blob: 80f656e47c2b34f2efc1499a7236a58fca723735 [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"
Mike Reedebfce6d2016-12-12 10:02:12 -050018#include "SkClipOpPriv.h"
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000019
reed@google.comc83e3522012-10-22 22:00:08 +000020#define FAT_PIXEL_COLOR SK_ColorBLACK
21#define PIXEL_CENTER_SIZE 3
22#define WIRE_FRAME_COLOR 0xFFFF0000 /*0xFF00FFFF*/
23#define WIRE_FRAME_SIZE 1.5f
24
reed@google.combbe66f02013-10-30 13:41:19 +000025static SkScalar apply_grid(SkScalar x) {
26 const SkScalar grid = 2;
27 return SkScalarRoundToScalar(x * grid) / grid;
28}
29
30static void apply_grid(SkPoint pts[], int count) {
31 for (int i = 0; i < count; ++i) {
32 pts[i].set(apply_grid(pts[i].fX), apply_grid(pts[i].fY));
33 }
34}
35
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000036static void erase(SkSurface* surface) {
junov@google.comdbfac8a2012-12-06 21:47:40 +000037 surface->getCanvas()->clear(SK_ColorTRANSPARENT);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000038}
39
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000040class FatBits {
41public:
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000042 FatBits() {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000043 fAA = false;
44 fStyle = kHair_Style;
reedbb886742015-08-15 07:42:31 -070045 fGrid = false;
reed@google.comc83e3522012-10-22 22:00:08 +000046 fShowSkeleton = true;
reed@google.com9c0bef12012-11-02 19:59:18 +000047 fUseClip = false;
mike@reedtribe.org64494e92013-03-06 02:18:33 +000048 fRectAsOval = false;
reed@google.combbe66f02013-10-30 13:41:19 +000049 fUseTriangle = false;
reeda5d12072015-11-16 18:57:18 -080050 fStrokeCap = SkPaint::kButt_Cap;
skia.committer@gmail.com1aa90cf2012-11-06 13:18:25 +000051
reed@google.com9c0bef12012-11-02 19:59:18 +000052 fClipRect.set(2, 2, 11, 8 );
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000053 }
54
robertphillips@google.comca47aae2012-12-12 15:58:25 +000055 int getZoom() const { return fZoom; }
reed@google.comc83e3522012-10-22 22:00:08 +000056
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000057 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.com45ba2f72012-10-23 02:01:22 +000062
reed@google.comc83e3522012-10-22 22:00:08 +000063 bool getShowSkeleton() const { return fShowSkeleton; }
64 void setShowSkeleton(bool ss) { fShowSkeleton = ss; }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +000065
reed@google.combbe66f02013-10-30 13:41:19 +000066 bool getTriangle() const { return fUseTriangle; }
67 void setTriangle(bool ut) { fUseTriangle = ut; }
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +000068
mike@reedtribe.org64494e92013-03-06 02:18:33 +000069 void toggleRectAsOval() { fRectAsOval = !fRectAsOval; }
70
reed8716a8a2016-09-19 07:10:36 -070071 void togglePixelColors() {
72 if (fShader == fShader0) {
73 fShader = fShader1;
74 } else {
75 fShader = fShader0;
76 }
77 }
78
Mike Reedce54bce2017-11-01 21:17:11 -040079 float fStrokeWidth = 1;
80
reed@google.com9c0bef12012-11-02 19:59:18 +000081 bool getUseClip() const { return fUseClip; }
82 void setUseClip(bool uc) { fUseClip = uc; }
83
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000084 enum Style {
85 kHair_Style,
reed@google.comc83e3522012-10-22 22:00:08 +000086 kStroke_Style,
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000087 };
88 Style getStyle() const { return fStyle; }
89 void setStyle(Style s) { fStyle = s; }
90
91 void setWHZ(int width, int height, int zoom) {
92 fW = width;
93 fH = height;
robertphillips@google.comca47aae2012-12-12 15:58:25 +000094 fZoom = zoom;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000095 fBounds.set(0, 0, SkIntToScalar(width * zoom), SkIntToScalar(height * zoom));
96 fMatrix.setScale(SkIntToScalar(zoom), SkIntToScalar(zoom));
97 fInverse.setScale(SK_Scalar1 / zoom, SK_Scalar1 / zoom);
reed8716a8a2016-09-19 07:10:36 -070098 fShader0 = sk_tool_utils::create_checkerboard_shader(0xFFDDDDDD, 0xFFFFFFFF, zoom);
99 fShader1 = SkShader::MakeColorShader(SK_ColorWHITE);
100 fShader = fShader0;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000101
commit-bot@chromium.org32678d92014-01-15 02:38:22 +0000102 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
reede8f30622016-03-23 18:59:25 -0700103 fMinSurface = SkSurface::MakeRaster(info);
reede5ea5002014-09-03 11:54:58 -0700104 info = info.makeWH(width * zoom, height * zoom);
reede8f30622016-03-23 18:59:25 -0700105 fMaxSurface = SkSurface::MakeRaster(info);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000106 }
107
108 void drawBG(SkCanvas*);
109 void drawFG(SkCanvas*);
110 void drawLine(SkCanvas*, SkPoint pts[2]);
111 void drawRect(SkCanvas* canvas, SkPoint pts[2]);
reed@google.combbe66f02013-10-30 13:41:19 +0000112 void drawTriangle(SkCanvas* canvas, SkPoint pts[3]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000113
reeda5d12072015-11-16 18:57:18 -0800114 SkPaint::Cap fStrokeCap;
115
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000116private:
reed8716a8a2016-09-19 07:10:36 -0700117 bool fAA, fGrid, fShowSkeleton, fUseClip, fRectAsOval, fUseTriangle;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000118 Style fStyle;
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000119 int fW, fH, fZoom;
reed8716a8a2016-09-19 07:10:36 -0700120 SkMatrix fMatrix, fInverse;
121 SkRect fBounds, fClipRect;
122 sk_sp<SkShader> fShader0;
123 sk_sp<SkShader> fShader1;
124 sk_sp<SkShader> fShader;
125 sk_sp<SkSurface> fMinSurface;
126 sk_sp<SkSurface> fMaxSurface;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000127
128 void setupPaint(SkPaint* paint) {
129 bool aa = this->getAA();
reeda5d12072015-11-16 18:57:18 -0800130 paint->setStrokeCap(fStrokeCap);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000131 switch (fStyle) {
132 case kHair_Style:
133 paint->setStrokeWidth(0);
134 break;
135 case kStroke_Style:
Mike Reedce54bce2017-11-01 21:17:11 -0400136 paint->setStrokeWidth(fStrokeWidth);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000137 break;
138 }
139 paint->setAntiAlias(aa);
140 }
141
reed@google.comc83e3522012-10-22 22:00:08 +0000142 void setupSkeletonPaint(SkPaint* paint) {
143 paint->setStyle(SkPaint::kStroke_Style);
144 paint->setStrokeWidth(WIRE_FRAME_SIZE);
145 paint->setColor(fShowSkeleton ? WIRE_FRAME_COLOR : 0);
146 paint->setAntiAlias(true);
147 }
148
reed@google.combbe66f02013-10-30 13:41:19 +0000149 void drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000150 void drawLineSkeleton(SkCanvas* max, const SkPoint pts[]);
151 void drawRectSkeleton(SkCanvas* max, const SkRect& r) {
152 SkPaint paint;
reed@google.comc83e3522012-10-22 22:00:08 +0000153 this->setupSkeletonPaint(&paint);
154 SkPath path;
155
reed8716a8a2016-09-19 07:10:36 -0700156 fRectAsOval ? path.addOval(r) : path.addRect(r);
reed@google.comc83e3522012-10-22 22:00:08 +0000157 max->drawPath(path, paint);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000158 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000159
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000160 void copyMinToMax() {
reede8f30622016-03-23 18:59:25 -0700161 erase(fMaxSurface.get());
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000162 SkCanvas* canvas = fMaxSurface->getCanvas();
163 canvas->save();
164 canvas->concat(fMatrix);
halcanary96fcdcc2015-08-27 07:41:13 -0700165 fMinSurface->draw(canvas, 0, 0, nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000166 canvas->restore();
167
168 SkPaint paint;
reed374772b2016-10-05 17:33:02 -0700169 paint.setBlendMode(SkBlendMode::kClear);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000170 for (int iy = 1; iy < fH; ++iy) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000171 SkScalar y = SkIntToScalar(iy * fZoom);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000172 canvas->drawLine(0, y - SK_ScalarHalf, 999, y - SK_ScalarHalf, paint);
173 }
174 for (int ix = 1; ix < fW; ++ix) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000175 SkScalar x = SkIntToScalar(ix * fZoom);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000176 canvas->drawLine(x - SK_ScalarHalf, 0, x - SK_ScalarHalf, 999, paint);
177 }
178 }
179};
180
181void FatBits::drawBG(SkCanvas* canvas) {
182 SkPaint paint;
183
184 paint.setShader(fShader);
185 canvas->drawRect(fBounds, paint);
halcanary96fcdcc2015-08-27 07:41:13 -0700186 paint.setShader(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000187}
188
189void FatBits::drawFG(SkCanvas* canvas) {
reed@google.comc83e3522012-10-22 22:00:08 +0000190 SkPaint inner, outer;
191
192 inner.setAntiAlias(true);
193 inner.setColor(SK_ColorBLACK);
194 inner.setStrokeWidth(PIXEL_CENTER_SIZE);
195
196 outer.setAntiAlias(true);
197 outer.setColor(SK_ColorWHITE);
198 outer.setStrokeWidth(PIXEL_CENTER_SIZE + 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000199
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000200 SkScalar half = SkIntToScalar(fZoom) / 2;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000201 for (int iy = 0; iy < fH; ++iy) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000202 SkScalar y = SkIntToScalar(iy * fZoom) + half;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000203 for (int ix = 0; ix < fW; ++ix) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000204 SkScalar x = SkIntToScalar(ix * fZoom) + half;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000205
reed@google.comc83e3522012-10-22 22:00:08 +0000206 canvas->drawPoint(x, y, outer);
207 canvas->drawPoint(x, y, inner);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000208 }
209 }
reed@google.com9c0bef12012-11-02 19:59:18 +0000210
211 if (fUseClip) {
212 SkPaint p;
213 p.setStyle(SkPaint::kStroke_Style);
214 p.setColor(SK_ColorLTGRAY);
215 SkRect r = {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000216 fClipRect.fLeft * fZoom,
217 fClipRect.fTop * fZoom,
218 fClipRect.fRight * fZoom,
219 fClipRect.fBottom * fZoom
reed@google.com9c0bef12012-11-02 19:59:18 +0000220 };
221 canvas->drawRect(r, p);
222 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000223}
224
225void FatBits::drawLineSkeleton(SkCanvas* max, const SkPoint pts[]) {
226 SkPaint paint;
reed@google.comc83e3522012-10-22 22:00:08 +0000227 this->setupSkeletonPaint(&paint);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000228
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000229 SkPath path;
230 path.moveTo(pts[0]);
231 path.lineTo(pts[1]);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000232
reed8716a8a2016-09-19 07:10:36 -0700233 if (fStyle == kStroke_Style) {
234 SkPaint p;
235 p.setStyle(SkPaint::kStroke_Style);
Mike Reedce54bce2017-11-01 21:17:11 -0400236 p.setStrokeWidth(fStrokeWidth * fZoom);
reed8716a8a2016-09-19 07:10:36 -0700237 p.setStrokeCap(fStrokeCap);
238 SkPath dst;
239 p.getFillPath(path, &dst);
240 path = dst;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000241
reed8716a8a2016-09-19 07:10:36 -0700242 path.moveTo(pts[0]);
243 path.lineTo(pts[1]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000244 }
245 max->drawPath(path, paint);
246}
247
248void FatBits::drawLine(SkCanvas* canvas, SkPoint pts[]) {
249 SkPaint paint;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000250
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000251 fInverse.mapPoints(pts, 2);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000252
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000253 if (fGrid) {
reed@google.combbe66f02013-10-30 13:41:19 +0000254 apply_grid(pts, 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000255 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000256
reede8f30622016-03-23 18:59:25 -0700257 erase(fMinSurface.get());
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000258 this->setupPaint(&paint);
reed@google.comc83e3522012-10-22 22:00:08 +0000259 paint.setColor(FAT_PIXEL_COLOR);
reed@google.com9c0bef12012-11-02 19:59:18 +0000260 if (fUseClip) {
261 fMinSurface->getCanvas()->save();
262 SkRect r = fClipRect;
263 r.inset(SK_Scalar1/3, SK_Scalar1/3);
Mike Reedc1f77742016-12-09 09:00:50 -0500264 fMinSurface->getCanvas()->clipRect(r, kIntersect_SkClipOp, true);
reed@google.com9c0bef12012-11-02 19:59:18 +0000265 }
Hal Canary23e474c2017-05-15 13:35:35 -0400266 fMinSurface->getCanvas()->drawLine(pts[0], pts[1], paint);
reed@google.com9c0bef12012-11-02 19:59:18 +0000267 if (fUseClip) {
268 fMinSurface->getCanvas()->restore();
269 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000270 this->copyMinToMax();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000271
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000272 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000273
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000274 fMatrix.mapPoints(pts, 2);
275 this->drawLineSkeleton(max, pts);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000276
halcanary96fcdcc2015-08-27 07:41:13 -0700277 fMaxSurface->draw(canvas, 0, 0, nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000278}
279
280void FatBits::drawRect(SkCanvas* canvas, SkPoint pts[2]) {
281 SkPaint paint;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000282
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000283 fInverse.mapPoints(pts, 2);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000284
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000285 if (fGrid) {
reed@google.combbe66f02013-10-30 13:41:19 +0000286 apply_grid(pts, 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000287 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000288
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000289 SkRect r;
290 r.set(pts, 2);
291
reede8f30622016-03-23 18:59:25 -0700292 erase(fMinSurface.get());
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000293 this->setupPaint(&paint);
reed@google.comc83e3522012-10-22 22:00:08 +0000294 paint.setColor(FAT_PIXEL_COLOR);
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000295 {
296 SkCanvas* c = fMinSurface->getCanvas();
297 fRectAsOval ? c->drawOval(r, paint) : c->drawRect(r, paint);
298 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000299 this->copyMinToMax();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000300
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000301 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000302
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000303 fMatrix.mapPoints(pts, 2);
304 r.set(pts, 2);
305 this->drawRectSkeleton(max, r);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000306
halcanary96fcdcc2015-08-27 07:41:13 -0700307 fMaxSurface->draw(canvas, 0, 0, nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000308}
309
reed@google.combbe66f02013-10-30 13:41:19 +0000310void FatBits::drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]) {
311 SkPaint paint;
312 this->setupSkeletonPaint(&paint);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000313
reed@google.combbe66f02013-10-30 13:41:19 +0000314 SkPath path;
315 path.moveTo(pts[0]);
316 path.lineTo(pts[1]);
317 path.lineTo(pts[2]);
318 path.close();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000319
reed@google.combbe66f02013-10-30 13:41:19 +0000320 max->drawPath(path, paint);
321}
322
323void FatBits::drawTriangle(SkCanvas* canvas, SkPoint pts[3]) {
324 SkPaint paint;
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000325
reed@google.combbe66f02013-10-30 13:41:19 +0000326 fInverse.mapPoints(pts, 3);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000327
reed@google.combbe66f02013-10-30 13:41:19 +0000328 if (fGrid) {
329 apply_grid(pts, 3);
330 }
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000331
reed@google.combbe66f02013-10-30 13:41:19 +0000332 SkPath path;
333 path.moveTo(pts[0]);
334 path.lineTo(pts[1]);
335 path.lineTo(pts[2]);
336 path.close();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000337
reede8f30622016-03-23 18:59:25 -0700338 erase(fMinSurface.get());
reed@google.combbe66f02013-10-30 13:41:19 +0000339 this->setupPaint(&paint);
340 paint.setColor(FAT_PIXEL_COLOR);
341 fMinSurface->getCanvas()->drawPath(path, paint);
342 this->copyMinToMax();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000343
reed@google.combbe66f02013-10-30 13:41:19 +0000344 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000345
reed@google.combbe66f02013-10-30 13:41:19 +0000346 fMatrix.mapPoints(pts, 3);
347 this->drawTriangleSkeleton(max, pts);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000348
halcanary96fcdcc2015-08-27 07:41:13 -0700349 fMaxSurface->draw(canvas, 0, 0, nullptr);
reed@google.combbe66f02013-10-30 13:41:19 +0000350}
351
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000352///////////////////////////////////////////////////////////////////////////////////////////////////
353
354class IndexClick : public SkView::Click {
355 int fIndex;
356public:
357 IndexClick(SkView* v, int index) : SkView::Click(v), fIndex(index) {}
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000358
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000359 static int GetIndex(SkView::Click* click) {
360 return ((IndexClick*)click)->fIndex;
361 }
362};
363
364class DrawLineView : public SampleView {
365 FatBits fFB;
reed@google.combbe66f02013-10-30 13:41:19 +0000366 SkPoint fPts[3];
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000367 bool fIsRect;
reed8716a8a2016-09-19 07:10:36 -0700368 int fZoom = 64;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000369public:
370 DrawLineView() {
reed8716a8a2016-09-19 07:10:36 -0700371 fFB.setWHZ(24*2, 16*2, fZoom);
reedbb886742015-08-15 07:42:31 -0700372 fPts[0].set(1, 1);
373 fPts[1].set(5, 4);
374 fPts[2].set(2, 6);
reed8716a8a2016-09-19 07:10:36 -0700375 SkMatrix::MakeScale(SkIntToScalar(fZoom)).mapPoints(fPts, 3);
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000376 fIsRect = false;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000377 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000378
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000379 void setStyle(FatBits::Style s) {
380 fFB.setStyle(s);
halcanary96fcdcc2015-08-27 07:41:13 -0700381 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000382 }
383
384protected:
mtklein36352bf2015-03-25 18:17:31 -0700385 bool onQuery(SkEvent* evt) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000386 if (SampleCode::TitleQ(*evt)) {
387 SampleCode::TitleR(evt, "FatBits");
388 return true;
389 }
390 SkUnichar uni;
391 if (SampleCode::CharQ(*evt, &uni)) {
392 switch (uni) {
reed@google.com9c0bef12012-11-02 19:59:18 +0000393 case 'c':
394 fFB.setUseClip(!fFB.getUseClip());
halcanary96fcdcc2015-08-27 07:41:13 -0700395 this->inval(nullptr);
reed@google.com9c0bef12012-11-02 19:59:18 +0000396 return true;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000397 case 'r':
398 fIsRect = !fIsRect;
halcanary96fcdcc2015-08-27 07:41:13 -0700399 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000400 return true;
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000401 case 'o':
402 fFB.toggleRectAsOval();
halcanary96fcdcc2015-08-27 07:41:13 -0700403 this->inval(nullptr);
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000404 return true;
reed@google.comc83e3522012-10-22 22:00:08 +0000405 case 'x':
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000406 fFB.setGrid(!fFB.getGrid());
halcanary96fcdcc2015-08-27 07:41:13 -0700407 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000408 return true;
409 case 's':
410 if (FatBits::kStroke_Style == fFB.getStyle()) {
411 this->setStyle(FatBits::kHair_Style);
412 } else {
413 this->setStyle(FatBits::kStroke_Style);
414 }
415 return true;
reeda5d12072015-11-16 18:57:18 -0800416 case 'k': {
417 const SkPaint::Cap caps[] = {
418 SkPaint::kButt_Cap, SkPaint::kRound_Cap, SkPaint::kSquare_Cap,
419 };
420 fFB.fStrokeCap = caps[(fFB.fStrokeCap + 1) % 3];
421 this->inval(nullptr);
422 return true;
423 } break;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000424 case 'a':
425 fFB.setAA(!fFB.getAA());
halcanary96fcdcc2015-08-27 07:41:13 -0700426 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000427 return true;
reed@google.comc83e3522012-10-22 22:00:08 +0000428 case 'w':
429 fFB.setShowSkeleton(!fFB.getShowSkeleton());
halcanary96fcdcc2015-08-27 07:41:13 -0700430 this->inval(nullptr);
reed@google.comc83e3522012-10-22 22:00:08 +0000431 return true;
432 case 'g':
reed8716a8a2016-09-19 07:10:36 -0700433 fFB.togglePixelColors();
halcanary96fcdcc2015-08-27 07:41:13 -0700434 this->inval(nullptr);
reed@google.comc83e3522012-10-22 22:00:08 +0000435 return true;
reed@google.combbe66f02013-10-30 13:41:19 +0000436 case 't':
437 fFB.setTriangle(!fFB.getTriangle());
halcanary96fcdcc2015-08-27 07:41:13 -0700438 this->inval(nullptr);
reed@google.combbe66f02013-10-30 13:41:19 +0000439 return true;
Mike Reedce54bce2017-11-01 21:17:11 -0400440 case '-':
441 fFB.fStrokeWidth -= 0.125f;
442 this->inval(nullptr);
443 return true;
444 case '=':
445 fFB.fStrokeWidth += 0.125f;
446 this->inval(nullptr);
447 return true;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000448 }
449 }
450 return this->INHERITED::onQuery(evt);
451 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000452
mtkleinf0599002015-07-13 06:18:39 -0700453 void onDrawContent(SkCanvas* canvas) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000454 fFB.drawBG(canvas);
reed@google.combbe66f02013-10-30 13:41:19 +0000455 if (fFB.getTriangle()) {
456 fFB.drawTriangle(canvas, fPts);
457 }
458 else if (fIsRect) {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000459 fFB.drawRect(canvas, fPts);
460 } else {
461 fFB.drawLine(canvas, fPts);
462 }
463 fFB.drawFG(canvas);
skia.committer@gmail.com1e34ff72012-10-24 02:01:24 +0000464
reed@google.comffe9d012012-10-23 15:33:41 +0000465 {
466 SkString str;
reed8716a8a2016-09-19 07:10:36 -0700467 str.printf("%s %s %s",
reed@google.comffe9d012012-10-23 15:33:41 +0000468 fFB.getAA() ? "AA" : "BW",
469 FatBits::kHair_Style == fFB.getStyle() ? "Hair" : "Stroke",
reed@google.com9c0bef12012-11-02 19:59:18 +0000470 fFB.getUseClip() ? "clip" : "noclip");
reed@google.comffe9d012012-10-23 15:33:41 +0000471 SkPaint paint;
472 paint.setAntiAlias(true);
473 paint.setTextSize(16);
474 paint.setColor(SK_ColorBLUE);
Cary Clark2a475ea2017-04-28 15:35:12 -0400475 canvas->drawString(str, 10, 16, paint);
reed@google.comffe9d012012-10-23 15:33:41 +0000476 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000477 }
478
mtkleinf0599002015-07-13 06:18:39 -0700479 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000480 SkPoint pt = { x, y };
481 int index = -1;
reed@google.combbe66f02013-10-30 13:41:19 +0000482 int count = fFB.getTriangle() ? 3 : 2;
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000483 SkScalar tol = 12;
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000484
reed@google.combbe66f02013-10-30 13:41:19 +0000485 for (int i = 0; i < count; ++i) {
486 if (fPts[i].equalsWithinTolerance(pt, tol)) {
487 index = i;
488 break;
489 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000490 }
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000491 return new IndexClick(this, index);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000492 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000493
mtklein36352bf2015-03-25 18:17:31 -0700494 bool onClick(Click* click) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000495 int index = IndexClick::GetIndex(click);
reed@google.combbe66f02013-10-30 13:41:19 +0000496 if (index >= 0 && index <= 2) {
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000497 fPts[index] = click->fCurr;
498 } else {
499 SkScalar dx = click->fCurr.fX - click->fPrev.fX;
500 SkScalar dy = click->fCurr.fY - click->fPrev.fY;
501 fPts[0].offset(dx, dy);
502 fPts[1].offset(dx, dy);
reed@google.combbe66f02013-10-30 13:41:19 +0000503 fPts[2].offset(dx, dy);
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000504 }
halcanary96fcdcc2015-08-27 07:41:13 -0700505 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000506 return true;
507 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000508
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000509private:
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000510
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000511 typedef SampleView INHERITED;
512};
513
514//////////////////////////////////////////////////////////////////////////////
515
516static SkView* MyFactory() { return new DrawLineView; }
517static SkViewRegister reg(MyFactory);