blob: 6900fae3eb6583e9394fbae83a273d3e360566b7 [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
8#include "SampleCode.h"
9#include "SkView.h"
10#include "SkCanvas.h"
11#include "SkPath.h"
12#include "SkRegion.h"
13#include "SkShader.h"
14#include "SkUtils.h"
15#include "SkImage.h"
16#include "SkSurface.h"
17
reed@google.comc83e3522012-10-22 22:00:08 +000018#define FAT_PIXEL_COLOR SK_ColorBLACK
19#define PIXEL_CENTER_SIZE 3
20#define WIRE_FRAME_COLOR 0xFFFF0000 /*0xFF00FFFF*/
21#define WIRE_FRAME_SIZE 1.5f
22
reed@google.combbe66f02013-10-30 13:41:19 +000023static SkScalar apply_grid(SkScalar x) {
24 const SkScalar grid = 2;
25 return SkScalarRoundToScalar(x * grid) / grid;
26}
27
28static void apply_grid(SkPoint pts[], int count) {
29 for (int i = 0; i < count; ++i) {
30 pts[i].set(apply_grid(pts[i].fX), apply_grid(pts[i].fY));
31 }
32}
33
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000034static void erase(SkSurface* surface) {
junov@google.comdbfac8a2012-12-06 21:47:40 +000035 surface->getCanvas()->clear(SK_ColorTRANSPARENT);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000036}
37
38static SkShader* createChecker() {
reed@google.com9c0bef12012-11-02 19:59:18 +000039// SkColor colors[] = { 0xFFFDFDFD, 0xFFF4F4F4 };
40 SkColor colors[] = { 0xFFFFFFFF, 0xFFFFFFFF };
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000041 SkBitmap bm;
commit-bot@chromium.orga8c18312014-02-17 02:55:57 +000042 bm.allocN32Pixels(2, 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000043 bm.lockPixels();
reed@google.com9c0bef12012-11-02 19:59:18 +000044 *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = SkPreMultiplyColor(colors[0]);
45 *bm.getAddr32(0, 1) = *bm.getAddr32(1, 0) = SkPreMultiplyColor(colors[1]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000046 SkShader* s = SkShader::CreateBitmapShader(bm, SkShader::kRepeat_TileMode,
47 SkShader::kRepeat_TileMode);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +000048
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000049 SkMatrix m;
50 m.setScale(12, 12);
51 s->setLocalMatrix(m);
52 return s;
53}
54
55class FatBits {
56public:
57 FatBits() : fShader(createChecker()) {
58 fAA = false;
59 fStyle = kHair_Style;
60 fGrid = true;
reed@google.comc83e3522012-10-22 22:00:08 +000061 fShowSkeleton = true;
62 fUseGPU = false;
reed@google.com9c0bef12012-11-02 19:59:18 +000063 fUseClip = false;
mike@reedtribe.org64494e92013-03-06 02:18:33 +000064 fRectAsOval = false;
reed@google.combbe66f02013-10-30 13:41:19 +000065 fUseTriangle = false;
skia.committer@gmail.com1aa90cf2012-11-06 13:18:25 +000066
reed@google.com9c0bef12012-11-02 19:59:18 +000067 fClipRect.set(2, 2, 11, 8 );
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000068 }
69
robertphillips@google.comca47aae2012-12-12 15:58:25 +000070 int getZoom() const { return fZoom; }
reed@google.comc83e3522012-10-22 22:00:08 +000071
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000072 bool getAA() const { return fAA; }
73 void setAA(bool aa) { fAA = aa; }
74
75 bool getGrid() const { return fGrid; }
76 void setGrid(bool g) { fGrid = g; }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +000077
reed@google.comc83e3522012-10-22 22:00:08 +000078 bool getShowSkeleton() const { return fShowSkeleton; }
79 void setShowSkeleton(bool ss) { fShowSkeleton = ss; }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +000080
reed@google.comc83e3522012-10-22 22:00:08 +000081 bool getUseGPU() const { return fUseGPU; }
82 void setUseGPU(bool ug) { fUseGPU = ug; }
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +000083
reed@google.combbe66f02013-10-30 13:41:19 +000084 bool getTriangle() const { return fUseTriangle; }
85 void setTriangle(bool ut) { fUseTriangle = ut; }
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +000086
mike@reedtribe.org64494e92013-03-06 02:18:33 +000087 void toggleRectAsOval() { fRectAsOval = !fRectAsOval; }
88
reed@google.com9c0bef12012-11-02 19:59:18 +000089 bool getUseClip() const { return fUseClip; }
90 void setUseClip(bool uc) { fUseClip = uc; }
91
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000092 enum Style {
93 kHair_Style,
reed@google.comc83e3522012-10-22 22:00:08 +000094 kStroke_Style,
mike@reedtribe.org50e4c722012-10-22 03:59:34 +000095 };
96 Style getStyle() const { return fStyle; }
97 void setStyle(Style s) { fStyle = s; }
98
99 void setWHZ(int width, int height, int zoom) {
100 fW = width;
101 fH = height;
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000102 fZoom = zoom;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000103 fBounds.set(0, 0, SkIntToScalar(width * zoom), SkIntToScalar(height * zoom));
104 fMatrix.setScale(SkIntToScalar(zoom), SkIntToScalar(zoom));
105 fInverse.setScale(SK_Scalar1 / zoom, SK_Scalar1 / zoom);
106 fShader->setLocalMatrix(fMatrix);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000107
commit-bot@chromium.org32678d92014-01-15 02:38:22 +0000108 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
reed@google.combbe66f02013-10-30 13:41:19 +0000109 fMinSurface.reset(SkSurface::NewRaster(info));
110 info.fWidth *= zoom;
111 info.fHeight *= zoom;
112 fMaxSurface.reset(SkSurface::NewRaster(info));
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000113 }
114
115 void drawBG(SkCanvas*);
116 void drawFG(SkCanvas*);
117 void drawLine(SkCanvas*, SkPoint pts[2]);
118 void drawRect(SkCanvas* canvas, SkPoint pts[2]);
reed@google.combbe66f02013-10-30 13:41:19 +0000119 void drawTriangle(SkCanvas* canvas, SkPoint pts[3]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000120
121private:
reed@google.combbe66f02013-10-30 13:41:19 +0000122 bool fAA, fGrid, fShowSkeleton, fUseGPU, fUseClip, fRectAsOval, fUseTriangle;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000123 Style fStyle;
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000124 int fW, fH, fZoom;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000125 SkMatrix fMatrix, fInverse;
reed@google.com9c0bef12012-11-02 19:59:18 +0000126 SkRect fBounds, fClipRect;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000127 SkAutoTUnref<SkShader> fShader;
128 SkAutoTUnref<SkSurface> fMinSurface;
129 SkAutoTUnref<SkSurface> fMaxSurface;
130
131 void setupPaint(SkPaint* paint) {
132 bool aa = this->getAA();
133 switch (fStyle) {
134 case kHair_Style:
135 paint->setStrokeWidth(0);
136 break;
137 case kStroke_Style:
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000138 paint->setStrokeWidth(SK_Scalar1);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000139 break;
140 }
141 paint->setAntiAlias(aa);
142 }
143
reed@google.comc83e3522012-10-22 22:00:08 +0000144 void setupSkeletonPaint(SkPaint* paint) {
145 paint->setStyle(SkPaint::kStroke_Style);
146 paint->setStrokeWidth(WIRE_FRAME_SIZE);
147 paint->setColor(fShowSkeleton ? WIRE_FRAME_COLOR : 0);
148 paint->setAntiAlias(true);
149 }
150
reed@google.combbe66f02013-10-30 13:41:19 +0000151 void drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000152 void drawLineSkeleton(SkCanvas* max, const SkPoint pts[]);
153 void drawRectSkeleton(SkCanvas* max, const SkRect& r) {
154 SkPaint paint;
reed@google.comc83e3522012-10-22 22:00:08 +0000155 this->setupSkeletonPaint(&paint);
156 SkPath path;
157
158 if (fUseGPU && fAA) {
159 SkRect rr = r;
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000160 rr.inset(SkIntToScalar(fZoom)/2, SkIntToScalar(fZoom)/2);
reed@google.comc83e3522012-10-22 22:00:08 +0000161 path.addRect(rr);
162 path.moveTo(rr.fLeft, rr.fTop);
163 path.lineTo(rr.fRight, rr.fBottom);
164 rr = r;
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000165 rr.inset(-SkIntToScalar(fZoom)/2, -SkIntToScalar(fZoom)/2);
reed@google.comc83e3522012-10-22 22:00:08 +0000166 path.addRect(rr);
167 } else {
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000168 fRectAsOval ? path.addOval(r) : path.addRect(r);
reed@google.comc83e3522012-10-22 22:00:08 +0000169 if (fUseGPU) {
170 path.moveTo(r.fLeft, r.fTop);
171 path.lineTo(r.fRight, r.fBottom);
172 }
173 }
174 max->drawPath(path, paint);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000175 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000176
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000177 void copyMinToMax() {
178 erase(fMaxSurface);
179 SkCanvas* canvas = fMaxSurface->getCanvas();
180 canvas->save();
181 canvas->concat(fMatrix);
182 fMinSurface->draw(canvas, 0, 0, NULL);
183 canvas->restore();
184
185 SkPaint paint;
186 paint.setXfermodeMode(SkXfermode::kClear_Mode);
187 for (int iy = 1; iy < fH; ++iy) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000188 SkScalar y = SkIntToScalar(iy * fZoom);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000189 canvas->drawLine(0, y - SK_ScalarHalf, 999, y - SK_ScalarHalf, paint);
190 }
191 for (int ix = 1; ix < fW; ++ix) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000192 SkScalar x = SkIntToScalar(ix * fZoom);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000193 canvas->drawLine(x - SK_ScalarHalf, 0, x - SK_ScalarHalf, 999, paint);
194 }
195 }
196};
197
198void FatBits::drawBG(SkCanvas* canvas) {
199 SkPaint paint;
200
201 paint.setShader(fShader);
202 canvas->drawRect(fBounds, paint);
203 paint.setShader(NULL);
204}
205
206void FatBits::drawFG(SkCanvas* canvas) {
reed@google.comc83e3522012-10-22 22:00:08 +0000207 SkPaint inner, outer;
208
209 inner.setAntiAlias(true);
210 inner.setColor(SK_ColorBLACK);
211 inner.setStrokeWidth(PIXEL_CENTER_SIZE);
212
213 outer.setAntiAlias(true);
214 outer.setColor(SK_ColorWHITE);
215 outer.setStrokeWidth(PIXEL_CENTER_SIZE + 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000216
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000217 SkScalar half = SkIntToScalar(fZoom) / 2;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000218 for (int iy = 0; iy < fH; ++iy) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000219 SkScalar y = SkIntToScalar(iy * fZoom) + half;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000220 for (int ix = 0; ix < fW; ++ix) {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000221 SkScalar x = SkIntToScalar(ix * fZoom) + half;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000222
reed@google.comc83e3522012-10-22 22:00:08 +0000223 canvas->drawPoint(x, y, outer);
224 canvas->drawPoint(x, y, inner);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000225 }
226 }
reed@google.com9c0bef12012-11-02 19:59:18 +0000227
228 if (fUseClip) {
229 SkPaint p;
230 p.setStyle(SkPaint::kStroke_Style);
231 p.setColor(SK_ColorLTGRAY);
232 SkRect r = {
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000233 fClipRect.fLeft * fZoom,
234 fClipRect.fTop * fZoom,
235 fClipRect.fRight * fZoom,
236 fClipRect.fBottom * fZoom
reed@google.com9c0bef12012-11-02 19:59:18 +0000237 };
238 canvas->drawRect(r, p);
239 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000240}
241
242void FatBits::drawLineSkeleton(SkCanvas* max, const SkPoint pts[]) {
243 SkPaint paint;
reed@google.comc83e3522012-10-22 22:00:08 +0000244 this->setupSkeletonPaint(&paint);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000245
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000246 SkPath path;
247 path.moveTo(pts[0]);
248 path.lineTo(pts[1]);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000249
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000250 switch (fStyle) {
251 case kHair_Style:
reed@google.comc83e3522012-10-22 22:00:08 +0000252 if (fUseGPU) {
253 SkPaint p;
254 p.setStyle(SkPaint::kStroke_Style);
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000255 p.setStrokeWidth(SK_Scalar1 * fZoom);
reed@google.comc83e3522012-10-22 22:00:08 +0000256 SkPath dst;
257 p.getFillPath(path, &dst);
258 path.addPath(dst);
259 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000260 break;
261 case kStroke_Style: {
262 SkPaint p;
263 p.setStyle(SkPaint::kStroke_Style);
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000264 p.setStrokeWidth(SK_Scalar1 * fZoom);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000265 SkPath dst;
266 p.getFillPath(path, &dst);
267 path = dst;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000268
reed@google.comc83e3522012-10-22 22:00:08 +0000269 if (fUseGPU) {
270 path.moveTo(dst.getPoint(0));
271 path.lineTo(dst.getPoint(2));
272 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000273 } break;
274 }
275 max->drawPath(path, paint);
276}
277
278void FatBits::drawLine(SkCanvas* canvas, SkPoint pts[]) {
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 erase(fMinSurface);
288 this->setupPaint(&paint);
reed@google.comc83e3522012-10-22 22:00:08 +0000289 paint.setColor(FAT_PIXEL_COLOR);
reed@google.com9c0bef12012-11-02 19:59:18 +0000290 if (fUseClip) {
291 fMinSurface->getCanvas()->save();
292 SkRect r = fClipRect;
293 r.inset(SK_Scalar1/3, SK_Scalar1/3);
294 fMinSurface->getCanvas()->clipRect(r, SkRegion::kIntersect_Op, true);
295 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000296 fMinSurface->getCanvas()->drawLine(pts[0].fX, pts[0].fY, pts[1].fX, pts[1].fY, paint);
reed@google.com9c0bef12012-11-02 19:59:18 +0000297 if (fUseClip) {
298 fMinSurface->getCanvas()->restore();
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 this->drawLineSkeleton(max, pts);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000306
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000307 fMaxSurface->draw(canvas, 0, 0, NULL);
308}
309
310void FatBits::drawRect(SkCanvas* canvas, SkPoint pts[2]) {
311 SkPaint paint;
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000312
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000313 fInverse.mapPoints(pts, 2);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000314
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000315 if (fGrid) {
reed@google.combbe66f02013-10-30 13:41:19 +0000316 apply_grid(pts, 2);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000317 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000318
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000319 SkRect r;
320 r.set(pts, 2);
321
322 erase(fMinSurface);
323 this->setupPaint(&paint);
reed@google.comc83e3522012-10-22 22:00:08 +0000324 paint.setColor(FAT_PIXEL_COLOR);
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000325 {
326 SkCanvas* c = fMinSurface->getCanvas();
327 fRectAsOval ? c->drawOval(r, paint) : c->drawRect(r, paint);
328 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000329 this->copyMinToMax();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000330
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000331 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000332
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000333 fMatrix.mapPoints(pts, 2);
334 r.set(pts, 2);
335 this->drawRectSkeleton(max, r);
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000336
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000337 fMaxSurface->draw(canvas, 0, 0, NULL);
338}
339
reed@google.combbe66f02013-10-30 13:41:19 +0000340void FatBits::drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]) {
341 SkPaint paint;
342 this->setupSkeletonPaint(&paint);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000343
reed@google.combbe66f02013-10-30 13:41:19 +0000344 SkPath path;
345 path.moveTo(pts[0]);
346 path.lineTo(pts[1]);
347 path.lineTo(pts[2]);
348 path.close();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000349
reed@google.combbe66f02013-10-30 13:41:19 +0000350 max->drawPath(path, paint);
351}
352
353void FatBits::drawTriangle(SkCanvas* canvas, SkPoint pts[3]) {
354 SkPaint paint;
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000355
reed@google.combbe66f02013-10-30 13:41:19 +0000356 fInverse.mapPoints(pts, 3);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000357
reed@google.combbe66f02013-10-30 13:41:19 +0000358 if (fGrid) {
359 apply_grid(pts, 3);
360 }
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000361
reed@google.combbe66f02013-10-30 13:41:19 +0000362 SkPath path;
363 path.moveTo(pts[0]);
364 path.lineTo(pts[1]);
365 path.lineTo(pts[2]);
366 path.close();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000367
reed@google.combbe66f02013-10-30 13:41:19 +0000368 erase(fMinSurface);
369 this->setupPaint(&paint);
370 paint.setColor(FAT_PIXEL_COLOR);
371 fMinSurface->getCanvas()->drawPath(path, paint);
372 this->copyMinToMax();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000373
reed@google.combbe66f02013-10-30 13:41:19 +0000374 SkCanvas* max = fMaxSurface->getCanvas();
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000375
reed@google.combbe66f02013-10-30 13:41:19 +0000376 fMatrix.mapPoints(pts, 3);
377 this->drawTriangleSkeleton(max, pts);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000378
reed@google.combbe66f02013-10-30 13:41:19 +0000379 fMaxSurface->draw(canvas, 0, 0, NULL);
380}
381
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000382///////////////////////////////////////////////////////////////////////////////////////////////////
383
384class IndexClick : public SkView::Click {
385 int fIndex;
386public:
387 IndexClick(SkView* v, int index) : SkView::Click(v), fIndex(index) {}
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000388
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000389 static int GetIndex(SkView::Click* click) {
390 return ((IndexClick*)click)->fIndex;
391 }
392};
393
394class DrawLineView : public SampleView {
395 FatBits fFB;
reed@google.combbe66f02013-10-30 13:41:19 +0000396 SkPoint fPts[3];
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000397 bool fIsRect;
398public:
399 DrawLineView() {
400 fFB.setWHZ(24, 16, 48);
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000401 fPts[0].set(48, 48);
402 fPts[1].set(48 * 5, 48 * 4);
reed@google.combbe66f02013-10-30 13:41:19 +0000403 fPts[2].set(48 * 2, 48 * 6);
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000404 fIsRect = false;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000405 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000406
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000407 void setStyle(FatBits::Style s) {
408 fFB.setStyle(s);
409 this->inval(NULL);
410 }
411
412protected:
413 virtual bool onQuery(SkEvent* evt) SK_OVERRIDE {
414 if (SampleCode::TitleQ(*evt)) {
415 SampleCode::TitleR(evt, "FatBits");
416 return true;
417 }
418 SkUnichar uni;
419 if (SampleCode::CharQ(*evt, &uni)) {
420 switch (uni) {
reed@google.com9c0bef12012-11-02 19:59:18 +0000421 case 'c':
422 fFB.setUseClip(!fFB.getUseClip());
423 this->inval(NULL);
424 return true;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000425 case 'r':
426 fIsRect = !fIsRect;
427 this->inval(NULL);
428 return true;
mike@reedtribe.org64494e92013-03-06 02:18:33 +0000429 case 'o':
430 fFB.toggleRectAsOval();
431 this->inval(NULL);
432 return true;
reed@google.comc83e3522012-10-22 22:00:08 +0000433 case 'x':
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000434 fFB.setGrid(!fFB.getGrid());
435 this->inval(NULL);
436 return true;
437 case 's':
438 if (FatBits::kStroke_Style == fFB.getStyle()) {
439 this->setStyle(FatBits::kHair_Style);
440 } else {
441 this->setStyle(FatBits::kStroke_Style);
442 }
443 return true;
444 case 'a':
445 fFB.setAA(!fFB.getAA());
446 this->inval(NULL);
447 return true;
reed@google.comc83e3522012-10-22 22:00:08 +0000448 case 'w':
449 fFB.setShowSkeleton(!fFB.getShowSkeleton());
450 this->inval(NULL);
451 return true;
452 case 'g':
453 fFB.setUseGPU(!fFB.getUseGPU());
454 this->inval(NULL);
455 return true;
reed@google.combbe66f02013-10-30 13:41:19 +0000456 case 't':
457 fFB.setTriangle(!fFB.getTriangle());
458 this->inval(NULL);
459 return true;
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000460 }
461 }
462 return this->INHERITED::onQuery(evt);
463 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000464
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000465 virtual void onDrawContent(SkCanvas* canvas) {
466 fFB.drawBG(canvas);
reed@google.combbe66f02013-10-30 13:41:19 +0000467 if (fFB.getTriangle()) {
468 fFB.drawTriangle(canvas, fPts);
469 }
470 else if (fIsRect) {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000471 fFB.drawRect(canvas, fPts);
472 } else {
473 fFB.drawLine(canvas, fPts);
474 }
475 fFB.drawFG(canvas);
skia.committer@gmail.com1e34ff72012-10-24 02:01:24 +0000476
reed@google.comffe9d012012-10-23 15:33:41 +0000477 {
478 SkString str;
reed@google.com9c0bef12012-11-02 19:59:18 +0000479 str.printf("%s %s %s %s",
reed@google.comffe9d012012-10-23 15:33:41 +0000480 fFB.getAA() ? "AA" : "BW",
481 FatBits::kHair_Style == fFB.getStyle() ? "Hair" : "Stroke",
reed@google.com9c0bef12012-11-02 19:59:18 +0000482 fFB.getUseGPU() ? "GPU" : "CPU",
483 fFB.getUseClip() ? "clip" : "noclip");
reed@google.comffe9d012012-10-23 15:33:41 +0000484 SkPaint paint;
485 paint.setAntiAlias(true);
486 paint.setTextSize(16);
487 paint.setColor(SK_ColorBLUE);
488 canvas->drawText(str.c_str(), str.size(), 10, 16, paint);
489 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000490 }
491
mike@reedtribe.org093455c2013-01-28 02:21:27 +0000492 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
493 unsigned modi) SK_OVERRIDE {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000494 SkPoint pt = { x, y };
495 int index = -1;
reed@google.combbe66f02013-10-30 13:41:19 +0000496 int count = fFB.getTriangle() ? 3 : 2;
reed@google.comcdbcb3e2012-10-22 22:10:20 +0000497 SkScalar tol = 12;
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +0000498
reed@google.combbe66f02013-10-30 13:41:19 +0000499 for (int i = 0; i < count; ++i) {
500 if (fPts[i].equalsWithinTolerance(pt, tol)) {
501 index = i;
502 break;
503 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000504 }
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000505 return new IndexClick(this, index);
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000506 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000507
mike@reedtribe.org093455c2013-01-28 02:21:27 +0000508 virtual bool onClick(Click* click) SK_OVERRIDE {
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000509 int index = IndexClick::GetIndex(click);
reed@google.combbe66f02013-10-30 13:41:19 +0000510 if (index >= 0 && index <= 2) {
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000511 fPts[index] = click->fCurr;
512 } else {
513 SkScalar dx = click->fCurr.fX - click->fPrev.fX;
514 SkScalar dy = click->fCurr.fY - click->fPrev.fY;
515 fPts[0].offset(dx, dy);
516 fPts[1].offset(dx, dy);
reed@google.combbe66f02013-10-30 13:41:19 +0000517 fPts[2].offset(dx, dy);
mike@reedtribe.orgc892a152012-10-23 03:10:46 +0000518 }
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000519 this->inval(NULL);
520 return true;
521 }
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000522
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000523private:
skia.committer@gmail.com45ba2f72012-10-23 02:01:22 +0000524
mike@reedtribe.org50e4c722012-10-22 03:59:34 +0000525 typedef SampleView INHERITED;
526};
527
528//////////////////////////////////////////////////////////////////////////////
529
530static SkView* MyFactory() { return new DrawLineView; }
531static SkViewRegister reg(MyFactory);