blob: 723dca860590ce17eb5c1d0c5dd141b96db1786e [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"
Cary Clarkdf429f32017-11-08 11:44:31 -050013#include "SkPointPriv.h"
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000014#include "SkRegion.h"
15#include "SkShader.h"
16#include "SkUtils.h"
17#include "SkImage.h"
18#include "SkSurface.h"
Mike Reedebfce6d2016-12-12 10:02:12 -050019#include "SkClipOpPriv.h"
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000020
reed@google.comc83e3522012-10-22 22:00:08 +000021#define FAT_PIXEL_COLOR SK_ColorBLACK
22#define PIXEL_CENTER_SIZE 3
23#define WIRE_FRAME_COLOR 0xFFFF0000 /*0xFF00FFFF*/
24#define WIRE_FRAME_SIZE 1.5f
25
reed@google.combbe66f02013-10-30 13:41:19 +000026static SkScalar apply_grid(SkScalar x) {
27 const SkScalar grid = 2;
28 return SkScalarRoundToScalar(x * grid) / grid;
29}
30
31static void apply_grid(SkPoint pts[], int count) {
32 for (int i = 0; i < count; ++i) {
33 pts[i].set(apply_grid(pts[i].fX), apply_grid(pts[i].fY));
34 }
35}
36
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000037static void erase(SkSurface* surface) {
junov@google.comdbfac8a2012-12-06 21:47:40 +000038 surface->getCanvas()->clear(SK_ColorTRANSPARENT);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000039}
40
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000041class FatBits {
42public:
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000043 FatBits() {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000044 fAA = false;
45 fStyle = kHair_Style;
reedbb886742015-08-15 07:42:31 -070046 fGrid = false;
reed@google.comc83e3522012-10-22 22:00:08 +000047 fShowSkeleton = true;
reed@google.com9c0bef12012-11-02 19:59:18 +000048 fUseClip = false;
mike@reedtribe.org64494e92013-03-06 02:18:33 +000049 fRectAsOval = false;
reed@google.combbe66f02013-10-30 13:41:19 +000050 fUseTriangle = false;
reeda5d12072015-11-16 18:57:18 -080051 fStrokeCap = SkPaint::kButt_Cap;
skia.committer@gmail.com1aa90cf2012-11-06 13:18:25 +000052
reed@google.com9c0bef12012-11-02 19:59:18 +000053 fClipRect.set(2, 2, 11, 8 );
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000054 }
55
robertphillips@google.comca47aae2012-12-12 15:58:25 +000056 int getZoom() const { return fZoom; }
reed@google.comc83e3522012-10-22 22:00:08 +000057
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000058 bool getAA() const { return fAA; }
59 void setAA(bool aa) { fAA = aa; }
60
61 bool getGrid() const { return fGrid; }
62 void setGrid(bool g) { fGrid = g; }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +000063
reed@google.comc83e3522012-10-22 22:00:08 +000064 bool getShowSkeleton() const { return fShowSkeleton; }
65 void setShowSkeleton(bool ss) { fShowSkeleton = ss; }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +000066
reed@google.combbe66f02013-10-30 13:41:19 +000067 bool getTriangle() const { return fUseTriangle; }
68 void setTriangle(bool ut) { fUseTriangle = ut; }
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +000069
mike@reedtribe.org64494e92013-03-06 02:18:33 +000070 void toggleRectAsOval() { fRectAsOval = !fRectAsOval; }
71
reed8716a8a2016-09-19 07:10:36 -070072 void togglePixelColors() {
73 if (fShader == fShader0) {
74 fShader = fShader1;
75 } else {
76 fShader = fShader0;
77 }
78 }
79
Mike Reedce54bce2017-11-01 21:17:11 -040080 float fStrokeWidth = 1;
81
reed@google.com9c0bef12012-11-02 19:59:18 +000082 bool getUseClip() const { return fUseClip; }
83 void setUseClip(bool uc) { fUseClip = uc; }
84
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000085 enum Style {
86 kHair_Style,
reed@google.comc83e3522012-10-22 22:00:08 +000087 kStroke_Style,
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000088 };
89 Style getStyle() const { return fStyle; }
90 void setStyle(Style s) { fStyle = s; }
91
92 void setWHZ(int width, int height, int zoom) {
93 fW = width;
94 fH = height;
robertphillips@google.comca47aae2012-12-12 15:58:25 +000095 fZoom = zoom;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000096 fBounds.set(0, 0, SkIntToScalar(width * zoom), SkIntToScalar(height * zoom));
97 fMatrix.setScale(SkIntToScalar(zoom), SkIntToScalar(zoom));
98 fInverse.setScale(SK_Scalar1 / zoom, SK_Scalar1 / zoom);
reed8716a8a2016-09-19 07:10:36 -070099 fShader0 = sk_tool_utils::create_checkerboard_shader(0xFFDDDDDD, 0xFFFFFFFF, zoom);
100 fShader1 = SkShader::MakeColorShader(SK_ColorWHITE);
101 fShader = fShader0;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000102
commit-bot@chromium.org32678d92014-01-15 02:38:22 +0000103 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
reede8f30622016-03-23 18:59:25 -0700104 fMinSurface = SkSurface::MakeRaster(info);
reede5ea5002014-09-03 11:54:58 -0700105 info = info.makeWH(width * zoom, height * zoom);
reede8f30622016-03-23 18:59:25 -0700106 fMaxSurface = SkSurface::MakeRaster(info);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000107 }
108
109 void drawBG(SkCanvas*);
110 void drawFG(SkCanvas*);
111 void drawLine(SkCanvas*, SkPoint pts[2]);
112 void drawRect(SkCanvas* canvas, SkPoint pts[2]);
reed@google.combbe66f02013-10-30 13:41:19 +0000113 void drawTriangle(SkCanvas* canvas, SkPoint pts[3]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000114
reeda5d12072015-11-16 18:57:18 -0800115 SkPaint::Cap fStrokeCap;
116
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000117private:
reed8716a8a2016-09-19 07:10:36 -0700118 bool fAA, fGrid, fShowSkeleton, fUseClip, fRectAsOval, fUseTriangle;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000119 Style fStyle;
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000120 int fW, fH, fZoom;
reed8716a8a2016-09-19 07:10:36 -0700121 SkMatrix fMatrix, fInverse;
122 SkRect fBounds, fClipRect;
123 sk_sp<SkShader> fShader0;
124 sk_sp<SkShader> fShader1;
125 sk_sp<SkShader> fShader;
126 sk_sp<SkSurface> fMinSurface;
127 sk_sp<SkSurface> fMaxSurface;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000128
129 void setupPaint(SkPaint* paint) {
130 bool aa = this->getAA();
reeda5d12072015-11-16 18:57:18 -0800131 paint->setStrokeCap(fStrokeCap);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000132 switch (fStyle) {
133 case kHair_Style:
134 paint->setStrokeWidth(0);
135 break;
136 case kStroke_Style:
Mike Reedce54bce2017-11-01 21:17:11 -0400137 paint->setStrokeWidth(fStrokeWidth);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000138 break;
139 }
140 paint->setAntiAlias(aa);
141 }
142
reed@google.comc83e3522012-10-22 22:00:08 +0000143 void setupSkeletonPaint(SkPaint* paint) {
144 paint->setStyle(SkPaint::kStroke_Style);
145 paint->setStrokeWidth(WIRE_FRAME_SIZE);
146 paint->setColor(fShowSkeleton ? WIRE_FRAME_COLOR : 0);
147 paint->setAntiAlias(true);
148 }
149
reed@google.combbe66f02013-10-30 13:41:19 +0000150 void drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000151 void drawLineSkeleton(SkCanvas* max, const SkPoint pts[]);
152 void drawRectSkeleton(SkCanvas* max, const SkRect& r) {
153 SkPaint paint;
reed@google.comc83e3522012-10-22 22:00:08 +0000154 this->setupSkeletonPaint(&paint);
155 SkPath path;
156
reed8716a8a2016-09-19 07:10:36 -0700157 fRectAsOval ? path.addOval(r) : path.addRect(r);
reed@google.comc83e3522012-10-22 22:00:08 +0000158 max->drawPath(path, paint);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000159 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000160
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000161 void copyMinToMax() {
reede8f30622016-03-23 18:59:25 -0700162 erase(fMaxSurface.get());
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000163 SkCanvas* canvas = fMaxSurface->getCanvas();
164 canvas->save();
165 canvas->concat(fMatrix);
halcanary96fcdcc2015-08-27 07:41:13 -0700166 fMinSurface->draw(canvas, 0, 0, nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000167 canvas->restore();
168
169 SkPaint paint;
reed374772b2016-10-05 17:33:02 -0700170 paint.setBlendMode(SkBlendMode::kClear);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000171 for (int iy = 1; iy < fH; ++iy) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000172 SkScalar y = SkIntToScalar(iy * fZoom);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000173 canvas->drawLine(0, y - SK_ScalarHalf, 999, y - SK_ScalarHalf, paint);
174 }
175 for (int ix = 1; ix < fW; ++ix) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000176 SkScalar x = SkIntToScalar(ix * fZoom);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000177 canvas->drawLine(x - SK_ScalarHalf, 0, x - SK_ScalarHalf, 999, paint);
178 }
179 }
180};
181
182void FatBits::drawBG(SkCanvas* canvas) {
183 SkPaint paint;
184
185 paint.setShader(fShader);
186 canvas->drawRect(fBounds, paint);
halcanary96fcdcc2015-08-27 07:41:13 -0700187 paint.setShader(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000188}
189
190void FatBits::drawFG(SkCanvas* canvas) {
reed@google.comc83e3522012-10-22 22:00:08 +0000191 SkPaint inner, outer;
192
193 inner.setAntiAlias(true);
194 inner.setColor(SK_ColorBLACK);
195 inner.setStrokeWidth(PIXEL_CENTER_SIZE);
196
197 outer.setAntiAlias(true);
198 outer.setColor(SK_ColorWHITE);
199 outer.setStrokeWidth(PIXEL_CENTER_SIZE + 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000200
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000201 SkScalar half = SkIntToScalar(fZoom) / 2;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000202 for (int iy = 0; iy < fH; ++iy) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000203 SkScalar y = SkIntToScalar(iy * fZoom) + half;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000204 for (int ix = 0; ix < fW; ++ix) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000205 SkScalar x = SkIntToScalar(ix * fZoom) + half;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000206
reed@google.comc83e3522012-10-22 22:00:08 +0000207 canvas->drawPoint(x, y, outer);
208 canvas->drawPoint(x, y, inner);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000209 }
210 }
reed@google.com9c0bef12012-11-02 19:59:18 +0000211
212 if (fUseClip) {
213 SkPaint p;
214 p.setStyle(SkPaint::kStroke_Style);
215 p.setColor(SK_ColorLTGRAY);
216 SkRect r = {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000217 fClipRect.fLeft * fZoom,
218 fClipRect.fTop * fZoom,
219 fClipRect.fRight * fZoom,
220 fClipRect.fBottom * fZoom
reed@google.com9c0bef12012-11-02 19:59:18 +0000221 };
222 canvas->drawRect(r, p);
223 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000224}
225
226void FatBits::drawLineSkeleton(SkCanvas* max, const SkPoint pts[]) {
227 SkPaint paint;
reed@google.comc83e3522012-10-22 22:00:08 +0000228 this->setupSkeletonPaint(&paint);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000229
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000230 SkPath path;
231 path.moveTo(pts[0]);
232 path.lineTo(pts[1]);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000233
reed8716a8a2016-09-19 07:10:36 -0700234 if (fStyle == kStroke_Style) {
235 SkPaint p;
236 p.setStyle(SkPaint::kStroke_Style);
Mike Reedce54bce2017-11-01 21:17:11 -0400237 p.setStrokeWidth(fStrokeWidth * fZoom);
reed8716a8a2016-09-19 07:10:36 -0700238 p.setStrokeCap(fStrokeCap);
239 SkPath dst;
240 p.getFillPath(path, &dst);
241 path = dst;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000242
reed8716a8a2016-09-19 07:10:36 -0700243 path.moveTo(pts[0]);
244 path.lineTo(pts[1]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000245 }
246 max->drawPath(path, paint);
247}
248
249void FatBits::drawLine(SkCanvas* canvas, SkPoint pts[]) {
250 SkPaint paint;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000251
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000252 fInverse.mapPoints(pts, 2);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000253
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000254 if (fGrid) {
reed@google.combbe66f02013-10-30 13:41:19 +0000255 apply_grid(pts, 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000256 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000257
reede8f30622016-03-23 18:59:25 -0700258 erase(fMinSurface.get());
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000259 this->setupPaint(&paint);
reed@google.comc83e3522012-10-22 22:00:08 +0000260 paint.setColor(FAT_PIXEL_COLOR);
reed@google.com9c0bef12012-11-02 19:59:18 +0000261 if (fUseClip) {
262 fMinSurface->getCanvas()->save();
263 SkRect r = fClipRect;
264 r.inset(SK_Scalar1/3, SK_Scalar1/3);
Mike Reedc1f77742016-12-09 09:00:50 -0500265 fMinSurface->getCanvas()->clipRect(r, kIntersect_SkClipOp, true);
reed@google.com9c0bef12012-11-02 19:59:18 +0000266 }
Hal Canary23e474c2017-05-15 13:35:35 -0400267 fMinSurface->getCanvas()->drawLine(pts[0], pts[1], paint);
reed@google.com9c0bef12012-11-02 19:59:18 +0000268 if (fUseClip) {
269 fMinSurface->getCanvas()->restore();
270 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000271 this->copyMinToMax();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000272
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000273 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000274
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000275 fMatrix.mapPoints(pts, 2);
276 this->drawLineSkeleton(max, pts);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000277
halcanary96fcdcc2015-08-27 07:41:13 -0700278 fMaxSurface->draw(canvas, 0, 0, nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000279}
280
281void FatBits::drawRect(SkCanvas* canvas, SkPoint pts[2]) {
282 SkPaint paint;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000283
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000284 fInverse.mapPoints(pts, 2);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000285
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000286 if (fGrid) {
reed@google.combbe66f02013-10-30 13:41:19 +0000287 apply_grid(pts, 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000288 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000289
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000290 SkRect r;
291 r.set(pts, 2);
292
reede8f30622016-03-23 18:59:25 -0700293 erase(fMinSurface.get());
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000294 this->setupPaint(&paint);
reed@google.comc83e3522012-10-22 22:00:08 +0000295 paint.setColor(FAT_PIXEL_COLOR);
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000296 {
297 SkCanvas* c = fMinSurface->getCanvas();
298 fRectAsOval ? c->drawOval(r, paint) : c->drawRect(r, paint);
299 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000300 this->copyMinToMax();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000301
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000302 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000303
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000304 fMatrix.mapPoints(pts, 2);
305 r.set(pts, 2);
306 this->drawRectSkeleton(max, r);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000307
halcanary96fcdcc2015-08-27 07:41:13 -0700308 fMaxSurface->draw(canvas, 0, 0, nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000309}
310
reed@google.combbe66f02013-10-30 13:41:19 +0000311void FatBits::drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]) {
312 SkPaint paint;
313 this->setupSkeletonPaint(&paint);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000314
reed@google.combbe66f02013-10-30 13:41:19 +0000315 SkPath path;
316 path.moveTo(pts[0]);
317 path.lineTo(pts[1]);
318 path.lineTo(pts[2]);
319 path.close();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000320
reed@google.combbe66f02013-10-30 13:41:19 +0000321 max->drawPath(path, paint);
322}
323
324void FatBits::drawTriangle(SkCanvas* canvas, SkPoint pts[3]) {
325 SkPaint paint;
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000326
reed@google.combbe66f02013-10-30 13:41:19 +0000327 fInverse.mapPoints(pts, 3);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000328
reed@google.combbe66f02013-10-30 13:41:19 +0000329 if (fGrid) {
330 apply_grid(pts, 3);
331 }
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000332
reed@google.combbe66f02013-10-30 13:41:19 +0000333 SkPath path;
334 path.moveTo(pts[0]);
335 path.lineTo(pts[1]);
336 path.lineTo(pts[2]);
337 path.close();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000338
reede8f30622016-03-23 18:59:25 -0700339 erase(fMinSurface.get());
reed@google.combbe66f02013-10-30 13:41:19 +0000340 this->setupPaint(&paint);
341 paint.setColor(FAT_PIXEL_COLOR);
342 fMinSurface->getCanvas()->drawPath(path, paint);
343 this->copyMinToMax();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000344
reed@google.combbe66f02013-10-30 13:41:19 +0000345 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000346
reed@google.combbe66f02013-10-30 13:41:19 +0000347 fMatrix.mapPoints(pts, 3);
348 this->drawTriangleSkeleton(max, pts);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000349
halcanary96fcdcc2015-08-27 07:41:13 -0700350 fMaxSurface->draw(canvas, 0, 0, nullptr);
reed@google.combbe66f02013-10-30 13:41:19 +0000351}
352
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000353///////////////////////////////////////////////////////////////////////////////////////////////////
354
355class IndexClick : public SkView::Click {
356 int fIndex;
357public:
358 IndexClick(SkView* v, int index) : SkView::Click(v), fIndex(index) {}
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000359
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000360 static int GetIndex(SkView::Click* click) {
361 return ((IndexClick*)click)->fIndex;
362 }
363};
364
365class DrawLineView : public SampleView {
366 FatBits fFB;
reed@google.combbe66f02013-10-30 13:41:19 +0000367 SkPoint fPts[3];
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000368 bool fIsRect;
reed8716a8a2016-09-19 07:10:36 -0700369 int fZoom = 64;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000370public:
371 DrawLineView() {
reed8716a8a2016-09-19 07:10:36 -0700372 fFB.setWHZ(24*2, 16*2, fZoom);
reedbb886742015-08-15 07:42:31 -0700373 fPts[0].set(1, 1);
374 fPts[1].set(5, 4);
375 fPts[2].set(2, 6);
reed8716a8a2016-09-19 07:10:36 -0700376 SkMatrix::MakeScale(SkIntToScalar(fZoom)).mapPoints(fPts, 3);
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000377 fIsRect = false;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000378 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000379
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000380 void setStyle(FatBits::Style s) {
381 fFB.setStyle(s);
halcanary96fcdcc2015-08-27 07:41:13 -0700382 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000383 }
384
385protected:
mtklein36352bf2015-03-25 18:17:31 -0700386 bool onQuery(SkEvent* evt) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000387 if (SampleCode::TitleQ(*evt)) {
388 SampleCode::TitleR(evt, "FatBits");
389 return true;
390 }
391 SkUnichar uni;
392 if (SampleCode::CharQ(*evt, &uni)) {
393 switch (uni) {
reed@google.com9c0bef12012-11-02 19:59:18 +0000394 case 'c':
395 fFB.setUseClip(!fFB.getUseClip());
halcanary96fcdcc2015-08-27 07:41:13 -0700396 this->inval(nullptr);
reed@google.com9c0bef12012-11-02 19:59:18 +0000397 return true;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000398 case 'r':
399 fIsRect = !fIsRect;
halcanary96fcdcc2015-08-27 07:41:13 -0700400 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000401 return true;
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000402 case 'o':
403 fFB.toggleRectAsOval();
halcanary96fcdcc2015-08-27 07:41:13 -0700404 this->inval(nullptr);
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000405 return true;
reed@google.comc83e3522012-10-22 22:00:08 +0000406 case 'x':
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000407 fFB.setGrid(!fFB.getGrid());
halcanary96fcdcc2015-08-27 07:41:13 -0700408 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000409 return true;
410 case 's':
411 if (FatBits::kStroke_Style == fFB.getStyle()) {
412 this->setStyle(FatBits::kHair_Style);
413 } else {
414 this->setStyle(FatBits::kStroke_Style);
415 }
416 return true;
reeda5d12072015-11-16 18:57:18 -0800417 case 'k': {
418 const SkPaint::Cap caps[] = {
419 SkPaint::kButt_Cap, SkPaint::kRound_Cap, SkPaint::kSquare_Cap,
420 };
421 fFB.fStrokeCap = caps[(fFB.fStrokeCap + 1) % 3];
422 this->inval(nullptr);
423 return true;
424 } break;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000425 case 'a':
426 fFB.setAA(!fFB.getAA());
halcanary96fcdcc2015-08-27 07:41:13 -0700427 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000428 return true;
reed@google.comc83e3522012-10-22 22:00:08 +0000429 case 'w':
430 fFB.setShowSkeleton(!fFB.getShowSkeleton());
halcanary96fcdcc2015-08-27 07:41:13 -0700431 this->inval(nullptr);
reed@google.comc83e3522012-10-22 22:00:08 +0000432 return true;
433 case 'g':
reed8716a8a2016-09-19 07:10:36 -0700434 fFB.togglePixelColors();
halcanary96fcdcc2015-08-27 07:41:13 -0700435 this->inval(nullptr);
reed@google.comc83e3522012-10-22 22:00:08 +0000436 return true;
reed@google.combbe66f02013-10-30 13:41:19 +0000437 case 't':
438 fFB.setTriangle(!fFB.getTriangle());
halcanary96fcdcc2015-08-27 07:41:13 -0700439 this->inval(nullptr);
reed@google.combbe66f02013-10-30 13:41:19 +0000440 return true;
Mike Reedce54bce2017-11-01 21:17:11 -0400441 case '-':
442 fFB.fStrokeWidth -= 0.125f;
443 this->inval(nullptr);
444 return true;
445 case '=':
446 fFB.fStrokeWidth += 0.125f;
447 this->inval(nullptr);
448 return true;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000449 }
450 }
451 return this->INHERITED::onQuery(evt);
452 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000453
mtkleinf0599002015-07-13 06:18:39 -0700454 void onDrawContent(SkCanvas* canvas) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000455 fFB.drawBG(canvas);
reed@google.combbe66f02013-10-30 13:41:19 +0000456 if (fFB.getTriangle()) {
457 fFB.drawTriangle(canvas, fPts);
458 }
459 else if (fIsRect) {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000460 fFB.drawRect(canvas, fPts);
461 } else {
462 fFB.drawLine(canvas, fPts);
463 }
464 fFB.drawFG(canvas);
skia.committer@gmail.com1e34ff72012-10-24 02:01:24 +0000465
reed@google.comffe9d012012-10-23 15:33:41 +0000466 {
467 SkString str;
reed8716a8a2016-09-19 07:10:36 -0700468 str.printf("%s %s %s",
reed@google.comffe9d012012-10-23 15:33:41 +0000469 fFB.getAA() ? "AA" : "BW",
470 FatBits::kHair_Style == fFB.getStyle() ? "Hair" : "Stroke",
reed@google.com9c0bef12012-11-02 19:59:18 +0000471 fFB.getUseClip() ? "clip" : "noclip");
reed@google.comffe9d012012-10-23 15:33:41 +0000472 SkPaint paint;
473 paint.setAntiAlias(true);
474 paint.setTextSize(16);
475 paint.setColor(SK_ColorBLUE);
Cary Clark2a475ea2017-04-28 15:35:12 -0400476 canvas->drawString(str, 10, 16, paint);
reed@google.comffe9d012012-10-23 15:33:41 +0000477 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000478 }
479
mtkleinf0599002015-07-13 06:18:39 -0700480 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000481 SkPoint pt = { x, y };
482 int index = -1;
reed@google.combbe66f02013-10-30 13:41:19 +0000483 int count = fFB.getTriangle() ? 3 : 2;
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000484 SkScalar tol = 12;
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000485
reed@google.combbe66f02013-10-30 13:41:19 +0000486 for (int i = 0; i < count; ++i) {
Cary Clarkdf429f32017-11-08 11:44:31 -0500487 if (SkPointPriv::EqualsWithinTolerance(fPts[i], pt, tol)) {
reed@google.combbe66f02013-10-30 13:41:19 +0000488 index = i;
489 break;
490 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000491 }
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000492 return new IndexClick(this, index);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000493 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000494
mtklein36352bf2015-03-25 18:17:31 -0700495 bool onClick(Click* click) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000496 int index = IndexClick::GetIndex(click);
reed@google.combbe66f02013-10-30 13:41:19 +0000497 if (index >= 0 && index <= 2) {
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000498 fPts[index] = click->fCurr;
499 } else {
500 SkScalar dx = click->fCurr.fX - click->fPrev.fX;
501 SkScalar dy = click->fCurr.fY - click->fPrev.fY;
502 fPts[0].offset(dx, dy);
503 fPts[1].offset(dx, dy);
reed@google.combbe66f02013-10-30 13:41:19 +0000504 fPts[2].offset(dx, dy);
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000505 }
halcanary96fcdcc2015-08-27 07:41:13 -0700506 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000507 return true;
508 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000509
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000510private:
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000511
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000512 typedef SampleView INHERITED;
513};
514
515//////////////////////////////////////////////////////////////////////////////
516
517static SkView* MyFactory() { return new DrawLineView; }
518static SkViewRegister reg(MyFactory);