blob: 4bd23db4fd60ef8799a7d1f4c4d599bca150dcfe [file] [log] [blame]
ethannicholas978d08a2016-01-26 07:47:57 -08001/*
2 * Copyright 2016 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 "SkJSONCanvas.h"
9#include "SkPath.h"
10#include "SkRRect.h"
ethannicholas978d08a2016-01-26 07:47:57 -080011
12SkJSONCanvas::SkJSONCanvas(int width, int height, SkWStream& out)
ethannicholas2bbc3432016-01-27 09:06:35 -080013 : INHERITED(width, height)
14 , fOut(out)
15 , fRoot(Json::objectValue)
16 , fCommands(Json::arrayValue) {
17 fRoot[SKJSONCANVAS_VERSION] = Json::Value(1);
ethannicholas978d08a2016-01-26 07:47:57 -080018}
19
20void SkJSONCanvas::finish() {
ethannicholas2bbc3432016-01-27 09:06:35 -080021 fRoot[SKJSONCANVAS_COMMANDS] = fCommands;
22 fOut.writeText(Json::FastWriter().write(fRoot).c_str());
ethannicholas978d08a2016-01-26 07:47:57 -080023}
24
ethannicholas2bbc3432016-01-27 09:06:35 -080025Json::Value SkJSONCanvas::makePoint(const SkPoint& point) {
26 Json::Value result(Json::arrayValue);
27 result.append(Json::Value(point.x()));
28 result.append(Json::Value(point.y()));
29 return result;
ethannicholas978d08a2016-01-26 07:47:57 -080030}
31
ethannicholas2bbc3432016-01-27 09:06:35 -080032Json::Value SkJSONCanvas::makePoint(SkScalar x, SkScalar y) {
33 Json::Value result(Json::arrayValue);
34 result.append(Json::Value(x));
35 result.append(Json::Value(y));
36 return result;
ethannicholas978d08a2016-01-26 07:47:57 -080037}
38
ethannicholas2bbc3432016-01-27 09:06:35 -080039Json::Value SkJSONCanvas::makeRect(const SkRect& rect) {
40 Json::Value result(Json::arrayValue);
41 result.append(Json::Value(rect.left()));
42 result.append(Json::Value(rect.top()));
43 result.append(Json::Value(rect.right()));
44 result.append(Json::Value(rect.bottom()));
45 return result;
ethannicholas978d08a2016-01-26 07:47:57 -080046}
47
ethannicholas2bbc3432016-01-27 09:06:35 -080048Json::Value SkJSONCanvas::makeRRect(const SkRRect& rrect) {
49 Json::Value result(Json::arrayValue);
50 result.append(this->makeRect(rrect.rect()));
51 result.append(this->makePoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
52 result.append(this->makePoint(rrect.radii(SkRRect::kUpperRight_Corner)));
53 result.append(this->makePoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
54 result.append(this->makePoint(rrect.radii(SkRRect::kLowerRight_Corner)));
55 return result;
ethannicholas978d08a2016-01-26 07:47:57 -080056}
57
ethannicholas2bbc3432016-01-27 09:06:35 -080058Json::Value SkJSONCanvas::makePath(const SkPath& path) {
59 Json::Value result(Json::arrayValue);
ethannicholas978d08a2016-01-26 07:47:57 -080060 SkPath::Iter iter(path, false);
61 SkPoint pts[4];
ethannicholas978d08a2016-01-26 07:47:57 -080062 SkPath::Verb verb;
63 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
ethannicholas978d08a2016-01-26 07:47:57 -080064 switch (verb) {
ethannicholas2bbc3432016-01-27 09:06:35 -080065 case SkPath::kLine_Verb: {
66 Json::Value line(Json::objectValue);
67 line[SKJSONCANVAS_VERB_LINE] = this->makePoint(pts[1]);
68 result.append(line);
ethannicholas978d08a2016-01-26 07:47:57 -080069 break;
ethannicholas2bbc3432016-01-27 09:06:35 -080070 }
71 case SkPath::kQuad_Verb: {
72 Json::Value quad(Json::objectValue);
73 Json::Value coords(Json::arrayValue);
74 coords.append(this->makePoint(pts[1]));
75 coords.append(this->makePoint(pts[2]));
76 quad[SKJSONCANVAS_VERB_QUAD] = coords;
77 result.append(quad);
ethannicholas978d08a2016-01-26 07:47:57 -080078 break;
ethannicholas2bbc3432016-01-27 09:06:35 -080079 }
80 case SkPath::kCubic_Verb: {
81 Json::Value cubic(Json::objectValue);
82 Json::Value coords(Json::arrayValue);
83 coords.append(this->makePoint(pts[1]));
84 coords.append(this->makePoint(pts[2]));
85 coords.append(this->makePoint(pts[3]));
86 cubic[SKJSONCANVAS_VERB_CUBIC] = coords;
87 result.append(cubic);
ethannicholas978d08a2016-01-26 07:47:57 -080088 break;
ethannicholas2bbc3432016-01-27 09:06:35 -080089 }
90 case SkPath::kConic_Verb: {
91 Json::Value conic(Json::objectValue);
92 Json::Value coords(Json::arrayValue);
93 coords.append(this->makePoint(pts[1]));
94 coords.append(this->makePoint(pts[2]));
95 coords.append(Json::Value(iter.conicWeight()));
96 conic[SKJSONCANVAS_VERB_CONIC] = coords;
97 result.append(conic);
ethannicholas978d08a2016-01-26 07:47:57 -080098 break;
ethannicholas2bbc3432016-01-27 09:06:35 -080099 }
100 case SkPath::kMove_Verb: {
101 Json::Value move(Json::objectValue);
102 move[SKJSONCANVAS_VERB_MOVE] = this->makePoint(pts[0]);
103 result.append(move);
ethannicholas978d08a2016-01-26 07:47:57 -0800104 break;
ethannicholas2bbc3432016-01-27 09:06:35 -0800105 }
ethannicholas978d08a2016-01-26 07:47:57 -0800106 case SkPath::kClose_Verb:
ethannicholas2bbc3432016-01-27 09:06:35 -0800107 result.append(Json::Value(SKJSONCANVAS_VERB_CLOSE));
ethannicholas978d08a2016-01-26 07:47:57 -0800108 break;
109 case SkPath::kDone_Verb:
110 break;
111 }
112 }
ethannicholas2bbc3432016-01-27 09:06:35 -0800113 return result;
ethannicholas978d08a2016-01-26 07:47:57 -0800114}
115
ethannicholas2bbc3432016-01-27 09:06:35 -0800116Json::Value SkJSONCanvas::makeRegion(const SkRegion& region) {
117 return Json::Value("<unimplemented>");
ethannicholas978d08a2016-01-26 07:47:57 -0800118}
119
ethannicholas2bbc3432016-01-27 09:06:35 -0800120Json::Value SkJSONCanvas::makePaint(const SkPaint& paint) {
121 Json::Value result(Json::objectValue);
122 SkColor color = paint.getColor();
123 if (color != SK_ColorBLACK) {
124 Json::Value colorValue(Json::arrayValue);
125 colorValue.append(Json::Value(SkColorGetA(color)));
126 colorValue.append(Json::Value(SkColorGetR(color)));
127 colorValue.append(Json::Value(SkColorGetG(color)));
128 colorValue.append(Json::Value(SkColorGetB(color)));
129 result[SKJSONCANVAS_ATTRIBUTE_COLOR] = colorValue;;
130 }
ethannicholas978d08a2016-01-26 07:47:57 -0800131 SkPaint::Style style = paint.getStyle();
132 if (style != SkPaint::kFill_Style) {
ethannicholas978d08a2016-01-26 07:47:57 -0800133 switch (style) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800134 case SkPaint::kStroke_Style: {
135 Json::Value stroke(SKJSONCANVAS_STYLE_STROKE);
136 result[SKJSONCANVAS_ATTRIBUTE_STYLE] = stroke;
ethannicholas978d08a2016-01-26 07:47:57 -0800137 break;
ethannicholas2bbc3432016-01-27 09:06:35 -0800138 }
139 case SkPaint::kStrokeAndFill_Style: {
140 Json::Value strokeAndFill(SKJSONCANVAS_STYLE_STROKEANDFILL);
141 result[SKJSONCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
ethannicholas978d08a2016-01-26 07:47:57 -0800142 break;
ethannicholas2bbc3432016-01-27 09:06:35 -0800143 }
ethannicholas978d08a2016-01-26 07:47:57 -0800144 default: SkASSERT(false);
145 }
146 }
147 SkScalar strokeWidth = paint.getStrokeWidth();
148 if (strokeWidth != 0.0f) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800149 result[SKJSONCANVAS_ATTRIBUTE_STROKEWIDTH] = Json::Value(strokeWidth);
ethannicholas978d08a2016-01-26 07:47:57 -0800150 }
151 if (paint.isAntiAlias()) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800152 result[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(true);
ethannicholas978d08a2016-01-26 07:47:57 -0800153 }
ethannicholas2bbc3432016-01-27 09:06:35 -0800154 return result;
ethannicholas978d08a2016-01-26 07:47:57 -0800155}
156
ethannicholas2bbc3432016-01-27 09:06:35 -0800157Json::Value SkJSONCanvas::makeMatrix(const SkMatrix& matrix) {
158 Json::Value result(Json::arrayValue);
159 Json::Value row1(Json::arrayValue);
160 row1.append(Json::Value(matrix[0]));
161 row1.append(Json::Value(matrix[1]));
162 row1.append(Json::Value(matrix[2]));
163 result.append(row1);
164 Json::Value row2(Json::arrayValue);
165 row2.append(Json::Value(matrix[3]));
166 row2.append(Json::Value(matrix[4]));
167 row2.append(Json::Value(matrix[5]));
168 result.append(row2);
169 Json::Value row3(Json::arrayValue);
170 row3.append(Json::Value(matrix[6]));
171 row3.append(Json::Value(matrix[7]));
172 row3.append(Json::Value(matrix[8]));
173 result.append(row3);
174 return result;
ethannicholas978d08a2016-01-26 07:47:57 -0800175}
176
ethannicholas2bbc3432016-01-27 09:06:35 -0800177Json::Value SkJSONCanvas::makeRegionOp(SkRegion::Op op) {
178 switch (op) {
ethannicholas978d08a2016-01-26 07:47:57 -0800179 case SkRegion::kDifference_Op:
ethannicholas2bbc3432016-01-27 09:06:35 -0800180 return Json::Value(SKJSONCANVAS_REGIONOP_DIFFERENCE);
ethannicholas978d08a2016-01-26 07:47:57 -0800181 case SkRegion::kIntersect_Op:
ethannicholas2bbc3432016-01-27 09:06:35 -0800182 return Json::Value(SKJSONCANVAS_REGIONOP_INTERSECT);
ethannicholas978d08a2016-01-26 07:47:57 -0800183 case SkRegion::kUnion_Op:
ethannicholas2bbc3432016-01-27 09:06:35 -0800184 return Json::Value(SKJSONCANVAS_REGIONOP_UNION);
ethannicholas978d08a2016-01-26 07:47:57 -0800185 case SkRegion::kXOR_Op:
ethannicholas2bbc3432016-01-27 09:06:35 -0800186 return Json::Value(SKJSONCANVAS_REGIONOP_XOR);
ethannicholas978d08a2016-01-26 07:47:57 -0800187 case SkRegion::kReverseDifference_Op:
ethannicholas2bbc3432016-01-27 09:06:35 -0800188 return Json::Value(SKJSONCANVAS_REGIONOP_REVERSE_DIFFERENCE);
ethannicholas978d08a2016-01-26 07:47:57 -0800189 case SkRegion::kReplace_Op:
ethannicholas2bbc3432016-01-27 09:06:35 -0800190 return Json::Value(SKJSONCANVAS_REGIONOP_REPLACE);
ethannicholas978d08a2016-01-26 07:47:57 -0800191 default:
192 SkASSERT(false);
ethannicholas2bbc3432016-01-27 09:06:35 -0800193 return Json::Value("<invalid region op>");
ethannicholas978d08a2016-01-26 07:47:57 -0800194 };
ethannicholas978d08a2016-01-26 07:47:57 -0800195}
196
ethannicholas2bbc3432016-01-27 09:06:35 -0800197Json::Value SkJSONCanvas::makeEdgeStyle(SkCanvas::ClipEdgeStyle edgeStyle) {
198 switch (edgeStyle) {
199 case SkCanvas::kHard_ClipEdgeStyle:
200 return Json::Value(SKJSONCANVAS_EDGESTYLE_HARD);
201 case SkCanvas::kSoft_ClipEdgeStyle:
202 return Json::Value(SKJSONCANVAS_EDGESTYLE_SOFT);
203 default:
204 SkASSERT(false);
205 return Json::Value("<invalid edge style>");
ethannicholas978d08a2016-01-26 07:47:57 -0800206 };
ethannicholas978d08a2016-01-26 07:47:57 -0800207}
208
ethannicholas2bbc3432016-01-27 09:06:35 -0800209Json::Value SkJSONCanvas::makePointMode(SkCanvas::PointMode mode) {
ethannicholas978d08a2016-01-26 07:47:57 -0800210 switch (mode) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800211 case SkCanvas::kPoints_PointMode:
212 return Json::Value(SKJSONCANVAS_POINTMODE_POINTS);
213 case SkCanvas::kLines_PointMode:
214 return Json::Value(SKJSONCANVAS_POINTMODE_LINES);
215 case SkCanvas::kPolygon_PointMode:
216 return Json::Value(SKJSONCANVAS_POINTMODE_POLYGON);
217 default:
218 SkASSERT(false);
219 return Json::Value("<invalid point mode>");
ethannicholas978d08a2016-01-26 07:47:57 -0800220 };
ethannicholas978d08a2016-01-26 07:47:57 -0800221}
222
223void SkJSONCanvas::updateMatrix() {
ethannicholas2bbc3432016-01-27 09:06:35 -0800224 const SkMatrix& matrix = this->getTotalMatrix();
225 if (matrix != fLastMatrix) {
226 Json::Value command(Json::objectValue);
227 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_MATRIX);
228 command[SKJSONCANVAS_ATTRIBUTE_MATRIX] = this->makeMatrix(matrix);
229 fCommands.append(command);
230 fLastMatrix = matrix;
231 }
ethannicholas978d08a2016-01-26 07:47:57 -0800232}
233
234void SkJSONCanvas::onDrawPaint(const SkPaint& paint) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800235 Json::Value command(Json::objectValue);
236 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_PAINT);
237 command[SKJSONCANVAS_ATTRIBUTE_PAINT] = this->makePaint(paint);
238 fCommands.append(command);
ethannicholas978d08a2016-01-26 07:47:57 -0800239}
240
241void SkJSONCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800242 this->updateMatrix();
243 Json::Value command(Json::objectValue);
244 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_RECT);
245 command[SKJSONCANVAS_ATTRIBUTE_COORDS] = this->makeRect(rect);
246 command[SKJSONCANVAS_ATTRIBUTE_PAINT] = this->makePaint(paint);
247 fCommands.append(command);
ethannicholas978d08a2016-01-26 07:47:57 -0800248}
249
250void SkJSONCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800251 this->updateMatrix();
252 Json::Value command(Json::objectValue);
253 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_OVAL);
254 command[SKJSONCANVAS_ATTRIBUTE_COORDS] = this->makeRect(rect);
255 command[SKJSONCANVAS_ATTRIBUTE_PAINT] = this->makePaint(paint);
256 fCommands.append(command);
ethannicholas978d08a2016-01-26 07:47:57 -0800257}
258
259void SkJSONCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800260 this->updateMatrix();
261 Json::Value command(Json::objectValue);
262 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_RRECT);
263 command[SKJSONCANVAS_ATTRIBUTE_COORDS] = this->makeRRect(rrect);
264 command[SKJSONCANVAS_ATTRIBUTE_PAINT] = this->makePaint(paint);
265 fCommands.append(command);
266}
ethannicholas978d08a2016-01-26 07:47:57 -0800267
268void SkJSONCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) {
269 this->updateMatrix();
ethannicholas2bbc3432016-01-27 09:06:35 -0800270 Json::Value command(Json::objectValue);
271 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_RRECT);
272 command[SKJSONCANVAS_ATTRIBUTE_INNER] = this->makeRRect(inner);
273 command[SKJSONCANVAS_ATTRIBUTE_OUTER] = this->makeRRect(outer);
274 command[SKJSONCANVAS_ATTRIBUTE_PAINT] = this->makePaint(paint);
275 fCommands.append(command);
ethannicholas978d08a2016-01-26 07:47:57 -0800276}
277
278void SkJSONCanvas::onDrawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint pts[],
ethannicholas2bbc3432016-01-27 09:06:35 -0800279 const SkPaint& paint) {
ethannicholas978d08a2016-01-26 07:47:57 -0800280 this->updateMatrix();
ethannicholas2bbc3432016-01-27 09:06:35 -0800281 Json::Value command(Json::objectValue);
282 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_POINTS);
283 command[SKJSONCANVAS_ATTRIBUTE_MODE] = this->makePointMode(mode);
284 Json::Value points(Json::arrayValue);
ethannicholas978d08a2016-01-26 07:47:57 -0800285 for (size_t i = 0; i < count; i++) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800286 points.append(this->makePoint(pts[i]));
ethannicholas978d08a2016-01-26 07:47:57 -0800287 }
ethannicholas2bbc3432016-01-27 09:06:35 -0800288 command[SKJSONCANVAS_ATTRIBUTE_POINTS] = points;
289 command[SKJSONCANVAS_ATTRIBUTE_PAINT] = this->makePaint(paint);
290 fCommands.append(command);
ethannicholas978d08a2016-01-26 07:47:57 -0800291}
292
293void SkJSONCanvas::onDrawVertices(SkCanvas::VertexMode, int vertexCount, const SkPoint vertices[],
294 const SkPoint texs[], const SkColor colors[], SkXfermode*,
295 const uint16_t indices[], int indexCount, const SkPaint&) {
296 SkDebugf("unsupported: drawVertices\n");
297}
298
299void SkJSONCanvas::onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[],
300 int count, SkXfermode::Mode, const SkRect* cull, const SkPaint*) {
301 SkDebugf("unsupported: drawAtlas\n");
302}
303
304void SkJSONCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800305 this->updateMatrix();
306 Json::Value command(Json::objectValue);
307 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_PATH);
308 command[SKJSONCANVAS_ATTRIBUTE_PATH] = this->makePath(path);
309 command[SKJSONCANVAS_ATTRIBUTE_PAINT] = this->makePaint(paint);
310 fCommands.append(command);
311}
ethannicholas978d08a2016-01-26 07:47:57 -0800312
313void SkJSONCanvas::onDrawImage(const SkImage*, SkScalar dx, SkScalar dy, const SkPaint*) {
314 SkDebugf("unsupported: drawImage\n");
315}
316
317void SkJSONCanvas::onDrawImageRect(const SkImage*, const SkRect*, const SkRect&, const SkPaint*,
318 SkCanvas::SrcRectConstraint) {
319 SkDebugf("unsupported: drawImageRect\n");
320}
321
322void SkJSONCanvas::onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst,
323 const SkPaint*) {
324 SkDebugf("unsupported: drawImageNine\n");
325}
326
327void SkJSONCanvas::onDrawBitmap(const SkBitmap&, SkScalar dx, SkScalar dy, const SkPaint*) {
328 SkDebugf("unsupported: drawBitmap\n");
329}
330
331void SkJSONCanvas::onDrawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&, const SkPaint*,
332 SkCanvas::SrcRectConstraint) {
333 SkDebugf("unsupported: drawBitmapRect\n");
334}
335
336void SkJSONCanvas::onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst,
337 const SkPaint*) {
338 SkDebugf("unsupported: drawBitmapNine\n");
339}
340
341void SkJSONCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x,
342 SkScalar y, const SkPaint& paint) {
343 this->updateMatrix();
ethannicholas2bbc3432016-01-27 09:06:35 -0800344 Json::Value command(Json::objectValue);
345 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_TEXT);
346 command[SKJSONCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) text,
347 ((const char*) text) + byteLength);
348 command[SKJSONCANVAS_ATTRIBUTE_COORDS] = this->makePoint(x, y);
349 command[SKJSONCANVAS_ATTRIBUTE_PAINT] = this->makePaint(paint);
350 fCommands.append(command);
ethannicholas978d08a2016-01-26 07:47:57 -0800351}
352
353void SkJSONCanvas::onDrawPosText(const void* text, size_t byteLength,
354 const SkPoint pos[], const SkPaint& paint) {
355 SkDebugf("unsupported: drawPosText\n");
356}
357
358void SkJSONCanvas::onDrawPosTextH(const void* text, size_t byteLength,
359 const SkScalar xpos[], SkScalar constY,
360 const SkPaint& paint) {
361 SkDebugf("unsupported: drawPosTextH\n");
362}
363
364void SkJSONCanvas::onDrawTextOnPath(const void* text, size_t byteLength,
365 const SkPath& path, const SkMatrix* matrix,
366 const SkPaint& paint) {
367 SkDebugf("unsupported: drawTextOnPath\n");
368}
369
370void SkJSONCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
371 const SkPaint& paint) {
372 SkDebugf("unsupported: drawTextBlob\n");
373}
374
375void SkJSONCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
376 const SkPoint texCoords[4], SkXfermode* xmode,
377 const SkPaint& paint) {
378 SkDebugf("unsupported: drawPatch\n");
379}
380
381void SkJSONCanvas::onDrawDrawable(SkDrawable*, const SkMatrix*) {
382 SkDebugf("unsupported: drawDrawable\n");
383}
384
385void SkJSONCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800386 this->updateMatrix();
387 Json::Value command(Json::objectValue);
388 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_CLIPRECT);
389 command[SKJSONCANVAS_ATTRIBUTE_COORDS] = this->makeRect(rect);
390 command[SKJSONCANVAS_ATTRIBUTE_REGIONOP] = this->makeRegionOp(op);
391 command[SKJSONCANVAS_ATTRIBUTE_EDGESTYLE] = this->makeEdgeStyle(edgeStyle);
392 fCommands.append(command);
ethannicholas978d08a2016-01-26 07:47:57 -0800393}
394
395void SkJSONCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800396 this->updateMatrix();
397 Json::Value command(Json::objectValue);
398 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_CLIPRRECT);
399 command[SKJSONCANVAS_ATTRIBUTE_COORDS] = this->makeRRect(rrect);
400 command[SKJSONCANVAS_ATTRIBUTE_REGIONOP] = this->makeRegionOp(op);
401 command[SKJSONCANVAS_ATTRIBUTE_EDGESTYLE] = this->makeEdgeStyle(edgeStyle);
402 fCommands.append(command);
ethannicholas978d08a2016-01-26 07:47:57 -0800403}
404
405void SkJSONCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800406 this->updateMatrix();
407 Json::Value command(Json::objectValue);
408 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_CLIPPATH);
409 command[SKJSONCANVAS_ATTRIBUTE_PATH] = this->makePath(path);
410 command[SKJSONCANVAS_ATTRIBUTE_REGIONOP] = this->makeRegionOp(op);
411 command[SKJSONCANVAS_ATTRIBUTE_EDGESTYLE] = this->makeEdgeStyle(edgeStyle);
412 fCommands.append(command);
ethannicholas978d08a2016-01-26 07:47:57 -0800413}
414
415void SkJSONCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
ethannicholas2bbc3432016-01-27 09:06:35 -0800416 this->updateMatrix();
417 Json::Value command(Json::objectValue);
418 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_CLIPREGION);
419 command[SKJSONCANVAS_ATTRIBUTE_REGION] = this->makeRegion(deviceRgn);
420 command[SKJSONCANVAS_ATTRIBUTE_REGIONOP] = this->makeRegionOp(op);
421 fCommands.append(command);
ethannicholas978d08a2016-01-26 07:47:57 -0800422}
423
424void SkJSONCanvas::willSave() {
ethannicholas2bbc3432016-01-27 09:06:35 -0800425 Json::Value command(Json::objectValue);
426 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_SAVE);
427 fCommands.append(command);
ethannicholas978d08a2016-01-26 07:47:57 -0800428}
429
430void SkJSONCanvas::willRestore() {
ethannicholas2bbc3432016-01-27 09:06:35 -0800431 Json::Value command(Json::objectValue);
432 command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_RESTORE);
433 fCommands.append(command);
ethannicholas978d08a2016-01-26 07:47:57 -0800434}