blob: ba6302ca3adcb1529b05a9e9a5598fa8b6375959 [file] [log] [blame]
chudy@google.com902ebe52012-06-29 14:21:22 +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
chudy@google.com902ebe52012-06-29 14:21:22 +00008#include "SkDrawCommand.h"
joshualitt6b3cf732016-02-17 11:20:26 -08009
ethannicholas50a8dd02016-02-10 05:40:46 -080010#include "SkBlurMaskFilter.h"
11#include "SkColorFilter.h"
12#include "SkDashPathEffect.h"
13#include "SkImageFilter.h"
brianosmanfad98562016-05-04 11:06:28 -070014#include "SkJsonWriteBuffer.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080015#include "SkMaskFilter.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000016#include "SkObjectParser.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080017#include "SkPaintDefaults.h"
18#include "SkPathEffect.h"
robertphillips9bafc302015-02-13 11:13:00 -080019#include "SkPicture.h"
fmalitab7425172014-08-26 07:56:44 -070020#include "SkTextBlob.h"
fmalitae77f2da2015-12-08 18:59:18 -080021#include "SkTextBlobRunIterator.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080022#include "SkTHash.h"
23#include "SkTypeface.h"
24#include "SkValidatingReadBuffer.h"
25#include "SkWriteBuffer.h"
msaretta5cf4f42016-06-30 10:06:51 -070026#include "picture_utils.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080027
ethannicholas50a8dd02016-02-10 05:40:46 -080028#define SKDEBUGCANVAS_ATTRIBUTE_COMMAND "command"
ethannicholas807dcab2016-02-23 06:53:37 -080029#define SKDEBUGCANVAS_ATTRIBUTE_VISIBLE "visible"
ethannicholas50a8dd02016-02-10 05:40:46 -080030#define SKDEBUGCANVAS_ATTRIBUTE_MATRIX "matrix"
vjiaoblacke5de1302016-07-13 14:05:28 -070031#define SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS "drawDepthTranslation"
ethannicholas50a8dd02016-02-10 05:40:46 -080032#define SKDEBUGCANVAS_ATTRIBUTE_COORDS "coords"
halcanaryf412f092016-08-25 11:10:41 -070033#define SKDEBUGCANVAS_ATTRIBUTE_HINTING "hinting"
ethannicholas50a8dd02016-02-10 05:40:46 -080034#define SKDEBUGCANVAS_ATTRIBUTE_BOUNDS "bounds"
35#define SKDEBUGCANVAS_ATTRIBUTE_PAINT "paint"
36#define SKDEBUGCANVAS_ATTRIBUTE_OUTER "outer"
37#define SKDEBUGCANVAS_ATTRIBUTE_INNER "inner"
38#define SKDEBUGCANVAS_ATTRIBUTE_MODE "mode"
39#define SKDEBUGCANVAS_ATTRIBUTE_POINTS "points"
40#define SKDEBUGCANVAS_ATTRIBUTE_PATH "path"
41#define SKDEBUGCANVAS_ATTRIBUTE_TEXT "text"
42#define SKDEBUGCANVAS_ATTRIBUTE_COLOR "color"
43#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
44#define SKDEBUGCANVAS_ATTRIBUTE_STYLE "style"
45#define SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH "strokeWidth"
46#define SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER "strokeMiter"
ethannicholas1446a9a2016-02-10 14:05:02 -080047#define SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN "strokeJoin"
ethannicholas50a8dd02016-02-10 05:40:46 -080048#define SKDEBUGCANVAS_ATTRIBUTE_CAP "cap"
49#define SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS "antiAlias"
ethannicholas1446a9a2016-02-10 14:05:02 -080050#define SKDEBUGCANVAS_ATTRIBUTE_DITHER "dither"
ethannicholas50a8dd02016-02-10 05:40:46 -080051#define SKDEBUGCANVAS_ATTRIBUTE_REGION "region"
52#define SKDEBUGCANVAS_ATTRIBUTE_REGIONOP "op"
53#define SKDEBUGCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle"
54#define SKDEBUGCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion"
55#define SKDEBUGCANVAS_ATTRIBUTE_BLUR "blur"
56#define SKDEBUGCANVAS_ATTRIBUTE_SIGMA "sigma"
57#define SKDEBUGCANVAS_ATTRIBUTE_QUALITY "quality"
58#define SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN "textAlign"
59#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE "textSize"
60#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX"
61#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX"
62#define SKDEBUGCANVAS_ATTRIBUTE_DASHING "dashing"
63#define SKDEBUGCANVAS_ATTRIBUTE_INTERVALS "intervals"
64#define SKDEBUGCANVAS_ATTRIBUTE_PHASE "phase"
65#define SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE "fillType"
66#define SKDEBUGCANVAS_ATTRIBUTE_VERBS "verbs"
67#define SKDEBUGCANVAS_ATTRIBUTE_NAME "name"
ethannicholasf62a8b72016-02-11 10:35:21 -080068#define SKDEBUGCANVAS_ATTRIBUTE_DATA "data"
brianosmanfad98562016-05-04 11:06:28 -070069#define SKDEBUGCANVAS_ATTRIBUTE_VALUES "values"
ethannicholas50a8dd02016-02-10 05:40:46 -080070#define SKDEBUGCANVAS_ATTRIBUTE_SHADER "shader"
71#define SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect"
72#define SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER "maskFilter"
73#define SKDEBUGCANVAS_ATTRIBUTE_XFERMODE "xfermode"
ethannicholas1446a9a2016-02-10 14:05:02 -080074#define SKDEBUGCANVAS_ATTRIBUTE_LOOPER "looper"
ethannicholas50a8dd02016-02-10 05:40:46 -080075#define SKDEBUGCANVAS_ATTRIBUTE_BACKDROP "backdrop"
76#define SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER "colorfilter"
77#define SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter"
78#define SKDEBUGCANVAS_ATTRIBUTE_IMAGE "image"
79#define SKDEBUGCANVAS_ATTRIBUTE_BITMAP "bitmap"
80#define SKDEBUGCANVAS_ATTRIBUTE_SRC "src"
81#define SKDEBUGCANVAS_ATTRIBUTE_DST "dst"
82#define SKDEBUGCANVAS_ATTRIBUTE_CENTER "center"
83#define SKDEBUGCANVAS_ATTRIBUTE_STRICT "strict"
84#define SKDEBUGCANVAS_ATTRIBUTE_DESCRIPTION "description"
85#define SKDEBUGCANVAS_ATTRIBUTE_X "x"
86#define SKDEBUGCANVAS_ATTRIBUTE_Y "y"
87#define SKDEBUGCANVAS_ATTRIBUTE_RUNS "runs"
88#define SKDEBUGCANVAS_ATTRIBUTE_POSITIONS "positions"
89#define SKDEBUGCANVAS_ATTRIBUTE_GLYPHS "glyphs"
90#define SKDEBUGCANVAS_ATTRIBUTE_FONT "font"
91#define SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE "typeface"
ethannicholas1446a9a2016-02-10 14:05:02 -080092#define SKDEBUGCANVAS_ATTRIBUTE_CUBICS "cubics"
93#define SKDEBUGCANVAS_ATTRIBUTE_COLORS "colors"
94#define SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS "textureCoords"
95#define SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY "filterQuality"
bsalomonac3aa242016-08-19 11:25:19 -070096#define SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE "startAngle"
97#define SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE "sweepAngle"
98#define SKDEBUGCANVAS_ATTRIBUTE_USECENTER "useCenter"
jcgregorioee0c5552016-06-30 09:18:27 -070099#define SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC "shortDesc"
msarett0ac1bec2016-08-29 09:15:33 -0700100#define SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID "uniqueID"
101#define SKDEBUGCANVAS_ATTRIBUTE_WIDTH "width"
102#define SKDEBUGCANVAS_ATTRIBUTE_HEIGHT "height"
103#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
reed67f62fa2016-06-29 11:36:34 -0700104
ethannicholas50a8dd02016-02-10 05:40:46 -0800105#define SKDEBUGCANVAS_VERB_MOVE "move"
106#define SKDEBUGCANVAS_VERB_LINE "line"
107#define SKDEBUGCANVAS_VERB_QUAD "quad"
108#define SKDEBUGCANVAS_VERB_CUBIC "cubic"
109#define SKDEBUGCANVAS_VERB_CONIC "conic"
110#define SKDEBUGCANVAS_VERB_CLOSE "close"
111
112#define SKDEBUGCANVAS_STYLE_FILL "fill"
113#define SKDEBUGCANVAS_STYLE_STROKE "stroke"
114#define SKDEBUGCANVAS_STYLE_STROKEANDFILL "strokeAndFill"
115
116#define SKDEBUGCANVAS_POINTMODE_POINTS "points"
117#define SKDEBUGCANVAS_POINTMODE_LINES "lines"
118#define SKDEBUGCANVAS_POINTMODE_POLYGON "polygon"
119
120#define SKDEBUGCANVAS_REGIONOP_DIFFERENCE "difference"
121#define SKDEBUGCANVAS_REGIONOP_INTERSECT "intersect"
122#define SKDEBUGCANVAS_REGIONOP_UNION "union"
123#define SKDEBUGCANVAS_REGIONOP_XOR "xor"
124#define SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE "reverseDifference"
125#define SKDEBUGCANVAS_REGIONOP_REPLACE "replace"
126
127#define SKDEBUGCANVAS_BLURSTYLE_NORMAL "normal"
128#define SKDEBUGCANVAS_BLURSTYLE_SOLID "solid"
129#define SKDEBUGCANVAS_BLURSTYLE_OUTER "outer"
130#define SKDEBUGCANVAS_BLURSTYLE_INNER "inner"
131
132#define SKDEBUGCANVAS_BLURQUALITY_LOW "low"
133#define SKDEBUGCANVAS_BLURQUALITY_HIGH "high"
134
135#define SKDEBUGCANVAS_ALIGN_LEFT "left"
136#define SKDEBUGCANVAS_ALIGN_CENTER "center"
137#define SKDEBUGCANVAS_ALIGN_RIGHT "right"
138
139#define SKDEBUGCANVAS_FILLTYPE_WINDING "winding"
140#define SKDEBUGCANVAS_FILLTYPE_EVENODD "evenOdd"
141#define SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding"
142#define SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd"
143
144#define SKDEBUGCANVAS_CAP_BUTT "butt"
145#define SKDEBUGCANVAS_CAP_ROUND "round"
146#define SKDEBUGCANVAS_CAP_SQUARE "square"
147
ethannicholas1446a9a2016-02-10 14:05:02 -0800148#define SKDEBUGCANVAS_MITER_JOIN "miter"
149#define SKDEBUGCANVAS_ROUND_JOIN "round"
150#define SKDEBUGCANVAS_BEVEL_JOIN "bevel"
151
ethannicholas50a8dd02016-02-10 05:40:46 -0800152#define SKDEBUGCANVAS_COLORTYPE_ARGB4444 "ARGB4444"
153#define SKDEBUGCANVAS_COLORTYPE_RGBA8888 "RGBA8888"
154#define SKDEBUGCANVAS_COLORTYPE_BGRA8888 "BGRA8888"
155#define SKDEBUGCANVAS_COLORTYPE_565 "565"
156#define SKDEBUGCANVAS_COLORTYPE_GRAY8 "Gray8"
157#define SKDEBUGCANVAS_COLORTYPE_INDEX8 "Index8"
158#define SKDEBUGCANVAS_COLORTYPE_ALPHA8 "Alpha8"
159
160#define SKDEBUGCANVAS_ALPHATYPE_OPAQUE "opaque"
161#define SKDEBUGCANVAS_ALPHATYPE_PREMUL "premul"
162#define SKDEBUGCANVAS_ALPHATYPE_UNPREMUL "unpremul"
msarett0ac1bec2016-08-29 09:15:33 -0700163#define SKDEBUGCANVAS_ALPHATYPE_UNKNOWN "unknown"
ethannicholas50a8dd02016-02-10 05:40:46 -0800164
ethannicholas1446a9a2016-02-10 14:05:02 -0800165#define SKDEBUGCANVAS_FILTERQUALITY_NONE "none"
166#define SKDEBUGCANVAS_FILTERQUALITY_LOW "low"
167#define SKDEBUGCANVAS_FILTERQUALITY_MEDIUM "medium"
168#define SKDEBUGCANVAS_FILTERQUALITY_HIGH "high"
169
halcanaryf412f092016-08-25 11:10:41 -0700170#define SKDEBUGCANVAS_HINTING_NONE "none"
171#define SKDEBUGCANVAS_HINTING_SLIGHT "slight"
172#define SKDEBUGCANVAS_HINTING_NORMAL "normal"
173#define SKDEBUGCANVAS_HINTING_FULL "full"
174
ethannicholasf62a8b72016-02-11 10:35:21 -0800175typedef SkDrawCommand* (*FROM_JSON)(Json::Value&, UrlDataManager&);
fmalitab7425172014-08-26 07:56:44 -0700176
reed67f62fa2016-06-29 11:36:34 -0700177static SkString* str_append(SkString* str, const SkRect& r) {
178 str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom());
179 return str;
180}
181
chudy@google.com902ebe52012-06-29 14:21:22 +0000182// TODO(chudy): Refactor into non subclass model.
183
robertphillips9bafc302015-02-13 11:13:00 -0800184SkDrawCommand::SkDrawCommand(OpType type)
185 : fOpType(type)
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000186 , fVisible(true) {
187}
188
chudy@google.com902ebe52012-06-29 14:21:22 +0000189SkDrawCommand::~SkDrawCommand() {
chudy@google.com97cee972012-08-07 20:41:37 +0000190 fInfo.deleteAll();
chudy@google.com902ebe52012-06-29 14:21:22 +0000191}
192
robertphillips9bafc302015-02-13 11:13:00 -0800193const char* SkDrawCommand::GetCommandString(OpType type) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000194 switch (type) {
fmalita160ebb22015-04-01 20:58:37 -0700195 case kBeginDrawPicture_OpType: return "BeginDrawPicture";
vjiaoblack95302da2016-07-21 10:25:54 -0700196 case kBeginDrawShadowedPicture_OpType: return "BeginDrawShadowedPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800197 case kClipPath_OpType: return "ClipPath";
198 case kClipRegion_OpType: return "ClipRegion";
199 case kClipRect_OpType: return "ClipRect";
200 case kClipRRect_OpType: return "ClipRRect";
robertphillips9bafc302015-02-13 11:13:00 -0800201 case kConcat_OpType: return "Concat";
robertphillipsfb409232016-06-29 10:28:11 -0700202 case kDrawAnnotation_OpType: return "DrawAnnotation";
robertphillips9bafc302015-02-13 11:13:00 -0800203 case kDrawBitmap_OpType: return "DrawBitmap";
204 case kDrawBitmapNine_OpType: return "DrawBitmapNine";
205 case kDrawBitmapRect_OpType: return "DrawBitmapRect";
206 case kDrawClear_OpType: return "DrawClear";
207 case kDrawDRRect_OpType: return "DrawDRRect";
fmalita651c9202015-07-22 10:23:01 -0700208 case kDrawImage_OpType: return "DrawImage";
209 case kDrawImageRect_OpType: return "DrawImageRect";
robertphillips9bafc302015-02-13 11:13:00 -0800210 case kDrawOval_OpType: return "DrawOval";
211 case kDrawPaint_OpType: return "DrawPaint";
212 case kDrawPatch_OpType: return "DrawPatch";
213 case kDrawPath_OpType: return "DrawPath";
robertphillips9bafc302015-02-13 11:13:00 -0800214 case kDrawPoints_OpType: return "DrawPoints";
215 case kDrawPosText_OpType: return "DrawPosText";
216 case kDrawPosTextH_OpType: return "DrawPosTextH";
217 case kDrawRect_OpType: return "DrawRect";
218 case kDrawRRect_OpType: return "DrawRRect";
robertphillips9bafc302015-02-13 11:13:00 -0800219 case kDrawText_OpType: return "DrawText";
220 case kDrawTextBlob_OpType: return "DrawTextBlob";
221 case kDrawTextOnPath_OpType: return "DrawTextOnPath";
reed63f30d92016-07-07 16:32:51 -0700222 case kDrawTextRSXform_OpType: return "DrawTextRSXform";
robertphillips9bafc302015-02-13 11:13:00 -0800223 case kDrawVertices_OpType: return "DrawVertices";
fmalita160ebb22015-04-01 20:58:37 -0700224 case kEndDrawPicture_OpType: return "EndDrawPicture";
vjiaoblack95302da2016-07-21 10:25:54 -0700225 case kEndDrawShadowedPicture_OpType: return "EndDrawShadowedPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800226 case kRestore_OpType: return "Restore";
227 case kSave_OpType: return "Save";
228 case kSaveLayer_OpType: return "SaveLayer";
229 case kSetMatrix_OpType: return "SetMatrix";
vjiaoblacke5de1302016-07-13 14:05:28 -0700230 case kTranslateZ_OpType: return "TranslateZ";
chudy@google.com902ebe52012-06-29 14:21:22 +0000231 default:
robertphillips9bafc302015-02-13 11:13:00 -0800232 SkDebugf("OpType error 0x%08x\n", type);
chudy@google.com902ebe52012-06-29 14:21:22 +0000233 SkASSERT(0);
234 break;
235 }
236 SkDEBUGFAIL("DrawType UNUSED\n");
halcanary96fcdcc2015-08-27 07:41:13 -0700237 return nullptr;
chudy@google.com902ebe52012-06-29 14:21:22 +0000238}
239
fmalita8c89c522014-11-08 16:18:56 -0800240SkString SkDrawCommand::toString() const {
robertphillips9bafc302015-02-13 11:13:00 -0800241 return SkString(GetCommandString(fOpType));
chudy@google.com902ebe52012-06-29 14:21:22 +0000242}
243
ethannicholasf62a8b72016-02-11 10:35:21 -0800244Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const {
ethannicholas50a8dd02016-02-10 05:40:46 -0800245 Json::Value result;
246 result[SKDEBUGCANVAS_ATTRIBUTE_COMMAND] = this->GetCommandString(fOpType);
ethannicholas807dcab2016-02-23 06:53:37 -0800247 result[SKDEBUGCANVAS_ATTRIBUTE_VISIBLE] = Json::Value(this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800248 return result;
249}
250
251#define INSTALL_FACTORY(name) factories.set(SkString(GetCommandString(k ## name ##_OpType)), \
252 (FROM_JSON) Sk ## name ## Command::fromJSON)
ethannicholasf62a8b72016-02-11 10:35:21 -0800253SkDrawCommand* SkDrawCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800254 static SkTHashMap<SkString, FROM_JSON> factories;
255 static bool initialized = false;
256 if (!initialized) {
257 initialized = true;
258 INSTALL_FACTORY(Restore);
259 INSTALL_FACTORY(ClipPath);
260 INSTALL_FACTORY(ClipRegion);
261 INSTALL_FACTORY(ClipRect);
262 INSTALL_FACTORY(ClipRRect);
263 INSTALL_FACTORY(Concat);
reed97660cc2016-06-28 18:54:19 -0700264 INSTALL_FACTORY(DrawAnnotation);
ethannicholas50a8dd02016-02-10 05:40:46 -0800265 INSTALL_FACTORY(DrawBitmap);
266 INSTALL_FACTORY(DrawBitmapRect);
267 INSTALL_FACTORY(DrawBitmapNine);
268 INSTALL_FACTORY(DrawImage);
269 INSTALL_FACTORY(DrawImageRect);
270 INSTALL_FACTORY(DrawOval);
271 INSTALL_FACTORY(DrawPaint);
272 INSTALL_FACTORY(DrawPath);
273 INSTALL_FACTORY(DrawPoints);
274 INSTALL_FACTORY(DrawText);
275 INSTALL_FACTORY(DrawPosText);
bungeman51190df2016-03-09 07:42:54 -0800276 INSTALL_FACTORY(DrawPosTextH);
ethannicholas50a8dd02016-02-10 05:40:46 -0800277 INSTALL_FACTORY(DrawTextOnPath);
reed45561a02016-07-07 12:47:17 -0700278 INSTALL_FACTORY(DrawTextRSXform);
ethannicholas50a8dd02016-02-10 05:40:46 -0800279 INSTALL_FACTORY(DrawTextBlob);
280
281 INSTALL_FACTORY(DrawRect);
282 INSTALL_FACTORY(DrawRRect);
283 INSTALL_FACTORY(DrawDRRect);
ethannicholas1446a9a2016-02-10 14:05:02 -0800284 INSTALL_FACTORY(DrawPatch);
ethannicholas50a8dd02016-02-10 05:40:46 -0800285 INSTALL_FACTORY(Save);
286 INSTALL_FACTORY(SaveLayer);
287 INSTALL_FACTORY(SetMatrix);
vjiaoblack95302da2016-07-21 10:25:54 -0700288#ifdef SK_EXPERIMENTAL_SHADOWING
vjiaoblacke5de1302016-07-13 14:05:28 -0700289 INSTALL_FACTORY(TranslateZ);
vjiaoblack95302da2016-07-21 10:25:54 -0700290#endif
ethannicholas50a8dd02016-02-10 05:40:46 -0800291 }
292 SkString name = SkString(command[SKDEBUGCANVAS_ATTRIBUTE_COMMAND].asCString());
293 FROM_JSON* factory = factories.find(name);
294 if (factory == nullptr) {
295 SkDebugf("no JSON factory for '%s'\n", name.c_str());
296 return nullptr;
297 }
ethannicholasf62a8b72016-02-11 10:35:21 -0800298 return (*factory)(command, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800299}
300
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000301namespace {
302
303void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
304 const SkISize& size = canvas->getDeviceSize();
305
306 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
307
308 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
309 if (bounds.width() > bounds.height()) {
310 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
311 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
312 } else {
313 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
314 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
315 }
316 canvas->translate(-bounds.centerX(), -bounds.centerY());
317}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000318
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000319
320void render_path(SkCanvas* canvas, const SkPath& path) {
321 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000322
323 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700324 if (bounds.isEmpty()) {
325 return;
326 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000327
fmalitab0cd8b72015-10-06 07:24:03 -0700328 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000329 xlate_and_scale_to_bounds(canvas, bounds);
330
331 SkPaint p;
332 p.setColor(SK_ColorBLACK);
333 p.setStyle(SkPaint::kStroke_Style);
334
335 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000336}
337
halcanary96fcdcc2015-08-27 07:41:13 -0700338void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000339 const SkISize& size = canvas->getDeviceSize();
340
341 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
342 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
343
344 if (input.width() > input.height()) {
345 yScale *= input.height() / (float) input.width();
346 } else {
347 xScale *= input.width() / (float) input.height();
348 }
349
350 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
351 xScale * input.width(),
352 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000353
robertphillips96a5cff2015-09-24 06:56:27 -0700354 static const int kNumBlocks = 8;
355
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000356 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700357 SkISize block = {
358 canvas->imageInfo().width()/kNumBlocks,
359 canvas->imageInfo().height()/kNumBlocks
360 };
361 for (int y = 0; y < kNumBlocks; ++y) {
362 for (int x = 0; x < kNumBlocks; ++x) {
363 SkPaint paint;
364 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
365 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
366 SkIntToScalar(y*block.height()),
367 SkIntToScalar(block.width()),
368 SkIntToScalar(block.height()));
369 canvas->drawRect(r, paint);
370 }
371 }
372
reede47829b2015-08-06 10:02:53 -0700373 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000374
bsalomon49f085d2014-09-05 13:34:00 -0700375 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000376 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
377 srcRect->fTop * yScale + SK_Scalar1,
378 srcRect->fRight * xScale + SK_Scalar1,
379 srcRect->fBottom * yScale + SK_Scalar1);
380 SkPaint p;
381 p.setColor(SK_ColorRED);
382 p.setStyle(SkPaint::kStroke_Style);
383
384 canvas->drawRect(r, p);
385 }
386}
387
388void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
389 canvas->clear(0xFFFFFFFF);
390 canvas->save();
391
392 const SkRect& bounds = rrect.getBounds();
393
394 xlate_and_scale_to_bounds(canvas, bounds);
395
396 SkPaint p;
397 p.setColor(SK_ColorBLACK);
398 p.setStyle(SkPaint::kStroke_Style);
399
400 canvas->drawRRect(rrect, p);
401 canvas->restore();
402}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000403
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000404void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
405 canvas->clear(0xFFFFFFFF);
406 canvas->save();
407
408 const SkRect& bounds = outer.getBounds();
409
410 xlate_and_scale_to_bounds(canvas, bounds);
411
412 SkPaint p;
413 p.setColor(SK_ColorBLACK);
414 p.setStyle(SkPaint::kStroke_Style);
415
416 canvas->drawDRRect(outer, inner, p);
417 canvas->restore();
418}
419
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000420};
421
brianosmanfad98562016-05-04 11:06:28 -0700422Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800423 Json::Value result(Json::arrayValue);
424 result.append(Json::Value(SkColorGetA(color)));
425 result.append(Json::Value(SkColorGetR(color)));
426 result.append(Json::Value(SkColorGetG(color)));
427 result.append(Json::Value(SkColorGetB(color)));
428 return result;
429}
430
brianosman97bbf822016-09-25 13:15:58 -0700431Json::Value SkDrawCommand::MakeJsonColor4f(const SkColor4f& color) {
432 Json::Value result(Json::arrayValue);
433 result.append(Json::Value(color.fA));
434 result.append(Json::Value(color.fR));
435 result.append(Json::Value(color.fG));
436 result.append(Json::Value(color.fB));
437 return result;
438}
439
brianosmanfad98562016-05-04 11:06:28 -0700440Json::Value SkDrawCommand::MakeJsonPoint(const SkPoint& point) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800441 Json::Value result(Json::arrayValue);
442 result.append(Json::Value(point.x()));
443 result.append(Json::Value(point.y()));
444 return result;
445}
446
brianosmanfad98562016-05-04 11:06:28 -0700447Json::Value SkDrawCommand::MakeJsonPoint(SkScalar x, SkScalar y) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800448 Json::Value result(Json::arrayValue);
449 result.append(Json::Value(x));
450 result.append(Json::Value(y));
451 return result;
452}
453
brianosmanfad98562016-05-04 11:06:28 -0700454Json::Value SkDrawCommand::MakeJsonRect(const SkRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800455 Json::Value result(Json::arrayValue);
456 result.append(Json::Value(rect.left()));
457 result.append(Json::Value(rect.top()));
458 result.append(Json::Value(rect.right()));
459 result.append(Json::Value(rect.bottom()));
460 return result;
461}
462
joshualittbd724132016-03-03 11:39:38 -0800463Json::Value SkDrawCommand::MakeJsonIRect(const SkIRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800464 Json::Value result(Json::arrayValue);
465 result.append(Json::Value(rect.left()));
466 result.append(Json::Value(rect.top()));
467 result.append(Json::Value(rect.right()));
468 result.append(Json::Value(rect.bottom()));
469 return result;
470}
471
472static Json::Value make_json_rrect(const SkRRect& rrect) {
473 Json::Value result(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700474 result.append(SkDrawCommand::MakeJsonRect(rrect.rect()));
475 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
476 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperRight_Corner)));
477 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerRight_Corner)));
478 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
ethannicholas50a8dd02016-02-10 05:40:46 -0800479 return result;
480}
481
joshualittbd724132016-03-03 11:39:38 -0800482Json::Value SkDrawCommand::MakeJsonMatrix(const SkMatrix& matrix) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800483 Json::Value result(Json::arrayValue);
484 Json::Value row1(Json::arrayValue);
485 row1.append(Json::Value(matrix[0]));
486 row1.append(Json::Value(matrix[1]));
487 row1.append(Json::Value(matrix[2]));
488 result.append(row1);
489 Json::Value row2(Json::arrayValue);
490 row2.append(Json::Value(matrix[3]));
491 row2.append(Json::Value(matrix[4]));
492 row2.append(Json::Value(matrix[5]));
493 result.append(row2);
494 Json::Value row3(Json::arrayValue);
495 row3.append(Json::Value(matrix[6]));
496 row3.append(Json::Value(matrix[7]));
497 row3.append(Json::Value(matrix[8]));
498 result.append(row3);
499 return result;
500}
ethannicholas1446a9a2016-02-10 14:05:02 -0800501
vjiaoblacke5de1302016-07-13 14:05:28 -0700502Json::Value SkDrawCommand::MakeJsonScalar(SkScalar z) {
503 Json::Value result(z);
504 return result;
505}
506
brianosmanfad98562016-05-04 11:06:28 -0700507Json::Value SkDrawCommand::MakeJsonPath(const SkPath& path) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800508 Json::Value result(Json::objectValue);
509 switch (path.getFillType()) {
510 case SkPath::kWinding_FillType:
511 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_WINDING;
512 break;
513 case SkPath::kEvenOdd_FillType:
514 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_EVENODD;
515 break;
516 case SkPath::kInverseWinding_FillType:
517 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING;
518 break;
519 case SkPath::kInverseEvenOdd_FillType:
520 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
521 break;
halcanary9d524f22016-03-29 09:03:52 -0700522 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800523 Json::Value verbs(Json::arrayValue);
524 SkPath::Iter iter(path, false);
525 SkPoint pts[4];
526 SkPath::Verb verb;
527 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
528 switch (verb) {
529 case SkPath::kLine_Verb: {
530 Json::Value line(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700531 line[SKDEBUGCANVAS_VERB_LINE] = MakeJsonPoint(pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800532 verbs.append(line);
533 break;
534 }
535 case SkPath::kQuad_Verb: {
536 Json::Value quad(Json::objectValue);
537 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700538 coords.append(MakeJsonPoint(pts[1]));
539 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800540 quad[SKDEBUGCANVAS_VERB_QUAD] = coords;
541 verbs.append(quad);
542 break;
543 }
544 case SkPath::kCubic_Verb: {
545 Json::Value cubic(Json::objectValue);
546 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700547 coords.append(MakeJsonPoint(pts[1]));
548 coords.append(MakeJsonPoint(pts[2]));
549 coords.append(MakeJsonPoint(pts[3]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800550 cubic[SKDEBUGCANVAS_VERB_CUBIC] = coords;
551 verbs.append(cubic);
552 break;
553 }
554 case SkPath::kConic_Verb: {
555 Json::Value conic(Json::objectValue);
556 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700557 coords.append(MakeJsonPoint(pts[1]));
558 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800559 coords.append(Json::Value(iter.conicWeight()));
560 conic[SKDEBUGCANVAS_VERB_CONIC] = coords;
561 verbs.append(conic);
562 break;
563 }
564 case SkPath::kMove_Verb: {
565 Json::Value move(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700566 move[SKDEBUGCANVAS_VERB_MOVE] = MakeJsonPoint(pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800567 verbs.append(move);
568 break;
569 }
570 case SkPath::kClose_Verb:
571 verbs.append(Json::Value(SKDEBUGCANVAS_VERB_CLOSE));
572 break;
573 case SkPath::kDone_Verb:
574 break;
575 }
576 }
577 result[SKDEBUGCANVAS_ATTRIBUTE_VERBS] = verbs;
578 return result;
579}
580
brianosmanfad98562016-05-04 11:06:28 -0700581Json::Value SkDrawCommand::MakeJsonRegion(const SkRegion& region) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800582 return Json::Value("<unimplemented>");
583}
584
reed73603f32016-09-20 08:42:38 -0700585static Json::Value make_json_regionop(SkCanvas::ClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800586 switch (op) {
reed73603f32016-09-20 08:42:38 -0700587 case SkCanvas::kDifference_Op:
ethannicholas50a8dd02016-02-10 05:40:46 -0800588 return Json::Value(SKDEBUGCANVAS_REGIONOP_DIFFERENCE);
reed73603f32016-09-20 08:42:38 -0700589 case SkCanvas::kIntersect_Op:
ethannicholas50a8dd02016-02-10 05:40:46 -0800590 return Json::Value(SKDEBUGCANVAS_REGIONOP_INTERSECT);
reed73603f32016-09-20 08:42:38 -0700591 case SkCanvas::kUnion_Op:
ethannicholas50a8dd02016-02-10 05:40:46 -0800592 return Json::Value(SKDEBUGCANVAS_REGIONOP_UNION);
reed73603f32016-09-20 08:42:38 -0700593 case SkCanvas::kXOR_Op:
ethannicholas50a8dd02016-02-10 05:40:46 -0800594 return Json::Value(SKDEBUGCANVAS_REGIONOP_XOR);
reed73603f32016-09-20 08:42:38 -0700595 case SkCanvas::kReverseDifference_Op:
ethannicholas50a8dd02016-02-10 05:40:46 -0800596 return Json::Value(SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE);
reed73603f32016-09-20 08:42:38 -0700597 case SkCanvas::kReplace_Op:
ethannicholas50a8dd02016-02-10 05:40:46 -0800598 return Json::Value(SKDEBUGCANVAS_REGIONOP_REPLACE);
599 default:
600 SkASSERT(false);
601 return Json::Value("<invalid region op>");
602 };
603}
604
605static Json::Value make_json_pointmode(SkCanvas::PointMode mode) {
606 switch (mode) {
607 case SkCanvas::kPoints_PointMode:
608 return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
609 case SkCanvas::kLines_PointMode:
610 return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
halcanary9d524f22016-03-29 09:03:52 -0700611 case SkCanvas::kPolygon_PointMode:
ethannicholas50a8dd02016-02-10 05:40:46 -0800612 return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
613 default:
614 SkASSERT(false);
615 return Json::Value("<invalid point mode>");
616 };
617}
618
halcanary9d524f22016-03-29 09:03:52 -0700619static void store_scalar(Json::Value* target, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800620 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800621 if (value != defaultValue) {
622 (*target)[key] = Json::Value(value);
623 }
624}
625
ethannicholasbd3dae82016-02-10 12:10:00 -0800626static void store_bool(Json::Value* target, const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800627 if (value != defaultValue) {
628 (*target)[key] = Json::Value(value);
629 }
630}
631
halcanary9d524f22016-03-29 09:03:52 -0700632static void encode_data(const void* bytes, size_t count, const char* contentType,
ethannicholasf62a8b72016-02-11 10:35:21 -0800633 UrlDataManager& urlDataManager, Json::Value* target) {
bungeman38d909e2016-08-02 14:40:46 -0700634 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
635 SkString url = urlDataManager.addData(data.get(), contentType);
ethannicholasf62a8b72016-02-11 10:35:21 -0800636 *target = Json::Value(url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800637}
638
brianosmanfad98562016-05-04 11:06:28 -0700639void SkDrawCommand::flatten(const SkFlattenable* flattenable, Json::Value* target,
640 UrlDataManager& urlDataManager) {
641 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800642 flattenable->flatten(buffer);
643 void* data = sk_malloc_throw(buffer.bytesWritten());
644 buffer.writeToMemory(data);
645 Json::Value jsonData;
646 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, &jsonData);
647 Json::Value jsonFlattenable;
648 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->getTypeName());
649 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
brianosmanfad98562016-05-04 11:06:28 -0700650
651 SkJsonWriteBuffer jsonBuffer(&urlDataManager);
652 flattenable->flatten(jsonBuffer);
653 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_VALUES] = jsonBuffer.getValue();
654
ethannicholasf62a8b72016-02-11 10:35:21 -0800655 (*target) = jsonFlattenable;
656 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800657}
658
ethannicholasf67531f2016-03-21 10:19:39 -0700659static void write_png_callback(png_structp png_ptr, png_bytep data, png_size_t length) {
660 SkWStream* out = (SkWStream*) png_get_io_ptr(png_ptr);
661 out->write(data, length);
662}
663
halcanary9d524f22016-03-29 09:03:52 -0700664void SkDrawCommand::WritePNG(const png_bytep rgba, png_uint_32 width, png_uint_32 height,
msaretta5cf4f42016-06-30 10:06:51 -0700665 SkWStream& out, bool isOpaque) {
ethannicholasf67531f2016-03-21 10:19:39 -0700666 png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
667 SkASSERT(png != nullptr);
668 png_infop info_ptr = png_create_info_struct(png);
669 SkASSERT(info_ptr != nullptr);
670 if (setjmp(png_jmpbuf(png))) {
671 SkFAIL("png encode error");
672 }
msaretta5cf4f42016-06-30 10:06:51 -0700673 png_set_write_fn(png, &out, write_png_callback, NULL);
674 int colorType = isOpaque ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGBA;
675 png_set_IHDR(png, info_ptr, width, height, 8, colorType, PNG_INTERLACE_NONE,
ethannicholasf67531f2016-03-21 10:19:39 -0700676 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
677 png_set_compression_level(png, 1);
678 png_bytepp rows = (png_bytepp) sk_malloc_throw(height * sizeof(png_byte*));
msaretta5cf4f42016-06-30 10:06:51 -0700679 png_bytep pixels = (png_bytep) sk_malloc_throw(width * height * 4);
ethannicholasf67531f2016-03-21 10:19:39 -0700680 for (png_size_t y = 0; y < height; ++y) {
681 const png_bytep src = rgba + y * width * 4;
msaretta5cf4f42016-06-30 10:06:51 -0700682 rows[y] = pixels + y * width * 4;
ethannicholasf67531f2016-03-21 10:19:39 -0700683 for (png_size_t x = 0; x < width; ++x) {
msaretta5cf4f42016-06-30 10:06:51 -0700684 rows[y][x * 4] = src[x * 4];
685 rows[y][x * 4 + 1] = src[x * 4 + 1];
686 rows[y][x * 4 + 2] = src[x * 4 + 2];
687 rows[y][x * 4 + 3] = src[x * 4 + 3];
ethannicholasf67531f2016-03-21 10:19:39 -0700688 }
689 }
msaretta5cf4f42016-06-30 10:06:51 -0700690 png_write_info(png, info_ptr);
691 if (isOpaque) {
692 png_set_filler(png, 0xFF, PNG_FILLER_AFTER);
693 }
ethannicholasf67531f2016-03-21 10:19:39 -0700694 png_set_filter(png, 0, PNG_NO_FILTERS);
msaretta5cf4f42016-06-30 10:06:51 -0700695 png_write_image(png, &rows[0]);
ethannicholasf67531f2016-03-21 10:19:39 -0700696 png_destroy_write_struct(&png, NULL);
697 sk_free(rows);
698 sk_free(pixels);
699}
700
brianosmanfad98562016-05-04 11:06:28 -0700701bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
702 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700703 size_t rowBytes = 4 * image.width();
704 SkAutoFree buffer(sk_malloc_throw(rowBytes * image.height()));
halcanary9d524f22016-03-29 09:03:52 -0700705 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700706 kN32_SkColorType, kPremul_SkAlphaType);
707 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
708 SkDebugf("readPixels failed\n");
709 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800710 }
msaretta5cf4f42016-06-30 10:06:51 -0700711
712 SkBitmap bm;
713 bm.installPixels(dstInfo, buffer.get(), rowBytes);
714 sk_sp<SkData> encodedBitmap = sk_tools::encode_bitmap_for_png(bm);
715
ethannicholasf67531f2016-03-21 10:19:39 -0700716 SkDynamicMemoryWStream out;
msaretta5cf4f42016-06-30 10:06:51 -0700717 SkDrawCommand::WritePNG((const png_bytep) encodedBitmap->bytes(), image.width(), image.height(),
718 out, false);
reed42943c82016-09-12 12:01:44 -0700719 sk_sp<SkData> encoded = out.detachAsData();
ethannicholasf62a8b72016-02-11 10:35:21 -0800720 Json::Value jsonData;
721 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
722 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
ethannicholas50a8dd02016-02-10 05:40:46 -0800723 return true;
724}
725
726static const char* color_type_name(SkColorType colorType) {
727 switch (colorType) {
728 case kARGB_4444_SkColorType:
729 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
730 case kRGBA_8888_SkColorType:
731 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
732 case kBGRA_8888_SkColorType:
733 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
734 case kRGB_565_SkColorType:
735 return SKDEBUGCANVAS_COLORTYPE_565;
736 case kGray_8_SkColorType:
737 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
738 case kIndex_8_SkColorType:
739 return SKDEBUGCANVAS_COLORTYPE_INDEX8;
740 case kAlpha_8_SkColorType:
741 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
742 default:
743 SkASSERT(false);
744 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
745 }
746}
747
748static const char* alpha_type_name(SkAlphaType alphaType) {
749 switch (alphaType) {
750 case kOpaque_SkAlphaType:
751 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
752 case kPremul_SkAlphaType:
753 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
754 case kUnpremul_SkAlphaType:
755 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
756 default:
757 SkASSERT(false);
758 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
759 }
760}
761
halcanary9d524f22016-03-29 09:03:52 -0700762static Json::ArrayIndex decode_data(Json::Value data, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -0800763 const void** target) {
764 UrlDataManager::UrlData* urlData = urlDataManager.getDataFromUrl(SkString(data.asCString()));
765 if (urlData == nullptr) {
766 SkASSERT(false);
767 *target = nullptr;
768 return 0;
ethannicholas50a8dd02016-02-10 05:40:46 -0800769 }
ethannicholasf62a8b72016-02-11 10:35:21 -0800770 *target = urlData->fData->data();
771 // cast should be safe for any reasonably-sized object...
772 return (Json::ArrayIndex) urlData->fData->size();
ethannicholas50a8dd02016-02-10 05:40:46 -0800773}
774
halcanary9d524f22016-03-29 09:03:52 -0700775static SkFlattenable* load_flattenable(Json::Value jsonFlattenable,
ethannicholasf62a8b72016-02-11 10:35:21 -0800776 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800777 if (!jsonFlattenable.isMember(SKDEBUGCANVAS_ATTRIBUTE_NAME)) {
778 return nullptr;
779 }
780 const char* name = jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME].asCString();
781 SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name);
782 if (factory == nullptr) {
783 SkDebugf("no factory for loading '%s'\n", name);
784 return nullptr;
785 }
ethannicholasf62a8b72016-02-11 10:35:21 -0800786 const void* data;
787 int size = decode_data(jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA], urlDataManager, &data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800788 SkValidatingReadBuffer buffer(data, size);
reed60c9b582016-04-03 09:11:13 -0700789 sk_sp<SkFlattenable> result = factory(buffer);
ethannicholas50a8dd02016-02-10 05:40:46 -0800790 if (!buffer.isValid()) {
791 SkDebugf("invalid buffer loading flattenable\n");
792 return nullptr;
793 }
reed60c9b582016-04-03 09:11:13 -0700794 return result.release();
ethannicholas50a8dd02016-02-10 05:40:46 -0800795}
796
797static SkColorType colortype_from_name(const char* name) {
798 if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_ARGB4444)) {
799 return kARGB_4444_SkColorType;
800 }
801 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_RGBA8888)) {
802 return kRGBA_8888_SkColorType;
803 }
804 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_BGRA8888)) {
805 return kBGRA_8888_SkColorType;
806 }
807 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_565)) {
808 return kRGB_565_SkColorType;
809 }
810 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_GRAY8)) {
811 return kGray_8_SkColorType;
812 }
813 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_INDEX8)) {
814 return kIndex_8_SkColorType;
815 }
816 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_ALPHA8)) {
817 return kAlpha_8_SkColorType;
818 }
819 SkASSERT(false);
820 return kN32_SkColorType;
821}
822
823static SkBitmap* convert_colortype(SkBitmap* bitmap, SkColorType colorType) {
824 if (bitmap->colorType() == colorType ) {
825 return bitmap;
826 }
827 SkBitmap* dst = new SkBitmap();
828 if (bitmap->copyTo(dst, colorType)) {
829 delete bitmap;
830 return dst;
831 }
832 SkASSERT(false);
833 delete dst;
834 return bitmap;
835}
836
837// caller is responsible for freeing return value
ethannicholasf62a8b72016-02-11 10:35:21 -0800838static SkBitmap* load_bitmap(const Json::Value& jsonBitmap, UrlDataManager& urlDataManager) {
839 if (!jsonBitmap.isMember(SKDEBUGCANVAS_ATTRIBUTE_DATA)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800840 SkDebugf("invalid bitmap\n");
841 return nullptr;
842 }
ethannicholasf62a8b72016-02-11 10:35:21 -0800843 const void* data;
844 int size = decode_data(jsonBitmap[SKDEBUGCANVAS_ATTRIBUTE_DATA], urlDataManager, &data);
bungeman38d909e2016-08-02 14:40:46 -0700845 sk_sp<SkData> encoded(SkData::MakeWithoutCopy(data, size));
reed9ce9d672016-03-17 10:51:11 -0700846 sk_sp<SkImage> image(SkImage::MakeFromEncoded(std::move(encoded), nullptr));
msarett790f99a2016-03-09 06:16:55 -0800847
848 SkAutoTDelete<SkBitmap> bitmap(new SkBitmap());
849 if (nullptr != image) {
850 if (!image->asLegacyBitmap(bitmap, SkImage::kRW_LegacyBitmapMode)) {
851 SkDebugf("image decode failed\n");
852 return nullptr;
853 }
854
ethannicholas50a8dd02016-02-10 05:40:46 -0800855 if (jsonBitmap.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLOR)) {
856 const char* ctName = jsonBitmap[SKDEBUGCANVAS_ATTRIBUTE_COLOR].asCString();
857 SkColorType ct = colortype_from_name(ctName);
858 if (ct != kIndex_8_SkColorType) {
mtklein18300a32016-03-16 13:53:35 -0700859 bitmap.reset(convert_colortype(bitmap.release(), ct));
ethannicholas50a8dd02016-02-10 05:40:46 -0800860 }
861 }
mtklein18300a32016-03-16 13:53:35 -0700862 return bitmap.release();
ethannicholas50a8dd02016-02-10 05:40:46 -0800863 }
864 SkDebugf("image decode failed\n");
ethannicholas50a8dd02016-02-10 05:40:46 -0800865 return nullptr;
866}
867
reed9ce9d672016-03-17 10:51:11 -0700868static sk_sp<SkImage> load_image(const Json::Value& jsonImage, UrlDataManager& urlDataManager) {
ethannicholasf62a8b72016-02-11 10:35:21 -0800869 SkBitmap* bitmap = load_bitmap(jsonImage, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800870 if (bitmap == nullptr) {
871 return nullptr;
872 }
reed9ce9d672016-03-17 10:51:11 -0700873 auto result = SkImage::MakeFromBitmap(*bitmap);
ethannicholas50a8dd02016-02-10 05:40:46 -0800874 delete bitmap;
875 return result;
876}
877
brianosmanfad98562016-05-04 11:06:28 -0700878bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
879 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800880 bitmap.lockPixels();
reed9ce9d672016-03-17 10:51:11 -0700881 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800882 bitmap.unlockPixels();
883 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
884 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800885 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800886 return success;
887}
888
halcanaryf412f092016-08-25 11:10:41 -0700889static void apply_paint_hinting(const SkPaint& paint, Json::Value* target) {
890 SkPaint::Hinting hinting = paint.getHinting();
891 if (hinting != SkPaintDefaults_Hinting) {
892 switch (hinting) {
893 case SkPaint::kNo_Hinting:
894 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
895 break;
896 case SkPaint::kSlight_Hinting:
897 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
898 break;
899 case SkPaint::kNormal_Hinting:
900 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
901 break;
902 case SkPaint::kFull_Hinting:
903 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
904 break;
905 }
906 }
907}
908
ethannicholas50a8dd02016-02-10 05:40:46 -0800909static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
910 SkColor color = paint.getColor();
911 if (color != SK_ColorBLACK) {
912 Json::Value colorValue(Json::arrayValue);
913 colorValue.append(Json::Value(SkColorGetA(color)));
914 colorValue.append(Json::Value(SkColorGetR(color)));
915 colorValue.append(Json::Value(SkColorGetG(color)));
916 colorValue.append(Json::Value(SkColorGetB(color)));
917 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;;
918 }
919}
920
921static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
922 SkPaint::Style style = paint.getStyle();
923 if (style != SkPaint::kFill_Style) {
924 switch (style) {
925 case SkPaint::kStroke_Style: {
926 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
927 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
928 break;
929 }
930 case SkPaint::kStrokeAndFill_Style: {
931 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
932 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
933 break;
934 }
935 default: SkASSERT(false);
936 }
937 }
938}
939
940static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
941 SkPaint::Cap cap = paint.getStrokeCap();
942 if (cap != SkPaint::kDefault_Cap) {
943 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800944 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800945 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
946 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800947 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800948 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
949 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800950 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800951 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
952 break;
ethannicholas50a8dd02016-02-10 05:40:46 -0800953 default: SkASSERT(false);
954 }
955 }
956}
ethannicholas1446a9a2016-02-10 14:05:02 -0800957
958static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
959 SkPaint::Join join = paint.getStrokeJoin();
960 if (join != SkPaint::kDefault_Join) {
961 switch (join) {
962 case SkPaint::kMiter_Join:
963 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
964 SKDEBUGCANVAS_MITER_JOIN);
965 break;
966 case SkPaint::kRound_Join:
967 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
968 SKDEBUGCANVAS_ROUND_JOIN);
969 break;
970 case SkPaint::kBevel_Join:
971 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
972 SKDEBUGCANVAS_BEVEL_JOIN);
973 break;
974 default: SkASSERT(false);
975 }
976 }
977}
978
979static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
980 SkFilterQuality quality = paint.getFilterQuality();
981 switch (quality) {
982 case kNone_SkFilterQuality:
983 break;
984 case kLow_SkFilterQuality:
985 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
986 SKDEBUGCANVAS_FILTERQUALITY_LOW);
987 break;
988 case kMedium_SkFilterQuality:
989 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
990 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
991 break;
992 case kHigh_SkFilterQuality:
993 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
994 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
995 break;
996 }
997}
998
halcanary9d524f22016-03-29 09:03:52 -0700999static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001000 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001001 SkMaskFilter* maskFilter = paint.getMaskFilter();
1002 if (maskFilter != nullptr) {
1003 SkMaskFilter::BlurRec blurRec;
1004 if (maskFilter->asABlur(&blurRec)) {
1005 Json::Value blur(Json::objectValue);
1006 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
1007 switch (blurRec.fStyle) {
1008 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -08001009 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
1010 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -08001011 break;
1012 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -08001013 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
1014 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -08001015 break;
1016 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -08001017 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
1018 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -08001019 break;
1020 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -08001021 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
1022 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -08001023 break;
1024 default:
1025 SkASSERT(false);
1026 }
1027 switch (blurRec.fQuality) {
1028 case SkBlurQuality::kLow_SkBlurQuality:
ethannicholas1446a9a2016-02-10 14:05:02 -08001029 blur[SKDEBUGCANVAS_ATTRIBUTE_QUALITY] = Json::Value(
1030 SKDEBUGCANVAS_BLURQUALITY_LOW);
ethannicholas50a8dd02016-02-10 05:40:46 -08001031 break;
1032 case SkBlurQuality::kHigh_SkBlurQuality:
ethannicholas1446a9a2016-02-10 14:05:02 -08001033 blur[SKDEBUGCANVAS_ATTRIBUTE_QUALITY] = Json::Value(
1034 SKDEBUGCANVAS_BLURQUALITY_HIGH);
ethannicholas50a8dd02016-02-10 05:40:46 -08001035 break;
1036 default:
1037 SkASSERT(false);
1038 }
1039 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
1040 } else {
1041 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -07001042 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001043 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
1044 }
1045 }
1046}
1047
halcanary9d524f22016-03-29 09:03:52 -07001048static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001049 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001050 SkPathEffect* pathEffect = paint.getPathEffect();
1051 if (pathEffect != nullptr) {
1052 SkPathEffect::DashInfo dashInfo;
1053 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
1054 if (dashType == SkPathEffect::kDash_DashType) {
1055 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
1056 pathEffect->asADash(&dashInfo);
1057 Json::Value dashing(Json::objectValue);
1058 Json::Value intervals(Json::arrayValue);
1059 for (int32_t i = 0; i < dashInfo.fCount; i++) {
1060 intervals.append(Json::Value(dashInfo.fIntervals[i]));
1061 }
1062 sk_free(dashInfo.fIntervals);
1063 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
1064 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
1065 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
1066 } else {
1067 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -07001068 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001069 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
1070 }
1071 }
1072}
halcanary9d524f22016-03-29 09:03:52 -07001073
ethannicholas50a8dd02016-02-10 05:40:46 -08001074static void apply_paint_textalign(const SkPaint& paint, Json::Value* target) {
1075 SkPaint::Align textAlign = paint.getTextAlign();
1076 if (textAlign != SkPaint::kLeft_Align) {
1077 switch (textAlign) {
1078 case SkPaint::kCenter_Align: {
1079 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_CENTER;
1080 break;
1081 }
1082 case SkPaint::kRight_Align: {
1083 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_RIGHT;
1084 break;
1085 }
1086 default: SkASSERT(false);
1087 }
1088 }
1089}
1090
halcanary9d524f22016-03-29 09:03:52 -07001091static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001092 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001093 SkTypeface* typeface = paint.getTypeface();
1094 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -08001095 Json::Value jsonTypeface;
1096 SkDynamicMemoryWStream buffer;
1097 typeface->serialize(&buffer);
1098 void* data = sk_malloc_throw(buffer.bytesWritten());
1099 buffer.copyTo(data);
1100 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -07001101 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001102 &jsonData);
1103 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
1104 sk_free(data);
1105 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -08001106 }
1107}
1108
halcanary9d524f22016-03-29 09:03:52 -07001109static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001110 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001111 SkFlattenable* shader = paint.getShader();
1112 if (shader != nullptr) {
1113 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -07001114 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001115 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
1116 }
1117}
1118
halcanary9d524f22016-03-29 09:03:52 -07001119static void apply_paint_xfermode(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001120 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001121 SkFlattenable* xfermode = paint.getXfermode();
1122 if (xfermode != nullptr) {
1123 Json::Value jsonXfermode;
brianosmanfad98562016-05-04 11:06:28 -07001124 SkDrawCommand::flatten(xfermode, &jsonXfermode, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001125 (*target)[SKDEBUGCANVAS_ATTRIBUTE_XFERMODE] = jsonXfermode;
1126 }
1127}
1128
ethannicholasf62a8b72016-02-11 10:35:21 -08001129static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
1130 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001131 SkFlattenable* imageFilter = paint.getImageFilter();
1132 if (imageFilter != nullptr) {
1133 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -07001134 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001135 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
1136 }
1137}
1138
halcanary9d524f22016-03-29 09:03:52 -07001139static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001140 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001141 SkFlattenable* colorFilter = paint.getColorFilter();
1142 if (colorFilter != nullptr) {
1143 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001144 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001145 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1146 }
1147}
1148
halcanary9d524f22016-03-29 09:03:52 -07001149static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001150 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001151 SkFlattenable* looper = paint.getLooper();
1152 if (looper != nullptr) {
1153 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001154 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001155 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1156 }
1157}
1158
brianosmanfad98562016-05-04 11:06:28 -07001159Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001160 Json::Value result(Json::objectValue);
1161 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001162 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001163 SkPaintDefaults_MiterLimit);
1164 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001165 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
halcanary9d524f22016-03-29 09:03:52 -07001166 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001167 SkPaintDefaults_TextSize);
1168 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
1169 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
halcanaryf412f092016-08-25 11:10:41 -07001170 apply_paint_hinting(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001171 apply_paint_color(paint, &result);
1172 apply_paint_style(paint, &result);
1173 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001174 apply_paint_join(paint, &result);
1175 apply_paint_filterquality(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001176 apply_paint_textalign(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001177 apply_paint_patheffect(paint, &result, urlDataManager);
1178 apply_paint_maskfilter(paint, &result, urlDataManager);
1179 apply_paint_shader(paint, &result, urlDataManager);
1180 apply_paint_xfermode(paint, &result, urlDataManager);
1181 apply_paint_looper(paint, &result, urlDataManager);
1182 apply_paint_imagefilter(paint, &result, urlDataManager);
1183 apply_paint_colorfilter(paint, &result, urlDataManager);
1184 apply_paint_typeface(paint, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001185 return result;
1186}
1187
ethannicholas1446a9a2016-02-10 14:05:02 -08001188static SkPoint get_json_point(Json::Value point) {
1189 return SkPoint::Make(point[0].asFloat(), point[1].asFloat());
1190}
1191
1192static SkColor get_json_color(Json::Value color) {
1193 return SkColorSetARGB(color[0].asInt(), color[1].asInt(), color[2].asInt(), color[3].asInt());
1194}
1195
ethannicholas50a8dd02016-02-10 05:40:46 -08001196static void extract_json_paint_color(Json::Value& jsonPaint, SkPaint* target) {
1197 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLOR)) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001198 target->setColor(get_json_color(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_COLOR]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001199 }
1200}
1201
halcanary9d524f22016-03-29 09:03:52 -07001202static void extract_json_paint_shader(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001203 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001204 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_SHADER)) {
1205 Json::Value jsonShader = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_SHADER];
ethannicholasf62a8b72016-02-11 10:35:21 -08001206 SkShader* shader = (SkShader*) load_flattenable(jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001207 if (shader != nullptr) {
reedfe630452016-03-25 09:08:00 -07001208 target->setShader(sk_ref_sp(shader));
ethannicholas50a8dd02016-02-10 05:40:46 -08001209 }
1210 }
1211}
1212
halcanary9d524f22016-03-29 09:03:52 -07001213static void extract_json_paint_patheffect(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001214 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001215 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT)) {
1216 Json::Value jsonPathEffect = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT];
reeda4393342016-03-18 11:22:57 -07001217 sk_sp<SkPathEffect> pathEffect((SkPathEffect*)load_flattenable(jsonPathEffect,
1218 urlDataManager));
ethannicholas50a8dd02016-02-10 05:40:46 -08001219 if (pathEffect != nullptr) {
1220 target->setPathEffect(pathEffect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001221 }
1222 }
1223}
1224
halcanary9d524f22016-03-29 09:03:52 -07001225static void extract_json_paint_maskfilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001226 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001227 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER)) {
1228 Json::Value jsonMaskFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER];
reedefdfd512016-04-04 10:02:58 -07001229 sk_sp<SkMaskFilter> maskFilter((SkMaskFilter*)load_flattenable(jsonMaskFilter,
1230 urlDataManager));
1231 if (maskFilter) {
1232 target->setMaskFilter(std::move(maskFilter));
ethannicholas50a8dd02016-02-10 05:40:46 -08001233 }
1234 }
1235}
1236
halcanary9d524f22016-03-29 09:03:52 -07001237static void extract_json_paint_colorfilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001238 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001239 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER)) {
1240 Json::Value jsonColorFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER];
reedd053ce92016-03-22 10:17:23 -07001241 sk_sp<SkColorFilter> colorFilter((SkColorFilter*)load_flattenable(jsonColorFilter,
1242 urlDataManager));
ethannicholas50a8dd02016-02-10 05:40:46 -08001243 if (colorFilter != nullptr) {
1244 target->setColorFilter(colorFilter);
ethannicholas50a8dd02016-02-10 05:40:46 -08001245 }
1246 }
1247}
1248
halcanary9d524f22016-03-29 09:03:52 -07001249static void extract_json_paint_xfermode(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001250 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001251 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_XFERMODE)) {
1252 Json::Value jsonXfermode = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_XFERMODE];
reedcfb6bdf2016-03-29 11:32:50 -07001253 sk_sp<SkXfermode> xfermode((SkXfermode*) load_flattenable(jsonXfermode, urlDataManager));
ethannicholas50a8dd02016-02-10 05:40:46 -08001254 if (xfermode != nullptr) {
1255 target->setXfermode(xfermode);
ethannicholas50a8dd02016-02-10 05:40:46 -08001256 }
1257 }
1258}
1259
halcanary9d524f22016-03-29 09:03:52 -07001260static void extract_json_paint_looper(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001261 SkPaint* target) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001262 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_LOOPER)) {
1263 Json::Value jsonLooper = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_LOOPER];
reed7b380d02016-03-21 13:25:16 -07001264 sk_sp<SkDrawLooper> looper((SkDrawLooper*) load_flattenable(jsonLooper, urlDataManager));
ethannicholas1446a9a2016-02-10 14:05:02 -08001265 if (looper != nullptr) {
reed7b380d02016-03-21 13:25:16 -07001266 target->setLooper(std::move(looper));
ethannicholas1446a9a2016-02-10 14:05:02 -08001267 }
1268 }
1269}
1270
halcanary9d524f22016-03-29 09:03:52 -07001271static void extract_json_paint_imagefilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001272 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001273 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER)) {
1274 Json::Value jsonImageFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER];
halcanary9d524f22016-03-29 09:03:52 -07001275 SkImageFilter* imageFilter = (SkImageFilter*) load_flattenable(jsonImageFilter,
ethannicholasf62a8b72016-02-11 10:35:21 -08001276 urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001277 if (imageFilter != nullptr) {
1278 target->setImageFilter(imageFilter);
1279 imageFilter->unref();
1280 }
1281 }
1282}
1283
halcanary9d524f22016-03-29 09:03:52 -07001284static void extract_json_paint_typeface(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001285 SkPaint* target) {
1286 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE)) {
1287 Json::Value jsonTypeface = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE];
1288 Json::Value jsonData = jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA];
1289 const void* data;
1290 Json::ArrayIndex length = decode_data(jsonData, urlDataManager, &data);
1291 SkMemoryStream buffer(data, length);
bungeman13b9c952016-05-12 10:09:30 -07001292 target->setTypeface(SkTypeface::MakeDeserialize(&buffer));
ethannicholasf62a8b72016-02-11 10:35:21 -08001293 }
1294}
1295
halcanaryf412f092016-08-25 11:10:41 -07001296static void extract_json_paint_hinting(Json::Value& jsonPaint, SkPaint* target) {
1297 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_HINTING)) {
1298 const char* hinting = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_HINTING].asCString();
1299 if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_NONE)) {
1300 target->setHinting(SkPaint::kNo_Hinting);
1301 } else if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_SLIGHT)) {
1302 target->setHinting(SkPaint::kSlight_Hinting);
1303 } else if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_NORMAL)) {
1304 target->setHinting(SkPaint::kNormal_Hinting);
1305 } else if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_FULL)) {
1306 target->setHinting(SkPaint::kFull_Hinting);
1307 }
1308 }
1309}
1310
ethannicholas50a8dd02016-02-10 05:40:46 -08001311static void extract_json_paint_style(Json::Value& jsonPaint, SkPaint* target) {
1312 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STYLE)) {
1313 const char* style = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STYLE].asCString();
1314 if (!strcmp(style, SKDEBUGCANVAS_STYLE_FILL)) {
1315 target->setStyle(SkPaint::kFill_Style);
1316 }
1317 else if (!strcmp(style, SKDEBUGCANVAS_STYLE_STROKE)) {
1318 target->setStyle(SkPaint::kStroke_Style);
1319 }
1320 else if (!strcmp(style, SKDEBUGCANVAS_STYLE_STROKEANDFILL)) {
1321 target->setStyle(SkPaint::kStrokeAndFill_Style);
1322 }
1323 }
1324}
1325
1326static void extract_json_paint_strokewidth(Json::Value& jsonPaint, SkPaint* target) {
1327 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH)) {
1328 float strokeWidth = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH].asFloat();
1329 target->setStrokeWidth(strokeWidth);
halcanary9d524f22016-03-29 09:03:52 -07001330 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001331}
1332
1333static void extract_json_paint_strokemiter(Json::Value& jsonPaint, SkPaint* target) {
1334 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER)) {
1335 float strokeMiter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER].asFloat();
1336 target->setStrokeMiter(strokeMiter);
halcanary9d524f22016-03-29 09:03:52 -07001337 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001338}
1339
ethannicholas1446a9a2016-02-10 14:05:02 -08001340static void extract_json_paint_strokejoin(Json::Value& jsonPaint, SkPaint* target) {
1341 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN)) {
1342 const char* join = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN].asCString();
1343 if (!strcmp(join, SKDEBUGCANVAS_MITER_JOIN)) {
1344 target->setStrokeJoin(SkPaint::kMiter_Join);
1345 }
1346 else if (!strcmp(join, SKDEBUGCANVAS_ROUND_JOIN)) {
1347 target->setStrokeJoin(SkPaint::kRound_Join);
1348 }
1349 else if (!strcmp(join, SKDEBUGCANVAS_BEVEL_JOIN)) {
1350 target->setStrokeJoin(SkPaint::kBevel_Join);
1351 }
1352 else {
1353 SkASSERT(false);
1354 }
1355 }
1356}
1357
ethannicholas50a8dd02016-02-10 05:40:46 -08001358static void extract_json_paint_cap(Json::Value& jsonPaint, SkPaint* target) {
1359 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_CAP)) {
1360 const char* cap = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_CAP].asCString();
1361 if (!strcmp(cap, SKDEBUGCANVAS_CAP_BUTT)) {
1362 target->setStrokeCap(SkPaint::kButt_Cap);
1363 }
1364 else if (!strcmp(cap, SKDEBUGCANVAS_CAP_ROUND)) {
1365 target->setStrokeCap(SkPaint::kRound_Cap);
1366 }
1367 else if (!strcmp(cap, SKDEBUGCANVAS_CAP_SQUARE)) {
1368 target->setStrokeCap(SkPaint::kSquare_Cap);
1369 }
1370 }
1371}
1372
ethannicholas1446a9a2016-02-10 14:05:02 -08001373static void extract_json_paint_filterquality(Json::Value& jsonPaint, SkPaint* target) {
1374 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY)) {
1375 const char* quality = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY].asCString();
1376 if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_NONE)) {
1377 target->setFilterQuality(kNone_SkFilterQuality);
1378 }
1379 else if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_LOW)) {
1380 target->setFilterQuality(kLow_SkFilterQuality);
1381 }
1382 else if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_MEDIUM)) {
1383 target->setFilterQuality(kMedium_SkFilterQuality);
1384 }
1385 else if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_HIGH)) {
1386 target->setFilterQuality(kHigh_SkFilterQuality);
1387 }
1388 }
1389}
1390
ethannicholas50a8dd02016-02-10 05:40:46 -08001391static void extract_json_paint_antialias(Json::Value& jsonPaint, SkPaint* target) {
1392 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS)) {
1393 target->setAntiAlias(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
1394 }
1395}
1396
ethannicholas1446a9a2016-02-10 14:05:02 -08001397static void extract_json_paint_dither(Json::Value& jsonPaint, SkPaint* target) {
1398 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_DITHER)) {
1399 target->setDither(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_DITHER].asBool());
1400 }
1401}
1402
ethannicholas50a8dd02016-02-10 05:40:46 -08001403static void extract_json_paint_blur(Json::Value& jsonPaint, SkPaint* target) {
1404 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_BLUR)) {
1405 Json::Value blur = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_BLUR];
1406 SkScalar sigma = blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA].asFloat();
1407 SkBlurStyle style;
1408 const char* jsonStyle = blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE].asCString();
1409 if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_NORMAL)) {
1410 style = SkBlurStyle::kNormal_SkBlurStyle;
1411 }
1412 else if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_SOLID)) {
1413 style = SkBlurStyle::kSolid_SkBlurStyle;
1414 }
1415 else if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_OUTER)) {
1416 style = SkBlurStyle::kOuter_SkBlurStyle;
1417 }
1418 else if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_INNER)) {
1419 style = SkBlurStyle::kInner_SkBlurStyle;
1420 }
1421 else {
1422 SkASSERT(false);
1423 style = SkBlurStyle::kNormal_SkBlurStyle;
1424 }
1425 SkBlurMaskFilter::BlurFlags flags;
1426 const char* jsonQuality = blur[SKDEBUGCANVAS_ATTRIBUTE_QUALITY].asCString();
1427 if (!strcmp(jsonQuality, SKDEBUGCANVAS_BLURQUALITY_LOW)) {
1428 flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag;
1429 }
1430 else if (!strcmp(jsonQuality, SKDEBUGCANVAS_BLURQUALITY_HIGH)) {
1431 flags = SkBlurMaskFilter::BlurFlags::kHighQuality_BlurFlag;
1432 }
1433 else {
1434 SkASSERT(false);
1435 flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag;
1436 }
reedefdfd512016-04-04 10:02:58 -07001437 target->setMaskFilter(SkBlurMaskFilter::Make(style, sigma, flags));
ethannicholas50a8dd02016-02-10 05:40:46 -08001438 }
1439}
1440
1441static void extract_json_paint_dashing(Json::Value& jsonPaint, SkPaint* target) {
1442 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_DASHING)) {
1443 Json::Value dash = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_DASHING];
1444 Json::Value jsonIntervals = dash[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS];
1445 Json::ArrayIndex count = jsonIntervals.size();
1446 SkScalar* intervals = (SkScalar*) sk_malloc_throw(count * sizeof(SkScalar));
1447 for (Json::ArrayIndex i = 0; i < count; i++) {
1448 intervals[i] = jsonIntervals[i].asFloat();
1449 }
1450 SkScalar phase = dash[SKDEBUGCANVAS_ATTRIBUTE_PHASE].asFloat();
reeda4393342016-03-18 11:22:57 -07001451 target->setPathEffect(SkDashPathEffect::Make(intervals, count, phase));
ethannicholas50a8dd02016-02-10 05:40:46 -08001452 sk_free(intervals);
1453 }
1454}
1455
1456static void extract_json_paint_textalign(Json::Value& jsonPaint, SkPaint* target) {
1457 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN)) {
1458 SkPaint::Align textAlign;
1459 const char* jsonAlign = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN].asCString();
1460 if (!strcmp(jsonAlign, SKDEBUGCANVAS_ALIGN_LEFT)) {
1461 textAlign = SkPaint::kLeft_Align;
1462 }
1463 else if (!strcmp(jsonAlign, SKDEBUGCANVAS_ALIGN_CENTER)) {
1464 textAlign = SkPaint::kCenter_Align;
1465 }
1466 else if (!strcmp(jsonAlign, SKDEBUGCANVAS_ALIGN_RIGHT)) {
1467 textAlign = SkPaint::kRight_Align;
1468 }
1469 else {
1470 SkASSERT(false);
1471 textAlign = SkPaint::kLeft_Align;
1472 }
1473 target->setTextAlign(textAlign);
1474 }
1475}
1476
1477static void extract_json_paint_textsize(Json::Value& jsonPaint, SkPaint* target) {
1478 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE)) {
1479 float textSize = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE].asFloat();
1480 target->setTextSize(textSize);
1481 }
1482}
1483
1484static void extract_json_paint_textscalex(Json::Value& jsonPaint, SkPaint* target) {
1485 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX)) {
1486 float textScaleX = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX].asFloat();
1487 target->setTextScaleX(textScaleX);
1488 }
1489}
1490
1491static void extract_json_paint_textskewx(Json::Value& jsonPaint, SkPaint* target) {
1492 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX)) {
1493 float textSkewX = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX].asFloat();
1494 target->setTextSkewX(textSkewX);
1495 }
1496}
1497
halcanary9d524f22016-03-29 09:03:52 -07001498static void extract_json_paint(Json::Value& paint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001499 SkPaint* result) {
halcanaryf412f092016-08-25 11:10:41 -07001500 extract_json_paint_hinting(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001501 extract_json_paint_color(paint, result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001502 extract_json_paint_shader(paint, urlDataManager, result);
1503 extract_json_paint_patheffect(paint, urlDataManager, result);
1504 extract_json_paint_maskfilter(paint, urlDataManager, result);
1505 extract_json_paint_colorfilter(paint, urlDataManager, result);
1506 extract_json_paint_xfermode(paint, urlDataManager, result);
1507 extract_json_paint_looper(paint, urlDataManager, result);
1508 extract_json_paint_imagefilter(paint, urlDataManager, result);
1509 extract_json_paint_typeface(paint, urlDataManager, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001510 extract_json_paint_style(paint, result);
1511 extract_json_paint_strokewidth(paint, result);
1512 extract_json_paint_strokemiter(paint, result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001513 extract_json_paint_strokejoin(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001514 extract_json_paint_cap(paint, result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001515 extract_json_paint_filterquality(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001516 extract_json_paint_antialias(paint, result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001517 extract_json_paint_dither(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001518 extract_json_paint_blur(paint, result);
1519 extract_json_paint_dashing(paint, result);
1520 extract_json_paint_textalign(paint, result);
1521 extract_json_paint_textsize(paint, result);
1522 extract_json_paint_textscalex(paint, result);
1523 extract_json_paint_textskewx(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001524}
1525
1526static void extract_json_rect(Json::Value& rect, SkRect* result) {
1527 result->set(rect[0].asFloat(), rect[1].asFloat(), rect[2].asFloat(), rect[3].asFloat());
1528}
1529
1530static void extract_json_irect(Json::Value& rect, SkIRect* result) {
1531 result->set(rect[0].asInt(), rect[1].asInt(), rect[2].asInt(), rect[3].asInt());
1532}
1533
1534static void extract_json_rrect(Json::Value& rrect, SkRRect* result) {
1535 SkVector radii[4] = {
halcanary9d524f22016-03-29 09:03:52 -07001536 { rrect[1][0].asFloat(), rrect[1][1].asFloat() },
1537 { rrect[2][0].asFloat(), rrect[2][1].asFloat() },
1538 { rrect[3][0].asFloat(), rrect[3][1].asFloat() },
ethannicholas50a8dd02016-02-10 05:40:46 -08001539 { rrect[4][0].asFloat(), rrect[4][1].asFloat() }
1540 };
halcanary9d524f22016-03-29 09:03:52 -07001541 result->setRectRadii(SkRect::MakeLTRB(rrect[0][0].asFloat(), rrect[0][1].asFloat(),
1542 rrect[0][2].asFloat(), rrect[0][3].asFloat()),
ethannicholas50a8dd02016-02-10 05:40:46 -08001543 radii);
1544}
1545
1546static void extract_json_matrix(Json::Value& matrix, SkMatrix* result) {
halcanary9d524f22016-03-29 09:03:52 -07001547 SkScalar values[] = {
ethannicholas50a8dd02016-02-10 05:40:46 -08001548 matrix[0][0].asFloat(), matrix[0][1].asFloat(), matrix[0][2].asFloat(),
1549 matrix[1][0].asFloat(), matrix[1][1].asFloat(), matrix[1][2].asFloat(),
halcanary9d524f22016-03-29 09:03:52 -07001550 matrix[2][0].asFloat(), matrix[2][1].asFloat(), matrix[2][2].asFloat()
ethannicholas50a8dd02016-02-10 05:40:46 -08001551 };
1552 result->set9(values);
1553}
1554
vjiaoblack95302da2016-07-21 10:25:54 -07001555#ifdef SK_EXPERIMENTAL_SHADOWING
1556// somehow this is only used in shadows...
vjiaoblacke5de1302016-07-13 14:05:28 -07001557static void extract_json_scalar(Json::Value& scalar, SkScalar* result) {
1558 SkScalar value = scalar.asFloat();
1559 *result = value;
1560}
vjiaoblack95302da2016-07-21 10:25:54 -07001561#endif
vjiaoblacke5de1302016-07-13 14:05:28 -07001562
ethannicholas50a8dd02016-02-10 05:40:46 -08001563static void extract_json_path(Json::Value& path, SkPath* result) {
1564 const char* fillType = path[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE].asCString();
1565 if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_WINDING)) {
1566 result->setFillType(SkPath::kWinding_FillType);
1567 }
1568 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_EVENODD)) {
1569 result->setFillType(SkPath::kEvenOdd_FillType);
1570 }
1571 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING)) {
1572 result->setFillType(SkPath::kInverseWinding_FillType);
1573 }
1574 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD)) {
1575 result->setFillType(SkPath::kInverseEvenOdd_FillType);
1576 }
1577 Json::Value verbs = path[SKDEBUGCANVAS_ATTRIBUTE_VERBS];
1578 for (Json::ArrayIndex i = 0; i < verbs.size(); i++) {
1579 Json::Value verb = verbs[i];
1580 if (verb.isString()) {
1581 SkASSERT(!strcmp(verb.asCString(), SKDEBUGCANVAS_VERB_CLOSE));
1582 result->close();
1583 }
1584 else {
1585 if (verb.isMember(SKDEBUGCANVAS_VERB_MOVE)) {
1586 Json::Value move = verb[SKDEBUGCANVAS_VERB_MOVE];
1587 result->moveTo(move[0].asFloat(), move[1].asFloat());
1588 }
1589 else if (verb.isMember(SKDEBUGCANVAS_VERB_LINE)) {
1590 Json::Value line = verb[SKDEBUGCANVAS_VERB_LINE];
1591 result->lineTo(line[0].asFloat(), line[1].asFloat());
1592 }
1593 else if (verb.isMember(SKDEBUGCANVAS_VERB_QUAD)) {
1594 Json::Value quad = verb[SKDEBUGCANVAS_VERB_QUAD];
1595 result->quadTo(quad[0][0].asFloat(), quad[0][1].asFloat(),
1596 quad[1][0].asFloat(), quad[1][1].asFloat());
1597 }
1598 else if (verb.isMember(SKDEBUGCANVAS_VERB_CUBIC)) {
1599 Json::Value cubic = verb[SKDEBUGCANVAS_VERB_CUBIC];
1600 result->cubicTo(cubic[0][0].asFloat(), cubic[0][1].asFloat(),
1601 cubic[1][0].asFloat(), cubic[1][1].asFloat(),
1602 cubic[2][0].asFloat(), cubic[2][1].asFloat());
1603 }
1604 else if (verb.isMember(SKDEBUGCANVAS_VERB_CONIC)) {
1605 Json::Value conic = verb[SKDEBUGCANVAS_VERB_CONIC];
1606 result->conicTo(conic[0][0].asFloat(), conic[0][1].asFloat(),
1607 conic[1][0].asFloat(), conic[1][1].asFloat(),
1608 conic[2].asFloat());
1609 }
1610 else {
1611 SkASSERT(false);
1612 }
1613 }
1614 }
1615}
1616
reed73603f32016-09-20 08:42:38 -07001617SkCanvas::ClipOp get_json_clipop(Json::Value& jsonOp) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001618 const char* op = jsonOp.asCString();
1619 if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_DIFFERENCE)) {
reed73603f32016-09-20 08:42:38 -07001620 return SkCanvas::kDifference_Op;
ethannicholas50a8dd02016-02-10 05:40:46 -08001621 }
1622 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_INTERSECT)) {
reed73603f32016-09-20 08:42:38 -07001623 return SkCanvas::kIntersect_Op;
ethannicholas50a8dd02016-02-10 05:40:46 -08001624 }
1625 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_UNION)) {
reed73603f32016-09-20 08:42:38 -07001626 return SkCanvas::kUnion_Op;
ethannicholas50a8dd02016-02-10 05:40:46 -08001627 }
1628 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_XOR)) {
reed73603f32016-09-20 08:42:38 -07001629 return SkCanvas::kXOR_Op;
ethannicholas50a8dd02016-02-10 05:40:46 -08001630 }
1631 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE)) {
reed73603f32016-09-20 08:42:38 -07001632 return SkCanvas::kReverseDifference_Op;
ethannicholas50a8dd02016-02-10 05:40:46 -08001633 }
1634 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_REPLACE)) {
reed73603f32016-09-20 08:42:38 -07001635 return SkCanvas::kReplace_Op;
ethannicholas50a8dd02016-02-10 05:40:46 -08001636 }
1637 SkASSERT(false);
reed73603f32016-09-20 08:42:38 -07001638 return SkCanvas::kIntersect_Op;
ethannicholas50a8dd02016-02-10 05:40:46 -08001639}
1640
ethannicholas1446a9a2016-02-10 14:05:02 -08001641SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kDrawClear_OpType) {
1642 fColor = color;
1643 fInfo.push(SkObjectParser::CustomTextToString("No Parameters"));
1644}
1645
1646void SkClearCommand::execute(SkCanvas* canvas) const {
1647 canvas->clear(fColor);
1648}
1649
ethannicholasf62a8b72016-02-11 10:35:21 -08001650Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1651 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001652 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001653 return result;
1654}
1655
ethannicholasf62a8b72016-02-11 10:35:21 -08001656 SkClearCommand* SkClearCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001657 Json::Value color = command[SKDEBUGCANVAS_ATTRIBUTE_COLOR];
1658 return new SkClearCommand(get_json_color(color));
1659}
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001660
reed73603f32016-09-20 08:42:38 -07001661SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkCanvas::ClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001662 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001663 fPath = path;
1664 fOp = op;
1665 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001666
robertphillips@google.com91217d02013-03-17 18:33:46 +00001667 fInfo.push(SkObjectParser::PathToString(path));
reed73603f32016-09-20 08:42:38 -07001668 fInfo.push(SkObjectParser::ClipOpToString(op));
robertphillips@google.com91217d02013-03-17 18:33:46 +00001669 fInfo.push(SkObjectParser::BoolToString(doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +00001670}
1671
fmalita8c89c522014-11-08 16:18:56 -08001672void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001673 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001674}
1675
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001676bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001677 render_path(canvas, fPath);
1678 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001679}
1680
ethannicholasf62a8b72016-02-11 10:35:21 -08001681Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1682 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001683 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001684 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1685 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1686 return result;
1687}
1688
halcanary9d524f22016-03-29 09:03:52 -07001689SkClipPathCommand* SkClipPathCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001690 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001691 SkPath path;
1692 extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path);
reed73603f32016-09-20 08:42:38 -07001693 return new SkClipPathCommand(path, get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]),
ethannicholas50a8dd02016-02-10 05:40:46 -08001694 command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
1695}
1696
reed73603f32016-09-20 08:42:38 -07001697SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkCanvas::ClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001698 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001699 fRegion = region;
1700 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001701
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001702 fInfo.push(SkObjectParser::RegionToString(region));
reed73603f32016-09-20 08:42:38 -07001703 fInfo.push(SkObjectParser::ClipOpToString(op));
chudy@google.com902ebe52012-06-29 14:21:22 +00001704}
1705
fmalita8c89c522014-11-08 16:18:56 -08001706void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001707 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001708}
1709
ethannicholasf62a8b72016-02-11 10:35:21 -08001710Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1711 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001712 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001713 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1714 return result;
1715}
1716
halcanary9d524f22016-03-29 09:03:52 -07001717SkClipRegionCommand* SkClipRegionCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001718 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001719 SkASSERT(false);
1720 return nullptr;
1721}
1722
reed73603f32016-09-20 08:42:38 -07001723SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkCanvas::ClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001724 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001725 fRect = rect;
1726 fOp = op;
1727 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001728
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001729 fInfo.push(SkObjectParser::RectToString(rect));
reed73603f32016-09-20 08:42:38 -07001730 fInfo.push(SkObjectParser::ClipOpToString(op));
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001731 fInfo.push(SkObjectParser::BoolToString(doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +00001732}
1733
fmalita8c89c522014-11-08 16:18:56 -08001734void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001735 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001736}
1737
ethannicholasf62a8b72016-02-11 10:35:21 -08001738Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1739 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001740 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001741 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1742 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001743
1744 SkString desc;
1745 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1746
ethannicholas50a8dd02016-02-10 05:40:46 -08001747 return result;
1748}
1749
halcanary9d524f22016-03-29 09:03:52 -07001750SkClipRectCommand* SkClipRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001751 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001752 SkRect rect;
1753 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rect);
reed73603f32016-09-20 08:42:38 -07001754 return new SkClipRectCommand(rect, get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]),
ethannicholas50a8dd02016-02-10 05:40:46 -08001755 command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
1756}
1757
reed73603f32016-09-20 08:42:38 -07001758SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkCanvas::ClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001759 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001760 fRRect = rrect;
1761 fOp = op;
1762 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001763
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001764 fInfo.push(SkObjectParser::RRectToString(rrect));
reed73603f32016-09-20 08:42:38 -07001765 fInfo.push(SkObjectParser::ClipOpToString(op));
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001766 fInfo.push(SkObjectParser::BoolToString(doAA));
robertphillips@google.com67baba42013-01-02 20:20:31 +00001767}
1768
fmalita8c89c522014-11-08 16:18:56 -08001769void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001770 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001771}
1772
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001773bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001774 render_rrect(canvas, fRRect);
1775 return true;
1776}
1777
ethannicholasf62a8b72016-02-11 10:35:21 -08001778Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1779 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001780 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1781 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1782 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1783 return result;
1784}
1785
halcanary9d524f22016-03-29 09:03:52 -07001786SkClipRRectCommand* SkClipRRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001787 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001788 SkRRect rrect;
1789 extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rrect);
halcanary9d524f22016-03-29 09:03:52 -07001790 return new SkClipRRectCommand(rrect,
reed73603f32016-09-20 08:42:38 -07001791 get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]),
ethannicholas50a8dd02016-02-10 05:40:46 -08001792 command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
1793}
1794
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001795SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001796 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001797 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001798
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001799 fInfo.push(SkObjectParser::MatrixToString(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +00001800}
1801
fmalita8c89c522014-11-08 16:18:56 -08001802void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001803 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001804}
1805
ethannicholasf62a8b72016-02-11 10:35:21 -08001806Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1807 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001808 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001809 return result;
1810}
1811
ethannicholasf62a8b72016-02-11 10:35:21 -08001812SkConcatCommand* SkConcatCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001813 SkMatrix matrix;
1814 extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix);
1815 return new SkConcatCommand(matrix);
1816}
1817
reed97660cc2016-06-28 18:54:19 -07001818////
1819
1820SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1821 sk_sp<SkData> value)
1822 : INHERITED(kDrawAnnotation_OpType)
1823 , fRect(rect)
1824 , fKey(key)
1825 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001826{
1827 SkString str;
1828 str.appendf("Key: %s Value: ", key);
1829 if (fValue && fValue->size()) {
1830 str.append((const char*) fValue->bytes(), fValue->size());
1831 } else {
1832 str.appendf("no value");
1833 }
1834 str.appendf("\n");
1835 fInfo.push(new SkString(str));
1836}
reed97660cc2016-06-28 18:54:19 -07001837
1838void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1839 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1840}
1841
1842Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1843 Json::Value result = INHERITED::toJSON(urlDataManager);
1844
1845 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1846 result["key"] = Json::Value(fKey.c_str());
1847 if (fValue.get()) {
1848 // TODO: dump out the "value"
1849 }
reed67f62fa2016-06-29 11:36:34 -07001850
1851 SkString desc;
1852 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1853 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1854
reed97660cc2016-06-28 18:54:19 -07001855 return result;
1856}
1857
1858SkDrawAnnotationCommand* SkDrawAnnotationCommand::fromJSON(Json::Value& command,
1859 UrlDataManager& urlDataManager) {
1860 SkRect rect;
1861 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rect);
1862 sk_sp<SkData> data(nullptr); // TODO: extract "value" from the Json
1863 return new SkDrawAnnotationCommand(rect, command["key"].asCString(), data);
1864}
1865
1866////
1867
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001868SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07001869 const SkPaint* paint)
robertphillips9bafc302015-02-13 11:13:00 -08001870 : INHERITED(kDrawBitmap_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001871 fBitmap = bitmap;
1872 fLeft = left;
1873 fTop = top;
bsalomon49f085d2014-09-05 13:34:00 -07001874 if (paint) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001875 fPaint = *paint;
1876 fPaintPtr = &fPaint;
1877 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07001878 fPaintPtr = nullptr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001879 }
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001880
1881 fInfo.push(SkObjectParser::BitmapToString(bitmap));
1882 fInfo.push(SkObjectParser::ScalarToString(left, "SkScalar left: "));
1883 fInfo.push(SkObjectParser::ScalarToString(top, "SkScalar top: "));
bsalomon49f085d2014-09-05 13:34:00 -07001884 if (paint) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001885 fInfo.push(SkObjectParser::PaintToString(*paint));
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00001886 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001887}
1888
fmalita8c89c522014-11-08 16:18:56 -08001889void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001890 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaintPtr);
chudy@google.com902ebe52012-06-29 14:21:22 +00001891}
1892
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001893bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001894 render_bitmap(canvas, fBitmap);
1895 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001896}
1897
ethannicholasf62a8b72016-02-11 10:35:21 -08001898Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
1899 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001900 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001901 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001902 Json::Value command(Json::objectValue);
1903 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001904 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08001905 if (fPaintPtr != nullptr) {
brianosmanfad98562016-05-04 11:06:28 -07001906 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001907 }
1908 }
1909 return result;
1910}
1911
halcanary9d524f22016-03-29 09:03:52 -07001912SkDrawBitmapCommand* SkDrawBitmapCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001913 UrlDataManager& urlDataManager) {
1914 SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001915 if (bitmap == nullptr) {
1916 return nullptr;
1917 }
1918 Json::Value point = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
1919 SkPaint* paintPtr;
1920 SkPaint paint;
1921 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08001922 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08001923 paintPtr = &paint;
1924 }
1925 else {
1926 paintPtr = nullptr;
1927 }
halcanary9d524f22016-03-29 09:03:52 -07001928 SkDrawBitmapCommand* result = new SkDrawBitmapCommand(*bitmap, point[0].asFloat(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001929 point[1].asFloat(), paintPtr);
1930 delete bitmap;
1931 return result;
1932}
1933
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001934SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00001935 const SkRect& dst, const SkPaint* paint)
robertphillips9bafc302015-02-13 11:13:00 -08001936 : INHERITED(kDrawBitmapNine_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001937 fBitmap = bitmap;
1938 fCenter = center;
1939 fDst = dst;
bsalomon49f085d2014-09-05 13:34:00 -07001940 if (paint) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001941 fPaint = *paint;
1942 fPaintPtr = &fPaint;
1943 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07001944 fPaintPtr = nullptr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001945 }
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001946
1947 fInfo.push(SkObjectParser::BitmapToString(bitmap));
1948 fInfo.push(SkObjectParser::IRectToString(center));
1949 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
bsalomon49f085d2014-09-05 13:34:00 -07001950 if (paint) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001951 fInfo.push(SkObjectParser::PaintToString(*paint));
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00001952 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001953}
1954
fmalita8c89c522014-11-08 16:18:56 -08001955void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001956 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaintPtr);
chudy@google.com902ebe52012-06-29 14:21:22 +00001957}
1958
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001959bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08001960 SkRect tmp = SkRect::Make(fCenter);
1961 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001962 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001963}
1964
ethannicholasf62a8b72016-02-11 10:35:21 -08001965Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1966 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001967 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001968 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001969 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08001970 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07001971 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08001972 if (fPaintPtr != nullptr) {
brianosmanfad98562016-05-04 11:06:28 -07001973 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001974 }
1975 }
1976 return result;
1977}
1978
halcanary9d524f22016-03-29 09:03:52 -07001979SkDrawBitmapNineCommand* SkDrawBitmapNineCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001980 UrlDataManager& urlDataManager) {
1981 SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001982 if (bitmap == nullptr) {
1983 return nullptr;
1984 }
1985 SkIRect center;
1986 extract_json_irect(command[SKDEBUGCANVAS_ATTRIBUTE_CENTER], &center);
1987 SkRect dst;
1988 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst);
1989 SkPaint* paintPtr;
1990 SkPaint paint;
1991 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08001992 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08001993 paintPtr = &paint;
1994 }
1995 else {
1996 paintPtr = nullptr;
1997 }
1998 SkDrawBitmapNineCommand* result = new SkDrawBitmapNineCommand(*bitmap, center, dst, paintPtr);
1999 delete bitmap;
2000 return result;
2001}
2002
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002003SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00002004 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07002005 SkCanvas::SrcRectConstraint constraint)
robertphillips9bafc302015-02-13 11:13:00 -08002006 : INHERITED(kDrawBitmapRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002007 fBitmap = bitmap;
bsalomon49f085d2014-09-05 13:34:00 -07002008 if (src) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002009 fSrc = *src;
2010 } else {
2011 fSrc.setEmpty();
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00002012 }
robertphillips@google.com91217d02013-03-17 18:33:46 +00002013 fDst = dst;
2014
bsalomon49f085d2014-09-05 13:34:00 -07002015 if (paint) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002016 fPaint = *paint;
2017 fPaintPtr = &fPaint;
2018 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07002019 fPaintPtr = nullptr;
robertphillips@google.com91217d02013-03-17 18:33:46 +00002020 }
reeda5517e22015-07-14 10:54:12 -07002021 fConstraint = constraint;
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00002022
robertphillips@google.com91217d02013-03-17 18:33:46 +00002023 fInfo.push(SkObjectParser::BitmapToString(bitmap));
bsalomon49f085d2014-09-05 13:34:00 -07002024 if (src) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002025 fInfo.push(SkObjectParser::RectToString(*src, "Src: "));
2026 }
2027 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
bsalomon49f085d2014-09-05 13:34:00 -07002028 if (paint) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002029 fInfo.push(SkObjectParser::PaintToString(*paint));
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00002030 }
reeda5517e22015-07-14 10:54:12 -07002031 fInfo.push(SkObjectParser::IntToString(fConstraint, "Constraint: "));
chudy@google.com902ebe52012-06-29 14:21:22 +00002032}
2033
fmalita8c89c522014-11-08 16:18:56 -08002034void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
reede47829b2015-08-06 10:02:53 -07002035 canvas->legacy_drawBitmapRect(fBitmap, this->srcRect(), fDst, fPaintPtr, fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002036}
2037
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002038bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002039 render_bitmap(canvas, fBitmap, this->srcRect());
2040 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00002041}
2042
ethannicholasf62a8b72016-02-11 10:35:21 -08002043Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2044 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002045 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002046 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002047 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
2048 if (!fSrc.isEmpty()) {
brianosmanfad98562016-05-04 11:06:28 -07002049 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(fSrc);
ethannicholas50a8dd02016-02-10 05:40:46 -08002050 }
brianosmanfad98562016-05-04 11:06:28 -07002051 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08002052 if (fPaintPtr != nullptr) {
brianosmanfad98562016-05-04 11:06:28 -07002053 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002054 }
2055 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
2056 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
2057 }
2058 }
reed67f62fa2016-06-29 11:36:34 -07002059
2060 SkString desc;
2061 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
2062
ethannicholas50a8dd02016-02-10 05:40:46 -08002063 return result;
2064}
2065
halcanary9d524f22016-03-29 09:03:52 -07002066SkDrawBitmapRectCommand* SkDrawBitmapRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002067 UrlDataManager& urlDataManager) {
2068 SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002069 if (bitmap == nullptr) {
2070 return nullptr;
2071 }
2072 SkRect dst;
2073 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst);
2074 SkPaint* paintPtr;
2075 SkPaint paint;
2076 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002077 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002078 paintPtr = &paint;
2079 }
2080 else {
2081 paintPtr = nullptr;
2082 }
2083 SkCanvas::SrcRectConstraint constraint;
halcanary9d524f22016-03-29 09:03:52 -07002084 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_STRICT) &&
ethannicholas50a8dd02016-02-10 05:40:46 -08002085 command[SKDEBUGCANVAS_ATTRIBUTE_STRICT].asBool()) {
2086 constraint = SkCanvas::kStrict_SrcRectConstraint;
2087 }
2088 else {
2089 constraint = SkCanvas::kFast_SrcRectConstraint;
2090 }
2091 SkRect* srcPtr;
2092 SkRect src;
2093 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_SRC)) {
2094 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_SRC], &src);
2095 srcPtr = &src;
2096 }
2097 else {
2098 srcPtr = nullptr;
2099 }
2100 SkDrawBitmapRectCommand* result = new SkDrawBitmapRectCommand(*bitmap, srcPtr, dst, paintPtr,
2101 constraint);
2102 delete bitmap;
2103 return result;
2104}
2105
fmalita651c9202015-07-22 10:23:01 -07002106SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
2107 const SkPaint* paint)
2108 : INHERITED(kDrawImage_OpType)
2109 , fImage(SkRef(image))
2110 , fLeft(left)
2111 , fTop(top) {
2112
fmalita7361bf02015-10-29 12:13:48 -07002113 fInfo.push(SkObjectParser::ImageToString(image));
2114 fInfo.push(SkObjectParser::ScalarToString(left, "Left: "));
2115 fInfo.push(SkObjectParser::ScalarToString(top, "Top: "));
2116
fmalita651c9202015-07-22 10:23:01 -07002117 if (paint) {
2118 fPaint.set(*paint);
fmalita7361bf02015-10-29 12:13:48 -07002119 fInfo.push(SkObjectParser::PaintToString(*paint));
fmalita651c9202015-07-22 10:23:01 -07002120 }
2121}
2122
2123void SkDrawImageCommand::execute(SkCanvas* canvas) const {
2124 canvas->drawImage(fImage, fLeft, fTop, fPaint.getMaybeNull());
2125}
2126
2127bool SkDrawImageCommand::render(SkCanvas* canvas) const {
2128 SkAutoCanvasRestore acr(canvas, true);
2129 canvas->clear(0xFFFFFFFF);
2130
2131 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
2132 SkIntToScalar(fImage->width()),
2133 SkIntToScalar(fImage->height())));
2134 this->execute(canvas);
2135 return true;
2136}
2137
ethannicholasf62a8b72016-02-11 10:35:21 -08002138Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
2139 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002140 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002141 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002142 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07002143 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08002144 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07002145 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002146 }
msarett0ac1bec2016-08-29 09:15:33 -07002147
2148 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
2149 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
2150 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
2151 switch (fImage->alphaType()) {
2152 case kOpaque_SkAlphaType:
2153 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
2154 break;
2155 case kPremul_SkAlphaType:
2156 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
2157 break;
2158 case kUnpremul_SkAlphaType:
2159 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
2160 break;
2161 default:
2162 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
2163 break;
2164 }
ethannicholas50a8dd02016-02-10 05:40:46 -08002165 }
2166 return result;
2167}
2168
halcanary9d524f22016-03-29 09:03:52 -07002169SkDrawImageCommand* SkDrawImageCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002170 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -07002171 sk_sp<SkImage> image = load_image(command[SKDEBUGCANVAS_ATTRIBUTE_IMAGE], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002172 if (image == nullptr) {
2173 return nullptr;
2174 }
2175 Json::Value point = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
2176 SkPaint* paintPtr;
2177 SkPaint paint;
2178 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002179 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002180 paintPtr = &paint;
2181 }
2182 else {
2183 paintPtr = nullptr;
2184 }
reed9ce9d672016-03-17 10:51:11 -07002185 SkDrawImageCommand* result = new SkDrawImageCommand(image.get(), point[0].asFloat(),
ethannicholas50a8dd02016-02-10 05:40:46 -08002186 point[1].asFloat(), paintPtr);
ethannicholas50a8dd02016-02-10 05:40:46 -08002187 return result;
2188}
2189
fmalita651c9202015-07-22 10:23:01 -07002190SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
2191 const SkRect& dst, const SkPaint* paint,
2192 SkCanvas::SrcRectConstraint constraint)
2193 : INHERITED(kDrawImageRect_OpType)
2194 , fImage(SkRef(image))
2195 , fDst(dst)
2196 , fConstraint(constraint) {
2197
2198 if (src) {
2199 fSrc.set(*src);
2200 }
2201
2202 if (paint) {
2203 fPaint.set(*paint);
2204 }
robertphillips80af6452015-08-24 08:27:38 -07002205
2206 fInfo.push(SkObjectParser::ImageToString(image));
2207 if (src) {
2208 fInfo.push(SkObjectParser::RectToString(*src, "Src: "));
2209 }
2210 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
2211 if (paint) {
2212 fInfo.push(SkObjectParser::PaintToString(*paint));
2213 }
2214 fInfo.push(SkObjectParser::IntToString(fConstraint, "Constraint: "));
fmalita651c9202015-07-22 10:23:01 -07002215}
2216
2217void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
halcanary9d524f22016-03-29 09:03:52 -07002218 canvas->legacy_drawImageRect(fImage, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
ethannicholas1446a9a2016-02-10 14:05:02 -08002219 fConstraint);
fmalita651c9202015-07-22 10:23:01 -07002220}
2221
2222bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
2223 SkAutoCanvasRestore acr(canvas, true);
2224 canvas->clear(0xFFFFFFFF);
2225
2226 xlate_and_scale_to_bounds(canvas, fDst);
2227
2228 this->execute(canvas);
2229 return true;
2230}
2231
ethannicholasf62a8b72016-02-11 10:35:21 -08002232Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2233 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002234 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002235 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002236 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
2237 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07002238 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002239 }
brianosmanfad98562016-05-04 11:06:28 -07002240 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08002241 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07002242 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002243 }
2244 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
2245 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
2246 }
2247 }
reed67f62fa2016-06-29 11:36:34 -07002248
2249 SkString desc;
2250 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
2251
ethannicholas50a8dd02016-02-10 05:40:46 -08002252 return result;
2253}
2254
halcanary9d524f22016-03-29 09:03:52 -07002255SkDrawImageRectCommand* SkDrawImageRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002256 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -07002257 sk_sp<SkImage> image = load_image(command[SKDEBUGCANVAS_ATTRIBUTE_IMAGE], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002258 if (image == nullptr) {
2259 return nullptr;
2260 }
2261 SkRect dst;
2262 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst);
2263 SkPaint* paintPtr;
2264 SkPaint paint;
2265 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002266 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002267 paintPtr = &paint;
2268 }
2269 else {
2270 paintPtr = nullptr;
2271 }
2272 SkCanvas::SrcRectConstraint constraint;
halcanary9d524f22016-03-29 09:03:52 -07002273 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_STRICT) &&
ethannicholas50a8dd02016-02-10 05:40:46 -08002274 command[SKDEBUGCANVAS_ATTRIBUTE_STRICT].asBool()) {
2275 constraint = SkCanvas::kStrict_SrcRectConstraint;
2276 }
2277 else {
2278 constraint = SkCanvas::kFast_SrcRectConstraint;
2279 }
2280 SkRect* srcPtr;
2281 SkRect src;
2282 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_SRC)) {
2283 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_SRC], &src);
2284 srcPtr = &src;
2285 }
2286 else {
2287 srcPtr = nullptr;
2288 }
reed9ce9d672016-03-17 10:51:11 -07002289 SkDrawImageRectCommand* result = new SkDrawImageRectCommand(image.get(), srcPtr, dst, paintPtr,
ethannicholas50a8dd02016-02-10 05:40:46 -08002290 constraint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002291 return result;
2292}
2293
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002294SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002295 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002296 fOval = oval;
2297 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00002298
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002299 fInfo.push(SkObjectParser::RectToString(oval));
2300 fInfo.push(SkObjectParser::PaintToString(paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +00002301}
2302
fmalita8c89c522014-11-08 16:18:56 -08002303void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002304 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00002305}
2306
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002307bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002308 canvas->clear(0xFFFFFFFF);
2309 canvas->save();
2310
2311 xlate_and_scale_to_bounds(canvas, fOval);
2312
2313 SkPaint p;
2314 p.setColor(SK_ColorBLACK);
2315 p.setStyle(SkPaint::kStroke_Style);
2316
2317 canvas->drawOval(fOval, p);
2318 canvas->restore();
2319
2320 return true;
2321}
2322
ethannicholasf62a8b72016-02-11 10:35:21 -08002323Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
2324 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002325 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
2326 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002327 return result;
2328}
2329
halcanary9d524f22016-03-29 09:03:52 -07002330SkDrawOvalCommand* SkDrawOvalCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002331 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002332 SkRect coords;
2333 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
2334 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002335 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002336 return new SkDrawOvalCommand(coords, paint);
2337}
2338
bsalomonac3aa242016-08-19 11:25:19 -07002339SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
2340 bool useCenter, const SkPaint& paint)
2341 : INHERITED(kDrawOval_OpType) {
2342 fOval = oval;
2343 fStartAngle = startAngle;
2344 fSweepAngle = sweepAngle;
2345 fUseCenter = useCenter;
2346 fPaint = paint;
2347
2348 fInfo.push(SkObjectParser::RectToString(oval));
2349 fInfo.push(SkObjectParser::ScalarToString(startAngle, "StartAngle: "));
2350 fInfo.push(SkObjectParser::ScalarToString(sweepAngle, "SweepAngle: "));
2351 fInfo.push(SkObjectParser::BoolToString(useCenter));
2352 fInfo.push(SkObjectParser::PaintToString(paint));
2353}
2354
2355void SkDrawArcCommand::execute(SkCanvas* canvas) const {
2356 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
2357}
2358
2359bool SkDrawArcCommand::render(SkCanvas* canvas) const {
2360 canvas->clear(0xFFFFFFFF);
2361 canvas->save();
2362
2363 xlate_and_scale_to_bounds(canvas, fOval);
2364
2365 SkPaint p;
2366 p.setColor(SK_ColorBLACK);
2367 p.setStyle(SkPaint::kStroke_Style);
2368
2369 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
2370 canvas->restore();
2371
2372 return true;
2373}
2374
2375Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
2376 Json::Value result = INHERITED::toJSON(urlDataManager);
2377 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
2378 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
2379 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
2380 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
2381 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
2382 return result;
2383}
2384
2385SkDrawArcCommand* SkDrawArcCommand::fromJSON(Json::Value& command,
2386 UrlDataManager& urlDataManager) {
2387 SkRect coords;
2388 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
2389 SkScalar startAngle = command[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE].asFloat();
2390 SkScalar sweepAngle = command[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE].asFloat();
2391 bool useCenter = command[SKDEBUGCANVAS_ATTRIBUTE_USECENTER].asBool();
2392 SkPaint paint;
2393 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
2394 return new SkDrawArcCommand(coords, startAngle, sweepAngle, useCenter, paint);
2395}
2396
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002397SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002398 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002399 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002400
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002401 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002402}
2403
fmalita8c89c522014-11-08 16:18:56 -08002404void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002405 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002406}
2407
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002408bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002409 canvas->clear(0xFFFFFFFF);
2410 canvas->drawPaint(fPaint);
2411 return true;
2412}
2413
ethannicholasf62a8b72016-02-11 10:35:21 -08002414Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
2415 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002416 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002417 return result;
2418}
2419
halcanary9d524f22016-03-29 09:03:52 -07002420SkDrawPaintCommand* SkDrawPaintCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002421 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002422 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002423 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002424 return new SkDrawPaintCommand(paint);
2425}
2426
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002427SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002428 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002429 fPath = path;
2430 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002431
robertphillips@google.com91217d02013-03-17 18:33:46 +00002432 fInfo.push(SkObjectParser::PathToString(path));
2433 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002434}
2435
fmalita8c89c522014-11-08 16:18:56 -08002436void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002437 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002438}
2439
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002440bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002441 render_path(canvas, fPath);
2442 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00002443}
2444
ethannicholasf62a8b72016-02-11 10:35:21 -08002445Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
2446 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002447 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2448 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002449 return result;
2450}
2451
halcanary9d524f22016-03-29 09:03:52 -07002452SkDrawPathCommand* SkDrawPathCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002453 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002454 SkPath path;
2455 extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path);
2456 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002457 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002458 return new SkDrawPathCommand(path, paint);
2459}
2460
fmalita160ebb22015-04-01 20:58:37 -07002461SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
2462 const SkMatrix* matrix,
2463 const SkPaint* paint)
2464 : INHERITED(kBeginDrawPicture_OpType)
2465 , fPicture(SkRef(picture)) {
2466
2467 SkString* str = new SkString;
2468 str->appendf("SkPicture: L: %f T: %f R: %f B: %f",
2469 picture->cullRect().fLeft, picture->cullRect().fTop,
2470 picture->cullRect().fRight, picture->cullRect().fBottom);
2471 fInfo.push(str);
robertphillipsb3f319f2014-08-13 10:46:23 -07002472
bsalomon49f085d2014-09-05 13:34:00 -07002473 if (matrix) {
fmalita160ebb22015-04-01 20:58:37 -07002474 fMatrix.set(*matrix);
robertphillipsb3f319f2014-08-13 10:46:23 -07002475 fInfo.push(SkObjectParser::MatrixToString(*matrix));
2476 }
fmalita160ebb22015-04-01 20:58:37 -07002477
bsalomon49f085d2014-09-05 13:34:00 -07002478 if (paint) {
fmalita160ebb22015-04-01 20:58:37 -07002479 fPaint.set(*paint);
robertphillipsb3f319f2014-08-13 10:46:23 -07002480 fInfo.push(SkObjectParser::PaintToString(*paint));
2481 }
fmalita160ebb22015-04-01 20:58:37 -07002482
2483}
2484
2485void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
2486 if (fPaint.isValid()) {
2487 SkRect bounds = fPicture->cullRect();
2488 if (fMatrix.isValid()) {
2489 fMatrix.get()->mapRect(&bounds);
2490 }
2491 canvas->saveLayer(&bounds, fPaint.get());
2492 }
2493
2494 if (fMatrix.isValid()) {
2495 if (!fPaint.isValid()) {
2496 canvas->save();
2497 }
2498 canvas->concat(*fMatrix.get());
2499 }
chudy@google.com902ebe52012-06-29 14:21:22 +00002500}
2501
fmalita160ebb22015-04-01 20:58:37 -07002502bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00002503 canvas->clear(0xFFFFFFFF);
2504 canvas->save();
2505
robertphillipsa8d7f0b2014-08-29 08:03:56 -07002506 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00002507
robertphillips9b14f262014-06-04 05:40:44 -07002508 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00002509
2510 canvas->restore();
2511
2512 return true;
2513}
2514
fmalita160ebb22015-04-01 20:58:37 -07002515SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
2516 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
2517
2518void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
2519 if (fRestore) {
2520 canvas->restore();
2521 }
2522}
2523
vjiaoblack95302da2016-07-21 10:25:54 -07002524SkBeginDrawShadowedPictureCommand::SkBeginDrawShadowedPictureCommand(const SkPicture* picture,
2525 const SkMatrix* matrix,
vjiaoblacke6f5d562016-08-25 06:30:23 -07002526 const SkPaint* paint,
2527 const SkShadowParams& params)
vjiaoblack95302da2016-07-21 10:25:54 -07002528 : INHERITED(kBeginDrawShadowedPicture_OpType)
vjiaoblacke6f5d562016-08-25 06:30:23 -07002529#ifdef SK_EXPERIMENTAL_SHADOWING
2530 , fPicture(SkRef(picture))
2531 , fShadowParams(params) {
2532#else
vjiaoblack95302da2016-07-21 10:25:54 -07002533 , fPicture(SkRef(picture)) {
vjiaoblacke6f5d562016-08-25 06:30:23 -07002534#endif
vjiaoblack95302da2016-07-21 10:25:54 -07002535 SkString* str = new SkString;
vjiaoblacke6f5d562016-08-25 06:30:23 -07002536 str->appendf("SkPicture: L: %f T: %f R: %f B: %f\n",
vjiaoblack95302da2016-07-21 10:25:54 -07002537 picture->cullRect().fLeft, picture->cullRect().fTop,
2538 picture->cullRect().fRight, picture->cullRect().fBottom);
vjiaoblacke6f5d562016-08-25 06:30:23 -07002539 str->appendf("SkShadowParams: bias:%f, minVariance:%f, shRadius:%f, shType:",
2540 params.fBiasingConstant,
2541 params.fMinVariance,
2542 params.fShadowRadius);
2543
2544 SkASSERT(SkShadowParams::kShadowTypeCount == 2);
2545
2546 switch (params.fType) {
2547 case SkShadowParams::ShadowType::kNoBlur_ShadowType:
2548 str->append("kNoBlur_ShadowType\n");
2549 break;
2550 case SkShadowParams::ShadowType::kVariance_ShadowType:
2551 str->append("kVariance_ShadowType\n");
2552 break;
2553 }
2554
vjiaoblack95302da2016-07-21 10:25:54 -07002555 fInfo.push(str);
2556
2557 if (matrix) {
2558 fMatrix.set(*matrix);
2559 fInfo.push(SkObjectParser::MatrixToString(*matrix));
2560 }
2561
2562 if (paint) {
2563 fPaint.set(*paint);
2564 fInfo.push(SkObjectParser::PaintToString(*paint));
2565 }
2566}
2567
2568void SkBeginDrawShadowedPictureCommand::execute(SkCanvas* canvas) const {
2569 if (fPaint.isValid()) {
2570 SkRect bounds = fPicture->cullRect();
2571 if (fMatrix.isValid()) {
2572 fMatrix.get()->mapRect(&bounds);
2573 }
2574 canvas->saveLayer(&bounds, fPaint.get());
2575 }
2576
2577 if (fMatrix.isValid()) {
2578 if (!fPaint.isValid()) {
2579 canvas->save();
2580 }
2581 canvas->concat(*fMatrix.get());
2582 }
2583}
2584
2585bool SkBeginDrawShadowedPictureCommand::render(SkCanvas* canvas) const {
2586 canvas->clear(0xFFFFFFFF);
2587 canvas->save();
2588
2589 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
vjiaoblacke6f5d562016-08-25 06:30:23 -07002590#ifdef SK_EXPERIMENTAL_SHADOWING
2591 canvas->drawShadowedPicture(fPicture.get(), fMatrix.get(), fPaint.get(), fShadowParams);
2592#else
2593 canvas->drawPicture(fPicture.get(), fMatrix.get(), fPaint.get());
2594#endif
vjiaoblack95302da2016-07-21 10:25:54 -07002595 canvas->restore();
2596
2597 return true;
2598}
2599
2600SkEndDrawShadowedPictureCommand::SkEndDrawShadowedPictureCommand(bool restore)
2601 : INHERITED(kEndDrawShadowedPicture_OpType) , fRestore(restore) { }
2602
2603void SkEndDrawShadowedPictureCommand::execute(SkCanvas* canvas) const {
2604 if (fRestore) {
2605 canvas->restore();
2606 }
2607}
2608
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002609SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002610 const SkPoint pts[], const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002611 : INHERITED(kDrawPoints_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002612 fMode = mode;
2613 fCount = count;
2614 fPts = new SkPoint[count];
2615 memcpy(fPts, pts, count * sizeof(SkPoint));
2616 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002617
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002618 fInfo.push(SkObjectParser::PointsToString(pts, count));
2619 fInfo.push(SkObjectParser::ScalarToString(SkIntToScalar((unsigned int)count),
2620 "Points: "));
2621 fInfo.push(SkObjectParser::PointModeToString(mode));
2622 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002623}
2624
fmalita8c89c522014-11-08 16:18:56 -08002625void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002626 canvas->drawPoints(fMode, fCount, fPts, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002627}
2628
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002629bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002630 canvas->clear(0xFFFFFFFF);
2631 canvas->save();
2632
2633 SkRect bounds;
2634
2635 bounds.setEmpty();
2636 for (unsigned int i = 0; i < fCount; ++i) {
2637 bounds.growToInclude(fPts[i].fX, fPts[i].fY);
2638 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00002639
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002640 xlate_and_scale_to_bounds(canvas, bounds);
2641
2642 SkPaint p;
2643 p.setColor(SK_ColorBLACK);
2644 p.setStyle(SkPaint::kStroke_Style);
2645
2646 canvas->drawPoints(fMode, fCount, fPts, p);
2647 canvas->restore();
2648
2649 return true;
2650}
2651
ethannicholasf62a8b72016-02-11 10:35:21 -08002652Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
2653 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002654 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
2655 Json::Value points(Json::arrayValue);
2656 for (size_t i = 0; i < fCount; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002657 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08002658 }
2659 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07002660 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002661 return result;
2662}
2663
halcanary9d524f22016-03-29 09:03:52 -07002664SkDrawPointsCommand* SkDrawPointsCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002665 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002666 SkCanvas::PointMode mode;
2667 const char* jsonMode = command[SKDEBUGCANVAS_ATTRIBUTE_MODE].asCString();
2668 if (!strcmp(jsonMode, SKDEBUGCANVAS_POINTMODE_POINTS)) {
2669 mode = SkCanvas::kPoints_PointMode;
2670 }
2671 else if (!strcmp(jsonMode, SKDEBUGCANVAS_POINTMODE_LINES)) {
2672 mode = SkCanvas::kLines_PointMode;
2673 }
2674 else if (!strcmp(jsonMode, SKDEBUGCANVAS_POINTMODE_POLYGON)) {
2675 mode = SkCanvas::kPolygon_PointMode;
2676 }
2677 else {
2678 SkASSERT(false);
2679 return nullptr;
2680 }
2681 Json::Value jsonPoints = command[SKDEBUGCANVAS_ATTRIBUTE_POINTS];
2682 int count = (int) jsonPoints.size();
2683 SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint));
2684 for (int i = 0; i < count; i++) {
2685 points[i] = SkPoint::Make(jsonPoints[i][0].asFloat(), jsonPoints[i][1].asFloat());
2686 }
2687 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002688 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002689 SkDrawPointsCommand* result = new SkDrawPointsCommand(mode, count, points, paint);
2690 sk_free(points);
2691 return result;
2692}
2693
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002694SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002695 const SkPoint pos[], const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002696 : INHERITED(kDrawPosText_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002697 size_t numPts = paint.countText(text, byteLength);
chudy@google.com902ebe52012-06-29 14:21:22 +00002698
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002699 fText = new char[byteLength];
2700 memcpy(fText, text, byteLength);
2701 fByteLength = byteLength;
2702
2703 fPos = new SkPoint[numPts];
2704 memcpy(fPos, pos, numPts * sizeof(SkPoint));
2705
2706 fPaint = paint;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002707
2708 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
chudy@google.com902ebe52012-06-29 14:21:22 +00002709 // TODO(chudy): Test that this works.
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002710 fInfo.push(SkObjectParser::PointsToString(pos, 1));
2711 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002712}
2713
fmalita8c89c522014-11-08 16:18:56 -08002714void SkDrawPosTextCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002715 canvas->drawPosText(fText, fByteLength, fPos, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002716}
2717
ethannicholasf62a8b72016-02-11 10:35:21 -08002718Json::Value SkDrawPosTextCommand::toJSON(UrlDataManager& urlDataManager) const {
2719 Json::Value result = INHERITED::toJSON(urlDataManager);
halcanary9d524f22016-03-29 09:03:52 -07002720 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
ethannicholas50a8dd02016-02-10 05:40:46 -08002721 ((const char*) fText) + fByteLength);
2722 Json::Value coords(Json::arrayValue);
bungeman51190df2016-03-09 07:42:54 -08002723 size_t numCoords = fPaint.textToGlyphs(fText, fByteLength, nullptr);
2724 for (size_t i = 0; i < numCoords; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002725 coords.append(MakeJsonPoint(fPos[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08002726 }
2727 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = coords;
brianosmanfad98562016-05-04 11:06:28 -07002728 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002729 return result;
2730}
2731
halcanary9d524f22016-03-29 09:03:52 -07002732SkDrawPosTextCommand* SkDrawPosTextCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002733 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002734 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
2735 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002736 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002737 Json::Value coords = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
2738 int count = (int) coords.size();
2739 SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint));
2740 for (int i = 0; i < count; i++) {
2741 points[i] = SkPoint::Make(coords[i][0].asFloat(), coords[i][1].asFloat());
2742 }
2743 return new SkDrawPosTextCommand(text, strlen(text), points, paint);
2744}
chudy@google.com902ebe52012-06-29 14:21:22 +00002745
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002746SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength,
2747 const SkScalar xpos[], SkScalar constY,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002748 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002749 : INHERITED(kDrawPosTextH_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002750 size_t numPts = paint.countText(text, byteLength);
2751
2752 fText = new char[byteLength];
2753 memcpy(fText, text, byteLength);
robertphillips@google.com91217d02013-03-17 18:33:46 +00002754 fByteLength = byteLength;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002755
2756 fXpos = new SkScalar[numPts];
2757 memcpy(fXpos, xpos, numPts * sizeof(SkScalar));
2758
robertphillips@google.com91217d02013-03-17 18:33:46 +00002759 fConstY = constY;
2760 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002761
robertphillips@google.com91217d02013-03-17 18:33:46 +00002762 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
2763 fInfo.push(SkObjectParser::ScalarToString(xpos[0], "XPOS: "));
2764 fInfo.push(SkObjectParser::ScalarToString(constY, "SkScalar constY: "));
2765 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002766}
2767
fmalita8c89c522014-11-08 16:18:56 -08002768void SkDrawPosTextHCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002769 canvas->drawPosTextH(fText, fByteLength, fXpos, fConstY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002770}
2771
bungeman51190df2016-03-09 07:42:54 -08002772Json::Value SkDrawPosTextHCommand::toJSON(UrlDataManager& urlDataManager) const {
2773 Json::Value result = INHERITED::toJSON(urlDataManager);
2774 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
2775 ((const char*) fText) + fByteLength);
2776 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fConstY);
2777 Json::Value xpos(Json::arrayValue);
2778 size_t numXpos = fPaint.textToGlyphs(fText, fByteLength, nullptr);
2779 for (size_t i = 0; i < numXpos; i++) {
2780 xpos.append(Json::Value(fXpos[i]));
2781 }
2782 result[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = xpos;
brianosmanfad98562016-05-04 11:06:28 -07002783 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
bungeman51190df2016-03-09 07:42:54 -08002784 return result;
2785}
2786
2787SkDrawPosTextHCommand* SkDrawPosTextHCommand::fromJSON(Json::Value& command,
2788 UrlDataManager& urlDataManager) {
2789 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
2790 SkPaint paint;
2791 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
2792 Json::Value jsonXpos = command[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS];
2793 int count = (int) jsonXpos.size();
2794 SkScalar* xpos = (SkScalar*) sk_malloc_throw(count * sizeof(SkScalar));
2795 for (int i = 0; i < count; i++) {
2796 xpos[i] = jsonXpos[i].asFloat();
2797 }
2798 SkScalar y = command[SKDEBUGCANVAS_ATTRIBUTE_Y].asFloat();
2799 return new SkDrawPosTextHCommand(text, strlen(text), xpos, y, paint);
2800}
2801
fmalita0d48e412016-01-04 08:08:04 -08002802static const char* gPositioningLabels[] = {
2803 "kDefault_Positioning",
2804 "kHorizontal_Positioning",
2805 "kFull_Positioning",
2806};
2807
fmalita37283c22016-09-13 10:00:23 -07002808SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07002809 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002810 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07002811 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07002812 , fXPos(x)
2813 , fYPos(y)
2814 , fPaint(paint) {
2815
fmalitae77f2da2015-12-08 18:59:18 -08002816 SkAutoTDelete<SkString> runsStr(new SkString);
fmalitab7425172014-08-26 07:56:44 -07002817 fInfo.push(SkObjectParser::ScalarToString(x, "XPOS: "));
fmalitaff3106c2014-12-09 05:28:20 -08002818 fInfo.push(SkObjectParser::ScalarToString(y, "YPOS: "));
2819 fInfo.push(SkObjectParser::RectToString(fBlob->bounds(), "Bounds: "));
fmalitae77f2da2015-12-08 18:59:18 -08002820 fInfo.push(runsStr);
fmalitab7425172014-08-26 07:56:44 -07002821 fInfo.push(SkObjectParser::PaintToString(paint));
fmalitae77f2da2015-12-08 18:59:18 -08002822
2823 unsigned runs = 0;
2824 SkPaint runPaint(paint);
fmalita02526bd2016-09-14 14:55:59 -07002825 SkTextBlobRunIterator iter(fBlob.get());
fmalitae77f2da2015-12-08 18:59:18 -08002826 while (!iter.done()) {
fmalita0d48e412016-01-04 08:08:04 -08002827 SkAutoTDelete<SkString> tmpStr(new SkString);
2828 tmpStr->printf("==== Run [%d] ====", runs++);
2829 fInfo.push(tmpStr.release());
fmalitae77f2da2015-12-08 18:59:18 -08002830
2831 fInfo.push(SkObjectParser::IntToString(iter.glyphCount(), "GlyphCount: "));
fmalita0d48e412016-01-04 08:08:04 -08002832 tmpStr.reset(new SkString("GlyphPositioning: "));
2833 tmpStr->append(gPositioningLabels[iter.positioning()]);
2834 fInfo.push(tmpStr.release());
2835
fmalitae77f2da2015-12-08 18:59:18 -08002836 iter.applyFontToPaint(&runPaint);
2837 fInfo.push(SkObjectParser::PaintToString(runPaint));
2838
2839 iter.next();
2840 }
2841
2842 runsStr->printf("Runs: %d", runs);
2843 // runStr is owned by fInfo at this point.
2844 runsStr.release();
fmalitab7425172014-08-26 07:56:44 -07002845}
2846
fmalita8c89c522014-11-08 16:18:56 -08002847void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07002848 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
2849}
2850
fmalita55773872014-08-29 15:08:20 -07002851bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
2852 canvas->clear(SK_ColorWHITE);
2853 canvas->save();
2854
2855 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
2856 xlate_and_scale_to_bounds(canvas, bounds);
2857
fmalita37283c22016-09-13 10:00:23 -07002858 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07002859
2860 canvas->restore();
2861
2862 return true;
2863}
2864
ethannicholasf62a8b72016-02-11 10:35:21 -08002865Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
2866 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002867 Json::Value runs(Json::arrayValue);
2868 SkTextBlobRunIterator iter(fBlob.get());
2869 while (!iter.done()) {
2870 Json::Value run(Json::objectValue);
2871 Json::Value jsonPositions(Json::arrayValue);
2872 Json::Value jsonGlyphs(Json::arrayValue);
2873 const SkScalar* iterPositions = iter.pos();
2874 const uint16_t* iterGlyphs = iter.glyphs();
2875 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
2876 switch (iter.positioning()) {
2877 case SkTextBlob::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07002878 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
2879 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08002880 break;
2881 case SkTextBlob::kHorizontal_Positioning:
2882 jsonPositions.append(Json::Value(iterPositions[i]));
2883 break;
2884 case SkTextBlob::kDefault_Positioning:
2885 break;
2886 }
2887 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
2888 }
2889 if (iter.positioning() != SkTextBlob::kDefault_Positioning) {
2890 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
2891 }
2892 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
2893 SkPaint fontPaint;
2894 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07002895 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
2896 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08002897 runs.append(run);
2898 iter.next();
2899 }
reed6d2c3e72016-07-07 14:10:14 -07002900 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08002901 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
2902 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
2903 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07002904 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07002905 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07002906
2907 SkString desc;
2908 // make the bounds local by applying the x,y
2909 bounds.offset(fXPos, fYPos);
2910 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
2911
ethannicholas50a8dd02016-02-10 05:40:46 -08002912 return result;
2913}
2914
halcanary9d524f22016-03-29 09:03:52 -07002915SkDrawTextBlobCommand* SkDrawTextBlobCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002916 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002917 SkTextBlobBuilder builder;
2918 Json::Value runs = command[SKDEBUGCANVAS_ATTRIBUTE_RUNS];
2919 for (Json::ArrayIndex i = 0 ; i < runs.size(); i++) {
2920 Json::Value run = runs[i];
2921 SkPaint font;
2922 font.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
ethannicholasf62a8b72016-02-11 10:35:21 -08002923 extract_json_paint(run[SKDEBUGCANVAS_ATTRIBUTE_FONT], urlDataManager, &font);
ethannicholas50a8dd02016-02-10 05:40:46 -08002924 Json::Value glyphs = run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS];
2925 int count = glyphs.size();
2926 Json::Value coords = run[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
2927 SkScalar x = coords[0].asFloat();
2928 SkScalar y = coords[1].asFloat();
reed6d2c3e72016-07-07 14:10:14 -07002929 SkRect bounds;
2930 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &bounds);
2931
ethannicholas50a8dd02016-02-10 05:40:46 -08002932 if (run.isMember(SKDEBUGCANVAS_ATTRIBUTE_POSITIONS)) {
2933 Json::Value positions = run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS];
2934 if (positions.size() > 0 && positions[0].isNumeric()) {
reed6d2c3e72016-07-07 14:10:14 -07002935 SkTextBlobBuilder::RunBuffer buffer = builder.allocRunPosH(font, count, y, &bounds);
ethannicholas50a8dd02016-02-10 05:40:46 -08002936 for (int j = 0; j < count; j++) {
2937 buffer.glyphs[j] = glyphs[j].asUInt();
2938 buffer.pos[j] = positions[j].asFloat();
2939 }
2940 }
2941 else {
reed6d2c3e72016-07-07 14:10:14 -07002942 SkTextBlobBuilder::RunBuffer buffer = builder.allocRunPos(font, count, &bounds);
ethannicholas50a8dd02016-02-10 05:40:46 -08002943 for (int j = 0; j < count; j++) {
2944 buffer.glyphs[j] = glyphs[j].asUInt();
2945 buffer.pos[j * 2] = positions[j][0].asFloat();
2946 buffer.pos[j * 2 + 1] = positions[j][1].asFloat();
2947 }
2948 }
2949 }
2950 else {
reed6d2c3e72016-07-07 14:10:14 -07002951 SkTextBlobBuilder::RunBuffer buffer = builder.allocRun(font, count, x, y, &bounds);
ethannicholas50a8dd02016-02-10 05:40:46 -08002952 for (int j = 0; j < count; j++) {
2953 buffer.glyphs[j] = glyphs[j].asUInt();
2954 }
2955 }
2956 }
2957 SkScalar x = command[SKDEBUGCANVAS_ATTRIBUTE_X].asFloat();
2958 SkScalar y = command[SKDEBUGCANVAS_ATTRIBUTE_Y].asFloat();
2959 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002960 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
fmalita37283c22016-09-13 10:00:23 -07002961 return new SkDrawTextBlobCommand(builder.make(), x, y, paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002962}
2963
robertphillips9bafc302015-02-13 11:13:00 -08002964SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
2965 const SkPoint texCoords[4], SkXfermode* xfermode,
2966 const SkPaint& paint)
2967 : INHERITED(kDrawPatch_OpType) {
2968 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08002969 if (colors != nullptr) {
2970 memcpy(fColors, colors, sizeof(fColors));
2971 fColorsPtr = fColors;
2972 } else {
2973 fColorsPtr = nullptr;
2974 }
2975 if (texCoords != nullptr) {
2976 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
2977 fTexCoordsPtr = fTexCoords;
2978 } else {
2979 fTexCoordsPtr = nullptr;
2980 }
2981 if (xfermode != nullptr) {
2982 fXfermode.reset(SkRef(xfermode));
2983 }
robertphillips9bafc302015-02-13 11:13:00 -08002984 fPaint = paint;
2985
2986 fInfo.push(SkObjectParser::PaintToString(paint));
2987}
2988
2989void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
ethannicholas1446a9a2016-02-10 14:05:02 -08002990 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fXfermode, fPaint);
2991}
2992
ethannicholasf62a8b72016-02-11 10:35:21 -08002993Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
2994 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08002995 Json::Value cubics = Json::Value(Json::arrayValue);
2996 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002997 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08002998 }
2999 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
3000 if (fColorsPtr != nullptr) {
3001 Json::Value colors = Json::Value(Json::arrayValue);
3002 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07003003 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08003004 }
3005 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
3006 }
3007 if (fTexCoordsPtr != nullptr) {
3008 Json::Value texCoords = Json::Value(Json::arrayValue);
3009 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07003010 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08003011 }
3012 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
3013 }
3014 if (fXfermode.get() != nullptr) {
3015 Json::Value jsonXfermode;
ethannicholasf62a8b72016-02-11 10:35:21 -08003016 flatten(fXfermode, &jsonXfermode, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08003017 result[SKDEBUGCANVAS_ATTRIBUTE_XFERMODE] = jsonXfermode;
3018 }
3019 return result;
3020}
3021
halcanary9d524f22016-03-29 09:03:52 -07003022SkDrawPatchCommand* SkDrawPatchCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003023 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08003024 Json::Value jsonCubics = command[SKDEBUGCANVAS_ATTRIBUTE_CUBICS];
3025 SkPoint cubics[12];
3026 for (int i = 0; i < 12; i++) {
3027 cubics[i] = get_json_point(jsonCubics[i]);
3028 }
3029 SkColor* colorsPtr;
3030 SkColor colors[4];
3031 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLORS)) {
3032 Json::Value jsonColors = command[SKDEBUGCANVAS_ATTRIBUTE_COLORS];
3033 for (int i = 0; i < 4; i++) {
3034 colors[i] = get_json_color(jsonColors[i]);
3035 }
3036 colorsPtr = colors;
3037 }
3038 else {
3039 colorsPtr = nullptr;
3040 }
3041 SkPoint* texCoordsPtr;
3042 SkPoint texCoords[4];
3043 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS)) {
3044 Json::Value jsonTexCoords = command[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS];
3045 for (int i = 0; i < 4; i++) {
3046 texCoords[i] = get_json_point(jsonTexCoords[i]);
3047 }
3048 texCoordsPtr = texCoords;
3049 }
3050 else {
3051 texCoordsPtr = nullptr;
3052 }
3053 SkAutoTUnref<SkXfermode> xfermode;
3054 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_XFERMODE)) {
3055 Json::Value jsonXfermode = command[SKDEBUGCANVAS_ATTRIBUTE_XFERMODE];
ethannicholasf62a8b72016-02-11 10:35:21 -08003056 xfermode.reset((SkXfermode*) load_flattenable(jsonXfermode, urlDataManager));
ethannicholas1446a9a2016-02-10 14:05:02 -08003057 }
3058 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003059 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas1446a9a2016-02-10 14:05:02 -08003060 return new SkDrawPatchCommand(cubics, colorsPtr, texCoordsPtr, xfermode, paint);
robertphillips9bafc302015-02-13 11:13:00 -08003061}
3062
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003063SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003064 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00003065 fRect = rect;
3066 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00003067
robertphillips@google.com91217d02013-03-17 18:33:46 +00003068 fInfo.push(SkObjectParser::RectToString(rect));
3069 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00003070}
3071
fmalita8c89c522014-11-08 16:18:56 -08003072void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00003073 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00003074}
3075
ethannicholasf62a8b72016-02-11 10:35:21 -08003076Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
3077 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07003078 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
3079 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07003080
3081 SkString desc;
3082 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
3083
ethannicholas50a8dd02016-02-10 05:40:46 -08003084 return result;
3085}
3086
halcanary9d524f22016-03-29 09:03:52 -07003087SkDrawRectCommand* SkDrawRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003088 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003089 SkRect coords;
3090 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
3091 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003092 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003093 return new SkDrawRectCommand(coords, paint);
3094}
3095
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003096SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003097 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003098 fRRect = rrect;
3099 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00003100
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003101 fInfo.push(SkObjectParser::RRectToString(rrect));
3102 fInfo.push(SkObjectParser::PaintToString(paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +00003103}
3104
fmalita8c89c522014-11-08 16:18:56 -08003105void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00003106 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00003107}
3108
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00003109bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00003110 render_rrect(canvas, fRRect);
3111 return true;
3112}
3113
ethannicholasf62a8b72016-02-11 10:35:21 -08003114Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
3115 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003116 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07003117 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003118 return result;
3119}
3120
halcanary9d524f22016-03-29 09:03:52 -07003121SkDrawRRectCommand* SkDrawRRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003122 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003123 SkRRect coords;
3124 extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
3125 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003126 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003127 return new SkDrawRRectCommand(coords, paint);
3128}
3129
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00003130SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00003131 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003132 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003133 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00003134 fOuter = outer;
3135 fInner = inner;
3136 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00003137
3138 fInfo.push(SkObjectParser::RRectToString(outer));
3139 fInfo.push(SkObjectParser::RRectToString(inner));
3140 fInfo.push(SkObjectParser::PaintToString(paint));
3141}
3142
fmalita8c89c522014-11-08 16:18:56 -08003143void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00003144 canvas->drawDRRect(fOuter, fInner, fPaint);
3145}
3146
3147bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
3148 render_drrect(canvas, fOuter, fInner);
3149 return true;
3150}
3151
ethannicholasf62a8b72016-02-11 10:35:21 -08003152Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
3153 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003154 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
3155 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07003156 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003157 return result;
3158}
3159
halcanary9d524f22016-03-29 09:03:52 -07003160SkDrawDRRectCommand* SkDrawDRRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003161 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003162 SkRRect outer;
3163 extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_INNER], &outer);
3164 SkRRect inner;
3165 extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_INNER], &inner);
3166 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003167 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003168 return new SkDrawDRRectCommand(outer, inner, paint);
3169}
3170
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00003171SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003172 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003173 : INHERITED(kDrawText_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003174 fText = new char[byteLength];
3175 memcpy(fText, text, byteLength);
3176 fByteLength = byteLength;
3177 fX = x;
3178 fY = y;
3179 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00003180
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003181 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
3182 fInfo.push(SkObjectParser::ScalarToString(x, "SkScalar x: "));
3183 fInfo.push(SkObjectParser::ScalarToString(y, "SkScalar y: "));
3184 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00003185}
3186
fmalita8c89c522014-11-08 16:18:56 -08003187void SkDrawTextCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003188 canvas->drawText(fText, fByteLength, fX, fY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00003189}
3190
ethannicholasf62a8b72016-02-11 10:35:21 -08003191Json::Value SkDrawTextCommand::toJSON(UrlDataManager& urlDataManager) const {
3192 Json::Value result = INHERITED::toJSON(urlDataManager);
halcanary9d524f22016-03-29 09:03:52 -07003193 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
ethannicholas50a8dd02016-02-10 05:40:46 -08003194 ((const char*) fText) + fByteLength);
3195 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07003196 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fX, fY);
3197 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003198 return result;
3199}
3200
halcanary9d524f22016-03-29 09:03:52 -07003201SkDrawTextCommand* SkDrawTextCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003202 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003203 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
3204 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003205 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003206 Json::Value coords = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
halcanary9d524f22016-03-29 09:03:52 -07003207 return new SkDrawTextCommand(text, strlen(text), coords[0].asFloat(), coords[1].asFloat(),
ethannicholas50a8dd02016-02-10 05:40:46 -08003208 paint);
3209}
3210
reed45561a02016-07-07 12:47:17 -07003211///////////////////////////////////////////////////////////////////////////////////////////////////
3212
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00003213SkDrawTextOnPathCommand::SkDrawTextOnPathCommand(const void* text, size_t byteLength,
3214 const SkPath& path, const SkMatrix* matrix,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003215 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003216 : INHERITED(kDrawTextOnPath_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003217 fText = new char[byteLength];
3218 memcpy(fText, text, byteLength);
3219 fByteLength = byteLength;
3220 fPath = path;
bsalomon49f085d2014-09-05 13:34:00 -07003221 if (matrix) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003222 fMatrix = *matrix;
3223 } else {
3224 fMatrix.setIdentity();
3225 }
3226 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00003227
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003228 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
3229 fInfo.push(SkObjectParser::PathToString(path));
bsalomon49f085d2014-09-05 13:34:00 -07003230 if (matrix) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003231 fInfo.push(SkObjectParser::MatrixToString(*matrix));
3232 }
3233 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00003234}
3235
fmalita8c89c522014-11-08 16:18:56 -08003236void SkDrawTextOnPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003237 canvas->drawTextOnPath(fText, fByteLength, fPath,
halcanary96fcdcc2015-08-27 07:41:13 -07003238 fMatrix.isIdentity() ? nullptr : &fMatrix,
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003239 fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00003240}
3241
ethannicholasf62a8b72016-02-11 10:35:21 -08003242Json::Value SkDrawTextOnPathCommand::toJSON(UrlDataManager& urlDataManager) const {
3243 Json::Value result = INHERITED::toJSON(urlDataManager);
halcanary9d524f22016-03-29 09:03:52 -07003244 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
ethannicholas50a8dd02016-02-10 05:40:46 -08003245 ((const char*) fText) + fByteLength);
3246 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07003247 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08003248 if (!fMatrix.isIdentity()) {
joshualittbd724132016-03-03 11:39:38 -08003249 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08003250 }
brianosmanfad98562016-05-04 11:06:28 -07003251 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003252 return result;
3253}
3254
halcanary9d524f22016-03-29 09:03:52 -07003255SkDrawTextOnPathCommand* SkDrawTextOnPathCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003256 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003257 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
3258 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003259 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003260 SkPath path;
3261 extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path);
3262 SkMatrix* matrixPtr;
3263 SkMatrix matrix;
3264 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_MATRIX)) {
3265 extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix);
3266 matrixPtr = &matrix;
3267 }
3268 else {
3269 matrixPtr = nullptr;
3270 }
3271 return new SkDrawTextOnPathCommand(text, strlen(text), path, matrixPtr, paint);
3272}
3273
reed45561a02016-07-07 12:47:17 -07003274///////////////////////////////////////////////////////////////////////////////////////////////////
3275
3276SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength,
3277 const SkRSXform xform[], const SkRect* cull,
3278 const SkPaint& paint)
reed63f30d92016-07-07 16:32:51 -07003279 : INHERITED(kDrawTextRSXform_OpType)
reed45561a02016-07-07 12:47:17 -07003280{
3281 fText = new char[byteLength];
3282 memcpy(fText, text, byteLength);
3283 fByteLength = byteLength;
3284 int count = paint.countText(text, byteLength);
3285 fXform = new SkRSXform[count];
3286 memcpy(fXform, xform, count * sizeof(SkRSXform));
3287 if (cull) {
3288 fCullStorage = *cull;
3289 fCull = &fCullStorage;
3290 } else {
3291 fCull = nullptr;
3292 }
3293 fPaint = paint;
3294
3295 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
3296 fInfo.push(SkObjectParser::PaintToString(paint));
3297}
3298
3299void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const {
3300 canvas->drawTextRSXform(fText, fByteLength, fXform, fCull, fPaint);
3301}
3302
3303Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) const {
3304 Json::Value result = INHERITED::toJSON(urlDataManager);
3305 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
3306 ((const char*) fText) + fByteLength);
3307 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
3308 return result;
3309}
3310
3311SkDrawTextRSXformCommand* SkDrawTextRSXformCommand::fromJSON(Json::Value& command,
3312 UrlDataManager& urlDataManager) {
3313 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
3314 size_t byteLength = strlen(text);
3315 SkPaint paint;
3316 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
3317
3318 // TODO: handle xform and cull
3319 int count = paint.countText(text, byteLength);
3320 SkAutoTArray<SkRSXform> xform(count);
3321 for (int i = 0; i < count; ++i) {
3322 xform[i].fSCos = 1;
3323 xform[i].fSSin = xform[i].fTx = xform[i].fTy = 0;
3324 }
3325 return new SkDrawTextRSXformCommand(text, byteLength, &xform[0], nullptr, paint);
3326}
3327
3328///////////////////////////////////////////////////////////////////////////////////////////////////
3329
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00003330SkDrawVerticesCommand::SkDrawVerticesCommand(SkCanvas::VertexMode vmode, int vertexCount,
3331 const SkPoint vertices[], const SkPoint texs[],
3332 const SkColor colors[], SkXfermode* xfermode,
3333 const uint16_t indices[], int indexCount,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003334 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003335 : INHERITED(kDrawVertices_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003336 fVmode = vmode;
3337
3338 fVertexCount = vertexCount;
3339
3340 fVertices = new SkPoint[vertexCount];
3341 memcpy(fVertices, vertices, vertexCount * sizeof(SkPoint));
3342
bsalomon49f085d2014-09-05 13:34:00 -07003343 if (texs) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003344 fTexs = new SkPoint[vertexCount];
3345 memcpy(fTexs, texs, vertexCount * sizeof(SkPoint));
3346 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07003347 fTexs = nullptr;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003348 }
3349
bsalomon49f085d2014-09-05 13:34:00 -07003350 if (colors) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003351 fColors = new SkColor[vertexCount];
3352 memcpy(fColors, colors, vertexCount * sizeof(SkColor));
3353 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07003354 fColors = nullptr;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003355 }
3356
3357 fXfermode = xfermode;
bsalomon49f085d2014-09-05 13:34:00 -07003358 if (fXfermode) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003359 fXfermode->ref();
3360 }
3361
3362 if (indexCount > 0) {
3363 fIndices = new uint16_t[indexCount];
3364 memcpy(fIndices, indices, indexCount * sizeof(uint16_t));
3365 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07003366 fIndices = nullptr;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003367 }
3368
3369 fIndexCount = indexCount;
3370 fPaint = paint;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003371
chudy@google.com902ebe52012-06-29 14:21:22 +00003372 // TODO(chudy)
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003373 fInfo.push(SkObjectParser::CustomTextToString("To be implemented."));
3374 fInfo.push(SkObjectParser::PaintToString(paint));
3375}
3376
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00003377SkDrawVerticesCommand::~SkDrawVerticesCommand() {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003378 delete [] fVertices;
3379 delete [] fTexs;
3380 delete [] fColors;
3381 SkSafeUnref(fXfermode);
3382 delete [] fIndices;
chudy@google.com902ebe52012-06-29 14:21:22 +00003383}
3384
fmalita8c89c522014-11-08 16:18:56 -08003385void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003386 canvas->drawVertices(fVmode, fVertexCount, fVertices,
3387 fTexs, fColors, fXfermode, fIndices,
3388 fIndexCount, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00003389}
3390
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003391SkRestoreCommand::SkRestoreCommand()
robertphillips9bafc302015-02-13 11:13:00 -08003392 : INHERITED(kRestore_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003393 fInfo.push(SkObjectParser::CustomTextToString("No Parameters"));
chudy@google.com902ebe52012-06-29 14:21:22 +00003394}
3395
fmalita8c89c522014-11-08 16:18:56 -08003396void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00003397 canvas->restore();
3398}
3399
ethannicholasf62a8b72016-02-11 10:35:21 -08003400SkRestoreCommand* SkRestoreCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003401 return new SkRestoreCommand();
3402}
3403
Florin Malita5f6102d2014-06-30 10:13:28 -04003404SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08003405 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00003406}
3407
fmalita8c89c522014-11-08 16:18:56 -08003408void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04003409 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00003410}
3411
ethannicholasf62a8b72016-02-11 10:35:21 -08003412SkSaveCommand* SkSaveCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003413 return new SkSaveCommand();
3414}
3415
reed4960eee2015-12-18 07:09:18 -08003416SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
robertphillips9bafc302015-02-13 11:13:00 -08003417 : INHERITED(kSaveLayer_OpType) {
reed4960eee2015-12-18 07:09:18 -08003418 if (rec.fBounds) {
3419 fBounds = *rec.fBounds;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003420 } else {
3421 fBounds.setEmpty();
3422 }
chudy@google.com902ebe52012-06-29 14:21:22 +00003423
reed4960eee2015-12-18 07:09:18 -08003424 if (rec.fPaint) {
3425 fPaint = *rec.fPaint;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003426 fPaintPtr = &fPaint;
3427 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07003428 fPaintPtr = nullptr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003429 }
reed4960eee2015-12-18 07:09:18 -08003430 fSaveLayerFlags = rec.fSaveLayerFlags;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003431
ethannicholas50a8dd02016-02-10 05:40:46 -08003432 if (rec.fBackdrop) {
3433 fBackdrop = rec.fBackdrop;
3434 fBackdrop->ref();
3435 } else {
3436 fBackdrop = nullptr;
3437 }
3438
reed4960eee2015-12-18 07:09:18 -08003439 if (rec.fBounds) {
3440 fInfo.push(SkObjectParser::RectToString(*rec.fBounds, "Bounds: "));
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003441 }
reed4960eee2015-12-18 07:09:18 -08003442 if (rec.fPaint) {
3443 fInfo.push(SkObjectParser::PaintToString(*rec.fPaint));
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003444 }
reed4960eee2015-12-18 07:09:18 -08003445 fInfo.push(SkObjectParser::SaveLayerFlagsToString(fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00003446}
3447
ethannicholas50a8dd02016-02-10 05:40:46 -08003448SkSaveLayerCommand::~SkSaveLayerCommand() {
3449 if (fBackdrop != nullptr) {
3450 fBackdrop->unref();
3451 }
3452}
3453
fmalita8c89c522014-11-08 16:18:56 -08003454void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
reed4960eee2015-12-18 07:09:18 -08003455 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.isEmpty() ? nullptr : &fBounds,
3456 fPaintPtr,
3457 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00003458}
3459
fmalita8c89c522014-11-08 16:18:56 -08003460void SkSaveLayerCommand::vizExecute(SkCanvas* canvas) const {
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +00003461 canvas->save();
3462}
3463
ethannicholasf62a8b72016-02-11 10:35:21 -08003464Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
3465 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003466 if (!fBounds.isEmpty()) {
brianosmanfad98562016-05-04 11:06:28 -07003467 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(fBounds);
ethannicholas50a8dd02016-02-10 05:40:46 -08003468 }
3469 if (fPaintPtr != nullptr) {
brianosmanfad98562016-05-04 11:06:28 -07003470 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr,
ethannicholasf62a8b72016-02-11 10:35:21 -08003471 urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003472 }
3473 if (fBackdrop != nullptr) {
3474 Json::Value jsonBackdrop;
ethannicholasf62a8b72016-02-11 10:35:21 -08003475 flatten(fBackdrop, &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003476 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
3477 }
3478 if (fSaveLayerFlags != 0) {
3479 SkDebugf("unsupported: saveLayer flags\n");
3480 SkASSERT(false);
3481 }
3482 return result;
3483}
3484
halcanary9d524f22016-03-29 09:03:52 -07003485SkSaveLayerCommand* SkSaveLayerCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003486 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003487 SkCanvas::SaveLayerRec rec;
3488 SkRect bounds;
3489 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_BOUNDS)) {
3490 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS], &bounds);
3491 rec.fBounds = &bounds;
3492 }
3493 SkPaint paint;
3494 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08003495 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003496 rec.fPaint = &paint;
3497 }
3498 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_BACKDROP)) {
3499 Json::Value backdrop = command[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP];
ethannicholasf62a8b72016-02-11 10:35:21 -08003500 rec.fBackdrop = (SkImageFilter*) load_flattenable(backdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003501 }
3502 SkSaveLayerCommand* result = new SkSaveLayerCommand(rec);
3503 if (rec.fBackdrop != nullptr) {
3504 rec.fBackdrop->unref();
3505 }
3506 return result;
3507}
3508
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003509SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08003510 : INHERITED(kSetMatrix_OpType) {
robertphillips70171682014-10-16 14:28:28 -07003511 fUserMatrix.reset();
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003512 fMatrix = matrix;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003513 fInfo.push(SkObjectParser::MatrixToString(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +00003514}
3515
robertphillips70171682014-10-16 14:28:28 -07003516void SkSetMatrixCommand::setUserMatrix(const SkMatrix& userMatrix) {
3517 fUserMatrix = userMatrix;
3518}
3519
fmalita8c89c522014-11-08 16:18:56 -08003520void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
robertphillips70171682014-10-16 14:28:28 -07003521 SkMatrix temp = SkMatrix::Concat(fUserMatrix, fMatrix);
3522 canvas->setMatrix(temp);
chudy@google.com902ebe52012-06-29 14:21:22 +00003523}
3524
ethannicholasf62a8b72016-02-11 10:35:21 -08003525Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
3526 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08003527 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08003528 return result;
3529}
3530
halcanary9d524f22016-03-29 09:03:52 -07003531SkSetMatrixCommand* SkSetMatrixCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003532 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003533 SkMatrix matrix;
3534 extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix);
3535 return new SkSetMatrixCommand(matrix);
3536}
vjiaoblacke5de1302016-07-13 14:05:28 -07003537
3538SkTranslateZCommand::SkTranslateZCommand(SkScalar z)
3539 : INHERITED(kTranslateZ_OpType) {
3540 fZTranslate = z;
3541 fInfo.push(SkObjectParser::ScalarToString(fZTranslate, "drawDepthTranslation"));
3542}
3543
3544void SkTranslateZCommand::execute(SkCanvas* canvas) const {
vjiaoblack95302da2016-07-21 10:25:54 -07003545#ifdef SK_EXPERIMENTAL_SHADOWING
vjiaoblacke5de1302016-07-13 14:05:28 -07003546 canvas->translateZ(fZTranslate);
vjiaoblack95302da2016-07-21 10:25:54 -07003547#endif
vjiaoblacke5de1302016-07-13 14:05:28 -07003548}
3549
3550Json::Value SkTranslateZCommand::toJSON(UrlDataManager& urlDataManager) const {
3551 Json::Value result = INHERITED::toJSON(urlDataManager);
3552 result[SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS] = MakeJsonScalar(fZTranslate);
3553 return result;
3554}
3555
3556SkTranslateZCommand* SkTranslateZCommand::fromJSON(Json::Value& command,
3557 UrlDataManager& urlDataManager) {
3558 SkScalar z;
vjiaoblack95302da2016-07-21 10:25:54 -07003559#ifdef SK_EXPERIMENTAL_SHADOWING
vjiaoblacke5de1302016-07-13 14:05:28 -07003560 extract_json_scalar(command[SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS], &z);
vjiaoblack95302da2016-07-21 10:25:54 -07003561#else
3562 z = 0;
3563#endif
vjiaoblacke5de1302016-07-13 14:05:28 -07003564 return new SkTranslateZCommand(z);
3565}