Updated iOSSampleApp to display FPS and display in OpenGL
git-svn-id: http://skia.googlecode.com/svn/trunk@1879 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/iOSSampleApp/Shared/DrawingBoard/SkColorPalette.cpp b/experimental/iOSSampleApp/Shared/DrawingBoard/SkColorPalette.cpp
new file mode 100644
index 0000000..38d5444
--- /dev/null
+++ b/experimental/iOSSampleApp/Shared/DrawingBoard/SkColorPalette.cpp
@@ -0,0 +1,182 @@
+#include "SkView.h"
+#include "SkCanvas.h"
+#include "SkPaint.h"
+#include "SkGradientShader.h"
+#include "SkColorPalette.h"
+
+SkColorPalette::SkColorPalette() {
+ fSlotRect = SkRect::MakeWH(SkIntToScalar(50), SkIntToScalar(20));
+ fGradientRect = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100));
+ fSelected = 0;
+ fCurrColor = 0xFF000000;
+ for (int i = 0; i < PaletteSlots; ++i) {
+ fColors[i] = 0xFF000000;
+ }
+}
+
+bool SkColorPalette::onEvent(const SkEvent& evt) {
+ return this->INHERITED::onEvent(evt);
+}
+
+void SkColorPalette::onDraw(SkCanvas* canvas) {
+ canvas->drawColor(0xFFEEEEEE);
+
+ SkPaint paint;
+ paint.setAntiAlias(true);
+ paint.setStyle(SkPaint::kStrokeAndFill_Style);
+
+ canvas->translate(PalettePadding, PalettePadding);
+ for (int i = 0; i < PaletteSlots; ++i) {
+ if (fSelected == i) {
+ paint.setStrokeWidth(SkIntToScalar(3));
+ }
+ else {
+ paint.setStrokeWidth(0);
+ }
+
+ paint.setColor(fColors[i]);
+ canvas->drawRect(fSlotRect, paint);
+
+ canvas->translate(0, fSlotRect.height() + PalettePadding);
+ }
+ paint.setStrokeWidth(0);
+ canvas->translate(0, PalettePadding);
+ SkPoint p = SkPoint::Make(0,0);
+ SkPoint q = SkPoint::Make(this->width(), 0);
+ SkPoint pts[] = {p, q};
+
+ SkColor colors[] = { SK_ColorRED, SK_ColorYELLOW, SK_ColorGREEN,
+ SK_ColorCYAN, SK_ColorBLUE, SK_ColorMAGENTA,SK_ColorRED};
+ SkScalar colorPositions[] = { 0, 0.2, 0.4, 0.5, 0.6, 0.8, 1.0};
+
+
+ SkShader* shader1 = SkGradientShader::CreateLinear(pts, colors, colorPositions,7,
+ SkShader::kMirror_TileMode);
+ paint.setShader(shader1)->unref();
+
+ canvas->drawRect(fGradientRect, paint);
+
+ //this->INHERITED::onDraw(canvas);
+}
+
+SkView::Click* SkColorPalette::onFindClickHandler(SkScalar x, SkScalar y) {
+ return new Click(this);
+}
+
+bool SkColorPalette::onClick(SkView::Click* click) {
+ SkPoint curr = click->fCurr;
+ //SkDebugf("click %f %f \n", curr.fX, curr.fY);
+ int selected = selectSlot(curr);
+ if (selected >= 0) {
+ switch (click->fState) {
+ case SkView::Click::kDown_State:
+ case SkView::Click::kMoved_State:
+ case SkView::Click::kUp_State:
+ fSelected = selected;
+ fCurrColor = fColors[fSelected];
+ break;
+ default:
+ break;
+ }
+ return true;
+ }
+ else{
+ //account for padding
+ curr.fX -= PalettePadding;
+ curr.fY -= 2 * PalettePadding + (fSlotRect.height() + PalettePadding) * PaletteSlots;
+ if (curr.fX < 0 || curr.fX > fGradientRect.width() ||
+ curr.fY < 0 || curr.fY > fGradientRect.height()) {
+ return false;
+ }
+ else {
+ switch (click->fState) {
+ case SkView::Click::kDown_State:
+ case SkView::Click::kMoved_State:
+ case SkView::Click::kUp_State:
+ fColors[fSelected] = selectColorFromGradient(curr);
+ fCurrColor = fColors[fSelected];
+ break;
+ default:
+ break;
+ }
+ return true;
+ }
+ }
+}
+
+void SkColorPalette::onSizeChange() {
+ fGradientRect = SkRect::MakeWH(this->width() - 2*PalettePadding,
+ this->width() - 2*PalettePadding);
+ this->INHERITED::onSizeChange();
+}
+
+int SkColorPalette::selectSlot(SkPoint& cursorPosition) {
+ //account for padding
+ cursorPosition.fX -= PalettePadding;
+ cursorPosition.fY -= PalettePadding;
+
+ if (cursorPosition.fX < 0 || cursorPosition.fX > fSlotRect.width() ||
+ cursorPosition.fY < 0 || cursorPosition.fY > (fSlotRect.height() + PalettePadding) * PaletteSlots) {
+ return -1;
+ }
+ int index = cursorPosition.fY/(fSlotRect.height() + PalettePadding);
+ int offset = (int)cursorPosition.fY%((int)fSlotRect.height() + PalettePadding);
+ if (offset <= fSlotRect.height()) {
+ return index;
+ }
+ else {
+ return -1;
+ }
+}
+
+SkColor SkColorPalette::selectColorFromGradient(SkPoint& cursorPosition) {
+ float h = cursorPosition.fX/fGradientRect.width();
+ float s = 1.0 - cursorPosition.fY/fGradientRect.height();
+ float v = 1.0;
+ float _h,r,g,b;
+ float _1, _2, _3;
+ int _i;
+
+ _h = h * 6;
+ _i = (int)_h;
+ _1 = v * (1 - s);
+ _2 = v * (1 - s * (_h - _i));
+ _3 = v * (1 - s * (1 - (_h - _i)));
+
+ if (_i == 0) {
+ r = v;
+ g = _3;
+ b = _1;
+ }
+ else if (_i == 1) {
+ r = _2;
+ g = v;
+ b = _1;
+ }
+ else if (_i == 2) {
+ r = _1;
+ g = v;
+ b = _3;
+ }
+ else if (_i == 3) {
+ r = _1;
+ g = _2;
+ b = v;
+ }
+ else if (_i == 4) {
+ r = _3;
+ g = _1;
+ b = v;
+ }
+ else {
+ r = v;
+ g = _1;
+ b = _2;
+ };
+
+ SkColor retval = 0xFF000000;
+ retval += ((int)(r * 255) << 16);
+ retval += ((int)(g * 255) << 8);
+ retval += (int)(b * 255);
+ return retval;
+}
\ No newline at end of file
diff --git a/experimental/iOSSampleApp/Shared/DrawingBoard/SkColorPalette.h b/experimental/iOSSampleApp/Shared/DrawingBoard/SkColorPalette.h
new file mode 100644
index 0000000..f5910a9
--- /dev/null
+++ b/experimental/iOSSampleApp/Shared/DrawingBoard/SkColorPalette.h
@@ -0,0 +1,27 @@
+#ifndef SkColorPalette_DEFINED
+#define SkColorPalette_DEFINED
+
+#define PaletteSlots 5
+#define PalettePadding 5
+class SkColorPalette : public SkView {
+public:
+ SkColorPalette();
+ SkColor getColor() { return fCurrColor; }
+protected:
+ virtual bool onEvent(const SkEvent& evt);
+ virtual void onDraw(SkCanvas* canvas);
+ virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y);
+ virtual bool onClick(SkView::Click* click);
+ virtual void onSizeChange();
+private:
+ int selectSlot(SkPoint& cursorPosition);
+ SkColor selectColorFromGradient(SkPoint& cursorPosition);
+ int fSelected;
+ SkRect fGradientRect;
+ SkRect fSlotRect;
+ SkColor fCurrColor;
+ SkColor fColors[PaletteSlots];
+ typedef SkView INHERITED;
+};
+
+#endif
\ No newline at end of file
diff --git a/experimental/iOSSampleApp/Shared/DrawingBoard/SkNetPipeController.cpp b/experimental/iOSSampleApp/Shared/DrawingBoard/SkNetPipeController.cpp
new file mode 100644
index 0000000..8b347d8
--- /dev/null
+++ b/experimental/iOSSampleApp/Shared/DrawingBoard/SkNetPipeController.cpp
@@ -0,0 +1,44 @@
+#include "SkNetPipeController.h"
+
+SkNetPipeController::SkNetPipeController(SkCanvas* target) : fReader(target) {
+ fBlock = NULL;
+ fBlockSize = fBytesWritten = 0;
+ fPlayback = true;
+ fStatus = SkGPipeReader::kDone_Status;
+ fTotalWritten = 0;
+ fAtomsWritten = 0;
+}
+SkNetPipeController::~SkNetPipeController() {
+ sk_free(fBlock);
+}
+
+int SkNetPipeController::writeToSocket(SkSocket* sockfd, SkSocket::DataType type) {
+ if (NULL != sockfd && fTotalWritten > 4)
+ return sockfd->writePacket(fBlock, fBytesWritten, type);
+ else
+ return -1;
+}
+
+void* SkNetPipeController::requestBlock(size_t minRequest, size_t* actual) {
+ sk_free(fBlock);
+
+ fBlockSize = minRequest * 4;
+ fBlock = sk_malloc_throw(fBlockSize);
+ fBytesWritten = 0;
+ *actual = fBlockSize;
+ return fBlock;
+}
+
+void SkNetPipeController::notifyWritten(size_t bytes) {
+ SkASSERT(fBytesWritten + bytes <= fBlockSize);
+
+ if (fPlayback) {
+ fStatus = fReader.playback((const char*)fBlock + fBytesWritten, bytes);
+ }
+
+ SkASSERT(SkGPipeReader::kError_Status != fStatus);
+ fBytesWritten += bytes;
+ fTotalWritten += bytes;
+
+ fAtomsWritten += 1;
+}
\ No newline at end of file
diff --git a/experimental/iOSSampleApp/Shared/DrawingBoard/SkNetPipeController.h b/experimental/iOSSampleApp/Shared/DrawingBoard/SkNetPipeController.h
new file mode 100644
index 0000000..f95cfc7
--- /dev/null
+++ b/experimental/iOSSampleApp/Shared/DrawingBoard/SkNetPipeController.h
@@ -0,0 +1,30 @@
+#ifndef SkNetPipeController_DEFINED
+#define SkNetPipeController_DEFINED
+#include "SkTypes.h"
+#include "SkCanvas.h"
+#include "SkGPipe.h"
+#include "SkSockets.h"
+class SkNetPipeController : public SkGPipeController {
+public:
+ SkNetPipeController(SkCanvas* target);
+ ~SkNetPipeController();
+
+ virtual void* requestBlock(size_t minRequest, size_t* actual);
+ virtual void notifyWritten(size_t bytes);
+
+ int writeToSocket(SkSocket* sockfd, SkSocket::DataType type);
+ void enablePlayback() { fPlayback = true; }
+ void disablePlayback() { fPlayback = false; }
+
+private:
+ SkGPipeReader fReader;
+ bool fPlayback;
+ void* fBlock;
+ size_t fBlockSize;
+ size_t fBytesWritten;
+ int fAtomsWritten;
+ size_t fTotalWritten;
+
+ SkGPipeReader::Status fStatus;
+};
+#endif
\ No newline at end of file