| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright 2012 Google Inc. | 
 | 3 |  * | 
 | 4 |  * Use of this source code is governed by a BSD-style license that can be | 
 | 5 |  * found in the LICENSE file. | 
 | 6 |  */ | 
 | 7 |  | 
| halcanary | b0cce2c | 2015-01-26 12:49:00 -0800 | [diff] [blame] | 8 | #include "sk_tool_utils.h" | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 9 | #include "SampleCode.h" | 
 | 10 | #include "SkView.h" | 
 | 11 | #include "SkCanvas.h" | 
 | 12 | #include "SkPath.h" | 
 | 13 | #include "SkRegion.h" | 
 | 14 | #include "SkShader.h" | 
 | 15 | #include "SkUtils.h" | 
 | 16 | #include "SkImage.h" | 
 | 17 | #include "SkSurface.h" | 
 | 18 |  | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 19 | #define FAT_PIXEL_COLOR     SK_ColorBLACK | 
 | 20 | #define PIXEL_CENTER_SIZE   3 | 
 | 21 | #define WIRE_FRAME_COLOR    0xFFFF0000  /*0xFF00FFFF*/ | 
 | 22 | #define WIRE_FRAME_SIZE     1.5f | 
 | 23 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 24 | static SkScalar apply_grid(SkScalar x) { | 
 | 25 |     const SkScalar grid = 2; | 
 | 26 |     return SkScalarRoundToScalar(x * grid) / grid; | 
 | 27 | } | 
 | 28 |  | 
 | 29 | static void apply_grid(SkPoint pts[], int count) { | 
 | 30 |     for (int i = 0; i < count; ++i) { | 
 | 31 |         pts[i].set(apply_grid(pts[i].fX), apply_grid(pts[i].fY)); | 
 | 32 |     } | 
 | 33 | } | 
 | 34 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 35 | static void erase(SkSurface* surface) { | 
| junov@google.com | dbfac8a | 2012-12-06 21:47:40 +0000 | [diff] [blame] | 36 |     surface->getCanvas()->clear(SK_ColorTRANSPARENT); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 37 | } | 
 | 38 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 39 | class FatBits { | 
 | 40 | public: | 
| commit-bot@chromium.org | 5970f62 | 2014-05-12 20:42:21 +0000 | [diff] [blame] | 41 |     FatBits() { | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 42 |         fAA = false; | 
 | 43 |         fStyle = kHair_Style; | 
| reed | bb88674 | 2015-08-15 07:42:31 -0700 | [diff] [blame] | 44 |         fGrid = false; | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 45 |         fShowSkeleton = true; | 
 | 46 |         fUseGPU = false; | 
| reed@google.com | 9c0bef1 | 2012-11-02 19:59:18 +0000 | [diff] [blame] | 47 |         fUseClip = false; | 
| mike@reedtribe.org | 64494e9 | 2013-03-06 02:18:33 +0000 | [diff] [blame] | 48 |         fRectAsOval = false; | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 49 |         fUseTriangle = false; | 
| reed | a5d1207 | 2015-11-16 18:57:18 -0800 | [diff] [blame^] | 50 |         fStrokeCap = SkPaint::kButt_Cap; | 
| skia.committer@gmail.com | 1aa90cf | 2012-11-06 13:18:25 +0000 | [diff] [blame] | 51 |  | 
| reed@google.com | 9c0bef1 | 2012-11-02 19:59:18 +0000 | [diff] [blame] | 52 |         fClipRect.set(2, 2, 11, 8 ); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 53 |     } | 
 | 54 |  | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 55 |     int getZoom() const { return fZoom; } | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 56 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 57 |     bool getAA() const { return fAA; } | 
 | 58 |     void setAA(bool aa) { fAA = aa; } | 
 | 59 |  | 
 | 60 |     bool getGrid() const { return fGrid; } | 
 | 61 |     void setGrid(bool g) { fGrid = g; } | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 62 |  | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 63 |     bool getShowSkeleton() const { return fShowSkeleton; } | 
 | 64 |     void setShowSkeleton(bool ss) { fShowSkeleton = ss; } | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 65 |  | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 66 |     bool getUseGPU() const { return fUseGPU; } | 
 | 67 |     void setUseGPU(bool ug) { fUseGPU = ug; } | 
| skia.committer@gmail.com | 7ed98df | 2013-10-31 07:01:53 +0000 | [diff] [blame] | 68 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 69 |     bool getTriangle() const { return fUseTriangle; } | 
 | 70 |     void setTriangle(bool ut) { fUseTriangle = ut; } | 
| skia.committer@gmail.com | 7ed98df | 2013-10-31 07:01:53 +0000 | [diff] [blame] | 71 |  | 
| mike@reedtribe.org | 64494e9 | 2013-03-06 02:18:33 +0000 | [diff] [blame] | 72 |     void toggleRectAsOval() { fRectAsOval = !fRectAsOval; } | 
 | 73 |  | 
| reed@google.com | 9c0bef1 | 2012-11-02 19:59:18 +0000 | [diff] [blame] | 74 |     bool getUseClip() const { return fUseClip; } | 
 | 75 |     void setUseClip(bool uc) { fUseClip = uc; } | 
 | 76 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 77 |     enum Style { | 
 | 78 |         kHair_Style, | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 79 |         kStroke_Style, | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 80 |     }; | 
 | 81 |     Style getStyle() const { return fStyle; } | 
 | 82 |     void setStyle(Style s) { fStyle = s; } | 
 | 83 |  | 
 | 84 |     void setWHZ(int width, int height, int zoom) { | 
 | 85 |         fW = width; | 
 | 86 |         fH = height; | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 87 |         fZoom = zoom; | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 88 |         fBounds.set(0, 0, SkIntToScalar(width * zoom), SkIntToScalar(height * zoom)); | 
 | 89 |         fMatrix.setScale(SkIntToScalar(zoom), SkIntToScalar(zoom)); | 
 | 90 |         fInverse.setScale(SK_Scalar1 / zoom, SK_Scalar1 / zoom); | 
| halcanary | b0cce2c | 2015-01-26 12:49:00 -0800 | [diff] [blame] | 91 |         fShader.reset(sk_tool_utils::create_checkerboard_shader( | 
| halcanary | 878fa02 | 2015-01-26 11:24:32 -0800 | [diff] [blame] | 92 |                               0xFFCCCCCC, 0xFFFFFFFF, zoom)); | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 93 |  | 
| commit-bot@chromium.org | 32678d9 | 2014-01-15 02:38:22 +0000 | [diff] [blame] | 94 |         SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 95 |         fMinSurface.reset(SkSurface::NewRaster(info)); | 
| reed | e5ea500 | 2014-09-03 11:54:58 -0700 | [diff] [blame] | 96 |         info = info.makeWH(width * zoom, height * zoom); | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 97 |         fMaxSurface.reset(SkSurface::NewRaster(info)); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 98 |     } | 
 | 99 |  | 
 | 100 |     void drawBG(SkCanvas*); | 
 | 101 |     void drawFG(SkCanvas*); | 
 | 102 |     void drawLine(SkCanvas*, SkPoint pts[2]); | 
 | 103 |     void drawRect(SkCanvas* canvas, SkPoint pts[2]); | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 104 |     void drawTriangle(SkCanvas* canvas, SkPoint pts[3]); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 105 |  | 
| reed | a5d1207 | 2015-11-16 18:57:18 -0800 | [diff] [blame^] | 106 |     SkPaint::Cap fStrokeCap; | 
 | 107 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 108 | private: | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 109 |     bool fAA, fGrid, fShowSkeleton, fUseGPU, fUseClip, fRectAsOval, fUseTriangle; | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 110 |     Style fStyle; | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 111 |     int fW, fH, fZoom; | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 112 |     SkMatrix fMatrix, fInverse; | 
| reed@google.com | 9c0bef1 | 2012-11-02 19:59:18 +0000 | [diff] [blame] | 113 |     SkRect   fBounds, fClipRect; | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 114 |     SkAutoTUnref<SkShader> fShader; | 
 | 115 |     SkAutoTUnref<SkSurface> fMinSurface; | 
 | 116 |     SkAutoTUnref<SkSurface> fMaxSurface; | 
 | 117 |  | 
 | 118 |     void setupPaint(SkPaint* paint) { | 
 | 119 |         bool aa = this->getAA(); | 
| reed | a5d1207 | 2015-11-16 18:57:18 -0800 | [diff] [blame^] | 120 |         paint->setStrokeCap(fStrokeCap); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 121 |         switch (fStyle) { | 
 | 122 |             case kHair_Style: | 
 | 123 |                 paint->setStrokeWidth(0); | 
 | 124 |                 break; | 
 | 125 |             case kStroke_Style: | 
| reed@google.com | cdbcb3e | 2012-10-22 22:10:20 +0000 | [diff] [blame] | 126 |                 paint->setStrokeWidth(SK_Scalar1); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 127 |                 break; | 
 | 128 |         } | 
 | 129 |         paint->setAntiAlias(aa); | 
 | 130 |     } | 
 | 131 |  | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 132 |     void setupSkeletonPaint(SkPaint* paint) { | 
 | 133 |         paint->setStyle(SkPaint::kStroke_Style); | 
 | 134 |         paint->setStrokeWidth(WIRE_FRAME_SIZE); | 
 | 135 |         paint->setColor(fShowSkeleton ? WIRE_FRAME_COLOR : 0); | 
 | 136 |         paint->setAntiAlias(true); | 
 | 137 |     } | 
 | 138 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 139 |     void drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 140 |     void drawLineSkeleton(SkCanvas* max, const SkPoint pts[]); | 
 | 141 |     void drawRectSkeleton(SkCanvas* max, const SkRect& r) { | 
 | 142 |         SkPaint paint; | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 143 |         this->setupSkeletonPaint(&paint); | 
 | 144 |         SkPath path; | 
 | 145 |  | 
 | 146 |         if (fUseGPU && fAA) { | 
 | 147 |             SkRect rr = r; | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 148 |             rr.inset(SkIntToScalar(fZoom)/2, SkIntToScalar(fZoom)/2); | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 149 |             path.addRect(rr); | 
 | 150 |             path.moveTo(rr.fLeft, rr.fTop); | 
 | 151 |             path.lineTo(rr.fRight, rr.fBottom); | 
 | 152 |             rr = r; | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 153 |             rr.inset(-SkIntToScalar(fZoom)/2, -SkIntToScalar(fZoom)/2); | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 154 |             path.addRect(rr); | 
 | 155 |         } else { | 
| mike@reedtribe.org | 64494e9 | 2013-03-06 02:18:33 +0000 | [diff] [blame] | 156 |             fRectAsOval ? path.addOval(r) : path.addRect(r); | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 157 |             if (fUseGPU) { | 
 | 158 |                 path.moveTo(r.fLeft, r.fTop); | 
 | 159 |                 path.lineTo(r.fRight, r.fBottom); | 
 | 160 |             } | 
 | 161 |         } | 
 | 162 |         max->drawPath(path, paint); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 163 |     } | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 164 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 165 |     void copyMinToMax() { | 
 | 166 |         erase(fMaxSurface); | 
 | 167 |         SkCanvas* canvas = fMaxSurface->getCanvas(); | 
 | 168 |         canvas->save(); | 
 | 169 |         canvas->concat(fMatrix); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 170 |         fMinSurface->draw(canvas, 0, 0, nullptr); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 171 |         canvas->restore(); | 
 | 172 |  | 
 | 173 |         SkPaint paint; | 
 | 174 |         paint.setXfermodeMode(SkXfermode::kClear_Mode); | 
 | 175 |         for (int iy = 1; iy < fH; ++iy) { | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 176 |             SkScalar y = SkIntToScalar(iy * fZoom); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 177 |             canvas->drawLine(0, y - SK_ScalarHalf, 999, y - SK_ScalarHalf, paint); | 
 | 178 |         } | 
 | 179 |         for (int ix = 1; ix < fW; ++ix) { | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 180 |             SkScalar x = SkIntToScalar(ix * fZoom); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 181 |             canvas->drawLine(x - SK_ScalarHalf, 0, x - SK_ScalarHalf, 999, paint); | 
 | 182 |         } | 
 | 183 |     } | 
 | 184 | }; | 
 | 185 |  | 
 | 186 | void FatBits::drawBG(SkCanvas* canvas) { | 
 | 187 |     SkPaint paint; | 
 | 188 |  | 
 | 189 |     paint.setShader(fShader); | 
 | 190 |     canvas->drawRect(fBounds, paint); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 191 |     paint.setShader(nullptr); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 192 | } | 
 | 193 |  | 
 | 194 | void FatBits::drawFG(SkCanvas* canvas) { | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 195 |     SkPaint inner, outer; | 
 | 196 |  | 
 | 197 |     inner.setAntiAlias(true); | 
 | 198 |     inner.setColor(SK_ColorBLACK); | 
 | 199 |     inner.setStrokeWidth(PIXEL_CENTER_SIZE); | 
 | 200 |  | 
 | 201 |     outer.setAntiAlias(true); | 
 | 202 |     outer.setColor(SK_ColorWHITE); | 
 | 203 |     outer.setStrokeWidth(PIXEL_CENTER_SIZE + 2); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 204 |  | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 205 |     SkScalar half = SkIntToScalar(fZoom) / 2; | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 206 |     for (int iy = 0; iy < fH; ++iy) { | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 207 |         SkScalar y = SkIntToScalar(iy * fZoom) + half; | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 208 |         for (int ix = 0; ix < fW; ++ix) { | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 209 |             SkScalar x = SkIntToScalar(ix * fZoom) + half; | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 210 |  | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 211 |             canvas->drawPoint(x, y, outer); | 
 | 212 |             canvas->drawPoint(x, y, inner); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 213 |         } | 
 | 214 |     } | 
| reed@google.com | 9c0bef1 | 2012-11-02 19:59:18 +0000 | [diff] [blame] | 215 |  | 
 | 216 |     if (fUseClip) { | 
 | 217 |         SkPaint p; | 
 | 218 |         p.setStyle(SkPaint::kStroke_Style); | 
 | 219 |         p.setColor(SK_ColorLTGRAY); | 
 | 220 |         SkRect r = { | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 221 |             fClipRect.fLeft * fZoom, | 
 | 222 |             fClipRect.fTop * fZoom, | 
 | 223 |             fClipRect.fRight * fZoom, | 
 | 224 |             fClipRect.fBottom * fZoom | 
| reed@google.com | 9c0bef1 | 2012-11-02 19:59:18 +0000 | [diff] [blame] | 225 |         }; | 
 | 226 |         canvas->drawRect(r, p); | 
 | 227 |     } | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 228 | } | 
 | 229 |  | 
 | 230 | void FatBits::drawLineSkeleton(SkCanvas* max, const SkPoint pts[]) { | 
 | 231 |     SkPaint paint; | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 232 |     this->setupSkeletonPaint(&paint); | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 233 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 234 |     SkPath path; | 
 | 235 |     path.moveTo(pts[0]); | 
 | 236 |     path.lineTo(pts[1]); | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 237 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 238 |     switch (fStyle) { | 
 | 239 |         case kHair_Style: | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 240 |             if (fUseGPU) { | 
 | 241 |                 SkPaint p; | 
 | 242 |                 p.setStyle(SkPaint::kStroke_Style); | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 243 |                 p.setStrokeWidth(SK_Scalar1 * fZoom); | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 244 |                 SkPath dst; | 
 | 245 |                 p.getFillPath(path, &dst); | 
 | 246 |                 path.addPath(dst); | 
 | 247 |             } | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 248 |             break; | 
 | 249 |         case kStroke_Style: { | 
 | 250 |             SkPaint p; | 
 | 251 |             p.setStyle(SkPaint::kStroke_Style); | 
| robertphillips@google.com | ca47aae | 2012-12-12 15:58:25 +0000 | [diff] [blame] | 252 |             p.setStrokeWidth(SK_Scalar1 * fZoom); | 
| reed | a5d1207 | 2015-11-16 18:57:18 -0800 | [diff] [blame^] | 253 |             p.setStrokeCap(fStrokeCap); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 254 |             SkPath dst; | 
 | 255 |             p.getFillPath(path, &dst); | 
 | 256 |             path = dst; | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 257 |  | 
| reed | a5d1207 | 2015-11-16 18:57:18 -0800 | [diff] [blame^] | 258 |             path.moveTo(pts[0]); | 
 | 259 |             path.lineTo(pts[1]); | 
 | 260 |  | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 261 |             if (fUseGPU) { | 
 | 262 |                 path.moveTo(dst.getPoint(0)); | 
 | 263 |                 path.lineTo(dst.getPoint(2)); | 
 | 264 |             } | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 265 |         } break; | 
 | 266 |     } | 
 | 267 |     max->drawPath(path, paint); | 
 | 268 | } | 
 | 269 |  | 
 | 270 | void FatBits::drawLine(SkCanvas* canvas, SkPoint pts[]) { | 
 | 271 |     SkPaint paint; | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 272 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 273 |     fInverse.mapPoints(pts, 2); | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 274 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 275 |     if (fGrid) { | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 276 |         apply_grid(pts, 2); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 277 |     } | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 278 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 279 |     erase(fMinSurface); | 
 | 280 |     this->setupPaint(&paint); | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 281 |     paint.setColor(FAT_PIXEL_COLOR); | 
| reed@google.com | 9c0bef1 | 2012-11-02 19:59:18 +0000 | [diff] [blame] | 282 |     if (fUseClip) { | 
 | 283 |         fMinSurface->getCanvas()->save(); | 
 | 284 |         SkRect r = fClipRect; | 
 | 285 |         r.inset(SK_Scalar1/3, SK_Scalar1/3); | 
 | 286 |         fMinSurface->getCanvas()->clipRect(r, SkRegion::kIntersect_Op, true); | 
 | 287 |     } | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 288 |     fMinSurface->getCanvas()->drawLine(pts[0].fX, pts[0].fY, pts[1].fX, pts[1].fY, paint); | 
| reed@google.com | 9c0bef1 | 2012-11-02 19:59:18 +0000 | [diff] [blame] | 289 |     if (fUseClip) { | 
 | 290 |         fMinSurface->getCanvas()->restore(); | 
 | 291 |     } | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 292 |     this->copyMinToMax(); | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 293 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 294 |     SkCanvas* max = fMaxSurface->getCanvas(); | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 295 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 296 |     fMatrix.mapPoints(pts, 2); | 
 | 297 |     this->drawLineSkeleton(max, pts); | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 298 |  | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 299 |     fMaxSurface->draw(canvas, 0, 0, nullptr); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 300 | } | 
 | 301 |  | 
 | 302 | void FatBits::drawRect(SkCanvas* canvas, SkPoint pts[2]) { | 
 | 303 |     SkPaint paint; | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 304 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 305 |     fInverse.mapPoints(pts, 2); | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 306 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 307 |     if (fGrid) { | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 308 |         apply_grid(pts, 2); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 309 |     } | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 310 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 311 |     SkRect r; | 
 | 312 |     r.set(pts, 2); | 
 | 313 |  | 
 | 314 |     erase(fMinSurface); | 
 | 315 |     this->setupPaint(&paint); | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 316 |     paint.setColor(FAT_PIXEL_COLOR); | 
| mike@reedtribe.org | 64494e9 | 2013-03-06 02:18:33 +0000 | [diff] [blame] | 317 |     { | 
 | 318 |         SkCanvas* c = fMinSurface->getCanvas(); | 
 | 319 |         fRectAsOval ? c->drawOval(r, paint) : c->drawRect(r, paint); | 
 | 320 |     } | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 321 |     this->copyMinToMax(); | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 322 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 323 |     SkCanvas* max = fMaxSurface->getCanvas(); | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 324 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 325 |     fMatrix.mapPoints(pts, 2); | 
 | 326 |     r.set(pts, 2); | 
 | 327 |     this->drawRectSkeleton(max, r); | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 328 |  | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 329 |     fMaxSurface->draw(canvas, 0, 0, nullptr); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 330 | } | 
 | 331 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 332 | void FatBits::drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]) { | 
 | 333 |     SkPaint paint; | 
 | 334 |     this->setupSkeletonPaint(&paint); | 
| skia.committer@gmail.com | 7ed98df | 2013-10-31 07:01:53 +0000 | [diff] [blame] | 335 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 336 |     SkPath path; | 
 | 337 |     path.moveTo(pts[0]); | 
 | 338 |     path.lineTo(pts[1]); | 
 | 339 |     path.lineTo(pts[2]); | 
 | 340 |     path.close(); | 
| skia.committer@gmail.com | 7ed98df | 2013-10-31 07:01:53 +0000 | [diff] [blame] | 341 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 342 |     max->drawPath(path, paint); | 
 | 343 | } | 
 | 344 |  | 
 | 345 | void FatBits::drawTriangle(SkCanvas* canvas, SkPoint pts[3]) { | 
 | 346 |     SkPaint paint; | 
| skia.committer@gmail.com | 7ed98df | 2013-10-31 07:01:53 +0000 | [diff] [blame] | 347 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 348 |     fInverse.mapPoints(pts, 3); | 
| skia.committer@gmail.com | 7ed98df | 2013-10-31 07:01:53 +0000 | [diff] [blame] | 349 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 350 |     if (fGrid) { | 
 | 351 |         apply_grid(pts, 3); | 
 | 352 |     } | 
| skia.committer@gmail.com | 7ed98df | 2013-10-31 07:01:53 +0000 | [diff] [blame] | 353 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 354 |     SkPath path; | 
 | 355 |     path.moveTo(pts[0]); | 
 | 356 |     path.lineTo(pts[1]); | 
 | 357 |     path.lineTo(pts[2]); | 
 | 358 |     path.close(); | 
| skia.committer@gmail.com | 7ed98df | 2013-10-31 07:01:53 +0000 | [diff] [blame] | 359 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 360 |     erase(fMinSurface); | 
 | 361 |     this->setupPaint(&paint); | 
 | 362 |     paint.setColor(FAT_PIXEL_COLOR); | 
 | 363 |     fMinSurface->getCanvas()->drawPath(path, paint); | 
 | 364 |     this->copyMinToMax(); | 
| skia.committer@gmail.com | 7ed98df | 2013-10-31 07:01:53 +0000 | [diff] [blame] | 365 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 366 |     SkCanvas* max = fMaxSurface->getCanvas(); | 
| skia.committer@gmail.com | 7ed98df | 2013-10-31 07:01:53 +0000 | [diff] [blame] | 367 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 368 |     fMatrix.mapPoints(pts, 3); | 
 | 369 |     this->drawTriangleSkeleton(max, pts); | 
| skia.committer@gmail.com | 7ed98df | 2013-10-31 07:01:53 +0000 | [diff] [blame] | 370 |  | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 371 |     fMaxSurface->draw(canvas, 0, 0, nullptr); | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 372 | } | 
 | 373 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 374 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
 | 375 |  | 
 | 376 | class IndexClick : public SkView::Click { | 
 | 377 |     int fIndex; | 
 | 378 | public: | 
 | 379 |     IndexClick(SkView* v, int index) : SkView::Click(v), fIndex(index) {} | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 380 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 381 |     static int GetIndex(SkView::Click* click) { | 
 | 382 |         return ((IndexClick*)click)->fIndex; | 
 | 383 |     } | 
 | 384 | }; | 
 | 385 |  | 
 | 386 | class DrawLineView : public SampleView { | 
| reed | bb88674 | 2015-08-15 07:42:31 -0700 | [diff] [blame] | 387 |     enum { | 
 | 388 |         kZoom = 96 | 
 | 389 |     }; | 
 | 390 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 391 |     FatBits fFB; | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 392 |     SkPoint fPts[3]; | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 393 |     bool    fIsRect; | 
 | 394 | public: | 
 | 395 |     DrawLineView() { | 
| reed | bb88674 | 2015-08-15 07:42:31 -0700 | [diff] [blame] | 396 |         fFB.setWHZ(24, 16, kZoom); | 
 | 397 |         fPts[0].set(1, 1); | 
 | 398 |         fPts[1].set(5, 4); | 
 | 399 |         fPts[2].set(2, 6); | 
 | 400 |         SkMatrix::MakeScale(kZoom, kZoom).mapPoints(fPts, 3); | 
| reed@google.com | cdbcb3e | 2012-10-22 22:10:20 +0000 | [diff] [blame] | 401 |         fIsRect = false; | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 402 |     } | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 403 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 404 |     void setStyle(FatBits::Style s) { | 
 | 405 |         fFB.setStyle(s); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 406 |         this->inval(nullptr); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 407 |     } | 
 | 408 |  | 
 | 409 | protected: | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 410 |     bool onQuery(SkEvent* evt) override { | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 411 |         if (SampleCode::TitleQ(*evt)) { | 
 | 412 |             SampleCode::TitleR(evt, "FatBits"); | 
 | 413 |             return true; | 
 | 414 |         } | 
 | 415 |         SkUnichar uni; | 
 | 416 |         if (SampleCode::CharQ(*evt, &uni)) { | 
 | 417 |             switch (uni) { | 
| reed@google.com | 9c0bef1 | 2012-11-02 19:59:18 +0000 | [diff] [blame] | 418 |                 case 'c': | 
 | 419 |                     fFB.setUseClip(!fFB.getUseClip()); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 420 |                     this->inval(nullptr); | 
| reed@google.com | 9c0bef1 | 2012-11-02 19:59:18 +0000 | [diff] [blame] | 421 |                     return true; | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 422 |                 case 'r': | 
 | 423 |                     fIsRect = !fIsRect; | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 424 |                     this->inval(nullptr); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 425 |                     return true; | 
| mike@reedtribe.org | 64494e9 | 2013-03-06 02:18:33 +0000 | [diff] [blame] | 426 |                 case 'o': | 
 | 427 |                     fFB.toggleRectAsOval(); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 428 |                     this->inval(nullptr); | 
| mike@reedtribe.org | 64494e9 | 2013-03-06 02:18:33 +0000 | [diff] [blame] | 429 |                     return true; | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 430 |                 case 'x': | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 431 |                     fFB.setGrid(!fFB.getGrid()); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 432 |                     this->inval(nullptr); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 433 |                     return true; | 
 | 434 |                 case 's': | 
 | 435 |                     if (FatBits::kStroke_Style == fFB.getStyle()) { | 
 | 436 |                         this->setStyle(FatBits::kHair_Style); | 
 | 437 |                     } else { | 
 | 438 |                         this->setStyle(FatBits::kStroke_Style); | 
 | 439 |                     } | 
 | 440 |                     return true; | 
| reed | a5d1207 | 2015-11-16 18:57:18 -0800 | [diff] [blame^] | 441 |                 case 'k': { | 
 | 442 |                     const SkPaint::Cap caps[] = { | 
 | 443 |                         SkPaint::kButt_Cap, SkPaint::kRound_Cap, SkPaint::kSquare_Cap, | 
 | 444 |                     }; | 
 | 445 |                     fFB.fStrokeCap = caps[(fFB.fStrokeCap + 1) % 3]; | 
 | 446 |                     this->inval(nullptr); | 
 | 447 |                     return true; | 
 | 448 |                 } break; | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 449 |                 case 'a': | 
 | 450 |                     fFB.setAA(!fFB.getAA()); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 451 |                     this->inval(nullptr); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 452 |                     return true; | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 453 |                 case 'w': | 
 | 454 |                     fFB.setShowSkeleton(!fFB.getShowSkeleton()); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 455 |                     this->inval(nullptr); | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 456 |                     return true; | 
 | 457 |                 case 'g': | 
 | 458 |                     fFB.setUseGPU(!fFB.getUseGPU()); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 459 |                     this->inval(nullptr); | 
| reed@google.com | c83e352 | 2012-10-22 22:00:08 +0000 | [diff] [blame] | 460 |                     return true; | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 461 |                 case 't': | 
 | 462 |                     fFB.setTriangle(!fFB.getTriangle()); | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 463 |                     this->inval(nullptr); | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 464 |                     return true; | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 465 |             } | 
 | 466 |         } | 
 | 467 |         return this->INHERITED::onQuery(evt); | 
 | 468 |     } | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 469 |  | 
| mtklein | f059900 | 2015-07-13 06:18:39 -0700 | [diff] [blame] | 470 |     void onDrawContent(SkCanvas* canvas) override { | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 471 |         fFB.drawBG(canvas); | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 472 |         if (fFB.getTriangle()) { | 
 | 473 |             fFB.drawTriangle(canvas, fPts); | 
 | 474 |         } | 
 | 475 |         else if (fIsRect) { | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 476 |             fFB.drawRect(canvas, fPts); | 
 | 477 |         } else { | 
 | 478 |             fFB.drawLine(canvas, fPts); | 
 | 479 |         } | 
 | 480 |         fFB.drawFG(canvas); | 
| skia.committer@gmail.com | 1e34ff7 | 2012-10-24 02:01:24 +0000 | [diff] [blame] | 481 |  | 
| reed@google.com | ffe9d01 | 2012-10-23 15:33:41 +0000 | [diff] [blame] | 482 |         { | 
 | 483 |             SkString str; | 
| reed@google.com | 9c0bef1 | 2012-11-02 19:59:18 +0000 | [diff] [blame] | 484 |             str.printf("%s %s %s %s", | 
| reed@google.com | ffe9d01 | 2012-10-23 15:33:41 +0000 | [diff] [blame] | 485 |                        fFB.getAA() ? "AA" : "BW", | 
 | 486 |                        FatBits::kHair_Style == fFB.getStyle() ? "Hair" : "Stroke", | 
| reed@google.com | 9c0bef1 | 2012-11-02 19:59:18 +0000 | [diff] [blame] | 487 |                        fFB.getUseGPU() ? "GPU" : "CPU", | 
 | 488 |                        fFB.getUseClip() ? "clip" : "noclip"); | 
| reed@google.com | ffe9d01 | 2012-10-23 15:33:41 +0000 | [diff] [blame] | 489 |             SkPaint paint; | 
 | 490 |             paint.setAntiAlias(true); | 
 | 491 |             paint.setTextSize(16); | 
 | 492 |             paint.setColor(SK_ColorBLUE); | 
 | 493 |             canvas->drawText(str.c_str(), str.size(), 10, 16, paint); | 
 | 494 |         } | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 495 |     } | 
 | 496 |  | 
| mtklein | f059900 | 2015-07-13 06:18:39 -0700 | [diff] [blame] | 497 |     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override { | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 498 |         SkPoint pt = { x, y }; | 
 | 499 |         int index = -1; | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 500 |         int count = fFB.getTriangle() ? 3 : 2; | 
| reed@google.com | cdbcb3e | 2012-10-22 22:10:20 +0000 | [diff] [blame] | 501 |         SkScalar tol = 12; | 
| skia.committer@gmail.com | 7ed98df | 2013-10-31 07:01:53 +0000 | [diff] [blame] | 502 |  | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 503 |         for (int i = 0; i < count; ++i) { | 
 | 504 |             if (fPts[i].equalsWithinTolerance(pt, tol)) { | 
 | 505 |                 index = i; | 
 | 506 |                 break; | 
 | 507 |             } | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 508 |         } | 
| mike@reedtribe.org | c892a15 | 2012-10-23 03:10:46 +0000 | [diff] [blame] | 509 |         return new IndexClick(this, index); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 510 |     } | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 511 |  | 
| mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 512 |     bool onClick(Click* click) override { | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 513 |         int index = IndexClick::GetIndex(click); | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 514 |         if (index >= 0 && index <= 2) { | 
| mike@reedtribe.org | c892a15 | 2012-10-23 03:10:46 +0000 | [diff] [blame] | 515 |             fPts[index] = click->fCurr; | 
 | 516 |         } else { | 
 | 517 |             SkScalar dx = click->fCurr.fX - click->fPrev.fX; | 
 | 518 |             SkScalar dy = click->fCurr.fY - click->fPrev.fY; | 
 | 519 |             fPts[0].offset(dx, dy); | 
 | 520 |             fPts[1].offset(dx, dy); | 
| reed@google.com | bbe66f0 | 2013-10-30 13:41:19 +0000 | [diff] [blame] | 521 |             fPts[2].offset(dx, dy); | 
| mike@reedtribe.org | c892a15 | 2012-10-23 03:10:46 +0000 | [diff] [blame] | 522 |         } | 
| halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 523 |         this->inval(nullptr); | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 524 |         return true; | 
 | 525 |     } | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 526 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 527 | private: | 
| skia.committer@gmail.com | 45ba2f7 | 2012-10-23 02:01:22 +0000 | [diff] [blame] | 528 |  | 
| mike@reedtribe.org | 50e4c72 | 2012-10-22 03:59:34 +0000 | [diff] [blame] | 529 |     typedef SampleView INHERITED; | 
 | 530 | }; | 
 | 531 |  | 
 | 532 | ////////////////////////////////////////////////////////////////////////////// | 
 | 533 |  | 
 | 534 | static SkView* MyFactory() { return new DrawLineView; } | 
 | 535 | static SkViewRegister reg(MyFactory); |