blob: c49cdadcb3fde21689f20e6be1ccc59b42b0ac21 [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
reed@google.com9c0bef12012-11-02 19:59:18 +000079 bool getUseClip() const { return fUseClip; }
80 void setUseClip(bool uc) { fUseClip = uc; }
81
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000082 enum Style {
83 kHair_Style,
reed@google.comc83e3522012-10-22 22:00:08 +000084 kStroke_Style,
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000085 };
86 Style getStyle() const { return fStyle; }
87 void setStyle(Style s) { fStyle = s; }
88
89 void setWHZ(int width, int height, int zoom) {
90 fW = width;
91 fH = height;
robertphillips@google.comca47aae2012-12-12 15:58:25 +000092 fZoom = zoom;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000093 fBounds.set(0, 0, SkIntToScalar(width * zoom), SkIntToScalar(height * zoom));
94 fMatrix.setScale(SkIntToScalar(zoom), SkIntToScalar(zoom));
95 fInverse.setScale(SK_Scalar1 / zoom, SK_Scalar1 / zoom);
reed8716a8a2016-09-19 07:10:36 -070096 fShader0 = sk_tool_utils::create_checkerboard_shader(0xFFDDDDDD, 0xFFFFFFFF, zoom);
97 fShader1 = SkShader::MakeColorShader(SK_ColorWHITE);
98 fShader = fShader0;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +000099
commit-bot@chromium.org32678d92014-01-15 02:38:22 +0000100 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
reede8f30622016-03-23 18:59:25 -0700101 fMinSurface = SkSurface::MakeRaster(info);
reede5ea5002014-09-03 11:54:58 -0700102 info = info.makeWH(width * zoom, height * zoom);
reede8f30622016-03-23 18:59:25 -0700103 fMaxSurface = SkSurface::MakeRaster(info);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000104 }
105
106 void drawBG(SkCanvas*);
107 void drawFG(SkCanvas*);
108 void drawLine(SkCanvas*, SkPoint pts[2]);
109 void drawRect(SkCanvas* canvas, SkPoint pts[2]);
reed@google.combbe66f02013-10-30 13:41:19 +0000110 void drawTriangle(SkCanvas* canvas, SkPoint pts[3]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000111
reeda5d12072015-11-16 18:57:18 -0800112 SkPaint::Cap fStrokeCap;
113
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000114private:
reed8716a8a2016-09-19 07:10:36 -0700115 bool fAA, fGrid, fShowSkeleton, fUseClip, fRectAsOval, fUseTriangle;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000116 Style fStyle;
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000117 int fW, fH, fZoom;
reed8716a8a2016-09-19 07:10:36 -0700118 SkMatrix fMatrix, fInverse;
119 SkRect fBounds, fClipRect;
120 sk_sp<SkShader> fShader0;
121 sk_sp<SkShader> fShader1;
122 sk_sp<SkShader> fShader;
123 sk_sp<SkSurface> fMinSurface;
124 sk_sp<SkSurface> fMaxSurface;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000125
126 void setupPaint(SkPaint* paint) {
127 bool aa = this->getAA();
reeda5d12072015-11-16 18:57:18 -0800128 paint->setStrokeCap(fStrokeCap);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000129 switch (fStyle) {
130 case kHair_Style:
131 paint->setStrokeWidth(0);
132 break;
133 case kStroke_Style:
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000134 paint->setStrokeWidth(SK_Scalar1);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000135 break;
136 }
137 paint->setAntiAlias(aa);
138 }
139
reed@google.comc83e3522012-10-22 22:00:08 +0000140 void setupSkeletonPaint(SkPaint* paint) {
141 paint->setStyle(SkPaint::kStroke_Style);
142 paint->setStrokeWidth(WIRE_FRAME_SIZE);
143 paint->setColor(fShowSkeleton ? WIRE_FRAME_COLOR : 0);
144 paint->setAntiAlias(true);
145 }
146
reed@google.combbe66f02013-10-30 13:41:19 +0000147 void drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000148 void drawLineSkeleton(SkCanvas* max, const SkPoint pts[]);
149 void drawRectSkeleton(SkCanvas* max, const SkRect& r) {
150 SkPaint paint;
reed@google.comc83e3522012-10-22 22:00:08 +0000151 this->setupSkeletonPaint(&paint);
152 SkPath path;
153
reed8716a8a2016-09-19 07:10:36 -0700154 fRectAsOval ? path.addOval(r) : path.addRect(r);
reed@google.comc83e3522012-10-22 22:00:08 +0000155 max->drawPath(path, paint);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000156 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000157
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000158 void copyMinToMax() {
reede8f30622016-03-23 18:59:25 -0700159 erase(fMaxSurface.get());
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000160 SkCanvas* canvas = fMaxSurface->getCanvas();
161 canvas->save();
162 canvas->concat(fMatrix);
halcanary96fcdcc2015-08-27 07:41:13 -0700163 fMinSurface->draw(canvas, 0, 0, nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000164 canvas->restore();
165
166 SkPaint paint;
reed374772b2016-10-05 17:33:02 -0700167 paint.setBlendMode(SkBlendMode::kClear);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000168 for (int iy = 1; iy < fH; ++iy) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000169 SkScalar y = SkIntToScalar(iy * fZoom);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000170 canvas->drawLine(0, y - SK_ScalarHalf, 999, y - SK_ScalarHalf, paint);
171 }
172 for (int ix = 1; ix < fW; ++ix) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000173 SkScalar x = SkIntToScalar(ix * fZoom);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000174 canvas->drawLine(x - SK_ScalarHalf, 0, x - SK_ScalarHalf, 999, paint);
175 }
176 }
177};
178
179void FatBits::drawBG(SkCanvas* canvas) {
180 SkPaint paint;
181
182 paint.setShader(fShader);
183 canvas->drawRect(fBounds, paint);
halcanary96fcdcc2015-08-27 07:41:13 -0700184 paint.setShader(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000185}
186
187void FatBits::drawFG(SkCanvas* canvas) {
reed@google.comc83e3522012-10-22 22:00:08 +0000188 SkPaint inner, outer;
189
190 inner.setAntiAlias(true);
191 inner.setColor(SK_ColorBLACK);
192 inner.setStrokeWidth(PIXEL_CENTER_SIZE);
193
194 outer.setAntiAlias(true);
195 outer.setColor(SK_ColorWHITE);
196 outer.setStrokeWidth(PIXEL_CENTER_SIZE + 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000197
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000198 SkScalar half = SkIntToScalar(fZoom) / 2;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000199 for (int iy = 0; iy < fH; ++iy) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000200 SkScalar y = SkIntToScalar(iy * fZoom) + half;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000201 for (int ix = 0; ix < fW; ++ix) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000202 SkScalar x = SkIntToScalar(ix * fZoom) + half;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000203
reed@google.comc83e3522012-10-22 22:00:08 +0000204 canvas->drawPoint(x, y, outer);
205 canvas->drawPoint(x, y, inner);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000206 }
207 }
reed@google.com9c0bef12012-11-02 19:59:18 +0000208
209 if (fUseClip) {
210 SkPaint p;
211 p.setStyle(SkPaint::kStroke_Style);
212 p.setColor(SK_ColorLTGRAY);
213 SkRect r = {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000214 fClipRect.fLeft * fZoom,
215 fClipRect.fTop * fZoom,
216 fClipRect.fRight * fZoom,
217 fClipRect.fBottom * fZoom
reed@google.com9c0bef12012-11-02 19:59:18 +0000218 };
219 canvas->drawRect(r, p);
220 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000221}
222
223void FatBits::drawLineSkeleton(SkCanvas* max, const SkPoint pts[]) {
224 SkPaint paint;
reed@google.comc83e3522012-10-22 22:00:08 +0000225 this->setupSkeletonPaint(&paint);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000226
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000227 SkPath path;
228 path.moveTo(pts[0]);
229 path.lineTo(pts[1]);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000230
reed8716a8a2016-09-19 07:10:36 -0700231 if (fStyle == kStroke_Style) {
232 SkPaint p;
233 p.setStyle(SkPaint::kStroke_Style);
234 p.setStrokeWidth(SK_Scalar1 * fZoom);
235 p.setStrokeCap(fStrokeCap);
236 SkPath dst;
237 p.getFillPath(path, &dst);
238 path = dst;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000239
reed8716a8a2016-09-19 07:10:36 -0700240 path.moveTo(pts[0]);
241 path.lineTo(pts[1]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000242 }
243 max->drawPath(path, paint);
244}
245
246void FatBits::drawLine(SkCanvas* canvas, SkPoint pts[]) {
247 SkPaint paint;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000248
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000249 fInverse.mapPoints(pts, 2);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000250
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000251 if (fGrid) {
reed@google.combbe66f02013-10-30 13:41:19 +0000252 apply_grid(pts, 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000253 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000254
reede8f30622016-03-23 18:59:25 -0700255 erase(fMinSurface.get());
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000256 this->setupPaint(&paint);
reed@google.comc83e3522012-10-22 22:00:08 +0000257 paint.setColor(FAT_PIXEL_COLOR);
reed@google.com9c0bef12012-11-02 19:59:18 +0000258 if (fUseClip) {
259 fMinSurface->getCanvas()->save();
260 SkRect r = fClipRect;
261 r.inset(SK_Scalar1/3, SK_Scalar1/3);
Mike Reedc1f77742016-12-09 09:00:50 -0500262 fMinSurface->getCanvas()->clipRect(r, kIntersect_SkClipOp, true);
reed@google.com9c0bef12012-11-02 19:59:18 +0000263 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000264 fMinSurface->getCanvas()->drawLine(pts[0].fX, pts[0].fY, pts[1].fX, pts[1].fY, paint);
reed@google.com9c0bef12012-11-02 19:59:18 +0000265 if (fUseClip) {
266 fMinSurface->getCanvas()->restore();
267 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000268 this->copyMinToMax();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000269
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000270 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000271
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000272 fMatrix.mapPoints(pts, 2);
273 this->drawLineSkeleton(max, pts);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000274
halcanary96fcdcc2015-08-27 07:41:13 -0700275 fMaxSurface->draw(canvas, 0, 0, nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000276}
277
278void FatBits::drawRect(SkCanvas* canvas, SkPoint pts[2]) {
279 SkPaint paint;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000280
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000281 fInverse.mapPoints(pts, 2);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000282
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000283 if (fGrid) {
reed@google.combbe66f02013-10-30 13:41:19 +0000284 apply_grid(pts, 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000285 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000286
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000287 SkRect r;
288 r.set(pts, 2);
289
reede8f30622016-03-23 18:59:25 -0700290 erase(fMinSurface.get());
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000291 this->setupPaint(&paint);
reed@google.comc83e3522012-10-22 22:00:08 +0000292 paint.setColor(FAT_PIXEL_COLOR);
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000293 {
294 SkCanvas* c = fMinSurface->getCanvas();
295 fRectAsOval ? c->drawOval(r, paint) : c->drawRect(r, paint);
296 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000297 this->copyMinToMax();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000298
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000299 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000300
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000301 fMatrix.mapPoints(pts, 2);
302 r.set(pts, 2);
303 this->drawRectSkeleton(max, r);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000304
halcanary96fcdcc2015-08-27 07:41:13 -0700305 fMaxSurface->draw(canvas, 0, 0, nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000306}
307
reed@google.combbe66f02013-10-30 13:41:19 +0000308void FatBits::drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]) {
309 SkPaint paint;
310 this->setupSkeletonPaint(&paint);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000311
reed@google.combbe66f02013-10-30 13:41:19 +0000312 SkPath path;
313 path.moveTo(pts[0]);
314 path.lineTo(pts[1]);
315 path.lineTo(pts[2]);
316 path.close();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000317
reed@google.combbe66f02013-10-30 13:41:19 +0000318 max->drawPath(path, paint);
319}
320
321void FatBits::drawTriangle(SkCanvas* canvas, SkPoint pts[3]) {
322 SkPaint paint;
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000323
reed@google.combbe66f02013-10-30 13:41:19 +0000324 fInverse.mapPoints(pts, 3);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000325
reed@google.combbe66f02013-10-30 13:41:19 +0000326 if (fGrid) {
327 apply_grid(pts, 3);
328 }
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000329
reed@google.combbe66f02013-10-30 13:41:19 +0000330 SkPath path;
331 path.moveTo(pts[0]);
332 path.lineTo(pts[1]);
333 path.lineTo(pts[2]);
334 path.close();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000335
reede8f30622016-03-23 18:59:25 -0700336 erase(fMinSurface.get());
reed@google.combbe66f02013-10-30 13:41:19 +0000337 this->setupPaint(&paint);
338 paint.setColor(FAT_PIXEL_COLOR);
339 fMinSurface->getCanvas()->drawPath(path, paint);
340 this->copyMinToMax();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000341
reed@google.combbe66f02013-10-30 13:41:19 +0000342 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000343
reed@google.combbe66f02013-10-30 13:41:19 +0000344 fMatrix.mapPoints(pts, 3);
345 this->drawTriangleSkeleton(max, pts);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000346
halcanary96fcdcc2015-08-27 07:41:13 -0700347 fMaxSurface->draw(canvas, 0, 0, nullptr);
reed@google.combbe66f02013-10-30 13:41:19 +0000348}
349
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000350///////////////////////////////////////////////////////////////////////////////////////////////////
351
352class IndexClick : public SkView::Click {
353 int fIndex;
354public:
355 IndexClick(SkView* v, int index) : SkView::Click(v), fIndex(index) {}
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000356
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000357 static int GetIndex(SkView::Click* click) {
358 return ((IndexClick*)click)->fIndex;
359 }
360};
361
362class DrawLineView : public SampleView {
363 FatBits fFB;
reed@google.combbe66f02013-10-30 13:41:19 +0000364 SkPoint fPts[3];
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000365 bool fIsRect;
reed8716a8a2016-09-19 07:10:36 -0700366 int fZoom = 64;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000367public:
368 DrawLineView() {
reed8716a8a2016-09-19 07:10:36 -0700369 fFB.setWHZ(24*2, 16*2, fZoom);
reedbb886742015-08-15 07:42:31 -0700370 fPts[0].set(1, 1);
371 fPts[1].set(5, 4);
372 fPts[2].set(2, 6);
reed8716a8a2016-09-19 07:10:36 -0700373 SkMatrix::MakeScale(SkIntToScalar(fZoom)).mapPoints(fPts, 3);
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000374 fIsRect = false;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000375 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000376
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000377 void setStyle(FatBits::Style s) {
378 fFB.setStyle(s);
halcanary96fcdcc2015-08-27 07:41:13 -0700379 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000380 }
381
382protected:
mtklein36352bf2015-03-25 18:17:31 -0700383 bool onQuery(SkEvent* evt) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000384 if (SampleCode::TitleQ(*evt)) {
385 SampleCode::TitleR(evt, "FatBits");
386 return true;
387 }
388 SkUnichar uni;
389 if (SampleCode::CharQ(*evt, &uni)) {
390 switch (uni) {
reed@google.com9c0bef12012-11-02 19:59:18 +0000391 case 'c':
392 fFB.setUseClip(!fFB.getUseClip());
halcanary96fcdcc2015-08-27 07:41:13 -0700393 this->inval(nullptr);
reed@google.com9c0bef12012-11-02 19:59:18 +0000394 return true;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000395 case 'r':
396 fIsRect = !fIsRect;
halcanary96fcdcc2015-08-27 07:41:13 -0700397 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000398 return true;
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000399 case 'o':
400 fFB.toggleRectAsOval();
halcanary96fcdcc2015-08-27 07:41:13 -0700401 this->inval(nullptr);
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000402 return true;
reed@google.comc83e3522012-10-22 22:00:08 +0000403 case 'x':
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000404 fFB.setGrid(!fFB.getGrid());
halcanary96fcdcc2015-08-27 07:41:13 -0700405 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000406 return true;
407 case 's':
408 if (FatBits::kStroke_Style == fFB.getStyle()) {
409 this->setStyle(FatBits::kHair_Style);
410 } else {
411 this->setStyle(FatBits::kStroke_Style);
412 }
413 return true;
reeda5d12072015-11-16 18:57:18 -0800414 case 'k': {
415 const SkPaint::Cap caps[] = {
416 SkPaint::kButt_Cap, SkPaint::kRound_Cap, SkPaint::kSquare_Cap,
417 };
418 fFB.fStrokeCap = caps[(fFB.fStrokeCap + 1) % 3];
419 this->inval(nullptr);
420 return true;
421 } break;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000422 case 'a':
423 fFB.setAA(!fFB.getAA());
halcanary96fcdcc2015-08-27 07:41:13 -0700424 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000425 return true;
reed@google.comc83e3522012-10-22 22:00:08 +0000426 case 'w':
427 fFB.setShowSkeleton(!fFB.getShowSkeleton());
halcanary96fcdcc2015-08-27 07:41:13 -0700428 this->inval(nullptr);
reed@google.comc83e3522012-10-22 22:00:08 +0000429 return true;
430 case 'g':
reed8716a8a2016-09-19 07:10:36 -0700431 fFB.togglePixelColors();
halcanary96fcdcc2015-08-27 07:41:13 -0700432 this->inval(nullptr);
reed@google.comc83e3522012-10-22 22:00:08 +0000433 return true;
reed@google.combbe66f02013-10-30 13:41:19 +0000434 case 't':
435 fFB.setTriangle(!fFB.getTriangle());
halcanary96fcdcc2015-08-27 07:41:13 -0700436 this->inval(nullptr);
reed@google.combbe66f02013-10-30 13:41:19 +0000437 return true;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000438 }
439 }
440 return this->INHERITED::onQuery(evt);
441 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000442
mtkleinf0599002015-07-13 06:18:39 -0700443 void onDrawContent(SkCanvas* canvas) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000444 fFB.drawBG(canvas);
reed@google.combbe66f02013-10-30 13:41:19 +0000445 if (fFB.getTriangle()) {
446 fFB.drawTriangle(canvas, fPts);
447 }
448 else if (fIsRect) {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000449 fFB.drawRect(canvas, fPts);
450 } else {
451 fFB.drawLine(canvas, fPts);
452 }
453 fFB.drawFG(canvas);
skia.committer@gmail.com1e34ff72012-10-24 02:01:24 +0000454
reed@google.comffe9d012012-10-23 15:33:41 +0000455 {
456 SkString str;
reed8716a8a2016-09-19 07:10:36 -0700457 str.printf("%s %s %s",
reed@google.comffe9d012012-10-23 15:33:41 +0000458 fFB.getAA() ? "AA" : "BW",
459 FatBits::kHair_Style == fFB.getStyle() ? "Hair" : "Stroke",
reed@google.com9c0bef12012-11-02 19:59:18 +0000460 fFB.getUseClip() ? "clip" : "noclip");
reed@google.comffe9d012012-10-23 15:33:41 +0000461 SkPaint paint;
462 paint.setAntiAlias(true);
463 paint.setTextSize(16);
464 paint.setColor(SK_ColorBLUE);
465 canvas->drawText(str.c_str(), str.size(), 10, 16, paint);
466 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000467 }
468
mtkleinf0599002015-07-13 06:18:39 -0700469 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000470 SkPoint pt = { x, y };
471 int index = -1;
reed@google.combbe66f02013-10-30 13:41:19 +0000472 int count = fFB.getTriangle() ? 3 : 2;
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000473 SkScalar tol = 12;
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000474
reed@google.combbe66f02013-10-30 13:41:19 +0000475 for (int i = 0; i < count; ++i) {
476 if (fPts[i].equalsWithinTolerance(pt, tol)) {
477 index = i;
478 break;
479 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000480 }
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000481 return new IndexClick(this, index);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000482 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000483
mtklein36352bf2015-03-25 18:17:31 -0700484 bool onClick(Click* click) override {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000485 int index = IndexClick::GetIndex(click);
reed@google.combbe66f02013-10-30 13:41:19 +0000486 if (index >= 0 && index <= 2) {
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000487 fPts[index] = click->fCurr;
488 } else {
489 SkScalar dx = click->fCurr.fX - click->fPrev.fX;
490 SkScalar dy = click->fCurr.fY - click->fPrev.fY;
491 fPts[0].offset(dx, dy);
492 fPts[1].offset(dx, dy);
reed@google.combbe66f02013-10-30 13:41:19 +0000493 fPts[2].offset(dx, dy);
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000494 }
halcanary96fcdcc2015-08-27 07:41:13 -0700495 this->inval(nullptr);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000496 return true;
497 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000498
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000499private:
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000500
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000501 typedef SampleView INHERITED;
502};
503
504//////////////////////////////////////////////////////////////////////////////
505
506static SkView* MyFactory() { return new DrawLineView; }
507static SkViewRegister reg(MyFactory);