blob: 251604e1d94a29db3768f989ddbdf01e0a4a985b [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
halcanarya73d76a2016-10-17 13:19:02 -070010#include "png.h"
11
Hal Canary95e3c052017-01-11 12:44:43 -050012#include "SkAutoMalloc.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080013#include "SkBlurMaskFilter.h"
14#include "SkColorFilter.h"
15#include "SkDashPathEffect.h"
16#include "SkImageFilter.h"
brianosmanfad98562016-05-04 11:06:28 -070017#include "SkJsonWriteBuffer.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080018#include "SkMaskFilter.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000019#include "SkObjectParser.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080020#include "SkPaintDefaults.h"
21#include "SkPathEffect.h"
robertphillips9bafc302015-02-13 11:13:00 -080022#include "SkPicture.h"
fmalitab7425172014-08-26 07:56:44 -070023#include "SkTextBlob.h"
fmalitae77f2da2015-12-08 18:59:18 -080024#include "SkTextBlobRunIterator.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080025#include "SkTHash.h"
26#include "SkTypeface.h"
27#include "SkValidatingReadBuffer.h"
28#include "SkWriteBuffer.h"
msaretta5cf4f42016-06-30 10:06:51 -070029#include "picture_utils.h"
Mike Reedebfce6d2016-12-12 10:02:12 -050030#include "SkClipOpPriv.h"
Stan Ilievac42aeb2017-01-12 16:20:50 -050031#include <SkLatticeIter.h>
ethannicholas50a8dd02016-02-10 05:40:46 -080032
ethannicholas50a8dd02016-02-10 05:40:46 -080033#define SKDEBUGCANVAS_ATTRIBUTE_COMMAND "command"
ethannicholas807dcab2016-02-23 06:53:37 -080034#define SKDEBUGCANVAS_ATTRIBUTE_VISIBLE "visible"
ethannicholas50a8dd02016-02-10 05:40:46 -080035#define SKDEBUGCANVAS_ATTRIBUTE_MATRIX "matrix"
vjiaoblacke5de1302016-07-13 14:05:28 -070036#define SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS "drawDepthTranslation"
ethannicholas50a8dd02016-02-10 05:40:46 -080037#define SKDEBUGCANVAS_ATTRIBUTE_COORDS "coords"
halcanaryf412f092016-08-25 11:10:41 -070038#define SKDEBUGCANVAS_ATTRIBUTE_HINTING "hinting"
ethannicholas50a8dd02016-02-10 05:40:46 -080039#define SKDEBUGCANVAS_ATTRIBUTE_BOUNDS "bounds"
40#define SKDEBUGCANVAS_ATTRIBUTE_PAINT "paint"
41#define SKDEBUGCANVAS_ATTRIBUTE_OUTER "outer"
42#define SKDEBUGCANVAS_ATTRIBUTE_INNER "inner"
43#define SKDEBUGCANVAS_ATTRIBUTE_MODE "mode"
44#define SKDEBUGCANVAS_ATTRIBUTE_POINTS "points"
45#define SKDEBUGCANVAS_ATTRIBUTE_PATH "path"
46#define SKDEBUGCANVAS_ATTRIBUTE_TEXT "text"
47#define SKDEBUGCANVAS_ATTRIBUTE_COLOR "color"
48#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Florin Malita82d80872017-06-06 16:58:40 -040049#define SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE "blendMode"
ethannicholas50a8dd02016-02-10 05:40:46 -080050#define SKDEBUGCANVAS_ATTRIBUTE_STYLE "style"
51#define SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH "strokeWidth"
52#define SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER "strokeMiter"
ethannicholas1446a9a2016-02-10 14:05:02 -080053#define SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN "strokeJoin"
ethannicholas50a8dd02016-02-10 05:40:46 -080054#define SKDEBUGCANVAS_ATTRIBUTE_CAP "cap"
55#define SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS "antiAlias"
ethannicholas1446a9a2016-02-10 14:05:02 -080056#define SKDEBUGCANVAS_ATTRIBUTE_DITHER "dither"
Ben Wagner78f1f5a2017-06-23 14:35:07 -040057#define SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT "fakeBoldText"
58#define SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT "linearText"
59#define SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT "subpixelText"
60#define SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT "devKernText"
61#define SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT "lcdRenderText"
62#define SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT "embeddedBitmapText"
63#define SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING "forceAutoHinting"
64#define SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT "verticalText"
ethannicholas50a8dd02016-02-10 05:40:46 -080065#define SKDEBUGCANVAS_ATTRIBUTE_REGION "region"
66#define SKDEBUGCANVAS_ATTRIBUTE_REGIONOP "op"
67#define SKDEBUGCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle"
68#define SKDEBUGCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion"
69#define SKDEBUGCANVAS_ATTRIBUTE_BLUR "blur"
70#define SKDEBUGCANVAS_ATTRIBUTE_SIGMA "sigma"
71#define SKDEBUGCANVAS_ATTRIBUTE_QUALITY "quality"
72#define SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN "textAlign"
73#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE "textSize"
74#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX"
75#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX"
76#define SKDEBUGCANVAS_ATTRIBUTE_DASHING "dashing"
77#define SKDEBUGCANVAS_ATTRIBUTE_INTERVALS "intervals"
78#define SKDEBUGCANVAS_ATTRIBUTE_PHASE "phase"
79#define SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE "fillType"
80#define SKDEBUGCANVAS_ATTRIBUTE_VERBS "verbs"
81#define SKDEBUGCANVAS_ATTRIBUTE_NAME "name"
ethannicholasf62a8b72016-02-11 10:35:21 -080082#define SKDEBUGCANVAS_ATTRIBUTE_DATA "data"
brianosmanfad98562016-05-04 11:06:28 -070083#define SKDEBUGCANVAS_ATTRIBUTE_VALUES "values"
ethannicholas50a8dd02016-02-10 05:40:46 -080084#define SKDEBUGCANVAS_ATTRIBUTE_SHADER "shader"
85#define SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect"
86#define SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER "maskFilter"
87#define SKDEBUGCANVAS_ATTRIBUTE_XFERMODE "xfermode"
ethannicholas1446a9a2016-02-10 14:05:02 -080088#define SKDEBUGCANVAS_ATTRIBUTE_LOOPER "looper"
ethannicholas50a8dd02016-02-10 05:40:46 -080089#define SKDEBUGCANVAS_ATTRIBUTE_BACKDROP "backdrop"
90#define SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER "colorfilter"
91#define SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter"
92#define SKDEBUGCANVAS_ATTRIBUTE_IMAGE "image"
93#define SKDEBUGCANVAS_ATTRIBUTE_BITMAP "bitmap"
94#define SKDEBUGCANVAS_ATTRIBUTE_SRC "src"
95#define SKDEBUGCANVAS_ATTRIBUTE_DST "dst"
96#define SKDEBUGCANVAS_ATTRIBUTE_CENTER "center"
97#define SKDEBUGCANVAS_ATTRIBUTE_STRICT "strict"
98#define SKDEBUGCANVAS_ATTRIBUTE_DESCRIPTION "description"
99#define SKDEBUGCANVAS_ATTRIBUTE_X "x"
100#define SKDEBUGCANVAS_ATTRIBUTE_Y "y"
101#define SKDEBUGCANVAS_ATTRIBUTE_RUNS "runs"
102#define SKDEBUGCANVAS_ATTRIBUTE_POSITIONS "positions"
103#define SKDEBUGCANVAS_ATTRIBUTE_GLYPHS "glyphs"
104#define SKDEBUGCANVAS_ATTRIBUTE_FONT "font"
105#define SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE "typeface"
ethannicholas1446a9a2016-02-10 14:05:02 -0800106#define SKDEBUGCANVAS_ATTRIBUTE_CUBICS "cubics"
107#define SKDEBUGCANVAS_ATTRIBUTE_COLORS "colors"
108#define SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS "textureCoords"
109#define SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY "filterQuality"
bsalomonac3aa242016-08-19 11:25:19 -0700110#define SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE "startAngle"
111#define SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE "sweepAngle"
112#define SKDEBUGCANVAS_ATTRIBUTE_USECENTER "useCenter"
jcgregorioee0c5552016-06-30 09:18:27 -0700113#define SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC "shortDesc"
msarett0ac1bec2016-08-29 09:15:33 -0700114#define SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID "uniqueID"
115#define SKDEBUGCANVAS_ATTRIBUTE_WIDTH "width"
116#define SKDEBUGCANVAS_ATTRIBUTE_HEIGHT "height"
117#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Stan Ilievac42aeb2017-01-12 16:20:50 -0500118#define SKDEBUGCANVAS_ATTRIBUTE_LATTICE "lattice"
119#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT "xCount"
120#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT "yCount"
121#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS "xDivs"
122#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS "yDivs"
123#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS "flags"
reed67f62fa2016-06-29 11:36:34 -0700124
ethannicholas50a8dd02016-02-10 05:40:46 -0800125#define SKDEBUGCANVAS_VERB_MOVE "move"
126#define SKDEBUGCANVAS_VERB_LINE "line"
127#define SKDEBUGCANVAS_VERB_QUAD "quad"
128#define SKDEBUGCANVAS_VERB_CUBIC "cubic"
129#define SKDEBUGCANVAS_VERB_CONIC "conic"
130#define SKDEBUGCANVAS_VERB_CLOSE "close"
131
132#define SKDEBUGCANVAS_STYLE_FILL "fill"
133#define SKDEBUGCANVAS_STYLE_STROKE "stroke"
134#define SKDEBUGCANVAS_STYLE_STROKEANDFILL "strokeAndFill"
135
136#define SKDEBUGCANVAS_POINTMODE_POINTS "points"
137#define SKDEBUGCANVAS_POINTMODE_LINES "lines"
138#define SKDEBUGCANVAS_POINTMODE_POLYGON "polygon"
139
140#define SKDEBUGCANVAS_REGIONOP_DIFFERENCE "difference"
141#define SKDEBUGCANVAS_REGIONOP_INTERSECT "intersect"
142#define SKDEBUGCANVAS_REGIONOP_UNION "union"
143#define SKDEBUGCANVAS_REGIONOP_XOR "xor"
144#define SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE "reverseDifference"
145#define SKDEBUGCANVAS_REGIONOP_REPLACE "replace"
146
147#define SKDEBUGCANVAS_BLURSTYLE_NORMAL "normal"
148#define SKDEBUGCANVAS_BLURSTYLE_SOLID "solid"
149#define SKDEBUGCANVAS_BLURSTYLE_OUTER "outer"
150#define SKDEBUGCANVAS_BLURSTYLE_INNER "inner"
151
152#define SKDEBUGCANVAS_BLURQUALITY_LOW "low"
153#define SKDEBUGCANVAS_BLURQUALITY_HIGH "high"
154
155#define SKDEBUGCANVAS_ALIGN_LEFT "left"
156#define SKDEBUGCANVAS_ALIGN_CENTER "center"
157#define SKDEBUGCANVAS_ALIGN_RIGHT "right"
158
159#define SKDEBUGCANVAS_FILLTYPE_WINDING "winding"
160#define SKDEBUGCANVAS_FILLTYPE_EVENODD "evenOdd"
161#define SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding"
162#define SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd"
163
164#define SKDEBUGCANVAS_CAP_BUTT "butt"
165#define SKDEBUGCANVAS_CAP_ROUND "round"
166#define SKDEBUGCANVAS_CAP_SQUARE "square"
167
ethannicholas1446a9a2016-02-10 14:05:02 -0800168#define SKDEBUGCANVAS_MITER_JOIN "miter"
169#define SKDEBUGCANVAS_ROUND_JOIN "round"
170#define SKDEBUGCANVAS_BEVEL_JOIN "bevel"
171
ethannicholas50a8dd02016-02-10 05:40:46 -0800172#define SKDEBUGCANVAS_COLORTYPE_ARGB4444 "ARGB4444"
173#define SKDEBUGCANVAS_COLORTYPE_RGBA8888 "RGBA8888"
174#define SKDEBUGCANVAS_COLORTYPE_BGRA8888 "BGRA8888"
175#define SKDEBUGCANVAS_COLORTYPE_565 "565"
176#define SKDEBUGCANVAS_COLORTYPE_GRAY8 "Gray8"
177#define SKDEBUGCANVAS_COLORTYPE_INDEX8 "Index8"
178#define SKDEBUGCANVAS_COLORTYPE_ALPHA8 "Alpha8"
179
180#define SKDEBUGCANVAS_ALPHATYPE_OPAQUE "opaque"
181#define SKDEBUGCANVAS_ALPHATYPE_PREMUL "premul"
182#define SKDEBUGCANVAS_ALPHATYPE_UNPREMUL "unpremul"
msarett0ac1bec2016-08-29 09:15:33 -0700183#define SKDEBUGCANVAS_ALPHATYPE_UNKNOWN "unknown"
ethannicholas50a8dd02016-02-10 05:40:46 -0800184
ethannicholas1446a9a2016-02-10 14:05:02 -0800185#define SKDEBUGCANVAS_FILTERQUALITY_NONE "none"
186#define SKDEBUGCANVAS_FILTERQUALITY_LOW "low"
187#define SKDEBUGCANVAS_FILTERQUALITY_MEDIUM "medium"
188#define SKDEBUGCANVAS_FILTERQUALITY_HIGH "high"
189
halcanaryf412f092016-08-25 11:10:41 -0700190#define SKDEBUGCANVAS_HINTING_NONE "none"
191#define SKDEBUGCANVAS_HINTING_SLIGHT "slight"
192#define SKDEBUGCANVAS_HINTING_NORMAL "normal"
193#define SKDEBUGCANVAS_HINTING_FULL "full"
194
ethannicholasf62a8b72016-02-11 10:35:21 -0800195typedef SkDrawCommand* (*FROM_JSON)(Json::Value&, UrlDataManager&);
fmalitab7425172014-08-26 07:56:44 -0700196
reed67f62fa2016-06-29 11:36:34 -0700197static SkString* str_append(SkString* str, const SkRect& r) {
198 str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom());
199 return str;
200}
201
chudy@google.com902ebe52012-06-29 14:21:22 +0000202// TODO(chudy): Refactor into non subclass model.
203
robertphillips9bafc302015-02-13 11:13:00 -0800204SkDrawCommand::SkDrawCommand(OpType type)
205 : fOpType(type)
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000206 , fVisible(true) {
207}
208
chudy@google.com902ebe52012-06-29 14:21:22 +0000209SkDrawCommand::~SkDrawCommand() {
chudy@google.com97cee972012-08-07 20:41:37 +0000210 fInfo.deleteAll();
chudy@google.com902ebe52012-06-29 14:21:22 +0000211}
212
robertphillips9bafc302015-02-13 11:13:00 -0800213const char* SkDrawCommand::GetCommandString(OpType type) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000214 switch (type) {
fmalita160ebb22015-04-01 20:58:37 -0700215 case kBeginDrawPicture_OpType: return "BeginDrawPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800216 case kClipPath_OpType: return "ClipPath";
217 case kClipRegion_OpType: return "ClipRegion";
218 case kClipRect_OpType: return "ClipRect";
219 case kClipRRect_OpType: return "ClipRRect";
robertphillips9bafc302015-02-13 11:13:00 -0800220 case kConcat_OpType: return "Concat";
robertphillipsfb409232016-06-29 10:28:11 -0700221 case kDrawAnnotation_OpType: return "DrawAnnotation";
robertphillips9bafc302015-02-13 11:13:00 -0800222 case kDrawBitmap_OpType: return "DrawBitmap";
223 case kDrawBitmapNine_OpType: return "DrawBitmapNine";
224 case kDrawBitmapRect_OpType: return "DrawBitmapRect";
225 case kDrawClear_OpType: return "DrawClear";
226 case kDrawDRRect_OpType: return "DrawDRRect";
fmalita651c9202015-07-22 10:23:01 -0700227 case kDrawImage_OpType: return "DrawImage";
Stan Ilievac42aeb2017-01-12 16:20:50 -0500228 case kDrawImageLattice_OpType: return "DrawImageLattice";
fmalita651c9202015-07-22 10:23:01 -0700229 case kDrawImageRect_OpType: return "DrawImageRect";
robertphillips9bafc302015-02-13 11:13:00 -0800230 case kDrawOval_OpType: return "DrawOval";
231 case kDrawPaint_OpType: return "DrawPaint";
232 case kDrawPatch_OpType: return "DrawPatch";
233 case kDrawPath_OpType: return "DrawPath";
robertphillips9bafc302015-02-13 11:13:00 -0800234 case kDrawPoints_OpType: return "DrawPoints";
235 case kDrawPosText_OpType: return "DrawPosText";
236 case kDrawPosTextH_OpType: return "DrawPosTextH";
237 case kDrawRect_OpType: return "DrawRect";
238 case kDrawRRect_OpType: return "DrawRRect";
robertphillips9bafc302015-02-13 11:13:00 -0800239 case kDrawText_OpType: return "DrawText";
240 case kDrawTextBlob_OpType: return "DrawTextBlob";
241 case kDrawTextOnPath_OpType: return "DrawTextOnPath";
reed63f30d92016-07-07 16:32:51 -0700242 case kDrawTextRSXform_OpType: return "DrawTextRSXform";
robertphillips9bafc302015-02-13 11:13:00 -0800243 case kDrawVertices_OpType: return "DrawVertices";
fmalita160ebb22015-04-01 20:58:37 -0700244 case kEndDrawPicture_OpType: return "EndDrawPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800245 case kRestore_OpType: return "Restore";
246 case kSave_OpType: return "Save";
247 case kSaveLayer_OpType: return "SaveLayer";
248 case kSetMatrix_OpType: return "SetMatrix";
chudy@google.com902ebe52012-06-29 14:21:22 +0000249 default:
robertphillips9bafc302015-02-13 11:13:00 -0800250 SkDebugf("OpType error 0x%08x\n", type);
chudy@google.com902ebe52012-06-29 14:21:22 +0000251 SkASSERT(0);
252 break;
253 }
254 SkDEBUGFAIL("DrawType UNUSED\n");
halcanary96fcdcc2015-08-27 07:41:13 -0700255 return nullptr;
chudy@google.com902ebe52012-06-29 14:21:22 +0000256}
257
fmalita8c89c522014-11-08 16:18:56 -0800258SkString SkDrawCommand::toString() const {
robertphillips9bafc302015-02-13 11:13:00 -0800259 return SkString(GetCommandString(fOpType));
chudy@google.com902ebe52012-06-29 14:21:22 +0000260}
261
ethannicholasf62a8b72016-02-11 10:35:21 -0800262Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const {
ethannicholas50a8dd02016-02-10 05:40:46 -0800263 Json::Value result;
264 result[SKDEBUGCANVAS_ATTRIBUTE_COMMAND] = this->GetCommandString(fOpType);
ethannicholas807dcab2016-02-23 06:53:37 -0800265 result[SKDEBUGCANVAS_ATTRIBUTE_VISIBLE] = Json::Value(this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800266 return result;
267}
268
269#define INSTALL_FACTORY(name) factories.set(SkString(GetCommandString(k ## name ##_OpType)), \
270 (FROM_JSON) Sk ## name ## Command::fromJSON)
ethannicholasf62a8b72016-02-11 10:35:21 -0800271SkDrawCommand* SkDrawCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800272 static SkTHashMap<SkString, FROM_JSON> factories;
273 static bool initialized = false;
274 if (!initialized) {
275 initialized = true;
276 INSTALL_FACTORY(Restore);
277 INSTALL_FACTORY(ClipPath);
278 INSTALL_FACTORY(ClipRegion);
279 INSTALL_FACTORY(ClipRect);
280 INSTALL_FACTORY(ClipRRect);
281 INSTALL_FACTORY(Concat);
reed97660cc2016-06-28 18:54:19 -0700282 INSTALL_FACTORY(DrawAnnotation);
ethannicholas50a8dd02016-02-10 05:40:46 -0800283 INSTALL_FACTORY(DrawBitmap);
284 INSTALL_FACTORY(DrawBitmapRect);
285 INSTALL_FACTORY(DrawBitmapNine);
286 INSTALL_FACTORY(DrawImage);
287 INSTALL_FACTORY(DrawImageRect);
288 INSTALL_FACTORY(DrawOval);
289 INSTALL_FACTORY(DrawPaint);
290 INSTALL_FACTORY(DrawPath);
291 INSTALL_FACTORY(DrawPoints);
292 INSTALL_FACTORY(DrawText);
293 INSTALL_FACTORY(DrawPosText);
bungeman51190df2016-03-09 07:42:54 -0800294 INSTALL_FACTORY(DrawPosTextH);
ethannicholas50a8dd02016-02-10 05:40:46 -0800295 INSTALL_FACTORY(DrawTextOnPath);
reed45561a02016-07-07 12:47:17 -0700296 INSTALL_FACTORY(DrawTextRSXform);
ethannicholas50a8dd02016-02-10 05:40:46 -0800297 INSTALL_FACTORY(DrawTextBlob);
298
299 INSTALL_FACTORY(DrawRect);
300 INSTALL_FACTORY(DrawRRect);
301 INSTALL_FACTORY(DrawDRRect);
ethannicholas1446a9a2016-02-10 14:05:02 -0800302 INSTALL_FACTORY(DrawPatch);
ethannicholas50a8dd02016-02-10 05:40:46 -0800303 INSTALL_FACTORY(Save);
304 INSTALL_FACTORY(SaveLayer);
305 INSTALL_FACTORY(SetMatrix);
306 }
307 SkString name = SkString(command[SKDEBUGCANVAS_ATTRIBUTE_COMMAND].asCString());
308 FROM_JSON* factory = factories.find(name);
309 if (factory == nullptr) {
310 SkDebugf("no JSON factory for '%s'\n", name.c_str());
311 return nullptr;
312 }
ethannicholasf62a8b72016-02-11 10:35:21 -0800313 return (*factory)(command, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800314}
315
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000316namespace {
317
318void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
Mike Reed3661bc92017-02-22 13:21:42 -0500319 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000320
321 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
322
323 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
324 if (bounds.width() > bounds.height()) {
325 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
326 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
327 } else {
328 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
329 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
330 }
331 canvas->translate(-bounds.centerX(), -bounds.centerY());
332}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000333
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000334
335void render_path(SkCanvas* canvas, const SkPath& path) {
336 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000337
338 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700339 if (bounds.isEmpty()) {
340 return;
341 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000342
fmalitab0cd8b72015-10-06 07:24:03 -0700343 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000344 xlate_and_scale_to_bounds(canvas, bounds);
345
346 SkPaint p;
347 p.setColor(SK_ColorBLACK);
348 p.setStyle(SkPaint::kStroke_Style);
349
350 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000351}
352
halcanary96fcdcc2015-08-27 07:41:13 -0700353void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
Mike Reed3661bc92017-02-22 13:21:42 -0500354 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000355
356 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
357 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
358
359 if (input.width() > input.height()) {
360 yScale *= input.height() / (float) input.width();
361 } else {
362 xScale *= input.width() / (float) input.height();
363 }
364
365 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
366 xScale * input.width(),
367 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000368
robertphillips96a5cff2015-09-24 06:56:27 -0700369 static const int kNumBlocks = 8;
370
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000371 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700372 SkISize block = {
373 canvas->imageInfo().width()/kNumBlocks,
374 canvas->imageInfo().height()/kNumBlocks
375 };
376 for (int y = 0; y < kNumBlocks; ++y) {
377 for (int x = 0; x < kNumBlocks; ++x) {
378 SkPaint paint;
379 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
380 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
381 SkIntToScalar(y*block.height()),
382 SkIntToScalar(block.width()),
383 SkIntToScalar(block.height()));
384 canvas->drawRect(r, paint);
385 }
386 }
387
reede47829b2015-08-06 10:02:53 -0700388 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000389
bsalomon49f085d2014-09-05 13:34:00 -0700390 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000391 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
392 srcRect->fTop * yScale + SK_Scalar1,
393 srcRect->fRight * xScale + SK_Scalar1,
394 srcRect->fBottom * yScale + SK_Scalar1);
395 SkPaint p;
396 p.setColor(SK_ColorRED);
397 p.setStyle(SkPaint::kStroke_Style);
398
399 canvas->drawRect(r, p);
400 }
401}
402
403void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
404 canvas->clear(0xFFFFFFFF);
405 canvas->save();
406
407 const SkRect& bounds = rrect.getBounds();
408
409 xlate_and_scale_to_bounds(canvas, bounds);
410
411 SkPaint p;
412 p.setColor(SK_ColorBLACK);
413 p.setStyle(SkPaint::kStroke_Style);
414
415 canvas->drawRRect(rrect, p);
416 canvas->restore();
417}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000418
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000419void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
420 canvas->clear(0xFFFFFFFF);
421 canvas->save();
422
423 const SkRect& bounds = outer.getBounds();
424
425 xlate_and_scale_to_bounds(canvas, bounds);
426
427 SkPaint p;
428 p.setColor(SK_ColorBLACK);
429 p.setStyle(SkPaint::kStroke_Style);
430
431 canvas->drawDRRect(outer, inner, p);
432 canvas->restore();
433}
434
Florin Malita82d80872017-06-06 16:58:40 -0400435static const char* const gBlendModeMap[] = {
436 "clear",
437 "src",
438 "dst",
439 "srcOver",
440 "dstOver",
441 "srcIn",
442 "dstIn",
443 "srcOut",
444 "dstOut",
445 "srcATop",
446 "dstATop",
447 "xor",
448 "plus",
449 "modulate",
450
451 "screen",
452
453 "overlay",
454 "darken",
455 "lighten",
456 "colorDodge",
457 "colorBurn",
458 "hardLight",
459 "softLight",
460 "difference",
461 "exclusion",
462 "multiply",
463
464 "hue",
465 "saturation",
466 "color",
467 "luminosity",
468};
469
470static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
471 "blendMode mismatch");
472static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
473 "blendMode mismatch");
474
475void apply_paint_blend_mode(const SkPaint& paint, Json::Value* target) {
476 const auto mode = paint.getBlendMode();
477 if (mode != SkBlendMode::kSrcOver) {
478 SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
479 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE] =
480 Json::Value(gBlendModeMap[static_cast<size_t>(mode)]);
481 }
482}
483
484void extract_json_paint_blend_mode(Json::Value& jsonPaint, SkPaint* target) {
485 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE)) {
486 const char* mode = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE].asCString();
487
488 for (size_t i = 0; i < SK_ARRAY_COUNT(gBlendModeMap); ++i) {
489 if (!strcmp(mode, gBlendModeMap[i])) {
490 target->setBlendMode(static_cast<SkBlendMode>(i));
491 break;
492 }
493 }
494 }
495}
496
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000497};
498
brianosmanfad98562016-05-04 11:06:28 -0700499Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800500 Json::Value result(Json::arrayValue);
501 result.append(Json::Value(SkColorGetA(color)));
502 result.append(Json::Value(SkColorGetR(color)));
503 result.append(Json::Value(SkColorGetG(color)));
504 result.append(Json::Value(SkColorGetB(color)));
505 return result;
506}
507
brianosman97bbf822016-09-25 13:15:58 -0700508Json::Value SkDrawCommand::MakeJsonColor4f(const SkColor4f& color) {
509 Json::Value result(Json::arrayValue);
510 result.append(Json::Value(color.fA));
511 result.append(Json::Value(color.fR));
512 result.append(Json::Value(color.fG));
513 result.append(Json::Value(color.fB));
514 return result;
515}
516
brianosmanfad98562016-05-04 11:06:28 -0700517Json::Value SkDrawCommand::MakeJsonPoint(const SkPoint& point) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800518 Json::Value result(Json::arrayValue);
519 result.append(Json::Value(point.x()));
520 result.append(Json::Value(point.y()));
521 return result;
522}
523
brianosmanfad98562016-05-04 11:06:28 -0700524Json::Value SkDrawCommand::MakeJsonPoint(SkScalar x, SkScalar y) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800525 Json::Value result(Json::arrayValue);
526 result.append(Json::Value(x));
527 result.append(Json::Value(y));
528 return result;
529}
530
brianosmanfad98562016-05-04 11:06:28 -0700531Json::Value SkDrawCommand::MakeJsonRect(const SkRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800532 Json::Value result(Json::arrayValue);
533 result.append(Json::Value(rect.left()));
534 result.append(Json::Value(rect.top()));
535 result.append(Json::Value(rect.right()));
536 result.append(Json::Value(rect.bottom()));
537 return result;
538}
539
joshualittbd724132016-03-03 11:39:38 -0800540Json::Value SkDrawCommand::MakeJsonIRect(const SkIRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800541 Json::Value result(Json::arrayValue);
542 result.append(Json::Value(rect.left()));
543 result.append(Json::Value(rect.top()));
544 result.append(Json::Value(rect.right()));
545 result.append(Json::Value(rect.bottom()));
546 return result;
547}
548
549static Json::Value make_json_rrect(const SkRRect& rrect) {
550 Json::Value result(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700551 result.append(SkDrawCommand::MakeJsonRect(rrect.rect()));
552 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
553 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperRight_Corner)));
554 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerRight_Corner)));
555 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
ethannicholas50a8dd02016-02-10 05:40:46 -0800556 return result;
557}
558
joshualittbd724132016-03-03 11:39:38 -0800559Json::Value SkDrawCommand::MakeJsonMatrix(const SkMatrix& matrix) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800560 Json::Value result(Json::arrayValue);
561 Json::Value row1(Json::arrayValue);
562 row1.append(Json::Value(matrix[0]));
563 row1.append(Json::Value(matrix[1]));
564 row1.append(Json::Value(matrix[2]));
565 result.append(row1);
566 Json::Value row2(Json::arrayValue);
567 row2.append(Json::Value(matrix[3]));
568 row2.append(Json::Value(matrix[4]));
569 row2.append(Json::Value(matrix[5]));
570 result.append(row2);
571 Json::Value row3(Json::arrayValue);
572 row3.append(Json::Value(matrix[6]));
573 row3.append(Json::Value(matrix[7]));
574 row3.append(Json::Value(matrix[8]));
575 result.append(row3);
576 return result;
577}
ethannicholas1446a9a2016-02-10 14:05:02 -0800578
vjiaoblacke5de1302016-07-13 14:05:28 -0700579Json::Value SkDrawCommand::MakeJsonScalar(SkScalar z) {
580 Json::Value result(z);
581 return result;
582}
583
brianosmanfad98562016-05-04 11:06:28 -0700584Json::Value SkDrawCommand::MakeJsonPath(const SkPath& path) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800585 Json::Value result(Json::objectValue);
586 switch (path.getFillType()) {
587 case SkPath::kWinding_FillType:
588 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_WINDING;
589 break;
590 case SkPath::kEvenOdd_FillType:
591 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_EVENODD;
592 break;
593 case SkPath::kInverseWinding_FillType:
594 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING;
595 break;
596 case SkPath::kInverseEvenOdd_FillType:
597 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
598 break;
halcanary9d524f22016-03-29 09:03:52 -0700599 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800600 Json::Value verbs(Json::arrayValue);
601 SkPath::Iter iter(path, false);
602 SkPoint pts[4];
603 SkPath::Verb verb;
604 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
605 switch (verb) {
606 case SkPath::kLine_Verb: {
607 Json::Value line(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700608 line[SKDEBUGCANVAS_VERB_LINE] = MakeJsonPoint(pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800609 verbs.append(line);
610 break;
611 }
612 case SkPath::kQuad_Verb: {
613 Json::Value quad(Json::objectValue);
614 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700615 coords.append(MakeJsonPoint(pts[1]));
616 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800617 quad[SKDEBUGCANVAS_VERB_QUAD] = coords;
618 verbs.append(quad);
619 break;
620 }
621 case SkPath::kCubic_Verb: {
622 Json::Value cubic(Json::objectValue);
623 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700624 coords.append(MakeJsonPoint(pts[1]));
625 coords.append(MakeJsonPoint(pts[2]));
626 coords.append(MakeJsonPoint(pts[3]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800627 cubic[SKDEBUGCANVAS_VERB_CUBIC] = coords;
628 verbs.append(cubic);
629 break;
630 }
631 case SkPath::kConic_Verb: {
632 Json::Value conic(Json::objectValue);
633 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700634 coords.append(MakeJsonPoint(pts[1]));
635 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800636 coords.append(Json::Value(iter.conicWeight()));
637 conic[SKDEBUGCANVAS_VERB_CONIC] = coords;
638 verbs.append(conic);
639 break;
640 }
641 case SkPath::kMove_Verb: {
642 Json::Value move(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700643 move[SKDEBUGCANVAS_VERB_MOVE] = MakeJsonPoint(pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800644 verbs.append(move);
645 break;
646 }
647 case SkPath::kClose_Verb:
648 verbs.append(Json::Value(SKDEBUGCANVAS_VERB_CLOSE));
649 break;
650 case SkPath::kDone_Verb:
651 break;
652 }
653 }
654 result[SKDEBUGCANVAS_ATTRIBUTE_VERBS] = verbs;
655 return result;
656}
657
brianosmanfad98562016-05-04 11:06:28 -0700658Json::Value SkDrawCommand::MakeJsonRegion(const SkRegion& region) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800659 return Json::Value("<unimplemented>");
660}
661
Mike Reedc1f77742016-12-09 09:00:50 -0500662static Json::Value make_json_regionop(SkClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800663 switch (op) {
Mike Reedc1f77742016-12-09 09:00:50 -0500664 case kDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800665 return Json::Value(SKDEBUGCANVAS_REGIONOP_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500666 case kIntersect_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800667 return Json::Value(SKDEBUGCANVAS_REGIONOP_INTERSECT);
Mike Reedc1f77742016-12-09 09:00:50 -0500668 case kUnion_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800669 return Json::Value(SKDEBUGCANVAS_REGIONOP_UNION);
Mike Reedc1f77742016-12-09 09:00:50 -0500670 case kXOR_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800671 return Json::Value(SKDEBUGCANVAS_REGIONOP_XOR);
Mike Reedc1f77742016-12-09 09:00:50 -0500672 case kReverseDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800673 return Json::Value(SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500674 case kReplace_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800675 return Json::Value(SKDEBUGCANVAS_REGIONOP_REPLACE);
676 default:
677 SkASSERT(false);
678 return Json::Value("<invalid region op>");
679 };
680}
681
682static Json::Value make_json_pointmode(SkCanvas::PointMode mode) {
683 switch (mode) {
684 case SkCanvas::kPoints_PointMode:
685 return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
686 case SkCanvas::kLines_PointMode:
687 return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
halcanary9d524f22016-03-29 09:03:52 -0700688 case SkCanvas::kPolygon_PointMode:
ethannicholas50a8dd02016-02-10 05:40:46 -0800689 return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
690 default:
691 SkASSERT(false);
692 return Json::Value("<invalid point mode>");
693 };
694}
695
halcanary9d524f22016-03-29 09:03:52 -0700696static void store_scalar(Json::Value* target, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800697 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800698 if (value != defaultValue) {
699 (*target)[key] = Json::Value(value);
700 }
701}
702
ethannicholasbd3dae82016-02-10 12:10:00 -0800703static void store_bool(Json::Value* target, const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800704 if (value != defaultValue) {
705 (*target)[key] = Json::Value(value);
706 }
707}
708
halcanary9d524f22016-03-29 09:03:52 -0700709static void encode_data(const void* bytes, size_t count, const char* contentType,
ethannicholasf62a8b72016-02-11 10:35:21 -0800710 UrlDataManager& urlDataManager, Json::Value* target) {
bungeman38d909e2016-08-02 14:40:46 -0700711 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
712 SkString url = urlDataManager.addData(data.get(), contentType);
ethannicholasf62a8b72016-02-11 10:35:21 -0800713 *target = Json::Value(url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800714}
715
brianosmanfad98562016-05-04 11:06:28 -0700716void SkDrawCommand::flatten(const SkFlattenable* flattenable, Json::Value* target,
717 UrlDataManager& urlDataManager) {
718 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800719 flattenable->flatten(buffer);
720 void* data = sk_malloc_throw(buffer.bytesWritten());
721 buffer.writeToMemory(data);
722 Json::Value jsonData;
723 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, &jsonData);
724 Json::Value jsonFlattenable;
725 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->getTypeName());
726 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
brianosmanfad98562016-05-04 11:06:28 -0700727
728 SkJsonWriteBuffer jsonBuffer(&urlDataManager);
729 flattenable->flatten(jsonBuffer);
730 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_VALUES] = jsonBuffer.getValue();
731
ethannicholasf62a8b72016-02-11 10:35:21 -0800732 (*target) = jsonFlattenable;
733 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800734}
735
ethannicholasf67531f2016-03-21 10:19:39 -0700736static void write_png_callback(png_structp png_ptr, png_bytep data, png_size_t length) {
737 SkWStream* out = (SkWStream*) png_get_io_ptr(png_ptr);
738 out->write(data, length);
739}
740
halcanarya73d76a2016-10-17 13:19:02 -0700741void SkDrawCommand::WritePNG(const uint8_t* rgba, unsigned width, unsigned height,
msaretta5cf4f42016-06-30 10:06:51 -0700742 SkWStream& out, bool isOpaque) {
ethannicholasf67531f2016-03-21 10:19:39 -0700743 png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
744 SkASSERT(png != nullptr);
745 png_infop info_ptr = png_create_info_struct(png);
746 SkASSERT(info_ptr != nullptr);
747 if (setjmp(png_jmpbuf(png))) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400748 SK_ABORT("png encode error");
ethannicholasf67531f2016-03-21 10:19:39 -0700749 }
msaretta5cf4f42016-06-30 10:06:51 -0700750 png_set_write_fn(png, &out, write_png_callback, NULL);
751 int colorType = isOpaque ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGBA;
752 png_set_IHDR(png, info_ptr, width, height, 8, colorType, PNG_INTERLACE_NONE,
ethannicholasf67531f2016-03-21 10:19:39 -0700753 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
754 png_set_compression_level(png, 1);
755 png_bytepp rows = (png_bytepp) sk_malloc_throw(height * sizeof(png_byte*));
msaretta5cf4f42016-06-30 10:06:51 -0700756 png_bytep pixels = (png_bytep) sk_malloc_throw(width * height * 4);
ethannicholasf67531f2016-03-21 10:19:39 -0700757 for (png_size_t y = 0; y < height; ++y) {
halcanarya73d76a2016-10-17 13:19:02 -0700758 const uint8_t* src = rgba + y * width * 4;
msaretta5cf4f42016-06-30 10:06:51 -0700759 rows[y] = pixels + y * width * 4;
ethannicholasf67531f2016-03-21 10:19:39 -0700760 for (png_size_t x = 0; x < width; ++x) {
msaretta5cf4f42016-06-30 10:06:51 -0700761 rows[y][x * 4] = src[x * 4];
762 rows[y][x * 4 + 1] = src[x * 4 + 1];
763 rows[y][x * 4 + 2] = src[x * 4 + 2];
764 rows[y][x * 4 + 3] = src[x * 4 + 3];
ethannicholasf67531f2016-03-21 10:19:39 -0700765 }
766 }
msaretta5cf4f42016-06-30 10:06:51 -0700767 png_write_info(png, info_ptr);
768 if (isOpaque) {
769 png_set_filler(png, 0xFF, PNG_FILLER_AFTER);
770 }
ethannicholasf67531f2016-03-21 10:19:39 -0700771 png_set_filter(png, 0, PNG_NO_FILTERS);
msaretta5cf4f42016-06-30 10:06:51 -0700772 png_write_image(png, &rows[0]);
ethannicholasf67531f2016-03-21 10:19:39 -0700773 png_destroy_write_struct(&png, NULL);
774 sk_free(rows);
775 sk_free(pixels);
776}
777
brianosmanfad98562016-05-04 11:06:28 -0700778bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
779 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700780 size_t rowBytes = 4 * image.width();
Hal Canary95e3c052017-01-11 12:44:43 -0500781 SkAutoMalloc buffer(rowBytes * image.height());
halcanary9d524f22016-03-29 09:03:52 -0700782 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700783 kN32_SkColorType, kPremul_SkAlphaType);
784 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
785 SkDebugf("readPixels failed\n");
786 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800787 }
msaretta5cf4f42016-06-30 10:06:51 -0700788
789 SkBitmap bm;
790 bm.installPixels(dstInfo, buffer.get(), rowBytes);
791 sk_sp<SkData> encodedBitmap = sk_tools::encode_bitmap_for_png(bm);
792
ethannicholasf67531f2016-03-21 10:19:39 -0700793 SkDynamicMemoryWStream out;
halcanarya73d76a2016-10-17 13:19:02 -0700794 SkDrawCommand::WritePNG(encodedBitmap->bytes(), image.width(), image.height(),
msaretta5cf4f42016-06-30 10:06:51 -0700795 out, false);
reed42943c82016-09-12 12:01:44 -0700796 sk_sp<SkData> encoded = out.detachAsData();
ethannicholasf62a8b72016-02-11 10:35:21 -0800797 Json::Value jsonData;
798 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
799 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
ethannicholas50a8dd02016-02-10 05:40:46 -0800800 return true;
801}
802
803static const char* color_type_name(SkColorType colorType) {
804 switch (colorType) {
805 case kARGB_4444_SkColorType:
806 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
807 case kRGBA_8888_SkColorType:
808 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
809 case kBGRA_8888_SkColorType:
810 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
811 case kRGB_565_SkColorType:
812 return SKDEBUGCANVAS_COLORTYPE_565;
813 case kGray_8_SkColorType:
814 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
ethannicholas50a8dd02016-02-10 05:40:46 -0800815 case kAlpha_8_SkColorType:
816 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
817 default:
818 SkASSERT(false);
819 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
820 }
821}
822
823static const char* alpha_type_name(SkAlphaType alphaType) {
824 switch (alphaType) {
825 case kOpaque_SkAlphaType:
826 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
827 case kPremul_SkAlphaType:
828 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
829 case kUnpremul_SkAlphaType:
830 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
831 default:
832 SkASSERT(false);
833 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
834 }
835}
836
halcanary9d524f22016-03-29 09:03:52 -0700837static Json::ArrayIndex decode_data(Json::Value data, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -0800838 const void** target) {
839 UrlDataManager::UrlData* urlData = urlDataManager.getDataFromUrl(SkString(data.asCString()));
840 if (urlData == nullptr) {
841 SkASSERT(false);
842 *target = nullptr;
843 return 0;
ethannicholas50a8dd02016-02-10 05:40:46 -0800844 }
ethannicholasf62a8b72016-02-11 10:35:21 -0800845 *target = urlData->fData->data();
846 // cast should be safe for any reasonably-sized object...
847 return (Json::ArrayIndex) urlData->fData->size();
ethannicholas50a8dd02016-02-10 05:40:46 -0800848}
849
halcanary9d524f22016-03-29 09:03:52 -0700850static SkFlattenable* load_flattenable(Json::Value jsonFlattenable,
ethannicholasf62a8b72016-02-11 10:35:21 -0800851 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800852 if (!jsonFlattenable.isMember(SKDEBUGCANVAS_ATTRIBUTE_NAME)) {
853 return nullptr;
854 }
855 const char* name = jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME].asCString();
856 SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name);
857 if (factory == nullptr) {
858 SkDebugf("no factory for loading '%s'\n", name);
859 return nullptr;
860 }
ethannicholasf62a8b72016-02-11 10:35:21 -0800861 const void* data;
862 int size = decode_data(jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA], urlDataManager, &data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800863 SkValidatingReadBuffer buffer(data, size);
reed60c9b582016-04-03 09:11:13 -0700864 sk_sp<SkFlattenable> result = factory(buffer);
ethannicholas50a8dd02016-02-10 05:40:46 -0800865 if (!buffer.isValid()) {
866 SkDebugf("invalid buffer loading flattenable\n");
867 return nullptr;
868 }
reed60c9b582016-04-03 09:11:13 -0700869 return result.release();
ethannicholas50a8dd02016-02-10 05:40:46 -0800870}
871
872static SkColorType colortype_from_name(const char* name) {
873 if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_ARGB4444)) {
874 return kARGB_4444_SkColorType;
875 }
876 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_RGBA8888)) {
877 return kRGBA_8888_SkColorType;
878 }
879 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_BGRA8888)) {
880 return kBGRA_8888_SkColorType;
881 }
882 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_565)) {
883 return kRGB_565_SkColorType;
884 }
885 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_GRAY8)) {
886 return kGray_8_SkColorType;
887 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800888 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_ALPHA8)) {
889 return kAlpha_8_SkColorType;
890 }
891 SkASSERT(false);
892 return kN32_SkColorType;
893}
894
895static SkBitmap* convert_colortype(SkBitmap* bitmap, SkColorType colorType) {
896 if (bitmap->colorType() == colorType ) {
897 return bitmap;
898 }
899 SkBitmap* dst = new SkBitmap();
Matt Sarett68b8e3d2017-04-28 11:15:22 -0400900 if (dst->tryAllocPixels(bitmap->info().makeColorType(colorType)) &&
901 bitmap->readPixels(dst->info(), dst->getPixels(), dst->rowBytes(), 0, 0))
902 {
ethannicholas50a8dd02016-02-10 05:40:46 -0800903 delete bitmap;
904 return dst;
905 }
906 SkASSERT(false);
907 delete dst;
908 return bitmap;
909}
910
911// caller is responsible for freeing return value
ethannicholasf62a8b72016-02-11 10:35:21 -0800912static SkBitmap* load_bitmap(const Json::Value& jsonBitmap, UrlDataManager& urlDataManager) {
913 if (!jsonBitmap.isMember(SKDEBUGCANVAS_ATTRIBUTE_DATA)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800914 SkDebugf("invalid bitmap\n");
915 return nullptr;
916 }
ethannicholasf62a8b72016-02-11 10:35:21 -0800917 const void* data;
918 int size = decode_data(jsonBitmap[SKDEBUGCANVAS_ATTRIBUTE_DATA], urlDataManager, &data);
bungeman38d909e2016-08-02 14:40:46 -0700919 sk_sp<SkData> encoded(SkData::MakeWithoutCopy(data, size));
reed9ce9d672016-03-17 10:51:11 -0700920 sk_sp<SkImage> image(SkImage::MakeFromEncoded(std::move(encoded), nullptr));
msarett790f99a2016-03-09 06:16:55 -0800921
Ben Wagner145dbcd2016-11-03 14:40:50 -0400922 std::unique_ptr<SkBitmap> bitmap(new SkBitmap());
msarett790f99a2016-03-09 06:16:55 -0800923 if (nullptr != image) {
Ben Wagner145dbcd2016-11-03 14:40:50 -0400924 if (!image->asLegacyBitmap(bitmap.get(), SkImage::kRW_LegacyBitmapMode)) {
msarett790f99a2016-03-09 06:16:55 -0800925 SkDebugf("image decode failed\n");
926 return nullptr;
927 }
928
ethannicholas50a8dd02016-02-10 05:40:46 -0800929 if (jsonBitmap.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLOR)) {
930 const char* ctName = jsonBitmap[SKDEBUGCANVAS_ATTRIBUTE_COLOR].asCString();
931 SkColorType ct = colortype_from_name(ctName);
Mike Reed304a07c2017-07-12 15:10:28 -0400932 bitmap.reset(convert_colortype(bitmap.release(), ct));
ethannicholas50a8dd02016-02-10 05:40:46 -0800933 }
mtklein18300a32016-03-16 13:53:35 -0700934 return bitmap.release();
ethannicholas50a8dd02016-02-10 05:40:46 -0800935 }
936 SkDebugf("image decode failed\n");
ethannicholas50a8dd02016-02-10 05:40:46 -0800937 return nullptr;
938}
939
reed9ce9d672016-03-17 10:51:11 -0700940static sk_sp<SkImage> load_image(const Json::Value& jsonImage, UrlDataManager& urlDataManager) {
ethannicholasf62a8b72016-02-11 10:35:21 -0800941 SkBitmap* bitmap = load_bitmap(jsonImage, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800942 if (bitmap == nullptr) {
943 return nullptr;
944 }
reed9ce9d672016-03-17 10:51:11 -0700945 auto result = SkImage::MakeFromBitmap(*bitmap);
ethannicholas50a8dd02016-02-10 05:40:46 -0800946 delete bitmap;
947 return result;
948}
949
brianosmanfad98562016-05-04 11:06:28 -0700950bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
951 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700952 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800953 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
954 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800955 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800956 return success;
957}
958
halcanaryf412f092016-08-25 11:10:41 -0700959static void apply_paint_hinting(const SkPaint& paint, Json::Value* target) {
960 SkPaint::Hinting hinting = paint.getHinting();
961 if (hinting != SkPaintDefaults_Hinting) {
962 switch (hinting) {
963 case SkPaint::kNo_Hinting:
964 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
965 break;
966 case SkPaint::kSlight_Hinting:
967 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
968 break;
969 case SkPaint::kNormal_Hinting:
970 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
971 break;
972 case SkPaint::kFull_Hinting:
973 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
974 break;
975 }
976 }
977}
978
ethannicholas50a8dd02016-02-10 05:40:46 -0800979static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
980 SkColor color = paint.getColor();
981 if (color != SK_ColorBLACK) {
982 Json::Value colorValue(Json::arrayValue);
983 colorValue.append(Json::Value(SkColorGetA(color)));
984 colorValue.append(Json::Value(SkColorGetR(color)));
985 colorValue.append(Json::Value(SkColorGetG(color)));
986 colorValue.append(Json::Value(SkColorGetB(color)));
987 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;;
988 }
989}
990
991static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
992 SkPaint::Style style = paint.getStyle();
993 if (style != SkPaint::kFill_Style) {
994 switch (style) {
995 case SkPaint::kStroke_Style: {
996 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
997 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
998 break;
999 }
1000 case SkPaint::kStrokeAndFill_Style: {
1001 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
1002 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
1003 break;
1004 }
1005 default: SkASSERT(false);
1006 }
1007 }
1008}
1009
1010static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
1011 SkPaint::Cap cap = paint.getStrokeCap();
1012 if (cap != SkPaint::kDefault_Cap) {
1013 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001014 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -08001015 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
1016 break;
ethannicholas1446a9a2016-02-10 14:05:02 -08001017 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -08001018 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
1019 break;
ethannicholas1446a9a2016-02-10 14:05:02 -08001020 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -08001021 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
1022 break;
ethannicholas50a8dd02016-02-10 05:40:46 -08001023 default: SkASSERT(false);
1024 }
1025 }
1026}
ethannicholas1446a9a2016-02-10 14:05:02 -08001027
1028static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
1029 SkPaint::Join join = paint.getStrokeJoin();
1030 if (join != SkPaint::kDefault_Join) {
1031 switch (join) {
1032 case SkPaint::kMiter_Join:
1033 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
1034 SKDEBUGCANVAS_MITER_JOIN);
1035 break;
1036 case SkPaint::kRound_Join:
1037 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
1038 SKDEBUGCANVAS_ROUND_JOIN);
1039 break;
1040 case SkPaint::kBevel_Join:
1041 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
1042 SKDEBUGCANVAS_BEVEL_JOIN);
1043 break;
1044 default: SkASSERT(false);
1045 }
1046 }
1047}
1048
1049static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
1050 SkFilterQuality quality = paint.getFilterQuality();
1051 switch (quality) {
1052 case kNone_SkFilterQuality:
1053 break;
1054 case kLow_SkFilterQuality:
1055 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
1056 SKDEBUGCANVAS_FILTERQUALITY_LOW);
1057 break;
1058 case kMedium_SkFilterQuality:
1059 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
1060 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
1061 break;
1062 case kHigh_SkFilterQuality:
1063 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
1064 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
1065 break;
1066 }
1067}
1068
halcanary9d524f22016-03-29 09:03:52 -07001069static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001070 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001071 SkMaskFilter* maskFilter = paint.getMaskFilter();
1072 if (maskFilter != nullptr) {
1073 SkMaskFilter::BlurRec blurRec;
1074 if (maskFilter->asABlur(&blurRec)) {
1075 Json::Value blur(Json::objectValue);
1076 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
1077 switch (blurRec.fStyle) {
1078 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -08001079 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
1080 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -08001081 break;
1082 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -08001083 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
1084 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -08001085 break;
1086 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -08001087 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
1088 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -08001089 break;
1090 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -08001091 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
1092 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -08001093 break;
1094 default:
1095 SkASSERT(false);
1096 }
1097 switch (blurRec.fQuality) {
1098 case SkBlurQuality::kLow_SkBlurQuality:
ethannicholas1446a9a2016-02-10 14:05:02 -08001099 blur[SKDEBUGCANVAS_ATTRIBUTE_QUALITY] = Json::Value(
1100 SKDEBUGCANVAS_BLURQUALITY_LOW);
ethannicholas50a8dd02016-02-10 05:40:46 -08001101 break;
1102 case SkBlurQuality::kHigh_SkBlurQuality:
ethannicholas1446a9a2016-02-10 14:05:02 -08001103 blur[SKDEBUGCANVAS_ATTRIBUTE_QUALITY] = Json::Value(
1104 SKDEBUGCANVAS_BLURQUALITY_HIGH);
ethannicholas50a8dd02016-02-10 05:40:46 -08001105 break;
1106 default:
1107 SkASSERT(false);
1108 }
1109 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
1110 } else {
1111 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -07001112 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001113 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
1114 }
1115 }
1116}
1117
halcanary9d524f22016-03-29 09:03:52 -07001118static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001119 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001120 SkPathEffect* pathEffect = paint.getPathEffect();
1121 if (pathEffect != nullptr) {
1122 SkPathEffect::DashInfo dashInfo;
1123 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
1124 if (dashType == SkPathEffect::kDash_DashType) {
1125 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
1126 pathEffect->asADash(&dashInfo);
1127 Json::Value dashing(Json::objectValue);
1128 Json::Value intervals(Json::arrayValue);
1129 for (int32_t i = 0; i < dashInfo.fCount; i++) {
1130 intervals.append(Json::Value(dashInfo.fIntervals[i]));
1131 }
1132 sk_free(dashInfo.fIntervals);
1133 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
1134 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
1135 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
1136 } else {
1137 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -07001138 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001139 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
1140 }
1141 }
1142}
halcanary9d524f22016-03-29 09:03:52 -07001143
ethannicholas50a8dd02016-02-10 05:40:46 -08001144static void apply_paint_textalign(const SkPaint& paint, Json::Value* target) {
1145 SkPaint::Align textAlign = paint.getTextAlign();
1146 if (textAlign != SkPaint::kLeft_Align) {
1147 switch (textAlign) {
1148 case SkPaint::kCenter_Align: {
1149 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_CENTER;
1150 break;
1151 }
1152 case SkPaint::kRight_Align: {
1153 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_RIGHT;
1154 break;
1155 }
1156 default: SkASSERT(false);
1157 }
1158 }
1159}
1160
halcanary9d524f22016-03-29 09:03:52 -07001161static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001162 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001163 SkTypeface* typeface = paint.getTypeface();
1164 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -08001165 Json::Value jsonTypeface;
1166 SkDynamicMemoryWStream buffer;
1167 typeface->serialize(&buffer);
1168 void* data = sk_malloc_throw(buffer.bytesWritten());
1169 buffer.copyTo(data);
1170 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -07001171 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001172 &jsonData);
1173 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
1174 sk_free(data);
1175 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -08001176 }
1177}
1178
halcanary9d524f22016-03-29 09:03:52 -07001179static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001180 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001181 SkFlattenable* shader = paint.getShader();
1182 if (shader != nullptr) {
1183 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -07001184 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001185 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
1186 }
1187}
1188
ethannicholasf62a8b72016-02-11 10:35:21 -08001189static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
1190 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001191 SkFlattenable* imageFilter = paint.getImageFilter();
1192 if (imageFilter != nullptr) {
1193 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -07001194 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001195 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
1196 }
1197}
1198
halcanary9d524f22016-03-29 09:03:52 -07001199static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001200 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001201 SkFlattenable* colorFilter = paint.getColorFilter();
1202 if (colorFilter != nullptr) {
1203 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001204 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001205 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1206 }
1207}
1208
halcanary9d524f22016-03-29 09:03:52 -07001209static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001210 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001211 SkFlattenable* looper = paint.getLooper();
1212 if (looper != nullptr) {
1213 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001214 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001215 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1216 }
1217}
1218
brianosmanfad98562016-05-04 11:06:28 -07001219Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001220 Json::Value result(Json::objectValue);
1221 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001222 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001223 SkPaintDefaults_MiterLimit);
1224 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001225 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001226 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, paint.isFakeBoldText(), false);
1227 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, paint.isLinearText(), false);
1228 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, paint.isSubpixelText(), false);
1229 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT, paint.isDevKernText(), false);
1230 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT, paint.isLCDRenderText(), false);
1231 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, paint.isEmbeddedBitmapText(), false);
1232 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, paint.isAutohinted(), false);
1233 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT, paint.isVerticalText(), false);
1234 //kGenA8FromLCD_Flag
1235
halcanary9d524f22016-03-29 09:03:52 -07001236 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001237 SkPaintDefaults_TextSize);
1238 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
1239 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
halcanaryf412f092016-08-25 11:10:41 -07001240 apply_paint_hinting(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001241 apply_paint_color(paint, &result);
1242 apply_paint_style(paint, &result);
Florin Malita82d80872017-06-06 16:58:40 -04001243 apply_paint_blend_mode(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001244 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001245 apply_paint_join(paint, &result);
1246 apply_paint_filterquality(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001247 apply_paint_textalign(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001248 apply_paint_patheffect(paint, &result, urlDataManager);
1249 apply_paint_maskfilter(paint, &result, urlDataManager);
1250 apply_paint_shader(paint, &result, urlDataManager);
ethannicholasf62a8b72016-02-11 10:35:21 -08001251 apply_paint_looper(paint, &result, urlDataManager);
1252 apply_paint_imagefilter(paint, &result, urlDataManager);
1253 apply_paint_colorfilter(paint, &result, urlDataManager);
1254 apply_paint_typeface(paint, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001255 return result;
1256}
1257
Stan Ilievac42aeb2017-01-12 16:20:50 -05001258Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) {
1259 Json::Value result(Json::objectValue);
1260 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount);
1261 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount);
1262 if (nullptr != lattice.fBounds) {
1263 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds);
1264 }
1265 Json::Value XDivs(Json::arrayValue);
1266 for (int i = 0; i < lattice.fXCount; i++) {
1267 XDivs.append(Json::Value(lattice.fXDivs[i]));
1268 }
1269 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs;
1270 Json::Value YDivs(Json::arrayValue);
1271 for (int i = 0; i < lattice.fYCount; i++) {
1272 YDivs.append(Json::Value(lattice.fYDivs[i]));
1273 }
1274 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs;
1275 if (nullptr != lattice.fFlags) {
1276 Json::Value flags(Json::arrayValue);
1277 int flagCount = 0;
1278 for (int row = 0; row < lattice.fYCount+1; row++) {
1279 Json::Value flagsRow(Json::arrayValue);
1280 for (int column = 0; column < lattice.fXCount+1; column++) {
1281 flagsRow.append(Json::Value(lattice.fFlags[flagCount++]));
1282 }
1283 flags.append(flagsRow);
1284 }
1285 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags;
1286 }
1287 return result;
1288}
1289
ethannicholas1446a9a2016-02-10 14:05:02 -08001290static SkPoint get_json_point(Json::Value point) {
1291 return SkPoint::Make(point[0].asFloat(), point[1].asFloat());
1292}
1293
1294static SkColor get_json_color(Json::Value color) {
1295 return SkColorSetARGB(color[0].asInt(), color[1].asInt(), color[2].asInt(), color[3].asInt());
1296}
1297
ethannicholas50a8dd02016-02-10 05:40:46 -08001298static void extract_json_paint_color(Json::Value& jsonPaint, SkPaint* target) {
1299 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLOR)) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001300 target->setColor(get_json_color(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_COLOR]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001301 }
1302}
1303
halcanary9d524f22016-03-29 09:03:52 -07001304static void extract_json_paint_shader(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001305 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001306 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_SHADER)) {
1307 Json::Value jsonShader = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_SHADER];
ethannicholasf62a8b72016-02-11 10:35:21 -08001308 SkShader* shader = (SkShader*) load_flattenable(jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001309 if (shader != nullptr) {
reedfe630452016-03-25 09:08:00 -07001310 target->setShader(sk_ref_sp(shader));
ethannicholas50a8dd02016-02-10 05:40:46 -08001311 }
1312 }
1313}
1314
halcanary9d524f22016-03-29 09:03:52 -07001315static void extract_json_paint_patheffect(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001316 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001317 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT)) {
1318 Json::Value jsonPathEffect = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT];
reeda4393342016-03-18 11:22:57 -07001319 sk_sp<SkPathEffect> pathEffect((SkPathEffect*)load_flattenable(jsonPathEffect,
1320 urlDataManager));
ethannicholas50a8dd02016-02-10 05:40:46 -08001321 if (pathEffect != nullptr) {
1322 target->setPathEffect(pathEffect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001323 }
1324 }
1325}
1326
halcanary9d524f22016-03-29 09:03:52 -07001327static void extract_json_paint_maskfilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001328 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001329 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER)) {
1330 Json::Value jsonMaskFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER];
reedefdfd512016-04-04 10:02:58 -07001331 sk_sp<SkMaskFilter> maskFilter((SkMaskFilter*)load_flattenable(jsonMaskFilter,
1332 urlDataManager));
1333 if (maskFilter) {
1334 target->setMaskFilter(std::move(maskFilter));
ethannicholas50a8dd02016-02-10 05:40:46 -08001335 }
1336 }
1337}
1338
halcanary9d524f22016-03-29 09:03:52 -07001339static void extract_json_paint_colorfilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001340 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001341 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER)) {
1342 Json::Value jsonColorFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER];
reedd053ce92016-03-22 10:17:23 -07001343 sk_sp<SkColorFilter> colorFilter((SkColorFilter*)load_flattenable(jsonColorFilter,
1344 urlDataManager));
ethannicholas50a8dd02016-02-10 05:40:46 -08001345 if (colorFilter != nullptr) {
1346 target->setColorFilter(colorFilter);
ethannicholas50a8dd02016-02-10 05:40:46 -08001347 }
1348 }
1349}
1350
halcanary9d524f22016-03-29 09:03:52 -07001351static void extract_json_paint_looper(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001352 SkPaint* target) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001353 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_LOOPER)) {
1354 Json::Value jsonLooper = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_LOOPER];
reed7b380d02016-03-21 13:25:16 -07001355 sk_sp<SkDrawLooper> looper((SkDrawLooper*) load_flattenable(jsonLooper, urlDataManager));
ethannicholas1446a9a2016-02-10 14:05:02 -08001356 if (looper != nullptr) {
reed7b380d02016-03-21 13:25:16 -07001357 target->setLooper(std::move(looper));
ethannicholas1446a9a2016-02-10 14:05:02 -08001358 }
1359 }
1360}
1361
halcanary9d524f22016-03-29 09:03:52 -07001362static void extract_json_paint_imagefilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001363 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001364 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER)) {
1365 Json::Value jsonImageFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER];
Mike Reed5e257172016-11-01 11:22:05 -04001366 sk_sp<SkImageFilter> imageFilter((SkImageFilter*) load_flattenable(jsonImageFilter,
1367 urlDataManager));
ethannicholas50a8dd02016-02-10 05:40:46 -08001368 if (imageFilter != nullptr) {
1369 target->setImageFilter(imageFilter);
ethannicholas50a8dd02016-02-10 05:40:46 -08001370 }
1371 }
1372}
1373
halcanary9d524f22016-03-29 09:03:52 -07001374static void extract_json_paint_typeface(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001375 SkPaint* target) {
1376 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE)) {
1377 Json::Value jsonTypeface = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE];
1378 Json::Value jsonData = jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA];
1379 const void* data;
1380 Json::ArrayIndex length = decode_data(jsonData, urlDataManager, &data);
1381 SkMemoryStream buffer(data, length);
bungeman13b9c952016-05-12 10:09:30 -07001382 target->setTypeface(SkTypeface::MakeDeserialize(&buffer));
ethannicholasf62a8b72016-02-11 10:35:21 -08001383 }
1384}
1385
halcanaryf412f092016-08-25 11:10:41 -07001386static void extract_json_paint_hinting(Json::Value& jsonPaint, SkPaint* target) {
1387 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_HINTING)) {
1388 const char* hinting = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_HINTING].asCString();
1389 if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_NONE)) {
1390 target->setHinting(SkPaint::kNo_Hinting);
1391 } else if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_SLIGHT)) {
1392 target->setHinting(SkPaint::kSlight_Hinting);
1393 } else if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_NORMAL)) {
1394 target->setHinting(SkPaint::kNormal_Hinting);
1395 } else if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_FULL)) {
1396 target->setHinting(SkPaint::kFull_Hinting);
1397 }
1398 }
1399}
1400
ethannicholas50a8dd02016-02-10 05:40:46 -08001401static void extract_json_paint_style(Json::Value& jsonPaint, SkPaint* target) {
1402 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STYLE)) {
1403 const char* style = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STYLE].asCString();
1404 if (!strcmp(style, SKDEBUGCANVAS_STYLE_FILL)) {
1405 target->setStyle(SkPaint::kFill_Style);
1406 }
1407 else if (!strcmp(style, SKDEBUGCANVAS_STYLE_STROKE)) {
1408 target->setStyle(SkPaint::kStroke_Style);
1409 }
1410 else if (!strcmp(style, SKDEBUGCANVAS_STYLE_STROKEANDFILL)) {
1411 target->setStyle(SkPaint::kStrokeAndFill_Style);
1412 }
1413 }
1414}
1415
1416static void extract_json_paint_strokewidth(Json::Value& jsonPaint, SkPaint* target) {
1417 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH)) {
1418 float strokeWidth = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH].asFloat();
1419 target->setStrokeWidth(strokeWidth);
halcanary9d524f22016-03-29 09:03:52 -07001420 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001421}
1422
1423static void extract_json_paint_strokemiter(Json::Value& jsonPaint, SkPaint* target) {
1424 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER)) {
1425 float strokeMiter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER].asFloat();
1426 target->setStrokeMiter(strokeMiter);
halcanary9d524f22016-03-29 09:03:52 -07001427 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001428}
1429
ethannicholas1446a9a2016-02-10 14:05:02 -08001430static void extract_json_paint_strokejoin(Json::Value& jsonPaint, SkPaint* target) {
1431 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN)) {
1432 const char* join = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN].asCString();
1433 if (!strcmp(join, SKDEBUGCANVAS_MITER_JOIN)) {
1434 target->setStrokeJoin(SkPaint::kMiter_Join);
1435 }
1436 else if (!strcmp(join, SKDEBUGCANVAS_ROUND_JOIN)) {
1437 target->setStrokeJoin(SkPaint::kRound_Join);
1438 }
1439 else if (!strcmp(join, SKDEBUGCANVAS_BEVEL_JOIN)) {
1440 target->setStrokeJoin(SkPaint::kBevel_Join);
1441 }
1442 else {
1443 SkASSERT(false);
1444 }
1445 }
1446}
1447
ethannicholas50a8dd02016-02-10 05:40:46 -08001448static void extract_json_paint_cap(Json::Value& jsonPaint, SkPaint* target) {
1449 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_CAP)) {
1450 const char* cap = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_CAP].asCString();
1451 if (!strcmp(cap, SKDEBUGCANVAS_CAP_BUTT)) {
1452 target->setStrokeCap(SkPaint::kButt_Cap);
1453 }
1454 else if (!strcmp(cap, SKDEBUGCANVAS_CAP_ROUND)) {
1455 target->setStrokeCap(SkPaint::kRound_Cap);
1456 }
1457 else if (!strcmp(cap, SKDEBUGCANVAS_CAP_SQUARE)) {
1458 target->setStrokeCap(SkPaint::kSquare_Cap);
1459 }
1460 }
1461}
1462
ethannicholas1446a9a2016-02-10 14:05:02 -08001463static void extract_json_paint_filterquality(Json::Value& jsonPaint, SkPaint* target) {
1464 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY)) {
1465 const char* quality = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY].asCString();
1466 if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_NONE)) {
1467 target->setFilterQuality(kNone_SkFilterQuality);
1468 }
1469 else if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_LOW)) {
1470 target->setFilterQuality(kLow_SkFilterQuality);
1471 }
1472 else if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_MEDIUM)) {
1473 target->setFilterQuality(kMedium_SkFilterQuality);
1474 }
1475 else if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_HIGH)) {
1476 target->setFilterQuality(kHigh_SkFilterQuality);
1477 }
1478 }
1479}
1480
ethannicholas50a8dd02016-02-10 05:40:46 -08001481static void extract_json_paint_antialias(Json::Value& jsonPaint, SkPaint* target) {
1482 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS)) {
1483 target->setAntiAlias(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
1484 }
1485}
1486
ethannicholas1446a9a2016-02-10 14:05:02 -08001487static void extract_json_paint_dither(Json::Value& jsonPaint, SkPaint* target) {
1488 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_DITHER)) {
1489 target->setDither(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_DITHER].asBool());
1490 }
1491}
1492
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001493static void extract_json_paint_fakeboldtext(Json::Value& jsonPaint, SkPaint* target) {
1494 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT)) {
1495 target->setFakeBoldText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT].asBool());
1496 }
1497}
1498
1499static void extract_json_paint_lineartext(Json::Value& jsonPaint, SkPaint* target) {
1500 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT)) {
1501 target->setLinearText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT].asBool());
1502 }
1503}
1504
1505static void extract_json_paint_subpixeltext(Json::Value& jsonPaint, SkPaint* target) {
1506 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT)) {
1507 target->setSubpixelText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT].asBool());
1508 }
1509}
1510
1511static void extract_json_paint_devkerntext(Json::Value& jsonPaint, SkPaint* target) {
1512 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT)) {
1513 target->setDevKernText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT].asBool());
1514 }
1515}
1516
1517static void extract_json_paint_lcdrendertext(Json::Value& jsonPaint, SkPaint* target) {
1518 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT)) {
1519 target->setLCDRenderText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT].asBool());
1520 }
1521}
1522
1523static void extract_json_paint_embeddedbitmaptext(Json::Value& jsonPaint, SkPaint* target) {
1524 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT)) {
1525 target->setEmbeddedBitmapText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT].asBool());
1526 }
1527}
1528
1529static void extract_json_paint_autohinting(Json::Value& jsonPaint, SkPaint* target) {
1530 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING)) {
1531 target->setAutohinted(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING].asBool());
1532 }
1533}
1534
1535static void extract_json_paint_verticaltext(Json::Value& jsonPaint, SkPaint* target) {
1536 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT)) {
1537 target->setVerticalText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT].asBool());
1538 }
1539}
1540
ethannicholas50a8dd02016-02-10 05:40:46 -08001541static void extract_json_paint_blur(Json::Value& jsonPaint, SkPaint* target) {
1542 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_BLUR)) {
1543 Json::Value blur = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_BLUR];
1544 SkScalar sigma = blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA].asFloat();
1545 SkBlurStyle style;
1546 const char* jsonStyle = blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE].asCString();
1547 if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_NORMAL)) {
1548 style = SkBlurStyle::kNormal_SkBlurStyle;
1549 }
1550 else if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_SOLID)) {
1551 style = SkBlurStyle::kSolid_SkBlurStyle;
1552 }
1553 else if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_OUTER)) {
1554 style = SkBlurStyle::kOuter_SkBlurStyle;
1555 }
1556 else if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_INNER)) {
1557 style = SkBlurStyle::kInner_SkBlurStyle;
1558 }
1559 else {
1560 SkASSERT(false);
1561 style = SkBlurStyle::kNormal_SkBlurStyle;
1562 }
1563 SkBlurMaskFilter::BlurFlags flags;
1564 const char* jsonQuality = blur[SKDEBUGCANVAS_ATTRIBUTE_QUALITY].asCString();
1565 if (!strcmp(jsonQuality, SKDEBUGCANVAS_BLURQUALITY_LOW)) {
1566 flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag;
1567 }
1568 else if (!strcmp(jsonQuality, SKDEBUGCANVAS_BLURQUALITY_HIGH)) {
1569 flags = SkBlurMaskFilter::BlurFlags::kHighQuality_BlurFlag;
1570 }
1571 else {
1572 SkASSERT(false);
1573 flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag;
1574 }
reedefdfd512016-04-04 10:02:58 -07001575 target->setMaskFilter(SkBlurMaskFilter::Make(style, sigma, flags));
ethannicholas50a8dd02016-02-10 05:40:46 -08001576 }
1577}
1578
1579static void extract_json_paint_dashing(Json::Value& jsonPaint, SkPaint* target) {
1580 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_DASHING)) {
1581 Json::Value dash = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_DASHING];
1582 Json::Value jsonIntervals = dash[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS];
1583 Json::ArrayIndex count = jsonIntervals.size();
1584 SkScalar* intervals = (SkScalar*) sk_malloc_throw(count * sizeof(SkScalar));
1585 for (Json::ArrayIndex i = 0; i < count; i++) {
1586 intervals[i] = jsonIntervals[i].asFloat();
1587 }
1588 SkScalar phase = dash[SKDEBUGCANVAS_ATTRIBUTE_PHASE].asFloat();
reeda4393342016-03-18 11:22:57 -07001589 target->setPathEffect(SkDashPathEffect::Make(intervals, count, phase));
ethannicholas50a8dd02016-02-10 05:40:46 -08001590 sk_free(intervals);
1591 }
1592}
1593
1594static void extract_json_paint_textalign(Json::Value& jsonPaint, SkPaint* target) {
1595 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN)) {
1596 SkPaint::Align textAlign;
1597 const char* jsonAlign = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN].asCString();
1598 if (!strcmp(jsonAlign, SKDEBUGCANVAS_ALIGN_LEFT)) {
1599 textAlign = SkPaint::kLeft_Align;
1600 }
1601 else if (!strcmp(jsonAlign, SKDEBUGCANVAS_ALIGN_CENTER)) {
1602 textAlign = SkPaint::kCenter_Align;
1603 }
1604 else if (!strcmp(jsonAlign, SKDEBUGCANVAS_ALIGN_RIGHT)) {
1605 textAlign = SkPaint::kRight_Align;
1606 }
1607 else {
1608 SkASSERT(false);
1609 textAlign = SkPaint::kLeft_Align;
1610 }
1611 target->setTextAlign(textAlign);
1612 }
1613}
1614
1615static void extract_json_paint_textsize(Json::Value& jsonPaint, SkPaint* target) {
1616 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE)) {
1617 float textSize = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE].asFloat();
1618 target->setTextSize(textSize);
1619 }
1620}
1621
1622static void extract_json_paint_textscalex(Json::Value& jsonPaint, SkPaint* target) {
1623 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX)) {
1624 float textScaleX = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX].asFloat();
1625 target->setTextScaleX(textScaleX);
1626 }
1627}
1628
1629static void extract_json_paint_textskewx(Json::Value& jsonPaint, SkPaint* target) {
1630 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX)) {
1631 float textSkewX = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX].asFloat();
1632 target->setTextSkewX(textSkewX);
1633 }
1634}
1635
halcanary9d524f22016-03-29 09:03:52 -07001636static void extract_json_paint(Json::Value& paint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001637 SkPaint* result) {
halcanaryf412f092016-08-25 11:10:41 -07001638 extract_json_paint_hinting(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001639 extract_json_paint_color(paint, result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001640 extract_json_paint_shader(paint, urlDataManager, result);
1641 extract_json_paint_patheffect(paint, urlDataManager, result);
1642 extract_json_paint_maskfilter(paint, urlDataManager, result);
1643 extract_json_paint_colorfilter(paint, urlDataManager, result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001644 extract_json_paint_looper(paint, urlDataManager, result);
1645 extract_json_paint_imagefilter(paint, urlDataManager, result);
1646 extract_json_paint_typeface(paint, urlDataManager, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001647 extract_json_paint_style(paint, result);
Florin Malita82d80872017-06-06 16:58:40 -04001648 extract_json_paint_blend_mode(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001649 extract_json_paint_strokewidth(paint, result);
1650 extract_json_paint_strokemiter(paint, result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001651 extract_json_paint_strokejoin(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001652 extract_json_paint_cap(paint, result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001653 extract_json_paint_filterquality(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001654 extract_json_paint_antialias(paint, result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001655 extract_json_paint_dither(paint, result);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001656 extract_json_paint_fakeboldtext(paint, result);
1657 extract_json_paint_lineartext(paint, result);
1658 extract_json_paint_subpixeltext(paint, result);
1659 extract_json_paint_devkerntext(paint, result);
1660 extract_json_paint_lcdrendertext(paint, result);
1661 extract_json_paint_embeddedbitmaptext(paint, result);
1662 extract_json_paint_autohinting(paint, result);
1663 extract_json_paint_verticaltext(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001664 extract_json_paint_blur(paint, result);
1665 extract_json_paint_dashing(paint, result);
1666 extract_json_paint_textalign(paint, result);
1667 extract_json_paint_textsize(paint, result);
1668 extract_json_paint_textscalex(paint, result);
1669 extract_json_paint_textskewx(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001670}
1671
1672static void extract_json_rect(Json::Value& rect, SkRect* result) {
1673 result->set(rect[0].asFloat(), rect[1].asFloat(), rect[2].asFloat(), rect[3].asFloat());
1674}
1675
1676static void extract_json_irect(Json::Value& rect, SkIRect* result) {
1677 result->set(rect[0].asInt(), rect[1].asInt(), rect[2].asInt(), rect[3].asInt());
1678}
1679
1680static void extract_json_rrect(Json::Value& rrect, SkRRect* result) {
1681 SkVector radii[4] = {
halcanary9d524f22016-03-29 09:03:52 -07001682 { rrect[1][0].asFloat(), rrect[1][1].asFloat() },
1683 { rrect[2][0].asFloat(), rrect[2][1].asFloat() },
1684 { rrect[3][0].asFloat(), rrect[3][1].asFloat() },
ethannicholas50a8dd02016-02-10 05:40:46 -08001685 { rrect[4][0].asFloat(), rrect[4][1].asFloat() }
1686 };
halcanary9d524f22016-03-29 09:03:52 -07001687 result->setRectRadii(SkRect::MakeLTRB(rrect[0][0].asFloat(), rrect[0][1].asFloat(),
1688 rrect[0][2].asFloat(), rrect[0][3].asFloat()),
ethannicholas50a8dd02016-02-10 05:40:46 -08001689 radii);
1690}
1691
1692static void extract_json_matrix(Json::Value& matrix, SkMatrix* result) {
halcanary9d524f22016-03-29 09:03:52 -07001693 SkScalar values[] = {
ethannicholas50a8dd02016-02-10 05:40:46 -08001694 matrix[0][0].asFloat(), matrix[0][1].asFloat(), matrix[0][2].asFloat(),
1695 matrix[1][0].asFloat(), matrix[1][1].asFloat(), matrix[1][2].asFloat(),
halcanary9d524f22016-03-29 09:03:52 -07001696 matrix[2][0].asFloat(), matrix[2][1].asFloat(), matrix[2][2].asFloat()
ethannicholas50a8dd02016-02-10 05:40:46 -08001697 };
1698 result->set9(values);
1699}
1700
1701static void extract_json_path(Json::Value& path, SkPath* result) {
1702 const char* fillType = path[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE].asCString();
1703 if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_WINDING)) {
1704 result->setFillType(SkPath::kWinding_FillType);
1705 }
1706 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_EVENODD)) {
1707 result->setFillType(SkPath::kEvenOdd_FillType);
1708 }
1709 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING)) {
1710 result->setFillType(SkPath::kInverseWinding_FillType);
1711 }
1712 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD)) {
1713 result->setFillType(SkPath::kInverseEvenOdd_FillType);
1714 }
1715 Json::Value verbs = path[SKDEBUGCANVAS_ATTRIBUTE_VERBS];
1716 for (Json::ArrayIndex i = 0; i < verbs.size(); i++) {
1717 Json::Value verb = verbs[i];
1718 if (verb.isString()) {
1719 SkASSERT(!strcmp(verb.asCString(), SKDEBUGCANVAS_VERB_CLOSE));
1720 result->close();
1721 }
1722 else {
1723 if (verb.isMember(SKDEBUGCANVAS_VERB_MOVE)) {
1724 Json::Value move = verb[SKDEBUGCANVAS_VERB_MOVE];
1725 result->moveTo(move[0].asFloat(), move[1].asFloat());
1726 }
1727 else if (verb.isMember(SKDEBUGCANVAS_VERB_LINE)) {
1728 Json::Value line = verb[SKDEBUGCANVAS_VERB_LINE];
1729 result->lineTo(line[0].asFloat(), line[1].asFloat());
1730 }
1731 else if (verb.isMember(SKDEBUGCANVAS_VERB_QUAD)) {
1732 Json::Value quad = verb[SKDEBUGCANVAS_VERB_QUAD];
1733 result->quadTo(quad[0][0].asFloat(), quad[0][1].asFloat(),
1734 quad[1][0].asFloat(), quad[1][1].asFloat());
1735 }
1736 else if (verb.isMember(SKDEBUGCANVAS_VERB_CUBIC)) {
1737 Json::Value cubic = verb[SKDEBUGCANVAS_VERB_CUBIC];
1738 result->cubicTo(cubic[0][0].asFloat(), cubic[0][1].asFloat(),
1739 cubic[1][0].asFloat(), cubic[1][1].asFloat(),
1740 cubic[2][0].asFloat(), cubic[2][1].asFloat());
1741 }
1742 else if (verb.isMember(SKDEBUGCANVAS_VERB_CONIC)) {
1743 Json::Value conic = verb[SKDEBUGCANVAS_VERB_CONIC];
1744 result->conicTo(conic[0][0].asFloat(), conic[0][1].asFloat(),
1745 conic[1][0].asFloat(), conic[1][1].asFloat(),
1746 conic[2].asFloat());
1747 }
1748 else {
1749 SkASSERT(false);
1750 }
1751 }
1752 }
1753}
1754
Mike Reedc1f77742016-12-09 09:00:50 -05001755SkClipOp get_json_clipop(Json::Value& jsonOp) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001756 const char* op = jsonOp.asCString();
1757 if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_DIFFERENCE)) {
Mike Reedc1f77742016-12-09 09:00:50 -05001758 return kDifference_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001759 }
1760 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_INTERSECT)) {
Mike Reedc1f77742016-12-09 09:00:50 -05001761 return kIntersect_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001762 }
1763 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_UNION)) {
Mike Reedc1f77742016-12-09 09:00:50 -05001764 return kUnion_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001765 }
1766 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_XOR)) {
Mike Reedc1f77742016-12-09 09:00:50 -05001767 return kXOR_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001768 }
1769 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE)) {
Mike Reedc1f77742016-12-09 09:00:50 -05001770 return kReverseDifference_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001771 }
1772 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_REPLACE)) {
Mike Reedc1f77742016-12-09 09:00:50 -05001773 return kReplace_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001774 }
1775 SkASSERT(false);
Mike Reedc1f77742016-12-09 09:00:50 -05001776 return kIntersect_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001777}
1778
ethannicholas1446a9a2016-02-10 14:05:02 -08001779SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kDrawClear_OpType) {
1780 fColor = color;
1781 fInfo.push(SkObjectParser::CustomTextToString("No Parameters"));
1782}
1783
1784void SkClearCommand::execute(SkCanvas* canvas) const {
1785 canvas->clear(fColor);
1786}
1787
ethannicholasf62a8b72016-02-11 10:35:21 -08001788Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1789 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001790 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001791 return result;
1792}
1793
ethannicholasf62a8b72016-02-11 10:35:21 -08001794 SkClearCommand* SkClearCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001795 Json::Value color = command[SKDEBUGCANVAS_ATTRIBUTE_COLOR];
1796 return new SkClearCommand(get_json_color(color));
1797}
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001798
Mike Reedc1f77742016-12-09 09:00:50 -05001799SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001800 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001801 fPath = path;
1802 fOp = op;
1803 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001804
robertphillips@google.com91217d02013-03-17 18:33:46 +00001805 fInfo.push(SkObjectParser::PathToString(path));
reed73603f32016-09-20 08:42:38 -07001806 fInfo.push(SkObjectParser::ClipOpToString(op));
robertphillips@google.com91217d02013-03-17 18:33:46 +00001807 fInfo.push(SkObjectParser::BoolToString(doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +00001808}
1809
fmalita8c89c522014-11-08 16:18:56 -08001810void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001811 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001812}
1813
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001814bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001815 render_path(canvas, fPath);
1816 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001817}
1818
ethannicholasf62a8b72016-02-11 10:35:21 -08001819Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1820 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001821 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001822 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1823 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1824 return result;
1825}
1826
halcanary9d524f22016-03-29 09:03:52 -07001827SkClipPathCommand* SkClipPathCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001828 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001829 SkPath path;
1830 extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path);
reed73603f32016-09-20 08:42:38 -07001831 return new SkClipPathCommand(path, get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]),
ethannicholas50a8dd02016-02-10 05:40:46 -08001832 command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
1833}
1834
Mike Reedc1f77742016-12-09 09:00:50 -05001835SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001836 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001837 fRegion = region;
1838 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001839
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001840 fInfo.push(SkObjectParser::RegionToString(region));
reed73603f32016-09-20 08:42:38 -07001841 fInfo.push(SkObjectParser::ClipOpToString(op));
chudy@google.com902ebe52012-06-29 14:21:22 +00001842}
1843
fmalita8c89c522014-11-08 16:18:56 -08001844void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001845 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001846}
1847
ethannicholasf62a8b72016-02-11 10:35:21 -08001848Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1849 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001850 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001851 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1852 return result;
1853}
1854
halcanary9d524f22016-03-29 09:03:52 -07001855SkClipRegionCommand* SkClipRegionCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001856 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001857 SkASSERT(false);
1858 return nullptr;
1859}
1860
Mike Reedc1f77742016-12-09 09:00:50 -05001861SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001862 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001863 fRect = rect;
1864 fOp = op;
1865 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001866
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001867 fInfo.push(SkObjectParser::RectToString(rect));
reed73603f32016-09-20 08:42:38 -07001868 fInfo.push(SkObjectParser::ClipOpToString(op));
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001869 fInfo.push(SkObjectParser::BoolToString(doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +00001870}
1871
fmalita8c89c522014-11-08 16:18:56 -08001872void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001873 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001874}
1875
ethannicholasf62a8b72016-02-11 10:35:21 -08001876Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1877 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001878 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001879 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1880 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001881
1882 SkString desc;
1883 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1884
ethannicholas50a8dd02016-02-10 05:40:46 -08001885 return result;
1886}
1887
halcanary9d524f22016-03-29 09:03:52 -07001888SkClipRectCommand* SkClipRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001889 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001890 SkRect rect;
1891 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rect);
reed73603f32016-09-20 08:42:38 -07001892 return new SkClipRectCommand(rect, get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]),
ethannicholas50a8dd02016-02-10 05:40:46 -08001893 command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
1894}
1895
Mike Reedc1f77742016-12-09 09:00:50 -05001896SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001897 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001898 fRRect = rrect;
1899 fOp = op;
1900 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001901
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001902 fInfo.push(SkObjectParser::RRectToString(rrect));
reed73603f32016-09-20 08:42:38 -07001903 fInfo.push(SkObjectParser::ClipOpToString(op));
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001904 fInfo.push(SkObjectParser::BoolToString(doAA));
robertphillips@google.com67baba42013-01-02 20:20:31 +00001905}
1906
fmalita8c89c522014-11-08 16:18:56 -08001907void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001908 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001909}
1910
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001911bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001912 render_rrect(canvas, fRRect);
1913 return true;
1914}
1915
ethannicholasf62a8b72016-02-11 10:35:21 -08001916Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1917 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001918 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1919 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1920 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1921 return result;
1922}
1923
halcanary9d524f22016-03-29 09:03:52 -07001924SkClipRRectCommand* SkClipRRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001925 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001926 SkRRect rrect;
1927 extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rrect);
halcanary9d524f22016-03-29 09:03:52 -07001928 return new SkClipRRectCommand(rrect,
reed73603f32016-09-20 08:42:38 -07001929 get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]),
ethannicholas50a8dd02016-02-10 05:40:46 -08001930 command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
1931}
1932
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001933SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001934 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001935 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001936
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001937 fInfo.push(SkObjectParser::MatrixToString(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +00001938}
1939
fmalita8c89c522014-11-08 16:18:56 -08001940void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001941 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001942}
1943
ethannicholasf62a8b72016-02-11 10:35:21 -08001944Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1945 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001946 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001947 return result;
1948}
1949
ethannicholasf62a8b72016-02-11 10:35:21 -08001950SkConcatCommand* SkConcatCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001951 SkMatrix matrix;
1952 extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix);
1953 return new SkConcatCommand(matrix);
1954}
1955
reed97660cc2016-06-28 18:54:19 -07001956////
1957
1958SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1959 sk_sp<SkData> value)
1960 : INHERITED(kDrawAnnotation_OpType)
1961 , fRect(rect)
1962 , fKey(key)
1963 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001964{
1965 SkString str;
1966 str.appendf("Key: %s Value: ", key);
1967 if (fValue && fValue->size()) {
1968 str.append((const char*) fValue->bytes(), fValue->size());
1969 } else {
1970 str.appendf("no value");
1971 }
1972 str.appendf("\n");
1973 fInfo.push(new SkString(str));
1974}
reed97660cc2016-06-28 18:54:19 -07001975
1976void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1977 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1978}
1979
1980Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1981 Json::Value result = INHERITED::toJSON(urlDataManager);
1982
1983 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1984 result["key"] = Json::Value(fKey.c_str());
1985 if (fValue.get()) {
1986 // TODO: dump out the "value"
1987 }
reed67f62fa2016-06-29 11:36:34 -07001988
1989 SkString desc;
1990 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1991 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1992
reed97660cc2016-06-28 18:54:19 -07001993 return result;
1994}
1995
1996SkDrawAnnotationCommand* SkDrawAnnotationCommand::fromJSON(Json::Value& command,
1997 UrlDataManager& urlDataManager) {
1998 SkRect rect;
1999 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rect);
2000 sk_sp<SkData> data(nullptr); // TODO: extract "value" from the Json
2001 return new SkDrawAnnotationCommand(rect, command["key"].asCString(), data);
2002}
2003
2004////
2005
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002006SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07002007 const SkPaint* paint)
robertphillips9bafc302015-02-13 11:13:00 -08002008 : INHERITED(kDrawBitmap_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002009 fBitmap = bitmap;
2010 fLeft = left;
2011 fTop = top;
bsalomon49f085d2014-09-05 13:34:00 -07002012 if (paint) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002013 fPaint = *paint;
2014 fPaintPtr = &fPaint;
2015 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07002016 fPaintPtr = nullptr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002017 }
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002018
2019 fInfo.push(SkObjectParser::BitmapToString(bitmap));
2020 fInfo.push(SkObjectParser::ScalarToString(left, "SkScalar left: "));
2021 fInfo.push(SkObjectParser::ScalarToString(top, "SkScalar top: "));
bsalomon49f085d2014-09-05 13:34:00 -07002022 if (paint) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002023 fInfo.push(SkObjectParser::PaintToString(*paint));
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00002024 }
chudy@google.com902ebe52012-06-29 14:21:22 +00002025}
2026
fmalita8c89c522014-11-08 16:18:56 -08002027void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002028 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaintPtr);
chudy@google.com902ebe52012-06-29 14:21:22 +00002029}
2030
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002031bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002032 render_bitmap(canvas, fBitmap);
2033 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00002034}
2035
ethannicholasf62a8b72016-02-11 10:35:21 -08002036Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
2037 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002038 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002039 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002040 Json::Value command(Json::objectValue);
2041 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07002042 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08002043 if (fPaintPtr != nullptr) {
brianosmanfad98562016-05-04 11:06:28 -07002044 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002045 }
2046 }
2047 return result;
2048}
2049
halcanary9d524f22016-03-29 09:03:52 -07002050SkDrawBitmapCommand* SkDrawBitmapCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002051 UrlDataManager& urlDataManager) {
2052 SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002053 if (bitmap == nullptr) {
2054 return nullptr;
2055 }
2056 Json::Value point = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
2057 SkPaint* paintPtr;
2058 SkPaint paint;
2059 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002060 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002061 paintPtr = &paint;
2062 }
2063 else {
2064 paintPtr = nullptr;
2065 }
halcanary9d524f22016-03-29 09:03:52 -07002066 SkDrawBitmapCommand* result = new SkDrawBitmapCommand(*bitmap, point[0].asFloat(),
ethannicholas50a8dd02016-02-10 05:40:46 -08002067 point[1].asFloat(), paintPtr);
2068 delete bitmap;
2069 return result;
2070}
2071
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002072SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00002073 const SkRect& dst, const SkPaint* paint)
robertphillips9bafc302015-02-13 11:13:00 -08002074 : INHERITED(kDrawBitmapNine_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002075 fBitmap = bitmap;
2076 fCenter = center;
2077 fDst = dst;
bsalomon49f085d2014-09-05 13:34:00 -07002078 if (paint) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002079 fPaint = *paint;
2080 fPaintPtr = &fPaint;
2081 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07002082 fPaintPtr = nullptr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002083 }
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002084
2085 fInfo.push(SkObjectParser::BitmapToString(bitmap));
2086 fInfo.push(SkObjectParser::IRectToString(center));
2087 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
bsalomon49f085d2014-09-05 13:34:00 -07002088 if (paint) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002089 fInfo.push(SkObjectParser::PaintToString(*paint));
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00002090 }
chudy@google.com902ebe52012-06-29 14:21:22 +00002091}
2092
fmalita8c89c522014-11-08 16:18:56 -08002093void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002094 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaintPtr);
chudy@google.com902ebe52012-06-29 14:21:22 +00002095}
2096
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002097bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08002098 SkRect tmp = SkRect::Make(fCenter);
2099 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002100 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00002101}
2102
ethannicholasf62a8b72016-02-11 10:35:21 -08002103Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
2104 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002105 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002106 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002107 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08002108 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07002109 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08002110 if (fPaintPtr != nullptr) {
brianosmanfad98562016-05-04 11:06:28 -07002111 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002112 }
2113 }
2114 return result;
2115}
2116
halcanary9d524f22016-03-29 09:03:52 -07002117SkDrawBitmapNineCommand* SkDrawBitmapNineCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002118 UrlDataManager& urlDataManager) {
2119 SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002120 if (bitmap == nullptr) {
2121 return nullptr;
2122 }
2123 SkIRect center;
2124 extract_json_irect(command[SKDEBUGCANVAS_ATTRIBUTE_CENTER], &center);
2125 SkRect dst;
2126 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst);
2127 SkPaint* paintPtr;
2128 SkPaint paint;
2129 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002130 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002131 paintPtr = &paint;
2132 }
2133 else {
2134 paintPtr = nullptr;
2135 }
2136 SkDrawBitmapNineCommand* result = new SkDrawBitmapNineCommand(*bitmap, center, dst, paintPtr);
2137 delete bitmap;
2138 return result;
2139}
2140
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002141SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00002142 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07002143 SkCanvas::SrcRectConstraint constraint)
robertphillips9bafc302015-02-13 11:13:00 -08002144 : INHERITED(kDrawBitmapRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002145 fBitmap = bitmap;
bsalomon49f085d2014-09-05 13:34:00 -07002146 if (src) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002147 fSrc = *src;
2148 } else {
2149 fSrc.setEmpty();
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00002150 }
robertphillips@google.com91217d02013-03-17 18:33:46 +00002151 fDst = dst;
2152
bsalomon49f085d2014-09-05 13:34:00 -07002153 if (paint) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002154 fPaint = *paint;
2155 fPaintPtr = &fPaint;
2156 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07002157 fPaintPtr = nullptr;
robertphillips@google.com91217d02013-03-17 18:33:46 +00002158 }
reeda5517e22015-07-14 10:54:12 -07002159 fConstraint = constraint;
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00002160
robertphillips@google.com91217d02013-03-17 18:33:46 +00002161 fInfo.push(SkObjectParser::BitmapToString(bitmap));
bsalomon49f085d2014-09-05 13:34:00 -07002162 if (src) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002163 fInfo.push(SkObjectParser::RectToString(*src, "Src: "));
2164 }
2165 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
bsalomon49f085d2014-09-05 13:34:00 -07002166 if (paint) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002167 fInfo.push(SkObjectParser::PaintToString(*paint));
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00002168 }
reeda5517e22015-07-14 10:54:12 -07002169 fInfo.push(SkObjectParser::IntToString(fConstraint, "Constraint: "));
chudy@google.com902ebe52012-06-29 14:21:22 +00002170}
2171
fmalita8c89c522014-11-08 16:18:56 -08002172void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
reede47829b2015-08-06 10:02:53 -07002173 canvas->legacy_drawBitmapRect(fBitmap, this->srcRect(), fDst, fPaintPtr, fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002174}
2175
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002176bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002177 render_bitmap(canvas, fBitmap, this->srcRect());
2178 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00002179}
2180
ethannicholasf62a8b72016-02-11 10:35:21 -08002181Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2182 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002183 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002184 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002185 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
2186 if (!fSrc.isEmpty()) {
brianosmanfad98562016-05-04 11:06:28 -07002187 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(fSrc);
ethannicholas50a8dd02016-02-10 05:40:46 -08002188 }
brianosmanfad98562016-05-04 11:06:28 -07002189 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08002190 if (fPaintPtr != nullptr) {
brianosmanfad98562016-05-04 11:06:28 -07002191 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002192 }
2193 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
2194 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
2195 }
2196 }
reed67f62fa2016-06-29 11:36:34 -07002197
2198 SkString desc;
2199 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
2200
ethannicholas50a8dd02016-02-10 05:40:46 -08002201 return result;
2202}
2203
halcanary9d524f22016-03-29 09:03:52 -07002204SkDrawBitmapRectCommand* SkDrawBitmapRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002205 UrlDataManager& urlDataManager) {
2206 SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002207 if (bitmap == nullptr) {
2208 return nullptr;
2209 }
2210 SkRect dst;
2211 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst);
2212 SkPaint* paintPtr;
2213 SkPaint paint;
2214 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002215 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002216 paintPtr = &paint;
2217 }
2218 else {
2219 paintPtr = nullptr;
2220 }
2221 SkCanvas::SrcRectConstraint constraint;
halcanary9d524f22016-03-29 09:03:52 -07002222 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_STRICT) &&
ethannicholas50a8dd02016-02-10 05:40:46 -08002223 command[SKDEBUGCANVAS_ATTRIBUTE_STRICT].asBool()) {
2224 constraint = SkCanvas::kStrict_SrcRectConstraint;
2225 }
2226 else {
2227 constraint = SkCanvas::kFast_SrcRectConstraint;
2228 }
2229 SkRect* srcPtr;
2230 SkRect src;
2231 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_SRC)) {
2232 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_SRC], &src);
2233 srcPtr = &src;
2234 }
2235 else {
2236 srcPtr = nullptr;
2237 }
2238 SkDrawBitmapRectCommand* result = new SkDrawBitmapRectCommand(*bitmap, srcPtr, dst, paintPtr,
2239 constraint);
2240 delete bitmap;
2241 return result;
2242}
2243
fmalita651c9202015-07-22 10:23:01 -07002244SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
2245 const SkPaint* paint)
2246 : INHERITED(kDrawImage_OpType)
2247 , fImage(SkRef(image))
2248 , fLeft(left)
2249 , fTop(top) {
2250
fmalita7361bf02015-10-29 12:13:48 -07002251 fInfo.push(SkObjectParser::ImageToString(image));
2252 fInfo.push(SkObjectParser::ScalarToString(left, "Left: "));
2253 fInfo.push(SkObjectParser::ScalarToString(top, "Top: "));
2254
fmalita651c9202015-07-22 10:23:01 -07002255 if (paint) {
2256 fPaint.set(*paint);
fmalita7361bf02015-10-29 12:13:48 -07002257 fInfo.push(SkObjectParser::PaintToString(*paint));
fmalita651c9202015-07-22 10:23:01 -07002258 }
2259}
2260
2261void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04002262 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07002263}
2264
2265bool SkDrawImageCommand::render(SkCanvas* canvas) const {
2266 SkAutoCanvasRestore acr(canvas, true);
2267 canvas->clear(0xFFFFFFFF);
2268
2269 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
2270 SkIntToScalar(fImage->width()),
2271 SkIntToScalar(fImage->height())));
2272 this->execute(canvas);
2273 return true;
2274}
2275
ethannicholasf62a8b72016-02-11 10:35:21 -08002276Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
2277 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002278 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002279 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002280 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07002281 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08002282 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07002283 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002284 }
msarett0ac1bec2016-08-29 09:15:33 -07002285
2286 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
2287 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
2288 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
2289 switch (fImage->alphaType()) {
2290 case kOpaque_SkAlphaType:
2291 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
2292 break;
2293 case kPremul_SkAlphaType:
2294 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
2295 break;
2296 case kUnpremul_SkAlphaType:
2297 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
2298 break;
2299 default:
2300 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
2301 break;
2302 }
ethannicholas50a8dd02016-02-10 05:40:46 -08002303 }
2304 return result;
2305}
2306
halcanary9d524f22016-03-29 09:03:52 -07002307SkDrawImageCommand* SkDrawImageCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002308 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -07002309 sk_sp<SkImage> image = load_image(command[SKDEBUGCANVAS_ATTRIBUTE_IMAGE], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002310 if (image == nullptr) {
2311 return nullptr;
2312 }
2313 Json::Value point = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
2314 SkPaint* paintPtr;
2315 SkPaint paint;
2316 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002317 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002318 paintPtr = &paint;
2319 }
2320 else {
2321 paintPtr = nullptr;
2322 }
reed9ce9d672016-03-17 10:51:11 -07002323 SkDrawImageCommand* result = new SkDrawImageCommand(image.get(), point[0].asFloat(),
ethannicholas50a8dd02016-02-10 05:40:46 -08002324 point[1].asFloat(), paintPtr);
ethannicholas50a8dd02016-02-10 05:40:46 -08002325 return result;
2326}
2327
Stan Ilievac42aeb2017-01-12 16:20:50 -05002328SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
2329 const SkCanvas::Lattice& lattice,
2330 const SkRect& dst, const SkPaint* paint)
2331 : INHERITED(kDrawImageLattice_OpType)
2332 , fImage(SkRef(image))
2333 , fLattice(lattice)
2334 , fDst(dst) {
2335
2336 fInfo.push(SkObjectParser::ImageToString(image));
2337 fInfo.push(SkObjectParser::LatticeToString(lattice));
2338 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
2339 if (paint) {
2340 fPaint.set(*paint);
2341 fInfo.push(SkObjectParser::PaintToString(*paint));
2342 }
2343}
2344
2345void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
2346 SkLatticeIter iter(fLattice, fDst);
2347 SkRect srcR, dstR;
2348 while (iter.next(&srcR, &dstR)) {
2349 canvas->legacy_drawImageRect(fImage.get(), &srcR, dstR,
2350 fPaint.getMaybeNull(), SkCanvas::kStrict_SrcRectConstraint);
2351 }
2352}
2353
2354bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
2355 SkAutoCanvasRestore acr(canvas, true);
2356 canvas->clear(0xFFFFFFFF);
2357
2358 xlate_and_scale_to_bounds(canvas, fDst);
2359
2360 this->execute(canvas);
2361 return true;
2362}
2363
2364Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
2365 Json::Value result = INHERITED::toJSON(urlDataManager);
2366 Json::Value encoded;
2367 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
2368 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
2369 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
2370 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
2371 if (fPaint.isValid()) {
2372 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
2373 }
2374 }
2375
2376 SkString desc;
2377 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
2378
2379 return result;
2380}
2381
fmalita651c9202015-07-22 10:23:01 -07002382SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
2383 const SkRect& dst, const SkPaint* paint,
2384 SkCanvas::SrcRectConstraint constraint)
2385 : INHERITED(kDrawImageRect_OpType)
2386 , fImage(SkRef(image))
2387 , fDst(dst)
2388 , fConstraint(constraint) {
2389
2390 if (src) {
2391 fSrc.set(*src);
2392 }
2393
2394 if (paint) {
2395 fPaint.set(*paint);
2396 }
robertphillips80af6452015-08-24 08:27:38 -07002397
2398 fInfo.push(SkObjectParser::ImageToString(image));
2399 if (src) {
2400 fInfo.push(SkObjectParser::RectToString(*src, "Src: "));
2401 }
2402 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
2403 if (paint) {
2404 fInfo.push(SkObjectParser::PaintToString(*paint));
2405 }
2406 fInfo.push(SkObjectParser::IntToString(fConstraint, "Constraint: "));
fmalita651c9202015-07-22 10:23:01 -07002407}
2408
2409void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04002410 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
2411 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07002412}
2413
2414bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
2415 SkAutoCanvasRestore acr(canvas, true);
2416 canvas->clear(0xFFFFFFFF);
2417
2418 xlate_and_scale_to_bounds(canvas, fDst);
2419
2420 this->execute(canvas);
2421 return true;
2422}
2423
ethannicholasf62a8b72016-02-11 10:35:21 -08002424Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2425 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002426 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002427 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002428 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
2429 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07002430 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002431 }
brianosmanfad98562016-05-04 11:06:28 -07002432 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08002433 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07002434 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002435 }
2436 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
2437 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
2438 }
2439 }
reed67f62fa2016-06-29 11:36:34 -07002440
2441 SkString desc;
2442 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
2443
ethannicholas50a8dd02016-02-10 05:40:46 -08002444 return result;
2445}
2446
halcanary9d524f22016-03-29 09:03:52 -07002447SkDrawImageRectCommand* SkDrawImageRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002448 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -07002449 sk_sp<SkImage> image = load_image(command[SKDEBUGCANVAS_ATTRIBUTE_IMAGE], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002450 if (image == nullptr) {
2451 return nullptr;
2452 }
2453 SkRect dst;
2454 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst);
2455 SkPaint* paintPtr;
2456 SkPaint paint;
2457 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002458 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002459 paintPtr = &paint;
2460 }
2461 else {
2462 paintPtr = nullptr;
2463 }
2464 SkCanvas::SrcRectConstraint constraint;
halcanary9d524f22016-03-29 09:03:52 -07002465 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_STRICT) &&
ethannicholas50a8dd02016-02-10 05:40:46 -08002466 command[SKDEBUGCANVAS_ATTRIBUTE_STRICT].asBool()) {
2467 constraint = SkCanvas::kStrict_SrcRectConstraint;
2468 }
2469 else {
2470 constraint = SkCanvas::kFast_SrcRectConstraint;
2471 }
2472 SkRect* srcPtr;
2473 SkRect src;
2474 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_SRC)) {
2475 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_SRC], &src);
2476 srcPtr = &src;
2477 }
2478 else {
2479 srcPtr = nullptr;
2480 }
reed9ce9d672016-03-17 10:51:11 -07002481 SkDrawImageRectCommand* result = new SkDrawImageRectCommand(image.get(), srcPtr, dst, paintPtr,
ethannicholas50a8dd02016-02-10 05:40:46 -08002482 constraint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002483 return result;
2484}
2485
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002486SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002487 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002488 fOval = oval;
2489 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00002490
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002491 fInfo.push(SkObjectParser::RectToString(oval));
2492 fInfo.push(SkObjectParser::PaintToString(paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +00002493}
2494
fmalita8c89c522014-11-08 16:18:56 -08002495void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002496 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00002497}
2498
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002499bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002500 canvas->clear(0xFFFFFFFF);
2501 canvas->save();
2502
2503 xlate_and_scale_to_bounds(canvas, fOval);
2504
2505 SkPaint p;
2506 p.setColor(SK_ColorBLACK);
2507 p.setStyle(SkPaint::kStroke_Style);
2508
2509 canvas->drawOval(fOval, p);
2510 canvas->restore();
2511
2512 return true;
2513}
2514
ethannicholasf62a8b72016-02-11 10:35:21 -08002515Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
2516 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002517 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
2518 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002519 return result;
2520}
2521
halcanary9d524f22016-03-29 09:03:52 -07002522SkDrawOvalCommand* SkDrawOvalCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002523 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002524 SkRect coords;
2525 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
2526 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002527 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002528 return new SkDrawOvalCommand(coords, paint);
2529}
2530
bsalomonac3aa242016-08-19 11:25:19 -07002531SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
2532 bool useCenter, const SkPaint& paint)
2533 : INHERITED(kDrawOval_OpType) {
2534 fOval = oval;
2535 fStartAngle = startAngle;
2536 fSweepAngle = sweepAngle;
2537 fUseCenter = useCenter;
2538 fPaint = paint;
2539
2540 fInfo.push(SkObjectParser::RectToString(oval));
2541 fInfo.push(SkObjectParser::ScalarToString(startAngle, "StartAngle: "));
2542 fInfo.push(SkObjectParser::ScalarToString(sweepAngle, "SweepAngle: "));
2543 fInfo.push(SkObjectParser::BoolToString(useCenter));
2544 fInfo.push(SkObjectParser::PaintToString(paint));
2545}
2546
2547void SkDrawArcCommand::execute(SkCanvas* canvas) const {
2548 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
2549}
2550
2551bool SkDrawArcCommand::render(SkCanvas* canvas) const {
2552 canvas->clear(0xFFFFFFFF);
2553 canvas->save();
2554
2555 xlate_and_scale_to_bounds(canvas, fOval);
2556
2557 SkPaint p;
2558 p.setColor(SK_ColorBLACK);
2559 p.setStyle(SkPaint::kStroke_Style);
2560
2561 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
2562 canvas->restore();
2563
2564 return true;
2565}
2566
2567Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
2568 Json::Value result = INHERITED::toJSON(urlDataManager);
2569 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
2570 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
2571 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
2572 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
2573 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
2574 return result;
2575}
2576
2577SkDrawArcCommand* SkDrawArcCommand::fromJSON(Json::Value& command,
2578 UrlDataManager& urlDataManager) {
2579 SkRect coords;
2580 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
2581 SkScalar startAngle = command[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE].asFloat();
2582 SkScalar sweepAngle = command[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE].asFloat();
2583 bool useCenter = command[SKDEBUGCANVAS_ATTRIBUTE_USECENTER].asBool();
2584 SkPaint paint;
2585 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
2586 return new SkDrawArcCommand(coords, startAngle, sweepAngle, useCenter, paint);
2587}
2588
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002589SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002590 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002591 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002592
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002593 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002594}
2595
fmalita8c89c522014-11-08 16:18:56 -08002596void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002597 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002598}
2599
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002600bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002601 canvas->clear(0xFFFFFFFF);
2602 canvas->drawPaint(fPaint);
2603 return true;
2604}
2605
ethannicholasf62a8b72016-02-11 10:35:21 -08002606Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
2607 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002608 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002609 return result;
2610}
2611
halcanary9d524f22016-03-29 09:03:52 -07002612SkDrawPaintCommand* SkDrawPaintCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002613 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002614 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002615 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002616 return new SkDrawPaintCommand(paint);
2617}
2618
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002619SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002620 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002621 fPath = path;
2622 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002623
robertphillips@google.com91217d02013-03-17 18:33:46 +00002624 fInfo.push(SkObjectParser::PathToString(path));
2625 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002626}
2627
fmalita8c89c522014-11-08 16:18:56 -08002628void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002629 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002630}
2631
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002632bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002633 render_path(canvas, fPath);
2634 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00002635}
2636
ethannicholasf62a8b72016-02-11 10:35:21 -08002637Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
2638 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002639 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2640 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002641 return result;
2642}
2643
halcanary9d524f22016-03-29 09:03:52 -07002644SkDrawPathCommand* SkDrawPathCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002645 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002646 SkPath path;
2647 extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path);
2648 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002649 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002650 return new SkDrawPathCommand(path, paint);
2651}
2652
fmalita160ebb22015-04-01 20:58:37 -07002653SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
2654 const SkMatrix* matrix,
2655 const SkPaint* paint)
2656 : INHERITED(kBeginDrawPicture_OpType)
2657 , fPicture(SkRef(picture)) {
2658
2659 SkString* str = new SkString;
2660 str->appendf("SkPicture: L: %f T: %f R: %f B: %f",
2661 picture->cullRect().fLeft, picture->cullRect().fTop,
2662 picture->cullRect().fRight, picture->cullRect().fBottom);
2663 fInfo.push(str);
robertphillipsb3f319f2014-08-13 10:46:23 -07002664
bsalomon49f085d2014-09-05 13:34:00 -07002665 if (matrix) {
fmalita160ebb22015-04-01 20:58:37 -07002666 fMatrix.set(*matrix);
robertphillipsb3f319f2014-08-13 10:46:23 -07002667 fInfo.push(SkObjectParser::MatrixToString(*matrix));
2668 }
fmalita160ebb22015-04-01 20:58:37 -07002669
bsalomon49f085d2014-09-05 13:34:00 -07002670 if (paint) {
fmalita160ebb22015-04-01 20:58:37 -07002671 fPaint.set(*paint);
robertphillipsb3f319f2014-08-13 10:46:23 -07002672 fInfo.push(SkObjectParser::PaintToString(*paint));
2673 }
fmalita160ebb22015-04-01 20:58:37 -07002674
2675}
2676
2677void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
2678 if (fPaint.isValid()) {
2679 SkRect bounds = fPicture->cullRect();
2680 if (fMatrix.isValid()) {
2681 fMatrix.get()->mapRect(&bounds);
2682 }
2683 canvas->saveLayer(&bounds, fPaint.get());
2684 }
2685
2686 if (fMatrix.isValid()) {
2687 if (!fPaint.isValid()) {
2688 canvas->save();
2689 }
2690 canvas->concat(*fMatrix.get());
2691 }
chudy@google.com902ebe52012-06-29 14:21:22 +00002692}
2693
fmalita160ebb22015-04-01 20:58:37 -07002694bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00002695 canvas->clear(0xFFFFFFFF);
2696 canvas->save();
2697
robertphillipsa8d7f0b2014-08-29 08:03:56 -07002698 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00002699
robertphillips9b14f262014-06-04 05:40:44 -07002700 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00002701
2702 canvas->restore();
2703
2704 return true;
2705}
2706
fmalita160ebb22015-04-01 20:58:37 -07002707SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
2708 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
2709
2710void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
2711 if (fRestore) {
2712 canvas->restore();
2713 }
2714}
2715
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002716SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002717 const SkPoint pts[], const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002718 : INHERITED(kDrawPoints_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002719 fMode = mode;
2720 fCount = count;
2721 fPts = new SkPoint[count];
2722 memcpy(fPts, pts, count * sizeof(SkPoint));
2723 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002724
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002725 fInfo.push(SkObjectParser::PointsToString(pts, count));
2726 fInfo.push(SkObjectParser::ScalarToString(SkIntToScalar((unsigned int)count),
2727 "Points: "));
2728 fInfo.push(SkObjectParser::PointModeToString(mode));
2729 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002730}
2731
fmalita8c89c522014-11-08 16:18:56 -08002732void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002733 canvas->drawPoints(fMode, fCount, fPts, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002734}
2735
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002736bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002737 canvas->clear(0xFFFFFFFF);
2738 canvas->save();
2739
2740 SkRect bounds;
2741
2742 bounds.setEmpty();
2743 for (unsigned int i = 0; i < fCount; ++i) {
2744 bounds.growToInclude(fPts[i].fX, fPts[i].fY);
2745 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00002746
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002747 xlate_and_scale_to_bounds(canvas, bounds);
2748
2749 SkPaint p;
2750 p.setColor(SK_ColorBLACK);
2751 p.setStyle(SkPaint::kStroke_Style);
2752
2753 canvas->drawPoints(fMode, fCount, fPts, p);
2754 canvas->restore();
2755
2756 return true;
2757}
2758
ethannicholasf62a8b72016-02-11 10:35:21 -08002759Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
2760 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002761 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
2762 Json::Value points(Json::arrayValue);
2763 for (size_t i = 0; i < fCount; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002764 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08002765 }
2766 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07002767 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002768 return result;
2769}
2770
halcanary9d524f22016-03-29 09:03:52 -07002771SkDrawPointsCommand* SkDrawPointsCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002772 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002773 SkCanvas::PointMode mode;
2774 const char* jsonMode = command[SKDEBUGCANVAS_ATTRIBUTE_MODE].asCString();
2775 if (!strcmp(jsonMode, SKDEBUGCANVAS_POINTMODE_POINTS)) {
2776 mode = SkCanvas::kPoints_PointMode;
2777 }
2778 else if (!strcmp(jsonMode, SKDEBUGCANVAS_POINTMODE_LINES)) {
2779 mode = SkCanvas::kLines_PointMode;
2780 }
2781 else if (!strcmp(jsonMode, SKDEBUGCANVAS_POINTMODE_POLYGON)) {
2782 mode = SkCanvas::kPolygon_PointMode;
2783 }
2784 else {
2785 SkASSERT(false);
2786 return nullptr;
2787 }
2788 Json::Value jsonPoints = command[SKDEBUGCANVAS_ATTRIBUTE_POINTS];
2789 int count = (int) jsonPoints.size();
2790 SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint));
2791 for (int i = 0; i < count; i++) {
2792 points[i] = SkPoint::Make(jsonPoints[i][0].asFloat(), jsonPoints[i][1].asFloat());
2793 }
2794 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002795 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002796 SkDrawPointsCommand* result = new SkDrawPointsCommand(mode, count, points, paint);
2797 sk_free(points);
2798 return result;
2799}
2800
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002801SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002802 const SkPoint pos[], const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002803 : INHERITED(kDrawPosText_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002804 size_t numPts = paint.countText(text, byteLength);
chudy@google.com902ebe52012-06-29 14:21:22 +00002805
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002806 fText = new char[byteLength];
2807 memcpy(fText, text, byteLength);
2808 fByteLength = byteLength;
2809
2810 fPos = new SkPoint[numPts];
2811 memcpy(fPos, pos, numPts * sizeof(SkPoint));
2812
2813 fPaint = paint;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002814
2815 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
chudy@google.com902ebe52012-06-29 14:21:22 +00002816 // TODO(chudy): Test that this works.
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002817 fInfo.push(SkObjectParser::PointsToString(pos, 1));
2818 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002819}
2820
fmalita8c89c522014-11-08 16:18:56 -08002821void SkDrawPosTextCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002822 canvas->drawPosText(fText, fByteLength, fPos, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002823}
2824
ethannicholasf62a8b72016-02-11 10:35:21 -08002825Json::Value SkDrawPosTextCommand::toJSON(UrlDataManager& urlDataManager) const {
2826 Json::Value result = INHERITED::toJSON(urlDataManager);
halcanary9d524f22016-03-29 09:03:52 -07002827 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
ethannicholas50a8dd02016-02-10 05:40:46 -08002828 ((const char*) fText) + fByteLength);
2829 Json::Value coords(Json::arrayValue);
bungeman51190df2016-03-09 07:42:54 -08002830 size_t numCoords = fPaint.textToGlyphs(fText, fByteLength, nullptr);
2831 for (size_t i = 0; i < numCoords; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002832 coords.append(MakeJsonPoint(fPos[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08002833 }
2834 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = coords;
brianosmanfad98562016-05-04 11:06:28 -07002835 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002836 return result;
2837}
2838
halcanary9d524f22016-03-29 09:03:52 -07002839SkDrawPosTextCommand* SkDrawPosTextCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002840 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002841 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
2842 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002843 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002844 Json::Value coords = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
2845 int count = (int) coords.size();
2846 SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint));
2847 for (int i = 0; i < count; i++) {
2848 points[i] = SkPoint::Make(coords[i][0].asFloat(), coords[i][1].asFloat());
2849 }
2850 return new SkDrawPosTextCommand(text, strlen(text), points, paint);
2851}
chudy@google.com902ebe52012-06-29 14:21:22 +00002852
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002853SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength,
2854 const SkScalar xpos[], SkScalar constY,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002855 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002856 : INHERITED(kDrawPosTextH_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002857 size_t numPts = paint.countText(text, byteLength);
2858
2859 fText = new char[byteLength];
2860 memcpy(fText, text, byteLength);
robertphillips@google.com91217d02013-03-17 18:33:46 +00002861 fByteLength = byteLength;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002862
2863 fXpos = new SkScalar[numPts];
2864 memcpy(fXpos, xpos, numPts * sizeof(SkScalar));
2865
robertphillips@google.com91217d02013-03-17 18:33:46 +00002866 fConstY = constY;
2867 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002868
robertphillips@google.com91217d02013-03-17 18:33:46 +00002869 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
2870 fInfo.push(SkObjectParser::ScalarToString(xpos[0], "XPOS: "));
2871 fInfo.push(SkObjectParser::ScalarToString(constY, "SkScalar constY: "));
2872 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002873}
2874
fmalita8c89c522014-11-08 16:18:56 -08002875void SkDrawPosTextHCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002876 canvas->drawPosTextH(fText, fByteLength, fXpos, fConstY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002877}
2878
bungeman51190df2016-03-09 07:42:54 -08002879Json::Value SkDrawPosTextHCommand::toJSON(UrlDataManager& urlDataManager) const {
2880 Json::Value result = INHERITED::toJSON(urlDataManager);
2881 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
2882 ((const char*) fText) + fByteLength);
2883 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fConstY);
2884 Json::Value xpos(Json::arrayValue);
2885 size_t numXpos = fPaint.textToGlyphs(fText, fByteLength, nullptr);
2886 for (size_t i = 0; i < numXpos; i++) {
2887 xpos.append(Json::Value(fXpos[i]));
2888 }
2889 result[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = xpos;
brianosmanfad98562016-05-04 11:06:28 -07002890 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
bungeman51190df2016-03-09 07:42:54 -08002891 return result;
2892}
2893
2894SkDrawPosTextHCommand* SkDrawPosTextHCommand::fromJSON(Json::Value& command,
2895 UrlDataManager& urlDataManager) {
2896 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
2897 SkPaint paint;
2898 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
2899 Json::Value jsonXpos = command[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS];
2900 int count = (int) jsonXpos.size();
2901 SkScalar* xpos = (SkScalar*) sk_malloc_throw(count * sizeof(SkScalar));
2902 for (int i = 0; i < count; i++) {
2903 xpos[i] = jsonXpos[i].asFloat();
2904 }
2905 SkScalar y = command[SKDEBUGCANVAS_ATTRIBUTE_Y].asFloat();
2906 return new SkDrawPosTextHCommand(text, strlen(text), xpos, y, paint);
2907}
2908
fmalita0d48e412016-01-04 08:08:04 -08002909static const char* gPositioningLabels[] = {
2910 "kDefault_Positioning",
2911 "kHorizontal_Positioning",
2912 "kFull_Positioning",
2913};
2914
fmalita37283c22016-09-13 10:00:23 -07002915SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07002916 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002917 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07002918 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07002919 , fXPos(x)
2920 , fYPos(y)
2921 , fPaint(paint) {
2922
Ben Wagner145dbcd2016-11-03 14:40:50 -04002923 std::unique_ptr<SkString> runsStr(new SkString);
fmalitab7425172014-08-26 07:56:44 -07002924 fInfo.push(SkObjectParser::ScalarToString(x, "XPOS: "));
fmalitaff3106c2014-12-09 05:28:20 -08002925 fInfo.push(SkObjectParser::ScalarToString(y, "YPOS: "));
2926 fInfo.push(SkObjectParser::RectToString(fBlob->bounds(), "Bounds: "));
Ben Wagner145dbcd2016-11-03 14:40:50 -04002927 fInfo.push(runsStr.get());
fmalitab7425172014-08-26 07:56:44 -07002928 fInfo.push(SkObjectParser::PaintToString(paint));
fmalitae77f2da2015-12-08 18:59:18 -08002929
2930 unsigned runs = 0;
2931 SkPaint runPaint(paint);
fmalita02526bd2016-09-14 14:55:59 -07002932 SkTextBlobRunIterator iter(fBlob.get());
fmalitae77f2da2015-12-08 18:59:18 -08002933 while (!iter.done()) {
Ben Wagner145dbcd2016-11-03 14:40:50 -04002934 std::unique_ptr<SkString> tmpStr(new SkString);
fmalita0d48e412016-01-04 08:08:04 -08002935 tmpStr->printf("==== Run [%d] ====", runs++);
2936 fInfo.push(tmpStr.release());
fmalitae77f2da2015-12-08 18:59:18 -08002937
2938 fInfo.push(SkObjectParser::IntToString(iter.glyphCount(), "GlyphCount: "));
fmalita0d48e412016-01-04 08:08:04 -08002939 tmpStr.reset(new SkString("GlyphPositioning: "));
2940 tmpStr->append(gPositioningLabels[iter.positioning()]);
2941 fInfo.push(tmpStr.release());
2942
fmalitae77f2da2015-12-08 18:59:18 -08002943 iter.applyFontToPaint(&runPaint);
2944 fInfo.push(SkObjectParser::PaintToString(runPaint));
2945
2946 iter.next();
2947 }
2948
2949 runsStr->printf("Runs: %d", runs);
2950 // runStr is owned by fInfo at this point.
2951 runsStr.release();
fmalitab7425172014-08-26 07:56:44 -07002952}
2953
fmalita8c89c522014-11-08 16:18:56 -08002954void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07002955 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
2956}
2957
fmalita55773872014-08-29 15:08:20 -07002958bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
2959 canvas->clear(SK_ColorWHITE);
2960 canvas->save();
2961
2962 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
2963 xlate_and_scale_to_bounds(canvas, bounds);
2964
fmalita37283c22016-09-13 10:00:23 -07002965 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07002966
2967 canvas->restore();
2968
2969 return true;
2970}
2971
ethannicholasf62a8b72016-02-11 10:35:21 -08002972Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
2973 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002974 Json::Value runs(Json::arrayValue);
2975 SkTextBlobRunIterator iter(fBlob.get());
2976 while (!iter.done()) {
2977 Json::Value run(Json::objectValue);
2978 Json::Value jsonPositions(Json::arrayValue);
2979 Json::Value jsonGlyphs(Json::arrayValue);
2980 const SkScalar* iterPositions = iter.pos();
2981 const uint16_t* iterGlyphs = iter.glyphs();
2982 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
2983 switch (iter.positioning()) {
2984 case SkTextBlob::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07002985 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
2986 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08002987 break;
2988 case SkTextBlob::kHorizontal_Positioning:
2989 jsonPositions.append(Json::Value(iterPositions[i]));
2990 break;
2991 case SkTextBlob::kDefault_Positioning:
2992 break;
2993 }
2994 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
2995 }
2996 if (iter.positioning() != SkTextBlob::kDefault_Positioning) {
2997 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
2998 }
2999 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
3000 SkPaint fontPaint;
3001 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07003002 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
3003 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08003004 runs.append(run);
3005 iter.next();
3006 }
reed6d2c3e72016-07-07 14:10:14 -07003007 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08003008 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
3009 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
3010 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07003011 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07003012 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07003013
3014 SkString desc;
3015 // make the bounds local by applying the x,y
3016 bounds.offset(fXPos, fYPos);
3017 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
3018
ethannicholas50a8dd02016-02-10 05:40:46 -08003019 return result;
3020}
3021
halcanary9d524f22016-03-29 09:03:52 -07003022SkDrawTextBlobCommand* SkDrawTextBlobCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003023 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003024 SkTextBlobBuilder builder;
3025 Json::Value runs = command[SKDEBUGCANVAS_ATTRIBUTE_RUNS];
3026 for (Json::ArrayIndex i = 0 ; i < runs.size(); i++) {
3027 Json::Value run = runs[i];
3028 SkPaint font;
3029 font.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
ethannicholasf62a8b72016-02-11 10:35:21 -08003030 extract_json_paint(run[SKDEBUGCANVAS_ATTRIBUTE_FONT], urlDataManager, &font);
ethannicholas50a8dd02016-02-10 05:40:46 -08003031 Json::Value glyphs = run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS];
3032 int count = glyphs.size();
3033 Json::Value coords = run[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
3034 SkScalar x = coords[0].asFloat();
3035 SkScalar y = coords[1].asFloat();
reed6d2c3e72016-07-07 14:10:14 -07003036 SkRect bounds;
3037 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &bounds);
3038
ethannicholas50a8dd02016-02-10 05:40:46 -08003039 if (run.isMember(SKDEBUGCANVAS_ATTRIBUTE_POSITIONS)) {
3040 Json::Value positions = run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS];
3041 if (positions.size() > 0 && positions[0].isNumeric()) {
reed6d2c3e72016-07-07 14:10:14 -07003042 SkTextBlobBuilder::RunBuffer buffer = builder.allocRunPosH(font, count, y, &bounds);
ethannicholas50a8dd02016-02-10 05:40:46 -08003043 for (int j = 0; j < count; j++) {
3044 buffer.glyphs[j] = glyphs[j].asUInt();
3045 buffer.pos[j] = positions[j].asFloat();
3046 }
3047 }
3048 else {
reed6d2c3e72016-07-07 14:10:14 -07003049 SkTextBlobBuilder::RunBuffer buffer = builder.allocRunPos(font, count, &bounds);
ethannicholas50a8dd02016-02-10 05:40:46 -08003050 for (int j = 0; j < count; j++) {
3051 buffer.glyphs[j] = glyphs[j].asUInt();
3052 buffer.pos[j * 2] = positions[j][0].asFloat();
3053 buffer.pos[j * 2 + 1] = positions[j][1].asFloat();
3054 }
3055 }
3056 }
3057 else {
reed6d2c3e72016-07-07 14:10:14 -07003058 SkTextBlobBuilder::RunBuffer buffer = builder.allocRun(font, count, x, y, &bounds);
ethannicholas50a8dd02016-02-10 05:40:46 -08003059 for (int j = 0; j < count; j++) {
3060 buffer.glyphs[j] = glyphs[j].asUInt();
3061 }
3062 }
3063 }
3064 SkScalar x = command[SKDEBUGCANVAS_ATTRIBUTE_X].asFloat();
3065 SkScalar y = command[SKDEBUGCANVAS_ATTRIBUTE_Y].asFloat();
3066 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003067 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
fmalita37283c22016-09-13 10:00:23 -07003068 return new SkDrawTextBlobCommand(builder.make(), x, y, paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003069}
3070
robertphillips9bafc302015-02-13 11:13:00 -08003071SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04003072 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08003073 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04003074 : INHERITED(kDrawPatch_OpType)
3075 , fBlendMode(bmode)
3076{
robertphillips9bafc302015-02-13 11:13:00 -08003077 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08003078 if (colors != nullptr) {
3079 memcpy(fColors, colors, sizeof(fColors));
3080 fColorsPtr = fColors;
3081 } else {
3082 fColorsPtr = nullptr;
3083 }
3084 if (texCoords != nullptr) {
3085 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
3086 fTexCoordsPtr = fTexCoords;
3087 } else {
3088 fTexCoordsPtr = nullptr;
3089 }
robertphillips9bafc302015-02-13 11:13:00 -08003090 fPaint = paint;
3091
3092 fInfo.push(SkObjectParser::PaintToString(paint));
3093}
3094
3095void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04003096 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08003097}
3098
ethannicholasf62a8b72016-02-11 10:35:21 -08003099Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
3100 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08003101 Json::Value cubics = Json::Value(Json::arrayValue);
3102 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07003103 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08003104 }
3105 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
3106 if (fColorsPtr != nullptr) {
3107 Json::Value colors = Json::Value(Json::arrayValue);
3108 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07003109 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08003110 }
3111 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
3112 }
3113 if (fTexCoordsPtr != nullptr) {
3114 Json::Value texCoords = Json::Value(Json::arrayValue);
3115 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07003116 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08003117 }
3118 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
3119 }
Mike Reed7d954ad2016-10-28 15:42:34 -04003120 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08003121 return result;
3122}
3123
halcanary9d524f22016-03-29 09:03:52 -07003124SkDrawPatchCommand* SkDrawPatchCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003125 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08003126 Json::Value jsonCubics = command[SKDEBUGCANVAS_ATTRIBUTE_CUBICS];
3127 SkPoint cubics[12];
3128 for (int i = 0; i < 12; i++) {
3129 cubics[i] = get_json_point(jsonCubics[i]);
3130 }
3131 SkColor* colorsPtr;
3132 SkColor colors[4];
3133 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLORS)) {
3134 Json::Value jsonColors = command[SKDEBUGCANVAS_ATTRIBUTE_COLORS];
3135 for (int i = 0; i < 4; i++) {
3136 colors[i] = get_json_color(jsonColors[i]);
3137 }
3138 colorsPtr = colors;
3139 }
3140 else {
3141 colorsPtr = nullptr;
3142 }
3143 SkPoint* texCoordsPtr;
3144 SkPoint texCoords[4];
3145 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS)) {
3146 Json::Value jsonTexCoords = command[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS];
3147 for (int i = 0; i < 4; i++) {
3148 texCoords[i] = get_json_point(jsonTexCoords[i]);
3149 }
3150 texCoordsPtr = texCoords;
3151 }
3152 else {
3153 texCoordsPtr = nullptr;
3154 }
Mike Reed7d954ad2016-10-28 15:42:34 -04003155
3156 SkBlendMode bmode = SkBlendMode::kSrcOver; // TODO: extract from json
3157
ethannicholas1446a9a2016-02-10 14:05:02 -08003158 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003159 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
Mike Reed7d954ad2016-10-28 15:42:34 -04003160 return new SkDrawPatchCommand(cubics, colorsPtr, texCoordsPtr, bmode, paint);
robertphillips9bafc302015-02-13 11:13:00 -08003161}
3162
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003163SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003164 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00003165 fRect = rect;
3166 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00003167
robertphillips@google.com91217d02013-03-17 18:33:46 +00003168 fInfo.push(SkObjectParser::RectToString(rect));
3169 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00003170}
3171
fmalita8c89c522014-11-08 16:18:56 -08003172void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00003173 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00003174}
3175
ethannicholasf62a8b72016-02-11 10:35:21 -08003176Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
3177 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07003178 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
3179 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07003180
3181 SkString desc;
3182 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
3183
ethannicholas50a8dd02016-02-10 05:40:46 -08003184 return result;
3185}
3186
halcanary9d524f22016-03-29 09:03:52 -07003187SkDrawRectCommand* SkDrawRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003188 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003189 SkRect coords;
3190 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
3191 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003192 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003193 return new SkDrawRectCommand(coords, paint);
3194}
3195
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003196SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003197 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003198 fRRect = rrect;
3199 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00003200
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003201 fInfo.push(SkObjectParser::RRectToString(rrect));
3202 fInfo.push(SkObjectParser::PaintToString(paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +00003203}
3204
fmalita8c89c522014-11-08 16:18:56 -08003205void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00003206 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00003207}
3208
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00003209bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00003210 render_rrect(canvas, fRRect);
3211 return true;
3212}
3213
ethannicholasf62a8b72016-02-11 10:35:21 -08003214Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
3215 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003216 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07003217 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003218 return result;
3219}
3220
halcanary9d524f22016-03-29 09:03:52 -07003221SkDrawRRectCommand* SkDrawRRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003222 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003223 SkRRect coords;
3224 extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
3225 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003226 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003227 return new SkDrawRRectCommand(coords, paint);
3228}
3229
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00003230SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00003231 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003232 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003233 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00003234 fOuter = outer;
3235 fInner = inner;
3236 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00003237
3238 fInfo.push(SkObjectParser::RRectToString(outer));
3239 fInfo.push(SkObjectParser::RRectToString(inner));
3240 fInfo.push(SkObjectParser::PaintToString(paint));
3241}
3242
fmalita8c89c522014-11-08 16:18:56 -08003243void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00003244 canvas->drawDRRect(fOuter, fInner, fPaint);
3245}
3246
3247bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
3248 render_drrect(canvas, fOuter, fInner);
3249 return true;
3250}
3251
ethannicholasf62a8b72016-02-11 10:35:21 -08003252Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
3253 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003254 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
3255 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07003256 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003257 return result;
3258}
3259
halcanary9d524f22016-03-29 09:03:52 -07003260SkDrawDRRectCommand* SkDrawDRRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003261 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003262 SkRRect outer;
3263 extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_INNER], &outer);
3264 SkRRect inner;
3265 extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_INNER], &inner);
3266 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003267 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003268 return new SkDrawDRRectCommand(outer, inner, paint);
3269}
3270
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00003271SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003272 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003273 : INHERITED(kDrawText_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003274 fText = new char[byteLength];
3275 memcpy(fText, text, byteLength);
3276 fByteLength = byteLength;
3277 fX = x;
3278 fY = y;
3279 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00003280
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003281 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
3282 fInfo.push(SkObjectParser::ScalarToString(x, "SkScalar x: "));
3283 fInfo.push(SkObjectParser::ScalarToString(y, "SkScalar y: "));
3284 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00003285}
3286
fmalita8c89c522014-11-08 16:18:56 -08003287void SkDrawTextCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003288 canvas->drawText(fText, fByteLength, fX, fY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00003289}
3290
ethannicholasf62a8b72016-02-11 10:35:21 -08003291Json::Value SkDrawTextCommand::toJSON(UrlDataManager& urlDataManager) const {
3292 Json::Value result = INHERITED::toJSON(urlDataManager);
halcanary9d524f22016-03-29 09:03:52 -07003293 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
ethannicholas50a8dd02016-02-10 05:40:46 -08003294 ((const char*) fText) + fByteLength);
3295 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07003296 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fX, fY);
3297 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003298 return result;
3299}
3300
halcanary9d524f22016-03-29 09:03:52 -07003301SkDrawTextCommand* SkDrawTextCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003302 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003303 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
3304 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003305 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003306 Json::Value coords = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
halcanary9d524f22016-03-29 09:03:52 -07003307 return new SkDrawTextCommand(text, strlen(text), coords[0].asFloat(), coords[1].asFloat(),
ethannicholas50a8dd02016-02-10 05:40:46 -08003308 paint);
3309}
3310
reed45561a02016-07-07 12:47:17 -07003311///////////////////////////////////////////////////////////////////////////////////////////////////
3312
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00003313SkDrawTextOnPathCommand::SkDrawTextOnPathCommand(const void* text, size_t byteLength,
3314 const SkPath& path, const SkMatrix* matrix,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003315 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003316 : INHERITED(kDrawTextOnPath_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003317 fText = new char[byteLength];
3318 memcpy(fText, text, byteLength);
3319 fByteLength = byteLength;
3320 fPath = path;
bsalomon49f085d2014-09-05 13:34:00 -07003321 if (matrix) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003322 fMatrix = *matrix;
3323 } else {
3324 fMatrix.setIdentity();
3325 }
3326 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00003327
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003328 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
3329 fInfo.push(SkObjectParser::PathToString(path));
bsalomon49f085d2014-09-05 13:34:00 -07003330 if (matrix) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003331 fInfo.push(SkObjectParser::MatrixToString(*matrix));
3332 }
3333 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00003334}
3335
fmalita8c89c522014-11-08 16:18:56 -08003336void SkDrawTextOnPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003337 canvas->drawTextOnPath(fText, fByteLength, fPath,
halcanary96fcdcc2015-08-27 07:41:13 -07003338 fMatrix.isIdentity() ? nullptr : &fMatrix,
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003339 fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00003340}
3341
ethannicholasf62a8b72016-02-11 10:35:21 -08003342Json::Value SkDrawTextOnPathCommand::toJSON(UrlDataManager& urlDataManager) const {
3343 Json::Value result = INHERITED::toJSON(urlDataManager);
halcanary9d524f22016-03-29 09:03:52 -07003344 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
ethannicholas50a8dd02016-02-10 05:40:46 -08003345 ((const char*) fText) + fByteLength);
3346 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07003347 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08003348 if (!fMatrix.isIdentity()) {
joshualittbd724132016-03-03 11:39:38 -08003349 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08003350 }
brianosmanfad98562016-05-04 11:06:28 -07003351 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003352 return result;
3353}
3354
halcanary9d524f22016-03-29 09:03:52 -07003355SkDrawTextOnPathCommand* SkDrawTextOnPathCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003356 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003357 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
3358 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003359 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003360 SkPath path;
3361 extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path);
3362 SkMatrix* matrixPtr;
3363 SkMatrix matrix;
3364 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_MATRIX)) {
3365 extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix);
3366 matrixPtr = &matrix;
3367 }
3368 else {
3369 matrixPtr = nullptr;
3370 }
3371 return new SkDrawTextOnPathCommand(text, strlen(text), path, matrixPtr, paint);
3372}
3373
reed45561a02016-07-07 12:47:17 -07003374///////////////////////////////////////////////////////////////////////////////////////////////////
3375
3376SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength,
3377 const SkRSXform xform[], const SkRect* cull,
3378 const SkPaint& paint)
reed63f30d92016-07-07 16:32:51 -07003379 : INHERITED(kDrawTextRSXform_OpType)
reed45561a02016-07-07 12:47:17 -07003380{
3381 fText = new char[byteLength];
3382 memcpy(fText, text, byteLength);
3383 fByteLength = byteLength;
3384 int count = paint.countText(text, byteLength);
3385 fXform = new SkRSXform[count];
3386 memcpy(fXform, xform, count * sizeof(SkRSXform));
3387 if (cull) {
3388 fCullStorage = *cull;
3389 fCull = &fCullStorage;
3390 } else {
3391 fCull = nullptr;
3392 }
3393 fPaint = paint;
3394
3395 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
3396 fInfo.push(SkObjectParser::PaintToString(paint));
3397}
3398
3399void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const {
3400 canvas->drawTextRSXform(fText, fByteLength, fXform, fCull, fPaint);
3401}
3402
3403Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) const {
3404 Json::Value result = INHERITED::toJSON(urlDataManager);
3405 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
3406 ((const char*) fText) + fByteLength);
3407 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
3408 return result;
3409}
3410
3411SkDrawTextRSXformCommand* SkDrawTextRSXformCommand::fromJSON(Json::Value& command,
3412 UrlDataManager& urlDataManager) {
3413 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
3414 size_t byteLength = strlen(text);
3415 SkPaint paint;
3416 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
3417
3418 // TODO: handle xform and cull
3419 int count = paint.countText(text, byteLength);
3420 SkAutoTArray<SkRSXform> xform(count);
3421 for (int i = 0; i < count; ++i) {
3422 xform[i].fSCos = 1;
3423 xform[i].fSSin = xform[i].fTx = xform[i].fTy = 0;
3424 }
3425 return new SkDrawTextRSXformCommand(text, byteLength, &xform[0], nullptr, paint);
3426}
3427
3428///////////////////////////////////////////////////////////////////////////////////////////////////
3429
Mike Reedfed9cfd2017-03-17 12:09:04 -04003430SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003431 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04003432 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04003433 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04003434 , fBlendMode(bmode)
Mike Reedfed9cfd2017-03-17 12:09:04 -04003435 , fPaint(paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04003436{
chudy@google.com902ebe52012-06-29 14:21:22 +00003437 // TODO(chudy)
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003438 fInfo.push(SkObjectParser::CustomTextToString("To be implemented."));
3439 fInfo.push(SkObjectParser::PaintToString(paint));
3440}
3441
fmalita8c89c522014-11-08 16:18:56 -08003442void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04003443 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00003444}
3445
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003446SkRestoreCommand::SkRestoreCommand()
robertphillips9bafc302015-02-13 11:13:00 -08003447 : INHERITED(kRestore_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003448 fInfo.push(SkObjectParser::CustomTextToString("No Parameters"));
chudy@google.com902ebe52012-06-29 14:21:22 +00003449}
3450
fmalita8c89c522014-11-08 16:18:56 -08003451void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00003452 canvas->restore();
3453}
3454
ethannicholasf62a8b72016-02-11 10:35:21 -08003455SkRestoreCommand* SkRestoreCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003456 return new SkRestoreCommand();
3457}
3458
Florin Malita5f6102d2014-06-30 10:13:28 -04003459SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08003460 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00003461}
3462
fmalita8c89c522014-11-08 16:18:56 -08003463void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04003464 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00003465}
3466
ethannicholasf62a8b72016-02-11 10:35:21 -08003467SkSaveCommand* SkSaveCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003468 return new SkSaveCommand();
3469}
3470
reed4960eee2015-12-18 07:09:18 -08003471SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
robertphillips9bafc302015-02-13 11:13:00 -08003472 : INHERITED(kSaveLayer_OpType) {
reed4960eee2015-12-18 07:09:18 -08003473 if (rec.fBounds) {
3474 fBounds = *rec.fBounds;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003475 } else {
3476 fBounds.setEmpty();
3477 }
chudy@google.com902ebe52012-06-29 14:21:22 +00003478
reed4960eee2015-12-18 07:09:18 -08003479 if (rec.fPaint) {
3480 fPaint = *rec.fPaint;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003481 fPaintPtr = &fPaint;
3482 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07003483 fPaintPtr = nullptr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003484 }
reed4960eee2015-12-18 07:09:18 -08003485 fSaveLayerFlags = rec.fSaveLayerFlags;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003486
ethannicholas50a8dd02016-02-10 05:40:46 -08003487 if (rec.fBackdrop) {
3488 fBackdrop = rec.fBackdrop;
3489 fBackdrop->ref();
3490 } else {
3491 fBackdrop = nullptr;
3492 }
3493
reed4960eee2015-12-18 07:09:18 -08003494 if (rec.fBounds) {
3495 fInfo.push(SkObjectParser::RectToString(*rec.fBounds, "Bounds: "));
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003496 }
reed4960eee2015-12-18 07:09:18 -08003497 if (rec.fPaint) {
3498 fInfo.push(SkObjectParser::PaintToString(*rec.fPaint));
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003499 }
reed4960eee2015-12-18 07:09:18 -08003500 fInfo.push(SkObjectParser::SaveLayerFlagsToString(fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00003501}
3502
ethannicholas50a8dd02016-02-10 05:40:46 -08003503SkSaveLayerCommand::~SkSaveLayerCommand() {
3504 if (fBackdrop != nullptr) {
3505 fBackdrop->unref();
3506 }
3507}
3508
fmalita8c89c522014-11-08 16:18:56 -08003509void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
reed4960eee2015-12-18 07:09:18 -08003510 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.isEmpty() ? nullptr : &fBounds,
3511 fPaintPtr,
3512 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00003513}
3514
fmalita8c89c522014-11-08 16:18:56 -08003515void SkSaveLayerCommand::vizExecute(SkCanvas* canvas) const {
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +00003516 canvas->save();
3517}
3518
ethannicholasf62a8b72016-02-11 10:35:21 -08003519Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
3520 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003521 if (!fBounds.isEmpty()) {
brianosmanfad98562016-05-04 11:06:28 -07003522 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(fBounds);
ethannicholas50a8dd02016-02-10 05:40:46 -08003523 }
3524 if (fPaintPtr != nullptr) {
brianosmanfad98562016-05-04 11:06:28 -07003525 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr,
ethannicholasf62a8b72016-02-11 10:35:21 -08003526 urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003527 }
3528 if (fBackdrop != nullptr) {
3529 Json::Value jsonBackdrop;
ethannicholasf62a8b72016-02-11 10:35:21 -08003530 flatten(fBackdrop, &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003531 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
3532 }
3533 if (fSaveLayerFlags != 0) {
3534 SkDebugf("unsupported: saveLayer flags\n");
3535 SkASSERT(false);
3536 }
3537 return result;
3538}
3539
halcanary9d524f22016-03-29 09:03:52 -07003540SkSaveLayerCommand* SkSaveLayerCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003541 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003542 SkCanvas::SaveLayerRec rec;
3543 SkRect bounds;
3544 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_BOUNDS)) {
3545 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS], &bounds);
3546 rec.fBounds = &bounds;
3547 }
3548 SkPaint paint;
3549 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08003550 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003551 rec.fPaint = &paint;
3552 }
3553 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_BACKDROP)) {
3554 Json::Value backdrop = command[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP];
ethannicholasf62a8b72016-02-11 10:35:21 -08003555 rec.fBackdrop = (SkImageFilter*) load_flattenable(backdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003556 }
3557 SkSaveLayerCommand* result = new SkSaveLayerCommand(rec);
3558 if (rec.fBackdrop != nullptr) {
3559 rec.fBackdrop->unref();
3560 }
3561 return result;
3562}
3563
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003564SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08003565 : INHERITED(kSetMatrix_OpType) {
robertphillips70171682014-10-16 14:28:28 -07003566 fUserMatrix.reset();
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003567 fMatrix = matrix;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003568 fInfo.push(SkObjectParser::MatrixToString(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +00003569}
3570
robertphillips70171682014-10-16 14:28:28 -07003571void SkSetMatrixCommand::setUserMatrix(const SkMatrix& userMatrix) {
3572 fUserMatrix = userMatrix;
3573}
3574
fmalita8c89c522014-11-08 16:18:56 -08003575void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
robertphillips70171682014-10-16 14:28:28 -07003576 SkMatrix temp = SkMatrix::Concat(fUserMatrix, fMatrix);
3577 canvas->setMatrix(temp);
chudy@google.com902ebe52012-06-29 14:21:22 +00003578}
3579
ethannicholasf62a8b72016-02-11 10:35:21 -08003580Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
3581 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08003582 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08003583 return result;
3584}
3585
halcanary9d524f22016-03-29 09:03:52 -07003586SkSetMatrixCommand* SkSetMatrixCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003587 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003588 SkMatrix matrix;
3589 extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix);
3590 return new SkSetMatrixCommand(matrix);
3591}