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