add triangles to fatbits sample ('t')

git-svn-id: http://skia.googlecode.com/svn/trunk@12015 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SampleFatBits.cpp b/samplecode/SampleFatBits.cpp
index 8159cc5..10ec8e5 100644
--- a/samplecode/SampleFatBits.cpp
+++ b/samplecode/SampleFatBits.cpp
@@ -20,6 +20,17 @@
 #define WIRE_FRAME_COLOR    0xFFFF0000  /*0xFF00FFFF*/
 #define WIRE_FRAME_SIZE     1.5f
 
+static SkScalar apply_grid(SkScalar x) {
+    const SkScalar grid = 2;
+    return SkScalarRoundToScalar(x * grid) / grid;
+}
+
+static void apply_grid(SkPoint pts[], int count) {
+    for (int i = 0; i < count; ++i) {
+        pts[i].set(apply_grid(pts[i].fX), apply_grid(pts[i].fY));
+    }
+}
+
 static void erase(SkSurface* surface) {
     surface->getCanvas()->clear(SK_ColorTRANSPARENT);
 }
@@ -52,6 +63,7 @@
         fUseGPU = false;
         fUseClip = false;
         fRectAsOval = false;
+        fUseTriangle = false;
 
         fClipRect.set(2, 2, 11, 8 );
     }
@@ -69,7 +81,10 @@
 
     bool getUseGPU() const { return fUseGPU; }
     void setUseGPU(bool ug) { fUseGPU = ug; }
-
+    
+    bool getTriangle() const { return fUseTriangle; }
+    void setTriangle(bool ut) { fUseTriangle = ut; }
+    
     void toggleRectAsOval() { fRectAsOval = !fRectAsOval; }
 
     bool getUseClip() const { return fUseClip; }
@@ -91,19 +106,23 @@
         fInverse.setScale(SK_Scalar1 / zoom, SK_Scalar1 / zoom);
         fShader->setLocalMatrix(fMatrix);
 
-        fMinSurface.reset(SkSurface::NewRasterPMColor(width, height));
-        width *= zoom;
-        height *= zoom;
-        fMaxSurface.reset(SkSurface::NewRasterPMColor(width, height));
+        SkImage::Info info = {
+            width, height, SkImage::kPMColor_ColorType, SkImage::kPremul_AlphaType
+        };
+        fMinSurface.reset(SkSurface::NewRaster(info));
+        info.fWidth *= zoom;
+        info.fHeight *= zoom;
+        fMaxSurface.reset(SkSurface::NewRaster(info));
     }
 
     void drawBG(SkCanvas*);
     void drawFG(SkCanvas*);
     void drawLine(SkCanvas*, SkPoint pts[2]);
     void drawRect(SkCanvas* canvas, SkPoint pts[2]);
+    void drawTriangle(SkCanvas* canvas, SkPoint pts[3]);
 
 private:
-    bool fAA, fGrid, fShowSkeleton, fUseGPU, fUseClip, fRectAsOval;
+    bool fAA, fGrid, fShowSkeleton, fUseGPU, fUseClip, fRectAsOval, fUseTriangle;
     Style fStyle;
     int fW, fH, fZoom;
     SkMatrix fMatrix, fInverse;
@@ -132,6 +151,7 @@
         paint->setAntiAlias(true);
     }
 
+    void drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]);
     void drawLineSkeleton(SkCanvas* max, const SkPoint pts[]);
     void drawRectSkeleton(SkCanvas* max, const SkRect& r) {
         SkPaint paint;
@@ -264,11 +284,7 @@
     fInverse.mapPoints(pts, 2);
 
     if (fGrid) {
-        SkScalar dd = 0;//SK_Scalar1 / 50;
-        pts[0].set(SkScalarRoundToScalar(pts[0].fX) + dd,
-                   SkScalarRoundToScalar(pts[0].fY) + dd);
-        pts[1].set(SkScalarRoundToScalar(pts[1].fX) + dd,
-                   SkScalarRoundToScalar(pts[1].fY) + dd);
+        apply_grid(pts, 2);
     }
 
     erase(fMinSurface);
@@ -300,8 +316,7 @@
     fInverse.mapPoints(pts, 2);
 
     if (fGrid) {
-        pts[0].set(SkScalarRoundToScalar(pts[0].fX), SkScalarRoundToScalar(pts[0].fY));
-        pts[1].set(SkScalarRoundToScalar(pts[1].fX), SkScalarRoundToScalar(pts[1].fY));
+        apply_grid(pts, 2);
     }
 
     SkRect r;
@@ -325,6 +340,48 @@
     fMaxSurface->draw(canvas, 0, 0, NULL);
 }
 
+void FatBits::drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]) {
+    SkPaint paint;
+    this->setupSkeletonPaint(&paint);
+    
+    SkPath path;
+    path.moveTo(pts[0]);
+    path.lineTo(pts[1]);
+    path.lineTo(pts[2]);
+    path.close();
+    
+    max->drawPath(path, paint);
+}
+
+void FatBits::drawTriangle(SkCanvas* canvas, SkPoint pts[3]) {
+    SkPaint paint;
+    
+    fInverse.mapPoints(pts, 3);
+    
+    if (fGrid) {
+        apply_grid(pts, 3);
+    }
+    
+    SkPath path;
+    path.moveTo(pts[0]);
+    path.lineTo(pts[1]);
+    path.lineTo(pts[2]);
+    path.close();
+    
+    erase(fMinSurface);
+    this->setupPaint(&paint);
+    paint.setColor(FAT_PIXEL_COLOR);
+    fMinSurface->getCanvas()->drawPath(path, paint);
+    this->copyMinToMax();
+    
+    SkCanvas* max = fMaxSurface->getCanvas();
+    
+    fMatrix.mapPoints(pts, 3);
+    this->drawTriangleSkeleton(max, pts);
+    
+    fMaxSurface->draw(canvas, 0, 0, NULL);
+}
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class IndexClick : public SkView::Click {
@@ -339,13 +396,14 @@
 
 class DrawLineView : public SampleView {
     FatBits fFB;
-    SkPoint fPts[2];
+    SkPoint fPts[3];
     bool    fIsRect;
 public:
     DrawLineView() {
         fFB.setWHZ(24, 16, 48);
         fPts[0].set(48, 48);
         fPts[1].set(48 * 5, 48 * 4);
+        fPts[2].set(48 * 2, 48 * 6);
         fIsRect = false;
     }
 
@@ -398,6 +456,10 @@
                     fFB.setUseGPU(!fFB.getUseGPU());
                     this->inval(NULL);
                     return true;
+                case 't':
+                    fFB.setTriangle(!fFB.getTriangle());
+                    this->inval(NULL);
+                    return true;
             }
         }
         return this->INHERITED::onQuery(evt);
@@ -405,7 +467,10 @@
 
     virtual void onDrawContent(SkCanvas* canvas) {
         fFB.drawBG(canvas);
-        if (fIsRect) {
+        if (fFB.getTriangle()) {
+            fFB.drawTriangle(canvas, fPts);
+        }
+        else if (fIsRect) {
             fFB.drawRect(canvas, fPts);
         } else {
             fFB.drawLine(canvas, fPts);
@@ -431,24 +496,28 @@
                                               unsigned modi) SK_OVERRIDE {
         SkPoint pt = { x, y };
         int index = -1;
+        int count = fFB.getTriangle() ? 3 : 2;
         SkScalar tol = 12;
-        if (fPts[0].equalsWithinTolerance(pt, tol)) {
-            index = 0;
-        } else if (fPts[1].equalsWithinTolerance(pt, tol)) {
-            index = 1;
+        
+        for (int i = 0; i < count; ++i) {
+            if (fPts[i].equalsWithinTolerance(pt, tol)) {
+                index = i;
+                break;
+            }
         }
         return new IndexClick(this, index);
     }
 
     virtual bool onClick(Click* click) SK_OVERRIDE {
         int index = IndexClick::GetIndex(click);
-        if (index >= 0 && index <= 1) {
+        if (index >= 0 && index <= 2) {
             fPts[index] = click->fCurr;
         } else {
             SkScalar dx = click->fCurr.fX - click->fPrev.fX;
             SkScalar dy = click->fCurr.fY - click->fPrev.fY;
             fPts[0].offset(dx, dy);
             fPts[1].offset(dx, dy);
+            fPts[2].offset(dx, dy);
         }
         this->inval(NULL);
         return true;