blob: a1ef3ad3e7fa2269e620e5f03900d3c8e1798176 [file] [log] [blame]
mike@reedtribe.org50e4c722012-10-22 03:59:34 +00001/*
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
halcanaryb0cce2c2015-01-26 12:49:00 -08008#include "sk_tool_utils.h"
mike@reedtribe.org50e4c722012-10-22 03:59:34 +00009#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.comc83e3522012-10-22 22:00:08 +000019#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.combbe66f02013-10-30 13:41:19 +000024static SkScalar apply_grid(SkScalar x) {
25 const SkScalar grid = 2;
26 return SkScalarRoundToScalar(x * grid) / grid;
27}
28
29static 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.org50e4c722012-10-22 03:59:34 +000035static void erase(SkSurface* surface) {
junov@google.comdbfac8a2012-12-06 21:47:40 +000036 surface->getCanvas()->clear(SK_ColorTRANSPARENT);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000037}
38
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000039class FatBits {
40public:
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000041 FatBits() {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000042 fAA = false;
43 fStyle = kHair_Style;
reedbb886742015-08-15 07:42:31 -070044 fGrid = false;
reed@google.comc83e3522012-10-22 22:00:08 +000045 fShowSkeleton = true;
reed@google.com9c0bef12012-11-02 19:59:18 +000046 fUseClip = false;
mike@reedtribe.org64494e92013-03-06 02:18:33 +000047 fRectAsOval = false;
reed@google.combbe66f02013-10-30 13:41:19 +000048 fUseTriangle = false;
reeda5d12072015-11-16 18:57:18 -080049 fStrokeCap = SkPaint::kButt_Cap;
skia.committer@gmail.com1aa90cf2012-11-06 13:18:25 +000050
reed@google.com9c0bef12012-11-02 19:59:18 +000051 fClipRect.set(2, 2, 11, 8 );
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000052 }
53
robertphillips@google.comca47aae2012-12-12 15:58:25 +000054 int getZoom() const { return fZoom; }
reed@google.comc83e3522012-10-22 22:00:08 +000055
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000056 bool getAA() const { return fAA; }
57 void setAA(bool aa) { fAA = aa; }
58
59 bool getGrid() const { return fGrid; }
60 void setGrid(bool g) { fGrid = g; }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +000061
reed@google.comc83e3522012-10-22 22:00:08 +000062 bool getShowSkeleton() const { return fShowSkeleton; }
63 void setShowSkeleton(bool ss) { fShowSkeleton = ss; }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +000064
reed@google.combbe66f02013-10-30 13:41:19 +000065 bool getTriangle() const { return fUseTriangle; }
66 void setTriangle(bool ut) { fUseTriangle = ut; }
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +000067
mike@reedtribe.org64494e92013-03-06 02:18:33 +000068 void toggleRectAsOval() { fRectAsOval = !fRectAsOval; }
69
reed8716a8a2016-09-19 07:10:36 -070070 void togglePixelColors() {
71 if (fShader == fShader0) {
72 fShader = fShader1;
73 } else {
74 fShader = fShader0;
75 }
76 }
77
reed@google.com9c0bef12012-11-02 19:59:18 +000078 bool getUseClip() const { return fUseClip; }
79 void setUseClip(bool uc) { fUseClip = uc; }
80
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000081 enum Style {
82 kHair_Style,
reed@google.comc83e3522012-10-22 22:00:08 +000083 kStroke_Style,
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000084 };
85 Style getStyle() const { return fStyle; }
86 void setStyle(Style s) { fStyle = s; }
87
88 void setWHZ(int width, int height, int zoom) {
89 fW = width;
90 fH = height;
robertphillips@google.comca47aae2012-12-12 15:58:25 +000091 fZoom = zoom;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000092 fBounds.set(0, 0, SkIntToScalar(width * zoom), SkIntToScalar(height * zoom));
93 fMatrix.setScale(SkIntToScalar(zoom), SkIntToScalar(zoom));
94 fInverse.setScale(SK_Scalar1 / zoom, SK_Scalar1 / zoom);
reed8716a8a2016-09-19 07:10:36 -070095 fShader0 = sk_tool_utils::create_checkerboard_shader(0xFFDDDDDD, 0xFFFFFFFF, zoom);
96 fShader1 = SkShader::MakeColorShader(SK_ColorWHITE);
97 fShader = fShader0;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +000098
commit-bot@chromium.org32678d92014-01-15 02:38:22 +000099 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
reede8f30622016-03-23 18:59:25 -0700100 fMinSurface = SkSurface::MakeRaster(info);
reede5ea5002014-09-03 11:54:58 -0700101 info = info.makeWH(width * zoom, height * zoom);
reede8f30622016-03-23 18:59:25 -0700102 fMaxSurface = SkSurface::MakeRaster(info);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000103 }
104
105 void drawBG(SkCanvas*);
106 void drawFG(SkCanvas*);
107 void drawLine(SkCanvas*, SkPoint pts[2]);
108 void drawRect(SkCanvas* canvas, SkPoint pts[2]);
reed@google.combbe66f02013-10-30 13:41:19 +0000109 void drawTriangle(SkCanvas* canvas, SkPoint pts[3]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000110
reeda5d12072015-11-16 18:57:18 -0800111 SkPaint::Cap fStrokeCap;
112
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000113private:
reed8716a8a2016-09-19 07:10:36 -0700114 bool fAA, fGrid, fShowSkeleton, fUseClip, fRectAsOval, fUseTriangle;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000115 Style fStyle;
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000116 int fW, fH, fZoom;
reed8716a8a2016-09-19 07:10:36 -0700117 SkMatrix fMatrix, fInverse;
118 SkRect fBounds, fClipRect;
119 sk_sp<SkShader> fShader0;
120 sk_sp<SkShader> fShader1;
121 sk_sp<SkShader> fShader;
122 sk_sp<SkSurface> fMinSurface;
123 sk_sp<SkSurface> fMaxSurface;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000124
125 void setupPaint(SkPaint* paint) {
126 bool aa = this->getAA();
reeda5d12072015-11-16 18:57:18 -0800127 paint->setStrokeCap(fStrokeCap);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000128 switch (fStyle) {
129 case kHair_Style:
130 paint->setStrokeWidth(0);
131 break;
132 case kStroke_Style:
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000133 paint->setStrokeWidth(SK_Scalar1);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000134 break;
135 }
136 paint->setAntiAlias(aa);
137 }
138
reed@google.comc83e3522012-10-22 22:00:08 +0000139 void setupSkeletonPaint(SkPaint* paint) {
140 paint->setStyle(SkPaint::kStroke_Style);
141 paint->setStrokeWidth(WIRE_FRAME_SIZE);
142 paint->setColor(fShowSkeleton ? WIRE_FRAME_COLOR : 0);
143 paint->setAntiAlias(true);
144 }
145
reed@google.combbe66f02013-10-30 13:41:19 +0000146 void drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000147 void drawLineSkeleton(SkCanvas* max, const SkPoint pts[]);
148 void drawRectSkeleton(SkCanvas* max, const SkRect& r) {
149 SkPaint paint;
reed@google.comc83e3522012-10-22 22:00:08 +0000150 this->setupSkeletonPaint(&paint);
151 SkPath path;
152
reed8716a8a2016-09-19 07:10:36 -0700153 fRectAsOval ? path.addOval(r) : path.addRect(r);
reed@google.comc83e3522012-10-22 22:00:08 +0000154 max->drawPath(path, paint);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000155 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000156
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000157 void copyMinToMax() {
reede8f30622016-03-23 18:59:25 -0700158 erase(fMaxSurface.get());
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000159 SkCanvas* canvas = fMaxSurface->getCanvas();
160 canvas->save();
161 canvas->concat(fMatrix);
halcanary96fcdcc2015-08-27 07:41:13 -0700162 fMinSurface->draw(canvas, 0, 0, nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000163 canvas->restore();
164
165 SkPaint paint;
166 paint.setXfermodeMode(SkXfermode::kClear_Mode);
167 for (int iy = 1; iy < fH; ++iy) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000168 SkScalar y = SkIntToScalar(iy * fZoom);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000169 canvas->drawLine(0, y - SK_ScalarHalf, 999, y - SK_ScalarHalf, paint);
170 }
171 for (int ix = 1; ix < fW; ++ix) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000172 SkScalar x = SkIntToScalar(ix * fZoom);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000173 canvas->drawLine(x - SK_ScalarHalf, 0, x - SK_ScalarHalf, 999, paint);
174 }
175 }
176};
177
178void FatBits::drawBG(SkCanvas* canvas) {
179 SkPaint paint;
180
181 paint.setShader(fShader);
182 canvas->drawRect(fBounds, paint);
halcanary96fcdcc2015-08-27 07:41:13 -0700183 paint.setShader(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000184}
185
186void FatBits::drawFG(SkCanvas* canvas) {
reed@google.comc83e3522012-10-22 22:00:08 +0000187 SkPaint inner, outer;
188
189 inner.setAntiAlias(true);
190 inner.setColor(SK_ColorBLACK);
191 inner.setStrokeWidth(PIXEL_CENTER_SIZE);
192
193 outer.setAntiAlias(true);
194 outer.setColor(SK_ColorWHITE);
195 outer.setStrokeWidth(PIXEL_CENTER_SIZE + 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000196
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000197 SkScalar half = SkIntToScalar(fZoom) / 2;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000198 for (int iy = 0; iy < fH; ++iy) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000199 SkScalar y = SkIntToScalar(iy * fZoom) + half;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000200 for (int ix = 0; ix < fW; ++ix) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000201 SkScalar x = SkIntToScalar(ix * fZoom) + half;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000202
reed@google.comc83e3522012-10-22 22:00:08 +0000203 canvas->drawPoint(x, y, outer);
204 canvas->drawPoint(x, y, inner);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000205 }
206 }
reed@google.com9c0bef12012-11-02 19:59:18 +0000207
208 if (fUseClip) {
209 SkPaint p;
210 p.setStyle(SkPaint::kStroke_Style);
211 p.setColor(SK_ColorLTGRAY);
212 SkRect r = {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000213 fClipRect.fLeft * fZoom,
214 fClipRect.fTop * fZoom,
215 fClipRect.fRight * fZoom,
216 fClipRect.fBottom * fZoom
reed@google.com9c0bef12012-11-02 19:59:18 +0000217 };
218 canvas->drawRect(r, p);
219 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000220}
221
222void FatBits::drawLineSkeleton(SkCanvas* max, const SkPoint pts[]) {
223 SkPaint paint;
reed@google.comc83e3522012-10-22 22:00:08 +0000224 this->setupSkeletonPaint(&paint);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000225
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000226 SkPath path;
227 path.moveTo(pts[0]);
228 path.lineTo(pts[1]);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000229
reed8716a8a2016-09-19 07:10:36 -0700230 if (fStyle == kStroke_Style) {
231 SkPaint p;
232 p.setStyle(SkPaint::kStroke_Style);
233 p.setStrokeWidth(SK_Scalar1 * fZoom);
234 p.setStrokeCap(fStrokeCap);
235 SkPath dst;
236 p.getFillPath(path, &dst);
237 path = dst;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000238
reed8716a8a2016-09-19 07:10:36 -0700239 path.moveTo(pts[0]);
240 path.lineTo(pts[1]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000241 }
242 max->drawPath(path, paint);
243}
244
245void FatBits::drawLine(SkCanvas* canvas, SkPoint pts[]) {
246 SkPaint paint;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000247
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000248 fInverse.mapPoints(pts, 2);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000249
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000250 if (fGrid) {
reed@google.combbe66f02013-10-30 13:41:19 +0000251 apply_grid(pts, 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000252 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000253
reede8f30622016-03-23 18:59:25 -0700254 erase(fMinSurface.get());
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000255 this->setupPaint(&paint);
reed@google.comc83e3522012-10-22 22:00:08 +0000256 paint.setColor(FAT_PIXEL_COLOR);
reed@google.com9c0bef12012-11-02 19:59:18 +0000257 if (fUseClip) {
258 fMinSurface->getCanvas()->save();
259 SkRect r = fClipRect;
260 r.inset(SK_Scalar1/3, SK_Scalar1/3);
261 fMinSurface->getCanvas()->clipRect(r, SkRegion::kIntersect_Op, true);
262 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000263 fMinSurface->getCanvas()->drawLine(pts[0].fX, pts[0].fY, pts[1].fX, pts[1].fY, paint);
reed@google.com9c0bef12012-11-02 19:59:18 +0000264 if (fUseClip) {
265 fMinSurface->getCanvas()->restore();
266 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000267 this->copyMinToMax();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000268
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000269 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000270
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000271 fMatrix.mapPoints(pts, 2);
272 this->drawLineSkeleton(max, pts);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000273
halcanary96fcdcc2015-08-27 07:41:13 -0700274 fMaxSurface->draw(canvas, 0, 0, nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000275}
276
277void FatBits::drawRect(SkCanvas* canvas, SkPoint pts[2]) {
278 SkPaint paint;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000279
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000280 fInverse.mapPoints(pts, 2);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000281
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000282 if (fGrid) {
reed@google.combbe66f02013-10-30 13:41:19 +0000283 apply_grid(pts, 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000284 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000285
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000286 SkRect r;
287 r.set(pts, 2);
288
reede8f30622016-03-23 18:59:25 -0700289 erase(fMinSurface.get());
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000290 this->setupPaint(&paint);
reed@google.comc83e3522012-10-22 22:00:08 +0000291 paint.setColor(FAT_PIXEL_COLOR);
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000292 {
293 SkCanvas* c = fMinSurface->getCanvas();
294 fRectAsOval ? c->drawOval(r, paint) : c->drawRect(r, paint);
295 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000296 this->copyMinToMax();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000297
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000298 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000299
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000300 fMatrix.mapPoints(pts, 2);
301 r.set(pts, 2);
302 this->drawRectSkeleton(max, r);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000303
halcanary96fcdcc2015-08-27 07:41:13 -0700304 fMaxSurface->draw(canvas, 0, 0, nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000305}
306
reed@google.combbe66f02013-10-30 13:41:19 +0000307void FatBits::drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]) {
308 SkPaint paint;
309 this->setupSkeletonPaint(&paint);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000310
reed@google.combbe66f02013-10-30 13:41:19 +0000311 SkPath path;
312 path.moveTo(pts[0]);
313 path.lineTo(pts[1]);
314 path.lineTo(pts[2]);
315 path.close();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000316
reed@google.combbe66f02013-10-30 13:41:19 +0000317 max->drawPath(path, paint);
318}
319
320void FatBits::drawTriangle(SkCanvas* canvas, SkPoint pts[3]) {
321 SkPaint paint;
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000322
reed@google.combbe66f02013-10-30 13:41:19 +0000323 fInverse.mapPoints(pts, 3);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000324
reed@google.combbe66f02013-10-30 13:41:19 +0000325 if (fGrid) {
326 apply_grid(pts, 3);
327 }
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000328
reed@google.combbe66f02013-10-30 13:41:19 +0000329 SkPath path;
330 path.moveTo(pts[0]);
331 path.lineTo(pts[1]);
332 path.lineTo(pts[2]);
333 path.close();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000334
reede8f30622016-03-23 18:59:25 -0700335 erase(fMinSurface.get());
reed@google.combbe66f02013-10-30 13:41:19 +0000336 this->setupPaint(&paint);
337 paint.setColor(FAT_PIXEL_COLOR);
338 fMinSurface->getCanvas()->drawPath(path, paint);
339 this->copyMinToMax();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000340
reed@google.combbe66f02013-10-30 13:41:19 +0000341 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000342
reed@google.combbe66f02013-10-30 13:41:19 +0000343 fMatrix.mapPoints(pts, 3);
344 this->drawTriangleSkeleton(max, pts);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000345
halcanary96fcdcc2015-08-27 07:41:13 -0700346 fMaxSurface->draw(canvas, 0, 0, nullptr);
reed@google.combbe66f02013-10-30 13:41:19 +0000347}
348
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000349///////////////////////////////////////////////////////////////////////////////////////////////////
350
351class IndexClick : public SkView::Click {
352 int fIndex;
353public:
354 IndexClick(SkView* v, int index) : SkView::Click(v), fIndex(index) {}
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000355
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000356 static int GetIndex(SkView::Click* click) {
357 return ((IndexClick*)click)->fIndex;
358 }
359};
360
361class DrawLineView : public SampleView {
362 FatBits fFB;
reed@google.combbe66f02013-10-30 13:41:19 +0000363 SkPoint fPts[3];
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000364 bool fIsRect;
reed8716a8a2016-09-19 07:10:36 -0700365 int fZoom = 64;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000366public:
367 DrawLineView() {
reed8716a8a2016-09-19 07:10:36 -0700368 fFB.setWHZ(24*2, 16*2, fZoom);
reedbb886742015-08-15 07:42:31 -0700369 fPts[0].set(1, 1);
370 fPts[1].set(5, 4);
371 fPts[2].set(2, 6);
reed8716a8a2016-09-19 07:10:36 -0700372 SkMatrix::MakeScale(SkIntToScalar(fZoom)).mapPoints(fPts, 3);
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000373 fIsRect = false;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000374 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000375
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000376 void setStyle(FatBits::Style s) {
377 fFB.setStyle(s);
halcanary96fcdcc2015-08-27 07:41:13 -0700378 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000379 }
380
381protected:
mtklein36352bf2015-03-25 18:17:31 -0700382 bool onQuery(SkEvent* evt) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000383 if (SampleCode::TitleQ(*evt)) {
384 SampleCode::TitleR(evt, "FatBits");
385 return true;
386 }
387 SkUnichar uni;
388 if (SampleCode::CharQ(*evt, &uni)) {
389 switch (uni) {
reed@google.com9c0bef12012-11-02 19:59:18 +0000390 case 'c':
391 fFB.setUseClip(!fFB.getUseClip());
halcanary96fcdcc2015-08-27 07:41:13 -0700392 this->inval(nullptr);
reed@google.com9c0bef12012-11-02 19:59:18 +0000393 return true;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000394 case 'r':
395 fIsRect = !fIsRect;
halcanary96fcdcc2015-08-27 07:41:13 -0700396 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000397 return true;
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000398 case 'o':
399 fFB.toggleRectAsOval();
halcanary96fcdcc2015-08-27 07:41:13 -0700400 this->inval(nullptr);
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000401 return true;
reed@google.comc83e3522012-10-22 22:00:08 +0000402 case 'x':
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000403 fFB.setGrid(!fFB.getGrid());
halcanary96fcdcc2015-08-27 07:41:13 -0700404 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000405 return true;
406 case 's':
407 if (FatBits::kStroke_Style == fFB.getStyle()) {
408 this->setStyle(FatBits::kHair_Style);
409 } else {
410 this->setStyle(FatBits::kStroke_Style);
411 }
412 return true;
reeda5d12072015-11-16 18:57:18 -0800413 case 'k': {
414 const SkPaint::Cap caps[] = {
415 SkPaint::kButt_Cap, SkPaint::kRound_Cap, SkPaint::kSquare_Cap,
416 };
417 fFB.fStrokeCap = caps[(fFB.fStrokeCap + 1) % 3];
418 this->inval(nullptr);
419 return true;
420 } break;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000421 case 'a':
422 fFB.setAA(!fFB.getAA());
halcanary96fcdcc2015-08-27 07:41:13 -0700423 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000424 return true;
reed@google.comc83e3522012-10-22 22:00:08 +0000425 case 'w':
426 fFB.setShowSkeleton(!fFB.getShowSkeleton());
halcanary96fcdcc2015-08-27 07:41:13 -0700427 this->inval(nullptr);
reed@google.comc83e3522012-10-22 22:00:08 +0000428 return true;
429 case 'g':
reed8716a8a2016-09-19 07:10:36 -0700430 fFB.togglePixelColors();
halcanary96fcdcc2015-08-27 07:41:13 -0700431 this->inval(nullptr);
reed@google.comc83e3522012-10-22 22:00:08 +0000432 return true;
reed@google.combbe66f02013-10-30 13:41:19 +0000433 case 't':
434 fFB.setTriangle(!fFB.getTriangle());
halcanary96fcdcc2015-08-27 07:41:13 -0700435 this->inval(nullptr);
reed@google.combbe66f02013-10-30 13:41:19 +0000436 return true;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000437 }
438 }
439 return this->INHERITED::onQuery(evt);
440 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000441
mtkleinf0599002015-07-13 06:18:39 -0700442 void onDrawContent(SkCanvas* canvas) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000443 fFB.drawBG(canvas);
reed@google.combbe66f02013-10-30 13:41:19 +0000444 if (fFB.getTriangle()) {
445 fFB.drawTriangle(canvas, fPts);
446 }
447 else if (fIsRect) {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000448 fFB.drawRect(canvas, fPts);
449 } else {
450 fFB.drawLine(canvas, fPts);
451 }
452 fFB.drawFG(canvas);
skia.committer@gmail.com1e34ff72012-10-24 02:01:24 +0000453
reed@google.comffe9d012012-10-23 15:33:41 +0000454 {
455 SkString str;
reed8716a8a2016-09-19 07:10:36 -0700456 str.printf("%s %s %s",
reed@google.comffe9d012012-10-23 15:33:41 +0000457 fFB.getAA() ? "AA" : "BW",
458 FatBits::kHair_Style == fFB.getStyle() ? "Hair" : "Stroke",
reed@google.com9c0bef12012-11-02 19:59:18 +0000459 fFB.getUseClip() ? "clip" : "noclip");
reed@google.comffe9d012012-10-23 15:33:41 +0000460 SkPaint paint;
461 paint.setAntiAlias(true);
462 paint.setTextSize(16);
463 paint.setColor(SK_ColorBLUE);
464 canvas->drawText(str.c_str(), str.size(), 10, 16, paint);
465 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000466 }
467
mtkleinf0599002015-07-13 06:18:39 -0700468 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000469 SkPoint pt = { x, y };
470 int index = -1;
reed@google.combbe66f02013-10-30 13:41:19 +0000471 int count = fFB.getTriangle() ? 3 : 2;
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000472 SkScalar tol = 12;
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000473
reed@google.combbe66f02013-10-30 13:41:19 +0000474 for (int i = 0; i < count; ++i) {
475 if (fPts[i].equalsWithinTolerance(pt, tol)) {
476 index = i;
477 break;
478 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000479 }
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000480 return new IndexClick(this, index);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000481 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000482
mtklein36352bf2015-03-25 18:17:31 -0700483 bool onClick(Click* click) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000484 int index = IndexClick::GetIndex(click);
reed@google.combbe66f02013-10-30 13:41:19 +0000485 if (index >= 0 && index <= 2) {
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000486 fPts[index] = click->fCurr;
487 } else {
488 SkScalar dx = click->fCurr.fX - click->fPrev.fX;
489 SkScalar dy = click->fCurr.fY - click->fPrev.fY;
490 fPts[0].offset(dx, dy);
491 fPts[1].offset(dx, dy);
reed@google.combbe66f02013-10-30 13:41:19 +0000492 fPts[2].offset(dx, dy);
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000493 }
halcanary96fcdcc2015-08-27 07:41:13 -0700494 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000495 return true;
496 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000497
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000498private:
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000499
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000500 typedef SampleView INHERITED;
501};
502
503//////////////////////////////////////////////////////////////////////////////
504
505static SkView* MyFactory() { return new DrawLineView; }
506static SkViewRegister reg(MyFactory);