blob: a7c94ab6e3124c9c576e816a331d9dc42a5ca96b [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))) {
748 SkFAIL("png encode error");
749 }
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;
815 case kIndex_8_SkColorType:
816 return SKDEBUGCANVAS_COLORTYPE_INDEX8;
817 case kAlpha_8_SkColorType:
818 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
819 default:
820 SkASSERT(false);
821 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
822 }
823}
824
825static const char* alpha_type_name(SkAlphaType alphaType) {
826 switch (alphaType) {
827 case kOpaque_SkAlphaType:
828 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
829 case kPremul_SkAlphaType:
830 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
831 case kUnpremul_SkAlphaType:
832 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
833 default:
834 SkASSERT(false);
835 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
836 }
837}
838
halcanary9d524f22016-03-29 09:03:52 -0700839static Json::ArrayIndex decode_data(Json::Value data, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -0800840 const void** target) {
841 UrlDataManager::UrlData* urlData = urlDataManager.getDataFromUrl(SkString(data.asCString()));
842 if (urlData == nullptr) {
843 SkASSERT(false);
844 *target = nullptr;
845 return 0;
ethannicholas50a8dd02016-02-10 05:40:46 -0800846 }
ethannicholasf62a8b72016-02-11 10:35:21 -0800847 *target = urlData->fData->data();
848 // cast should be safe for any reasonably-sized object...
849 return (Json::ArrayIndex) urlData->fData->size();
ethannicholas50a8dd02016-02-10 05:40:46 -0800850}
851
halcanary9d524f22016-03-29 09:03:52 -0700852static SkFlattenable* load_flattenable(Json::Value jsonFlattenable,
ethannicholasf62a8b72016-02-11 10:35:21 -0800853 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800854 if (!jsonFlattenable.isMember(SKDEBUGCANVAS_ATTRIBUTE_NAME)) {
855 return nullptr;
856 }
857 const char* name = jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME].asCString();
858 SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name);
859 if (factory == nullptr) {
860 SkDebugf("no factory for loading '%s'\n", name);
861 return nullptr;
862 }
ethannicholasf62a8b72016-02-11 10:35:21 -0800863 const void* data;
864 int size = decode_data(jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA], urlDataManager, &data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800865 SkValidatingReadBuffer buffer(data, size);
reed60c9b582016-04-03 09:11:13 -0700866 sk_sp<SkFlattenable> result = factory(buffer);
ethannicholas50a8dd02016-02-10 05:40:46 -0800867 if (!buffer.isValid()) {
868 SkDebugf("invalid buffer loading flattenable\n");
869 return nullptr;
870 }
reed60c9b582016-04-03 09:11:13 -0700871 return result.release();
ethannicholas50a8dd02016-02-10 05:40:46 -0800872}
873
874static SkColorType colortype_from_name(const char* name) {
875 if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_ARGB4444)) {
876 return kARGB_4444_SkColorType;
877 }
878 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_RGBA8888)) {
879 return kRGBA_8888_SkColorType;
880 }
881 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_BGRA8888)) {
882 return kBGRA_8888_SkColorType;
883 }
884 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_565)) {
885 return kRGB_565_SkColorType;
886 }
887 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_GRAY8)) {
888 return kGray_8_SkColorType;
889 }
890 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_INDEX8)) {
891 return kIndex_8_SkColorType;
892 }
893 else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_ALPHA8)) {
894 return kAlpha_8_SkColorType;
895 }
896 SkASSERT(false);
897 return kN32_SkColorType;
898}
899
900static SkBitmap* convert_colortype(SkBitmap* bitmap, SkColorType colorType) {
901 if (bitmap->colorType() == colorType ) {
902 return bitmap;
903 }
904 SkBitmap* dst = new SkBitmap();
Matt Sarett68b8e3d2017-04-28 11:15:22 -0400905 if (dst->tryAllocPixels(bitmap->info().makeColorType(colorType)) &&
906 bitmap->readPixels(dst->info(), dst->getPixels(), dst->rowBytes(), 0, 0))
907 {
ethannicholas50a8dd02016-02-10 05:40:46 -0800908 delete bitmap;
909 return dst;
910 }
911 SkASSERT(false);
912 delete dst;
913 return bitmap;
914}
915
916// caller is responsible for freeing return value
ethannicholasf62a8b72016-02-11 10:35:21 -0800917static SkBitmap* load_bitmap(const Json::Value& jsonBitmap, UrlDataManager& urlDataManager) {
918 if (!jsonBitmap.isMember(SKDEBUGCANVAS_ATTRIBUTE_DATA)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800919 SkDebugf("invalid bitmap\n");
920 return nullptr;
921 }
ethannicholasf62a8b72016-02-11 10:35:21 -0800922 const void* data;
923 int size = decode_data(jsonBitmap[SKDEBUGCANVAS_ATTRIBUTE_DATA], urlDataManager, &data);
bungeman38d909e2016-08-02 14:40:46 -0700924 sk_sp<SkData> encoded(SkData::MakeWithoutCopy(data, size));
reed9ce9d672016-03-17 10:51:11 -0700925 sk_sp<SkImage> image(SkImage::MakeFromEncoded(std::move(encoded), nullptr));
msarett790f99a2016-03-09 06:16:55 -0800926
Ben Wagner145dbcd2016-11-03 14:40:50 -0400927 std::unique_ptr<SkBitmap> bitmap(new SkBitmap());
msarett790f99a2016-03-09 06:16:55 -0800928 if (nullptr != image) {
Ben Wagner145dbcd2016-11-03 14:40:50 -0400929 if (!image->asLegacyBitmap(bitmap.get(), SkImage::kRW_LegacyBitmapMode)) {
msarett790f99a2016-03-09 06:16:55 -0800930 SkDebugf("image decode failed\n");
931 return nullptr;
932 }
933
ethannicholas50a8dd02016-02-10 05:40:46 -0800934 if (jsonBitmap.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLOR)) {
935 const char* ctName = jsonBitmap[SKDEBUGCANVAS_ATTRIBUTE_COLOR].asCString();
936 SkColorType ct = colortype_from_name(ctName);
937 if (ct != kIndex_8_SkColorType) {
mtklein18300a32016-03-16 13:53:35 -0700938 bitmap.reset(convert_colortype(bitmap.release(), ct));
ethannicholas50a8dd02016-02-10 05:40:46 -0800939 }
940 }
mtklein18300a32016-03-16 13:53:35 -0700941 return bitmap.release();
ethannicholas50a8dd02016-02-10 05:40:46 -0800942 }
943 SkDebugf("image decode failed\n");
ethannicholas50a8dd02016-02-10 05:40:46 -0800944 return nullptr;
945}
946
reed9ce9d672016-03-17 10:51:11 -0700947static sk_sp<SkImage> load_image(const Json::Value& jsonImage, UrlDataManager& urlDataManager) {
ethannicholasf62a8b72016-02-11 10:35:21 -0800948 SkBitmap* bitmap = load_bitmap(jsonImage, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800949 if (bitmap == nullptr) {
950 return nullptr;
951 }
reed9ce9d672016-03-17 10:51:11 -0700952 auto result = SkImage::MakeFromBitmap(*bitmap);
ethannicholas50a8dd02016-02-10 05:40:46 -0800953 delete bitmap;
954 return result;
955}
956
brianosmanfad98562016-05-04 11:06:28 -0700957bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
958 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700959 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800960 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
961 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800962 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800963 return success;
964}
965
halcanaryf412f092016-08-25 11:10:41 -0700966static void apply_paint_hinting(const SkPaint& paint, Json::Value* target) {
967 SkPaint::Hinting hinting = paint.getHinting();
968 if (hinting != SkPaintDefaults_Hinting) {
969 switch (hinting) {
970 case SkPaint::kNo_Hinting:
971 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
972 break;
973 case SkPaint::kSlight_Hinting:
974 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
975 break;
976 case SkPaint::kNormal_Hinting:
977 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
978 break;
979 case SkPaint::kFull_Hinting:
980 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
981 break;
982 }
983 }
984}
985
ethannicholas50a8dd02016-02-10 05:40:46 -0800986static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
987 SkColor color = paint.getColor();
988 if (color != SK_ColorBLACK) {
989 Json::Value colorValue(Json::arrayValue);
990 colorValue.append(Json::Value(SkColorGetA(color)));
991 colorValue.append(Json::Value(SkColorGetR(color)));
992 colorValue.append(Json::Value(SkColorGetG(color)));
993 colorValue.append(Json::Value(SkColorGetB(color)));
994 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;;
995 }
996}
997
998static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
999 SkPaint::Style style = paint.getStyle();
1000 if (style != SkPaint::kFill_Style) {
1001 switch (style) {
1002 case SkPaint::kStroke_Style: {
1003 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
1004 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
1005 break;
1006 }
1007 case SkPaint::kStrokeAndFill_Style: {
1008 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
1009 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
1010 break;
1011 }
1012 default: SkASSERT(false);
1013 }
1014 }
1015}
1016
1017static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
1018 SkPaint::Cap cap = paint.getStrokeCap();
1019 if (cap != SkPaint::kDefault_Cap) {
1020 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001021 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -08001022 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
1023 break;
ethannicholas1446a9a2016-02-10 14:05:02 -08001024 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -08001025 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
1026 break;
ethannicholas1446a9a2016-02-10 14:05:02 -08001027 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -08001028 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
1029 break;
ethannicholas50a8dd02016-02-10 05:40:46 -08001030 default: SkASSERT(false);
1031 }
1032 }
1033}
ethannicholas1446a9a2016-02-10 14:05:02 -08001034
1035static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
1036 SkPaint::Join join = paint.getStrokeJoin();
1037 if (join != SkPaint::kDefault_Join) {
1038 switch (join) {
1039 case SkPaint::kMiter_Join:
1040 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
1041 SKDEBUGCANVAS_MITER_JOIN);
1042 break;
1043 case SkPaint::kRound_Join:
1044 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
1045 SKDEBUGCANVAS_ROUND_JOIN);
1046 break;
1047 case SkPaint::kBevel_Join:
1048 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
1049 SKDEBUGCANVAS_BEVEL_JOIN);
1050 break;
1051 default: SkASSERT(false);
1052 }
1053 }
1054}
1055
1056static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
1057 SkFilterQuality quality = paint.getFilterQuality();
1058 switch (quality) {
1059 case kNone_SkFilterQuality:
1060 break;
1061 case kLow_SkFilterQuality:
1062 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
1063 SKDEBUGCANVAS_FILTERQUALITY_LOW);
1064 break;
1065 case kMedium_SkFilterQuality:
1066 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
1067 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
1068 break;
1069 case kHigh_SkFilterQuality:
1070 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
1071 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
1072 break;
1073 }
1074}
1075
halcanary9d524f22016-03-29 09:03:52 -07001076static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001077 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001078 SkMaskFilter* maskFilter = paint.getMaskFilter();
1079 if (maskFilter != nullptr) {
1080 SkMaskFilter::BlurRec blurRec;
1081 if (maskFilter->asABlur(&blurRec)) {
1082 Json::Value blur(Json::objectValue);
1083 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
1084 switch (blurRec.fStyle) {
1085 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -08001086 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
1087 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -08001088 break;
1089 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -08001090 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
1091 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -08001092 break;
1093 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -08001094 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
1095 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -08001096 break;
1097 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -08001098 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
1099 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -08001100 break;
1101 default:
1102 SkASSERT(false);
1103 }
1104 switch (blurRec.fQuality) {
1105 case SkBlurQuality::kLow_SkBlurQuality:
ethannicholas1446a9a2016-02-10 14:05:02 -08001106 blur[SKDEBUGCANVAS_ATTRIBUTE_QUALITY] = Json::Value(
1107 SKDEBUGCANVAS_BLURQUALITY_LOW);
ethannicholas50a8dd02016-02-10 05:40:46 -08001108 break;
1109 case SkBlurQuality::kHigh_SkBlurQuality:
ethannicholas1446a9a2016-02-10 14:05:02 -08001110 blur[SKDEBUGCANVAS_ATTRIBUTE_QUALITY] = Json::Value(
1111 SKDEBUGCANVAS_BLURQUALITY_HIGH);
ethannicholas50a8dd02016-02-10 05:40:46 -08001112 break;
1113 default:
1114 SkASSERT(false);
1115 }
1116 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
1117 } else {
1118 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -07001119 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001120 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
1121 }
1122 }
1123}
1124
halcanary9d524f22016-03-29 09:03:52 -07001125static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001126 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001127 SkPathEffect* pathEffect = paint.getPathEffect();
1128 if (pathEffect != nullptr) {
1129 SkPathEffect::DashInfo dashInfo;
1130 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
1131 if (dashType == SkPathEffect::kDash_DashType) {
1132 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
1133 pathEffect->asADash(&dashInfo);
1134 Json::Value dashing(Json::objectValue);
1135 Json::Value intervals(Json::arrayValue);
1136 for (int32_t i = 0; i < dashInfo.fCount; i++) {
1137 intervals.append(Json::Value(dashInfo.fIntervals[i]));
1138 }
1139 sk_free(dashInfo.fIntervals);
1140 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
1141 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
1142 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
1143 } else {
1144 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -07001145 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001146 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
1147 }
1148 }
1149}
halcanary9d524f22016-03-29 09:03:52 -07001150
ethannicholas50a8dd02016-02-10 05:40:46 -08001151static void apply_paint_textalign(const SkPaint& paint, Json::Value* target) {
1152 SkPaint::Align textAlign = paint.getTextAlign();
1153 if (textAlign != SkPaint::kLeft_Align) {
1154 switch (textAlign) {
1155 case SkPaint::kCenter_Align: {
1156 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_CENTER;
1157 break;
1158 }
1159 case SkPaint::kRight_Align: {
1160 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_RIGHT;
1161 break;
1162 }
1163 default: SkASSERT(false);
1164 }
1165 }
1166}
1167
halcanary9d524f22016-03-29 09:03:52 -07001168static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001169 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001170 SkTypeface* typeface = paint.getTypeface();
1171 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -08001172 Json::Value jsonTypeface;
1173 SkDynamicMemoryWStream buffer;
1174 typeface->serialize(&buffer);
1175 void* data = sk_malloc_throw(buffer.bytesWritten());
1176 buffer.copyTo(data);
1177 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -07001178 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001179 &jsonData);
1180 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
1181 sk_free(data);
1182 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -08001183 }
1184}
1185
halcanary9d524f22016-03-29 09:03:52 -07001186static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001187 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001188 SkFlattenable* shader = paint.getShader();
1189 if (shader != nullptr) {
1190 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -07001191 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001192 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
1193 }
1194}
1195
ethannicholasf62a8b72016-02-11 10:35:21 -08001196static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
1197 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001198 SkFlattenable* imageFilter = paint.getImageFilter();
1199 if (imageFilter != nullptr) {
1200 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -07001201 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001202 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
1203 }
1204}
1205
halcanary9d524f22016-03-29 09:03:52 -07001206static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001207 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001208 SkFlattenable* colorFilter = paint.getColorFilter();
1209 if (colorFilter != nullptr) {
1210 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001211 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001212 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1213 }
1214}
1215
halcanary9d524f22016-03-29 09:03:52 -07001216static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001217 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001218 SkFlattenable* looper = paint.getLooper();
1219 if (looper != nullptr) {
1220 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001221 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001222 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1223 }
1224}
1225
brianosmanfad98562016-05-04 11:06:28 -07001226Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001227 Json::Value result(Json::objectValue);
1228 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001229 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001230 SkPaintDefaults_MiterLimit);
1231 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001232 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001233 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, paint.isFakeBoldText(), false);
1234 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, paint.isLinearText(), false);
1235 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, paint.isSubpixelText(), false);
1236 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT, paint.isDevKernText(), false);
1237 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT, paint.isLCDRenderText(), false);
1238 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, paint.isEmbeddedBitmapText(), false);
1239 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, paint.isAutohinted(), false);
1240 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT, paint.isVerticalText(), false);
1241 //kGenA8FromLCD_Flag
1242
halcanary9d524f22016-03-29 09:03:52 -07001243 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001244 SkPaintDefaults_TextSize);
1245 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
1246 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
halcanaryf412f092016-08-25 11:10:41 -07001247 apply_paint_hinting(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001248 apply_paint_color(paint, &result);
1249 apply_paint_style(paint, &result);
Florin Malita82d80872017-06-06 16:58:40 -04001250 apply_paint_blend_mode(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001251 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001252 apply_paint_join(paint, &result);
1253 apply_paint_filterquality(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001254 apply_paint_textalign(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001255 apply_paint_patheffect(paint, &result, urlDataManager);
1256 apply_paint_maskfilter(paint, &result, urlDataManager);
1257 apply_paint_shader(paint, &result, urlDataManager);
ethannicholasf62a8b72016-02-11 10:35:21 -08001258 apply_paint_looper(paint, &result, urlDataManager);
1259 apply_paint_imagefilter(paint, &result, urlDataManager);
1260 apply_paint_colorfilter(paint, &result, urlDataManager);
1261 apply_paint_typeface(paint, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001262 return result;
1263}
1264
Stan Ilievac42aeb2017-01-12 16:20:50 -05001265Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) {
1266 Json::Value result(Json::objectValue);
1267 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount);
1268 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount);
1269 if (nullptr != lattice.fBounds) {
1270 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds);
1271 }
1272 Json::Value XDivs(Json::arrayValue);
1273 for (int i = 0; i < lattice.fXCount; i++) {
1274 XDivs.append(Json::Value(lattice.fXDivs[i]));
1275 }
1276 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs;
1277 Json::Value YDivs(Json::arrayValue);
1278 for (int i = 0; i < lattice.fYCount; i++) {
1279 YDivs.append(Json::Value(lattice.fYDivs[i]));
1280 }
1281 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs;
1282 if (nullptr != lattice.fFlags) {
1283 Json::Value flags(Json::arrayValue);
1284 int flagCount = 0;
1285 for (int row = 0; row < lattice.fYCount+1; row++) {
1286 Json::Value flagsRow(Json::arrayValue);
1287 for (int column = 0; column < lattice.fXCount+1; column++) {
1288 flagsRow.append(Json::Value(lattice.fFlags[flagCount++]));
1289 }
1290 flags.append(flagsRow);
1291 }
1292 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags;
1293 }
1294 return result;
1295}
1296
ethannicholas1446a9a2016-02-10 14:05:02 -08001297static SkPoint get_json_point(Json::Value point) {
1298 return SkPoint::Make(point[0].asFloat(), point[1].asFloat());
1299}
1300
1301static SkColor get_json_color(Json::Value color) {
1302 return SkColorSetARGB(color[0].asInt(), color[1].asInt(), color[2].asInt(), color[3].asInt());
1303}
1304
ethannicholas50a8dd02016-02-10 05:40:46 -08001305static void extract_json_paint_color(Json::Value& jsonPaint, SkPaint* target) {
1306 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLOR)) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001307 target->setColor(get_json_color(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_COLOR]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001308 }
1309}
1310
halcanary9d524f22016-03-29 09:03:52 -07001311static void extract_json_paint_shader(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001312 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001313 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_SHADER)) {
1314 Json::Value jsonShader = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_SHADER];
ethannicholasf62a8b72016-02-11 10:35:21 -08001315 SkShader* shader = (SkShader*) load_flattenable(jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001316 if (shader != nullptr) {
reedfe630452016-03-25 09:08:00 -07001317 target->setShader(sk_ref_sp(shader));
ethannicholas50a8dd02016-02-10 05:40:46 -08001318 }
1319 }
1320}
1321
halcanary9d524f22016-03-29 09:03:52 -07001322static void extract_json_paint_patheffect(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001323 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001324 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT)) {
1325 Json::Value jsonPathEffect = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT];
reeda4393342016-03-18 11:22:57 -07001326 sk_sp<SkPathEffect> pathEffect((SkPathEffect*)load_flattenable(jsonPathEffect,
1327 urlDataManager));
ethannicholas50a8dd02016-02-10 05:40:46 -08001328 if (pathEffect != nullptr) {
1329 target->setPathEffect(pathEffect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001330 }
1331 }
1332}
1333
halcanary9d524f22016-03-29 09:03:52 -07001334static void extract_json_paint_maskfilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001335 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001336 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER)) {
1337 Json::Value jsonMaskFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER];
reedefdfd512016-04-04 10:02:58 -07001338 sk_sp<SkMaskFilter> maskFilter((SkMaskFilter*)load_flattenable(jsonMaskFilter,
1339 urlDataManager));
1340 if (maskFilter) {
1341 target->setMaskFilter(std::move(maskFilter));
ethannicholas50a8dd02016-02-10 05:40:46 -08001342 }
1343 }
1344}
1345
halcanary9d524f22016-03-29 09:03:52 -07001346static void extract_json_paint_colorfilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001347 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001348 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER)) {
1349 Json::Value jsonColorFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER];
reedd053ce92016-03-22 10:17:23 -07001350 sk_sp<SkColorFilter> colorFilter((SkColorFilter*)load_flattenable(jsonColorFilter,
1351 urlDataManager));
ethannicholas50a8dd02016-02-10 05:40:46 -08001352 if (colorFilter != nullptr) {
1353 target->setColorFilter(colorFilter);
ethannicholas50a8dd02016-02-10 05:40:46 -08001354 }
1355 }
1356}
1357
halcanary9d524f22016-03-29 09:03:52 -07001358static void extract_json_paint_looper(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001359 SkPaint* target) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001360 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_LOOPER)) {
1361 Json::Value jsonLooper = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_LOOPER];
reed7b380d02016-03-21 13:25:16 -07001362 sk_sp<SkDrawLooper> looper((SkDrawLooper*) load_flattenable(jsonLooper, urlDataManager));
ethannicholas1446a9a2016-02-10 14:05:02 -08001363 if (looper != nullptr) {
reed7b380d02016-03-21 13:25:16 -07001364 target->setLooper(std::move(looper));
ethannicholas1446a9a2016-02-10 14:05:02 -08001365 }
1366 }
1367}
1368
halcanary9d524f22016-03-29 09:03:52 -07001369static void extract_json_paint_imagefilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001370 SkPaint* target) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001371 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER)) {
1372 Json::Value jsonImageFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER];
Mike Reed5e257172016-11-01 11:22:05 -04001373 sk_sp<SkImageFilter> imageFilter((SkImageFilter*) load_flattenable(jsonImageFilter,
1374 urlDataManager));
ethannicholas50a8dd02016-02-10 05:40:46 -08001375 if (imageFilter != nullptr) {
1376 target->setImageFilter(imageFilter);
ethannicholas50a8dd02016-02-10 05:40:46 -08001377 }
1378 }
1379}
1380
halcanary9d524f22016-03-29 09:03:52 -07001381static void extract_json_paint_typeface(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001382 SkPaint* target) {
1383 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE)) {
1384 Json::Value jsonTypeface = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE];
1385 Json::Value jsonData = jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA];
1386 const void* data;
1387 Json::ArrayIndex length = decode_data(jsonData, urlDataManager, &data);
1388 SkMemoryStream buffer(data, length);
bungeman13b9c952016-05-12 10:09:30 -07001389 target->setTypeface(SkTypeface::MakeDeserialize(&buffer));
ethannicholasf62a8b72016-02-11 10:35:21 -08001390 }
1391}
1392
halcanaryf412f092016-08-25 11:10:41 -07001393static void extract_json_paint_hinting(Json::Value& jsonPaint, SkPaint* target) {
1394 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_HINTING)) {
1395 const char* hinting = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_HINTING].asCString();
1396 if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_NONE)) {
1397 target->setHinting(SkPaint::kNo_Hinting);
1398 } else if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_SLIGHT)) {
1399 target->setHinting(SkPaint::kSlight_Hinting);
1400 } else if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_NORMAL)) {
1401 target->setHinting(SkPaint::kNormal_Hinting);
1402 } else if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_FULL)) {
1403 target->setHinting(SkPaint::kFull_Hinting);
1404 }
1405 }
1406}
1407
ethannicholas50a8dd02016-02-10 05:40:46 -08001408static void extract_json_paint_style(Json::Value& jsonPaint, SkPaint* target) {
1409 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STYLE)) {
1410 const char* style = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STYLE].asCString();
1411 if (!strcmp(style, SKDEBUGCANVAS_STYLE_FILL)) {
1412 target->setStyle(SkPaint::kFill_Style);
1413 }
1414 else if (!strcmp(style, SKDEBUGCANVAS_STYLE_STROKE)) {
1415 target->setStyle(SkPaint::kStroke_Style);
1416 }
1417 else if (!strcmp(style, SKDEBUGCANVAS_STYLE_STROKEANDFILL)) {
1418 target->setStyle(SkPaint::kStrokeAndFill_Style);
1419 }
1420 }
1421}
1422
1423static void extract_json_paint_strokewidth(Json::Value& jsonPaint, SkPaint* target) {
1424 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH)) {
1425 float strokeWidth = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH].asFloat();
1426 target->setStrokeWidth(strokeWidth);
halcanary9d524f22016-03-29 09:03:52 -07001427 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001428}
1429
1430static void extract_json_paint_strokemiter(Json::Value& jsonPaint, SkPaint* target) {
1431 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER)) {
1432 float strokeMiter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER].asFloat();
1433 target->setStrokeMiter(strokeMiter);
halcanary9d524f22016-03-29 09:03:52 -07001434 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001435}
1436
ethannicholas1446a9a2016-02-10 14:05:02 -08001437static void extract_json_paint_strokejoin(Json::Value& jsonPaint, SkPaint* target) {
1438 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN)) {
1439 const char* join = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN].asCString();
1440 if (!strcmp(join, SKDEBUGCANVAS_MITER_JOIN)) {
1441 target->setStrokeJoin(SkPaint::kMiter_Join);
1442 }
1443 else if (!strcmp(join, SKDEBUGCANVAS_ROUND_JOIN)) {
1444 target->setStrokeJoin(SkPaint::kRound_Join);
1445 }
1446 else if (!strcmp(join, SKDEBUGCANVAS_BEVEL_JOIN)) {
1447 target->setStrokeJoin(SkPaint::kBevel_Join);
1448 }
1449 else {
1450 SkASSERT(false);
1451 }
1452 }
1453}
1454
ethannicholas50a8dd02016-02-10 05:40:46 -08001455static void extract_json_paint_cap(Json::Value& jsonPaint, SkPaint* target) {
1456 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_CAP)) {
1457 const char* cap = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_CAP].asCString();
1458 if (!strcmp(cap, SKDEBUGCANVAS_CAP_BUTT)) {
1459 target->setStrokeCap(SkPaint::kButt_Cap);
1460 }
1461 else if (!strcmp(cap, SKDEBUGCANVAS_CAP_ROUND)) {
1462 target->setStrokeCap(SkPaint::kRound_Cap);
1463 }
1464 else if (!strcmp(cap, SKDEBUGCANVAS_CAP_SQUARE)) {
1465 target->setStrokeCap(SkPaint::kSquare_Cap);
1466 }
1467 }
1468}
1469
ethannicholas1446a9a2016-02-10 14:05:02 -08001470static void extract_json_paint_filterquality(Json::Value& jsonPaint, SkPaint* target) {
1471 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY)) {
1472 const char* quality = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY].asCString();
1473 if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_NONE)) {
1474 target->setFilterQuality(kNone_SkFilterQuality);
1475 }
1476 else if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_LOW)) {
1477 target->setFilterQuality(kLow_SkFilterQuality);
1478 }
1479 else if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_MEDIUM)) {
1480 target->setFilterQuality(kMedium_SkFilterQuality);
1481 }
1482 else if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_HIGH)) {
1483 target->setFilterQuality(kHigh_SkFilterQuality);
1484 }
1485 }
1486}
1487
ethannicholas50a8dd02016-02-10 05:40:46 -08001488static void extract_json_paint_antialias(Json::Value& jsonPaint, SkPaint* target) {
1489 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS)) {
1490 target->setAntiAlias(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
1491 }
1492}
1493
ethannicholas1446a9a2016-02-10 14:05:02 -08001494static void extract_json_paint_dither(Json::Value& jsonPaint, SkPaint* target) {
1495 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_DITHER)) {
1496 target->setDither(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_DITHER].asBool());
1497 }
1498}
1499
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001500static void extract_json_paint_fakeboldtext(Json::Value& jsonPaint, SkPaint* target) {
1501 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT)) {
1502 target->setFakeBoldText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT].asBool());
1503 }
1504}
1505
1506static void extract_json_paint_lineartext(Json::Value& jsonPaint, SkPaint* target) {
1507 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT)) {
1508 target->setLinearText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT].asBool());
1509 }
1510}
1511
1512static void extract_json_paint_subpixeltext(Json::Value& jsonPaint, SkPaint* target) {
1513 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT)) {
1514 target->setSubpixelText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT].asBool());
1515 }
1516}
1517
1518static void extract_json_paint_devkerntext(Json::Value& jsonPaint, SkPaint* target) {
1519 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT)) {
1520 target->setDevKernText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT].asBool());
1521 }
1522}
1523
1524static void extract_json_paint_lcdrendertext(Json::Value& jsonPaint, SkPaint* target) {
1525 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT)) {
1526 target->setLCDRenderText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT].asBool());
1527 }
1528}
1529
1530static void extract_json_paint_embeddedbitmaptext(Json::Value& jsonPaint, SkPaint* target) {
1531 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT)) {
1532 target->setEmbeddedBitmapText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT].asBool());
1533 }
1534}
1535
1536static void extract_json_paint_autohinting(Json::Value& jsonPaint, SkPaint* target) {
1537 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING)) {
1538 target->setAutohinted(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING].asBool());
1539 }
1540}
1541
1542static void extract_json_paint_verticaltext(Json::Value& jsonPaint, SkPaint* target) {
1543 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT)) {
1544 target->setVerticalText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT].asBool());
1545 }
1546}
1547
ethannicholas50a8dd02016-02-10 05:40:46 -08001548static void extract_json_paint_blur(Json::Value& jsonPaint, SkPaint* target) {
1549 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_BLUR)) {
1550 Json::Value blur = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_BLUR];
1551 SkScalar sigma = blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA].asFloat();
1552 SkBlurStyle style;
1553 const char* jsonStyle = blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE].asCString();
1554 if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_NORMAL)) {
1555 style = SkBlurStyle::kNormal_SkBlurStyle;
1556 }
1557 else if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_SOLID)) {
1558 style = SkBlurStyle::kSolid_SkBlurStyle;
1559 }
1560 else if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_OUTER)) {
1561 style = SkBlurStyle::kOuter_SkBlurStyle;
1562 }
1563 else if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_INNER)) {
1564 style = SkBlurStyle::kInner_SkBlurStyle;
1565 }
1566 else {
1567 SkASSERT(false);
1568 style = SkBlurStyle::kNormal_SkBlurStyle;
1569 }
1570 SkBlurMaskFilter::BlurFlags flags;
1571 const char* jsonQuality = blur[SKDEBUGCANVAS_ATTRIBUTE_QUALITY].asCString();
1572 if (!strcmp(jsonQuality, SKDEBUGCANVAS_BLURQUALITY_LOW)) {
1573 flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag;
1574 }
1575 else if (!strcmp(jsonQuality, SKDEBUGCANVAS_BLURQUALITY_HIGH)) {
1576 flags = SkBlurMaskFilter::BlurFlags::kHighQuality_BlurFlag;
1577 }
1578 else {
1579 SkASSERT(false);
1580 flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag;
1581 }
reedefdfd512016-04-04 10:02:58 -07001582 target->setMaskFilter(SkBlurMaskFilter::Make(style, sigma, flags));
ethannicholas50a8dd02016-02-10 05:40:46 -08001583 }
1584}
1585
1586static void extract_json_paint_dashing(Json::Value& jsonPaint, SkPaint* target) {
1587 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_DASHING)) {
1588 Json::Value dash = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_DASHING];
1589 Json::Value jsonIntervals = dash[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS];
1590 Json::ArrayIndex count = jsonIntervals.size();
1591 SkScalar* intervals = (SkScalar*) sk_malloc_throw(count * sizeof(SkScalar));
1592 for (Json::ArrayIndex i = 0; i < count; i++) {
1593 intervals[i] = jsonIntervals[i].asFloat();
1594 }
1595 SkScalar phase = dash[SKDEBUGCANVAS_ATTRIBUTE_PHASE].asFloat();
reeda4393342016-03-18 11:22:57 -07001596 target->setPathEffect(SkDashPathEffect::Make(intervals, count, phase));
ethannicholas50a8dd02016-02-10 05:40:46 -08001597 sk_free(intervals);
1598 }
1599}
1600
1601static void extract_json_paint_textalign(Json::Value& jsonPaint, SkPaint* target) {
1602 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN)) {
1603 SkPaint::Align textAlign;
1604 const char* jsonAlign = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN].asCString();
1605 if (!strcmp(jsonAlign, SKDEBUGCANVAS_ALIGN_LEFT)) {
1606 textAlign = SkPaint::kLeft_Align;
1607 }
1608 else if (!strcmp(jsonAlign, SKDEBUGCANVAS_ALIGN_CENTER)) {
1609 textAlign = SkPaint::kCenter_Align;
1610 }
1611 else if (!strcmp(jsonAlign, SKDEBUGCANVAS_ALIGN_RIGHT)) {
1612 textAlign = SkPaint::kRight_Align;
1613 }
1614 else {
1615 SkASSERT(false);
1616 textAlign = SkPaint::kLeft_Align;
1617 }
1618 target->setTextAlign(textAlign);
1619 }
1620}
1621
1622static void extract_json_paint_textsize(Json::Value& jsonPaint, SkPaint* target) {
1623 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE)) {
1624 float textSize = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE].asFloat();
1625 target->setTextSize(textSize);
1626 }
1627}
1628
1629static void extract_json_paint_textscalex(Json::Value& jsonPaint, SkPaint* target) {
1630 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX)) {
1631 float textScaleX = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX].asFloat();
1632 target->setTextScaleX(textScaleX);
1633 }
1634}
1635
1636static void extract_json_paint_textskewx(Json::Value& jsonPaint, SkPaint* target) {
1637 if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX)) {
1638 float textSkewX = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX].asFloat();
1639 target->setTextSkewX(textSkewX);
1640 }
1641}
1642
halcanary9d524f22016-03-29 09:03:52 -07001643static void extract_json_paint(Json::Value& paint, UrlDataManager& urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001644 SkPaint* result) {
halcanaryf412f092016-08-25 11:10:41 -07001645 extract_json_paint_hinting(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001646 extract_json_paint_color(paint, result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001647 extract_json_paint_shader(paint, urlDataManager, result);
1648 extract_json_paint_patheffect(paint, urlDataManager, result);
1649 extract_json_paint_maskfilter(paint, urlDataManager, result);
1650 extract_json_paint_colorfilter(paint, urlDataManager, result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001651 extract_json_paint_looper(paint, urlDataManager, result);
1652 extract_json_paint_imagefilter(paint, urlDataManager, result);
1653 extract_json_paint_typeface(paint, urlDataManager, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001654 extract_json_paint_style(paint, result);
Florin Malita82d80872017-06-06 16:58:40 -04001655 extract_json_paint_blend_mode(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001656 extract_json_paint_strokewidth(paint, result);
1657 extract_json_paint_strokemiter(paint, result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001658 extract_json_paint_strokejoin(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001659 extract_json_paint_cap(paint, result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001660 extract_json_paint_filterquality(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001661 extract_json_paint_antialias(paint, result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001662 extract_json_paint_dither(paint, result);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001663 extract_json_paint_fakeboldtext(paint, result);
1664 extract_json_paint_lineartext(paint, result);
1665 extract_json_paint_subpixeltext(paint, result);
1666 extract_json_paint_devkerntext(paint, result);
1667 extract_json_paint_lcdrendertext(paint, result);
1668 extract_json_paint_embeddedbitmaptext(paint, result);
1669 extract_json_paint_autohinting(paint, result);
1670 extract_json_paint_verticaltext(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001671 extract_json_paint_blur(paint, result);
1672 extract_json_paint_dashing(paint, result);
1673 extract_json_paint_textalign(paint, result);
1674 extract_json_paint_textsize(paint, result);
1675 extract_json_paint_textscalex(paint, result);
1676 extract_json_paint_textskewx(paint, result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001677}
1678
1679static void extract_json_rect(Json::Value& rect, SkRect* result) {
1680 result->set(rect[0].asFloat(), rect[1].asFloat(), rect[2].asFloat(), rect[3].asFloat());
1681}
1682
1683static void extract_json_irect(Json::Value& rect, SkIRect* result) {
1684 result->set(rect[0].asInt(), rect[1].asInt(), rect[2].asInt(), rect[3].asInt());
1685}
1686
1687static void extract_json_rrect(Json::Value& rrect, SkRRect* result) {
1688 SkVector radii[4] = {
halcanary9d524f22016-03-29 09:03:52 -07001689 { rrect[1][0].asFloat(), rrect[1][1].asFloat() },
1690 { rrect[2][0].asFloat(), rrect[2][1].asFloat() },
1691 { rrect[3][0].asFloat(), rrect[3][1].asFloat() },
ethannicholas50a8dd02016-02-10 05:40:46 -08001692 { rrect[4][0].asFloat(), rrect[4][1].asFloat() }
1693 };
halcanary9d524f22016-03-29 09:03:52 -07001694 result->setRectRadii(SkRect::MakeLTRB(rrect[0][0].asFloat(), rrect[0][1].asFloat(),
1695 rrect[0][2].asFloat(), rrect[0][3].asFloat()),
ethannicholas50a8dd02016-02-10 05:40:46 -08001696 radii);
1697}
1698
1699static void extract_json_matrix(Json::Value& matrix, SkMatrix* result) {
halcanary9d524f22016-03-29 09:03:52 -07001700 SkScalar values[] = {
ethannicholas50a8dd02016-02-10 05:40:46 -08001701 matrix[0][0].asFloat(), matrix[0][1].asFloat(), matrix[0][2].asFloat(),
1702 matrix[1][0].asFloat(), matrix[1][1].asFloat(), matrix[1][2].asFloat(),
halcanary9d524f22016-03-29 09:03:52 -07001703 matrix[2][0].asFloat(), matrix[2][1].asFloat(), matrix[2][2].asFloat()
ethannicholas50a8dd02016-02-10 05:40:46 -08001704 };
1705 result->set9(values);
1706}
1707
1708static void extract_json_path(Json::Value& path, SkPath* result) {
1709 const char* fillType = path[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE].asCString();
1710 if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_WINDING)) {
1711 result->setFillType(SkPath::kWinding_FillType);
1712 }
1713 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_EVENODD)) {
1714 result->setFillType(SkPath::kEvenOdd_FillType);
1715 }
1716 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING)) {
1717 result->setFillType(SkPath::kInverseWinding_FillType);
1718 }
1719 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD)) {
1720 result->setFillType(SkPath::kInverseEvenOdd_FillType);
1721 }
1722 Json::Value verbs = path[SKDEBUGCANVAS_ATTRIBUTE_VERBS];
1723 for (Json::ArrayIndex i = 0; i < verbs.size(); i++) {
1724 Json::Value verb = verbs[i];
1725 if (verb.isString()) {
1726 SkASSERT(!strcmp(verb.asCString(), SKDEBUGCANVAS_VERB_CLOSE));
1727 result->close();
1728 }
1729 else {
1730 if (verb.isMember(SKDEBUGCANVAS_VERB_MOVE)) {
1731 Json::Value move = verb[SKDEBUGCANVAS_VERB_MOVE];
1732 result->moveTo(move[0].asFloat(), move[1].asFloat());
1733 }
1734 else if (verb.isMember(SKDEBUGCANVAS_VERB_LINE)) {
1735 Json::Value line = verb[SKDEBUGCANVAS_VERB_LINE];
1736 result->lineTo(line[0].asFloat(), line[1].asFloat());
1737 }
1738 else if (verb.isMember(SKDEBUGCANVAS_VERB_QUAD)) {
1739 Json::Value quad = verb[SKDEBUGCANVAS_VERB_QUAD];
1740 result->quadTo(quad[0][0].asFloat(), quad[0][1].asFloat(),
1741 quad[1][0].asFloat(), quad[1][1].asFloat());
1742 }
1743 else if (verb.isMember(SKDEBUGCANVAS_VERB_CUBIC)) {
1744 Json::Value cubic = verb[SKDEBUGCANVAS_VERB_CUBIC];
1745 result->cubicTo(cubic[0][0].asFloat(), cubic[0][1].asFloat(),
1746 cubic[1][0].asFloat(), cubic[1][1].asFloat(),
1747 cubic[2][0].asFloat(), cubic[2][1].asFloat());
1748 }
1749 else if (verb.isMember(SKDEBUGCANVAS_VERB_CONIC)) {
1750 Json::Value conic = verb[SKDEBUGCANVAS_VERB_CONIC];
1751 result->conicTo(conic[0][0].asFloat(), conic[0][1].asFloat(),
1752 conic[1][0].asFloat(), conic[1][1].asFloat(),
1753 conic[2].asFloat());
1754 }
1755 else {
1756 SkASSERT(false);
1757 }
1758 }
1759 }
1760}
1761
Mike Reedc1f77742016-12-09 09:00:50 -05001762SkClipOp get_json_clipop(Json::Value& jsonOp) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001763 const char* op = jsonOp.asCString();
1764 if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_DIFFERENCE)) {
Mike Reedc1f77742016-12-09 09:00:50 -05001765 return kDifference_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001766 }
1767 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_INTERSECT)) {
Mike Reedc1f77742016-12-09 09:00:50 -05001768 return kIntersect_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001769 }
1770 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_UNION)) {
Mike Reedc1f77742016-12-09 09:00:50 -05001771 return kUnion_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001772 }
1773 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_XOR)) {
Mike Reedc1f77742016-12-09 09:00:50 -05001774 return kXOR_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001775 }
1776 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE)) {
Mike Reedc1f77742016-12-09 09:00:50 -05001777 return kReverseDifference_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001778 }
1779 else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_REPLACE)) {
Mike Reedc1f77742016-12-09 09:00:50 -05001780 return kReplace_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001781 }
1782 SkASSERT(false);
Mike Reedc1f77742016-12-09 09:00:50 -05001783 return kIntersect_SkClipOp;
ethannicholas50a8dd02016-02-10 05:40:46 -08001784}
1785
ethannicholas1446a9a2016-02-10 14:05:02 -08001786SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kDrawClear_OpType) {
1787 fColor = color;
1788 fInfo.push(SkObjectParser::CustomTextToString("No Parameters"));
1789}
1790
1791void SkClearCommand::execute(SkCanvas* canvas) const {
1792 canvas->clear(fColor);
1793}
1794
ethannicholasf62a8b72016-02-11 10:35:21 -08001795Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1796 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001797 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001798 return result;
1799}
1800
ethannicholasf62a8b72016-02-11 10:35:21 -08001801 SkClearCommand* SkClearCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001802 Json::Value color = command[SKDEBUGCANVAS_ATTRIBUTE_COLOR];
1803 return new SkClearCommand(get_json_color(color));
1804}
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001805
Mike Reedc1f77742016-12-09 09:00:50 -05001806SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001807 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001808 fPath = path;
1809 fOp = op;
1810 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001811
robertphillips@google.com91217d02013-03-17 18:33:46 +00001812 fInfo.push(SkObjectParser::PathToString(path));
reed73603f32016-09-20 08:42:38 -07001813 fInfo.push(SkObjectParser::ClipOpToString(op));
robertphillips@google.com91217d02013-03-17 18:33:46 +00001814 fInfo.push(SkObjectParser::BoolToString(doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +00001815}
1816
fmalita8c89c522014-11-08 16:18:56 -08001817void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001818 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001819}
1820
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001821bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001822 render_path(canvas, fPath);
1823 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001824}
1825
ethannicholasf62a8b72016-02-11 10:35:21 -08001826Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1827 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001828 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001829 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1830 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1831 return result;
1832}
1833
halcanary9d524f22016-03-29 09:03:52 -07001834SkClipPathCommand* SkClipPathCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001835 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001836 SkPath path;
1837 extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path);
reed73603f32016-09-20 08:42:38 -07001838 return new SkClipPathCommand(path, get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]),
ethannicholas50a8dd02016-02-10 05:40:46 -08001839 command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
1840}
1841
Mike Reedc1f77742016-12-09 09:00:50 -05001842SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001843 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001844 fRegion = region;
1845 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001846
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001847 fInfo.push(SkObjectParser::RegionToString(region));
reed73603f32016-09-20 08:42:38 -07001848 fInfo.push(SkObjectParser::ClipOpToString(op));
chudy@google.com902ebe52012-06-29 14:21:22 +00001849}
1850
fmalita8c89c522014-11-08 16:18:56 -08001851void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001852 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001853}
1854
ethannicholasf62a8b72016-02-11 10:35:21 -08001855Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1856 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001857 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001858 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1859 return result;
1860}
1861
halcanary9d524f22016-03-29 09:03:52 -07001862SkClipRegionCommand* SkClipRegionCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001863 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001864 SkASSERT(false);
1865 return nullptr;
1866}
1867
Mike Reedc1f77742016-12-09 09:00:50 -05001868SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001869 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001870 fRect = rect;
1871 fOp = op;
1872 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001873
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001874 fInfo.push(SkObjectParser::RectToString(rect));
reed73603f32016-09-20 08:42:38 -07001875 fInfo.push(SkObjectParser::ClipOpToString(op));
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001876 fInfo.push(SkObjectParser::BoolToString(doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +00001877}
1878
fmalita8c89c522014-11-08 16:18:56 -08001879void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001880 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001881}
1882
ethannicholasf62a8b72016-02-11 10:35:21 -08001883Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1884 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001885 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001886 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1887 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001888
1889 SkString desc;
1890 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1891
ethannicholas50a8dd02016-02-10 05:40:46 -08001892 return result;
1893}
1894
halcanary9d524f22016-03-29 09:03:52 -07001895SkClipRectCommand* SkClipRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001896 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001897 SkRect rect;
1898 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rect);
reed73603f32016-09-20 08:42:38 -07001899 return new SkClipRectCommand(rect, get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]),
ethannicholas50a8dd02016-02-10 05:40:46 -08001900 command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
1901}
1902
Mike Reedc1f77742016-12-09 09:00:50 -05001903SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001904 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001905 fRRect = rrect;
1906 fOp = op;
1907 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001908
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001909 fInfo.push(SkObjectParser::RRectToString(rrect));
reed73603f32016-09-20 08:42:38 -07001910 fInfo.push(SkObjectParser::ClipOpToString(op));
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001911 fInfo.push(SkObjectParser::BoolToString(doAA));
robertphillips@google.com67baba42013-01-02 20:20:31 +00001912}
1913
fmalita8c89c522014-11-08 16:18:56 -08001914void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001915 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001916}
1917
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001918bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001919 render_rrect(canvas, fRRect);
1920 return true;
1921}
1922
ethannicholasf62a8b72016-02-11 10:35:21 -08001923Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1924 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001925 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1926 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1927 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1928 return result;
1929}
1930
halcanary9d524f22016-03-29 09:03:52 -07001931SkClipRRectCommand* SkClipRRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08001932 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001933 SkRRect rrect;
1934 extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rrect);
halcanary9d524f22016-03-29 09:03:52 -07001935 return new SkClipRRectCommand(rrect,
reed73603f32016-09-20 08:42:38 -07001936 get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]),
ethannicholas50a8dd02016-02-10 05:40:46 -08001937 command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
1938}
1939
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001940SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001941 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001942 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001943
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001944 fInfo.push(SkObjectParser::MatrixToString(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +00001945}
1946
fmalita8c89c522014-11-08 16:18:56 -08001947void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001948 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001949}
1950
ethannicholasf62a8b72016-02-11 10:35:21 -08001951Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1952 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001953 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001954 return result;
1955}
1956
ethannicholasf62a8b72016-02-11 10:35:21 -08001957SkConcatCommand* SkConcatCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001958 SkMatrix matrix;
1959 extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix);
1960 return new SkConcatCommand(matrix);
1961}
1962
reed97660cc2016-06-28 18:54:19 -07001963////
1964
1965SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1966 sk_sp<SkData> value)
1967 : INHERITED(kDrawAnnotation_OpType)
1968 , fRect(rect)
1969 , fKey(key)
1970 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001971{
1972 SkString str;
1973 str.appendf("Key: %s Value: ", key);
1974 if (fValue && fValue->size()) {
1975 str.append((const char*) fValue->bytes(), fValue->size());
1976 } else {
1977 str.appendf("no value");
1978 }
1979 str.appendf("\n");
1980 fInfo.push(new SkString(str));
1981}
reed97660cc2016-06-28 18:54:19 -07001982
1983void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1984 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1985}
1986
1987Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1988 Json::Value result = INHERITED::toJSON(urlDataManager);
1989
1990 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1991 result["key"] = Json::Value(fKey.c_str());
1992 if (fValue.get()) {
1993 // TODO: dump out the "value"
1994 }
reed67f62fa2016-06-29 11:36:34 -07001995
1996 SkString desc;
1997 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1998 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1999
reed97660cc2016-06-28 18:54:19 -07002000 return result;
2001}
2002
2003SkDrawAnnotationCommand* SkDrawAnnotationCommand::fromJSON(Json::Value& command,
2004 UrlDataManager& urlDataManager) {
2005 SkRect rect;
2006 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rect);
2007 sk_sp<SkData> data(nullptr); // TODO: extract "value" from the Json
2008 return new SkDrawAnnotationCommand(rect, command["key"].asCString(), data);
2009}
2010
2011////
2012
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002013SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07002014 const SkPaint* paint)
robertphillips9bafc302015-02-13 11:13:00 -08002015 : INHERITED(kDrawBitmap_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002016 fBitmap = bitmap;
2017 fLeft = left;
2018 fTop = top;
bsalomon49f085d2014-09-05 13:34:00 -07002019 if (paint) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002020 fPaint = *paint;
2021 fPaintPtr = &fPaint;
2022 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07002023 fPaintPtr = nullptr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002024 }
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002025
2026 fInfo.push(SkObjectParser::BitmapToString(bitmap));
2027 fInfo.push(SkObjectParser::ScalarToString(left, "SkScalar left: "));
2028 fInfo.push(SkObjectParser::ScalarToString(top, "SkScalar top: "));
bsalomon49f085d2014-09-05 13:34:00 -07002029 if (paint) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002030 fInfo.push(SkObjectParser::PaintToString(*paint));
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00002031 }
chudy@google.com902ebe52012-06-29 14:21:22 +00002032}
2033
fmalita8c89c522014-11-08 16:18:56 -08002034void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002035 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaintPtr);
chudy@google.com902ebe52012-06-29 14:21:22 +00002036}
2037
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002038bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002039 render_bitmap(canvas, fBitmap);
2040 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00002041}
2042
ethannicholasf62a8b72016-02-11 10:35:21 -08002043Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
2044 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002045 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002046 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002047 Json::Value command(Json::objectValue);
2048 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07002049 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08002050 if (fPaintPtr != nullptr) {
brianosmanfad98562016-05-04 11:06:28 -07002051 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002052 }
2053 }
2054 return result;
2055}
2056
halcanary9d524f22016-03-29 09:03:52 -07002057SkDrawBitmapCommand* SkDrawBitmapCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002058 UrlDataManager& urlDataManager) {
2059 SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002060 if (bitmap == nullptr) {
2061 return nullptr;
2062 }
2063 Json::Value point = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
2064 SkPaint* paintPtr;
2065 SkPaint paint;
2066 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002067 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002068 paintPtr = &paint;
2069 }
2070 else {
2071 paintPtr = nullptr;
2072 }
halcanary9d524f22016-03-29 09:03:52 -07002073 SkDrawBitmapCommand* result = new SkDrawBitmapCommand(*bitmap, point[0].asFloat(),
ethannicholas50a8dd02016-02-10 05:40:46 -08002074 point[1].asFloat(), paintPtr);
2075 delete bitmap;
2076 return result;
2077}
2078
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002079SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00002080 const SkRect& dst, const SkPaint* paint)
robertphillips9bafc302015-02-13 11:13:00 -08002081 : INHERITED(kDrawBitmapNine_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002082 fBitmap = bitmap;
2083 fCenter = center;
2084 fDst = dst;
bsalomon49f085d2014-09-05 13:34:00 -07002085 if (paint) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002086 fPaint = *paint;
2087 fPaintPtr = &fPaint;
2088 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07002089 fPaintPtr = nullptr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002090 }
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002091
2092 fInfo.push(SkObjectParser::BitmapToString(bitmap));
2093 fInfo.push(SkObjectParser::IRectToString(center));
2094 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
bsalomon49f085d2014-09-05 13:34:00 -07002095 if (paint) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002096 fInfo.push(SkObjectParser::PaintToString(*paint));
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00002097 }
chudy@google.com902ebe52012-06-29 14:21:22 +00002098}
2099
fmalita8c89c522014-11-08 16:18:56 -08002100void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00002101 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaintPtr);
chudy@google.com902ebe52012-06-29 14:21:22 +00002102}
2103
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002104bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08002105 SkRect tmp = SkRect::Make(fCenter);
2106 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002107 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00002108}
2109
ethannicholasf62a8b72016-02-11 10:35:21 -08002110Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
2111 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002112 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002113 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002114 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08002115 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07002116 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08002117 if (fPaintPtr != nullptr) {
brianosmanfad98562016-05-04 11:06:28 -07002118 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002119 }
2120 }
2121 return result;
2122}
2123
halcanary9d524f22016-03-29 09:03:52 -07002124SkDrawBitmapNineCommand* SkDrawBitmapNineCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002125 UrlDataManager& urlDataManager) {
2126 SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002127 if (bitmap == nullptr) {
2128 return nullptr;
2129 }
2130 SkIRect center;
2131 extract_json_irect(command[SKDEBUGCANVAS_ATTRIBUTE_CENTER], &center);
2132 SkRect dst;
2133 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst);
2134 SkPaint* paintPtr;
2135 SkPaint paint;
2136 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002137 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002138 paintPtr = &paint;
2139 }
2140 else {
2141 paintPtr = nullptr;
2142 }
2143 SkDrawBitmapNineCommand* result = new SkDrawBitmapNineCommand(*bitmap, center, dst, paintPtr);
2144 delete bitmap;
2145 return result;
2146}
2147
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002148SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00002149 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07002150 SkCanvas::SrcRectConstraint constraint)
robertphillips9bafc302015-02-13 11:13:00 -08002151 : INHERITED(kDrawBitmapRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002152 fBitmap = bitmap;
bsalomon49f085d2014-09-05 13:34:00 -07002153 if (src) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002154 fSrc = *src;
2155 } else {
2156 fSrc.setEmpty();
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00002157 }
robertphillips@google.com91217d02013-03-17 18:33:46 +00002158 fDst = dst;
2159
bsalomon49f085d2014-09-05 13:34:00 -07002160 if (paint) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002161 fPaint = *paint;
2162 fPaintPtr = &fPaint;
2163 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07002164 fPaintPtr = nullptr;
robertphillips@google.com91217d02013-03-17 18:33:46 +00002165 }
reeda5517e22015-07-14 10:54:12 -07002166 fConstraint = constraint;
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00002167
robertphillips@google.com91217d02013-03-17 18:33:46 +00002168 fInfo.push(SkObjectParser::BitmapToString(bitmap));
bsalomon49f085d2014-09-05 13:34:00 -07002169 if (src) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002170 fInfo.push(SkObjectParser::RectToString(*src, "Src: "));
2171 }
2172 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
bsalomon49f085d2014-09-05 13:34:00 -07002173 if (paint) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002174 fInfo.push(SkObjectParser::PaintToString(*paint));
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00002175 }
reeda5517e22015-07-14 10:54:12 -07002176 fInfo.push(SkObjectParser::IntToString(fConstraint, "Constraint: "));
chudy@google.com902ebe52012-06-29 14:21:22 +00002177}
2178
fmalita8c89c522014-11-08 16:18:56 -08002179void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
reede47829b2015-08-06 10:02:53 -07002180 canvas->legacy_drawBitmapRect(fBitmap, this->srcRect(), fDst, fPaintPtr, fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002181}
2182
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002183bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002184 render_bitmap(canvas, fBitmap, this->srcRect());
2185 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00002186}
2187
ethannicholasf62a8b72016-02-11 10:35:21 -08002188Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2189 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002190 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002191 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002192 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
2193 if (!fSrc.isEmpty()) {
brianosmanfad98562016-05-04 11:06:28 -07002194 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(fSrc);
ethannicholas50a8dd02016-02-10 05:40:46 -08002195 }
brianosmanfad98562016-05-04 11:06:28 -07002196 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08002197 if (fPaintPtr != nullptr) {
brianosmanfad98562016-05-04 11:06:28 -07002198 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002199 }
2200 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
2201 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
2202 }
2203 }
reed67f62fa2016-06-29 11:36:34 -07002204
2205 SkString desc;
2206 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
2207
ethannicholas50a8dd02016-02-10 05:40:46 -08002208 return result;
2209}
2210
halcanary9d524f22016-03-29 09:03:52 -07002211SkDrawBitmapRectCommand* SkDrawBitmapRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002212 UrlDataManager& urlDataManager) {
2213 SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002214 if (bitmap == nullptr) {
2215 return nullptr;
2216 }
2217 SkRect dst;
2218 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst);
2219 SkPaint* paintPtr;
2220 SkPaint paint;
2221 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002222 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002223 paintPtr = &paint;
2224 }
2225 else {
2226 paintPtr = nullptr;
2227 }
2228 SkCanvas::SrcRectConstraint constraint;
halcanary9d524f22016-03-29 09:03:52 -07002229 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_STRICT) &&
ethannicholas50a8dd02016-02-10 05:40:46 -08002230 command[SKDEBUGCANVAS_ATTRIBUTE_STRICT].asBool()) {
2231 constraint = SkCanvas::kStrict_SrcRectConstraint;
2232 }
2233 else {
2234 constraint = SkCanvas::kFast_SrcRectConstraint;
2235 }
2236 SkRect* srcPtr;
2237 SkRect src;
2238 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_SRC)) {
2239 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_SRC], &src);
2240 srcPtr = &src;
2241 }
2242 else {
2243 srcPtr = nullptr;
2244 }
2245 SkDrawBitmapRectCommand* result = new SkDrawBitmapRectCommand(*bitmap, srcPtr, dst, paintPtr,
2246 constraint);
2247 delete bitmap;
2248 return result;
2249}
2250
fmalita651c9202015-07-22 10:23:01 -07002251SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
2252 const SkPaint* paint)
2253 : INHERITED(kDrawImage_OpType)
2254 , fImage(SkRef(image))
2255 , fLeft(left)
2256 , fTop(top) {
2257
fmalita7361bf02015-10-29 12:13:48 -07002258 fInfo.push(SkObjectParser::ImageToString(image));
2259 fInfo.push(SkObjectParser::ScalarToString(left, "Left: "));
2260 fInfo.push(SkObjectParser::ScalarToString(top, "Top: "));
2261
fmalita651c9202015-07-22 10:23:01 -07002262 if (paint) {
2263 fPaint.set(*paint);
fmalita7361bf02015-10-29 12:13:48 -07002264 fInfo.push(SkObjectParser::PaintToString(*paint));
fmalita651c9202015-07-22 10:23:01 -07002265 }
2266}
2267
2268void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04002269 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07002270}
2271
2272bool SkDrawImageCommand::render(SkCanvas* canvas) const {
2273 SkAutoCanvasRestore acr(canvas, true);
2274 canvas->clear(0xFFFFFFFF);
2275
2276 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
2277 SkIntToScalar(fImage->width()),
2278 SkIntToScalar(fImage->height())));
2279 this->execute(canvas);
2280 return true;
2281}
2282
ethannicholasf62a8b72016-02-11 10:35:21 -08002283Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
2284 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002285 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002286 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002287 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07002288 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08002289 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07002290 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002291 }
msarett0ac1bec2016-08-29 09:15:33 -07002292
2293 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
2294 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
2295 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
2296 switch (fImage->alphaType()) {
2297 case kOpaque_SkAlphaType:
2298 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
2299 break;
2300 case kPremul_SkAlphaType:
2301 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
2302 break;
2303 case kUnpremul_SkAlphaType:
2304 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
2305 break;
2306 default:
2307 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
2308 break;
2309 }
ethannicholas50a8dd02016-02-10 05:40:46 -08002310 }
2311 return result;
2312}
2313
halcanary9d524f22016-03-29 09:03:52 -07002314SkDrawImageCommand* SkDrawImageCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002315 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -07002316 sk_sp<SkImage> image = load_image(command[SKDEBUGCANVAS_ATTRIBUTE_IMAGE], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002317 if (image == nullptr) {
2318 return nullptr;
2319 }
2320 Json::Value point = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
2321 SkPaint* paintPtr;
2322 SkPaint paint;
2323 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002324 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002325 paintPtr = &paint;
2326 }
2327 else {
2328 paintPtr = nullptr;
2329 }
reed9ce9d672016-03-17 10:51:11 -07002330 SkDrawImageCommand* result = new SkDrawImageCommand(image.get(), point[0].asFloat(),
ethannicholas50a8dd02016-02-10 05:40:46 -08002331 point[1].asFloat(), paintPtr);
ethannicholas50a8dd02016-02-10 05:40:46 -08002332 return result;
2333}
2334
Stan Ilievac42aeb2017-01-12 16:20:50 -05002335SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
2336 const SkCanvas::Lattice& lattice,
2337 const SkRect& dst, const SkPaint* paint)
2338 : INHERITED(kDrawImageLattice_OpType)
2339 , fImage(SkRef(image))
2340 , fLattice(lattice)
2341 , fDst(dst) {
2342
2343 fInfo.push(SkObjectParser::ImageToString(image));
2344 fInfo.push(SkObjectParser::LatticeToString(lattice));
2345 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
2346 if (paint) {
2347 fPaint.set(*paint);
2348 fInfo.push(SkObjectParser::PaintToString(*paint));
2349 }
2350}
2351
2352void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
2353 SkLatticeIter iter(fLattice, fDst);
2354 SkRect srcR, dstR;
2355 while (iter.next(&srcR, &dstR)) {
2356 canvas->legacy_drawImageRect(fImage.get(), &srcR, dstR,
2357 fPaint.getMaybeNull(), SkCanvas::kStrict_SrcRectConstraint);
2358 }
2359}
2360
2361bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
2362 SkAutoCanvasRestore acr(canvas, true);
2363 canvas->clear(0xFFFFFFFF);
2364
2365 xlate_and_scale_to_bounds(canvas, fDst);
2366
2367 this->execute(canvas);
2368 return true;
2369}
2370
2371Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
2372 Json::Value result = INHERITED::toJSON(urlDataManager);
2373 Json::Value encoded;
2374 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
2375 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
2376 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
2377 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
2378 if (fPaint.isValid()) {
2379 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
2380 }
2381 }
2382
2383 SkString desc;
2384 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
2385
2386 return result;
2387}
2388
fmalita651c9202015-07-22 10:23:01 -07002389SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
2390 const SkRect& dst, const SkPaint* paint,
2391 SkCanvas::SrcRectConstraint constraint)
2392 : INHERITED(kDrawImageRect_OpType)
2393 , fImage(SkRef(image))
2394 , fDst(dst)
2395 , fConstraint(constraint) {
2396
2397 if (src) {
2398 fSrc.set(*src);
2399 }
2400
2401 if (paint) {
2402 fPaint.set(*paint);
2403 }
robertphillips80af6452015-08-24 08:27:38 -07002404
2405 fInfo.push(SkObjectParser::ImageToString(image));
2406 if (src) {
2407 fInfo.push(SkObjectParser::RectToString(*src, "Src: "));
2408 }
2409 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
2410 if (paint) {
2411 fInfo.push(SkObjectParser::PaintToString(*paint));
2412 }
2413 fInfo.push(SkObjectParser::IntToString(fConstraint, "Constraint: "));
fmalita651c9202015-07-22 10:23:01 -07002414}
2415
2416void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04002417 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
2418 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07002419}
2420
2421bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
2422 SkAutoCanvasRestore acr(canvas, true);
2423 canvas->clear(0xFFFFFFFF);
2424
2425 xlate_and_scale_to_bounds(canvas, fDst);
2426
2427 this->execute(canvas);
2428 return true;
2429}
2430
ethannicholasf62a8b72016-02-11 10:35:21 -08002431Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2432 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002433 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08002434 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002435 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
2436 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07002437 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002438 }
brianosmanfad98562016-05-04 11:06:28 -07002439 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08002440 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07002441 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002442 }
2443 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
2444 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
2445 }
2446 }
reed67f62fa2016-06-29 11:36:34 -07002447
2448 SkString desc;
2449 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
2450
ethannicholas50a8dd02016-02-10 05:40:46 -08002451 return result;
2452}
2453
halcanary9d524f22016-03-29 09:03:52 -07002454SkDrawImageRectCommand* SkDrawImageRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002455 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -07002456 sk_sp<SkImage> image = load_image(command[SKDEBUGCANVAS_ATTRIBUTE_IMAGE], urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002457 if (image == nullptr) {
2458 return nullptr;
2459 }
2460 SkRect dst;
2461 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst);
2462 SkPaint* paintPtr;
2463 SkPaint paint;
2464 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08002465 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002466 paintPtr = &paint;
2467 }
2468 else {
2469 paintPtr = nullptr;
2470 }
2471 SkCanvas::SrcRectConstraint constraint;
halcanary9d524f22016-03-29 09:03:52 -07002472 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_STRICT) &&
ethannicholas50a8dd02016-02-10 05:40:46 -08002473 command[SKDEBUGCANVAS_ATTRIBUTE_STRICT].asBool()) {
2474 constraint = SkCanvas::kStrict_SrcRectConstraint;
2475 }
2476 else {
2477 constraint = SkCanvas::kFast_SrcRectConstraint;
2478 }
2479 SkRect* srcPtr;
2480 SkRect src;
2481 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_SRC)) {
2482 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_SRC], &src);
2483 srcPtr = &src;
2484 }
2485 else {
2486 srcPtr = nullptr;
2487 }
reed9ce9d672016-03-17 10:51:11 -07002488 SkDrawImageRectCommand* result = new SkDrawImageRectCommand(image.get(), srcPtr, dst, paintPtr,
ethannicholas50a8dd02016-02-10 05:40:46 -08002489 constraint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002490 return result;
2491}
2492
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002493SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002494 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002495 fOval = oval;
2496 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00002497
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002498 fInfo.push(SkObjectParser::RectToString(oval));
2499 fInfo.push(SkObjectParser::PaintToString(paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +00002500}
2501
fmalita8c89c522014-11-08 16:18:56 -08002502void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002503 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00002504}
2505
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002506bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002507 canvas->clear(0xFFFFFFFF);
2508 canvas->save();
2509
2510 xlate_and_scale_to_bounds(canvas, fOval);
2511
2512 SkPaint p;
2513 p.setColor(SK_ColorBLACK);
2514 p.setStyle(SkPaint::kStroke_Style);
2515
2516 canvas->drawOval(fOval, p);
2517 canvas->restore();
2518
2519 return true;
2520}
2521
ethannicholasf62a8b72016-02-11 10:35:21 -08002522Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
2523 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002524 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
2525 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002526 return result;
2527}
2528
halcanary9d524f22016-03-29 09:03:52 -07002529SkDrawOvalCommand* SkDrawOvalCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002530 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002531 SkRect coords;
2532 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
2533 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002534 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002535 return new SkDrawOvalCommand(coords, paint);
2536}
2537
bsalomonac3aa242016-08-19 11:25:19 -07002538SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
2539 bool useCenter, const SkPaint& paint)
2540 : INHERITED(kDrawOval_OpType) {
2541 fOval = oval;
2542 fStartAngle = startAngle;
2543 fSweepAngle = sweepAngle;
2544 fUseCenter = useCenter;
2545 fPaint = paint;
2546
2547 fInfo.push(SkObjectParser::RectToString(oval));
2548 fInfo.push(SkObjectParser::ScalarToString(startAngle, "StartAngle: "));
2549 fInfo.push(SkObjectParser::ScalarToString(sweepAngle, "SweepAngle: "));
2550 fInfo.push(SkObjectParser::BoolToString(useCenter));
2551 fInfo.push(SkObjectParser::PaintToString(paint));
2552}
2553
2554void SkDrawArcCommand::execute(SkCanvas* canvas) const {
2555 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
2556}
2557
2558bool SkDrawArcCommand::render(SkCanvas* canvas) const {
2559 canvas->clear(0xFFFFFFFF);
2560 canvas->save();
2561
2562 xlate_and_scale_to_bounds(canvas, fOval);
2563
2564 SkPaint p;
2565 p.setColor(SK_ColorBLACK);
2566 p.setStyle(SkPaint::kStroke_Style);
2567
2568 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
2569 canvas->restore();
2570
2571 return true;
2572}
2573
2574Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
2575 Json::Value result = INHERITED::toJSON(urlDataManager);
2576 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
2577 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
2578 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
2579 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
2580 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
2581 return result;
2582}
2583
2584SkDrawArcCommand* SkDrawArcCommand::fromJSON(Json::Value& command,
2585 UrlDataManager& urlDataManager) {
2586 SkRect coords;
2587 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
2588 SkScalar startAngle = command[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE].asFloat();
2589 SkScalar sweepAngle = command[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE].asFloat();
2590 bool useCenter = command[SKDEBUGCANVAS_ATTRIBUTE_USECENTER].asBool();
2591 SkPaint paint;
2592 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
2593 return new SkDrawArcCommand(coords, startAngle, sweepAngle, useCenter, paint);
2594}
2595
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002596SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002597 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002598 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002599
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002600 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002601}
2602
fmalita8c89c522014-11-08 16:18:56 -08002603void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002604 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002605}
2606
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002607bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002608 canvas->clear(0xFFFFFFFF);
2609 canvas->drawPaint(fPaint);
2610 return true;
2611}
2612
ethannicholasf62a8b72016-02-11 10:35:21 -08002613Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
2614 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002615 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002616 return result;
2617}
2618
halcanary9d524f22016-03-29 09:03:52 -07002619SkDrawPaintCommand* SkDrawPaintCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002620 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002621 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002622 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002623 return new SkDrawPaintCommand(paint);
2624}
2625
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002626SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002627 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002628 fPath = path;
2629 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002630
robertphillips@google.com91217d02013-03-17 18:33:46 +00002631 fInfo.push(SkObjectParser::PathToString(path));
2632 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002633}
2634
fmalita8c89c522014-11-08 16:18:56 -08002635void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002636 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002637}
2638
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002639bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002640 render_path(canvas, fPath);
2641 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00002642}
2643
ethannicholasf62a8b72016-02-11 10:35:21 -08002644Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
2645 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002646 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2647 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002648 return result;
2649}
2650
halcanary9d524f22016-03-29 09:03:52 -07002651SkDrawPathCommand* SkDrawPathCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002652 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002653 SkPath path;
2654 extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path);
2655 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002656 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002657 return new SkDrawPathCommand(path, paint);
2658}
2659
fmalita160ebb22015-04-01 20:58:37 -07002660SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
2661 const SkMatrix* matrix,
2662 const SkPaint* paint)
2663 : INHERITED(kBeginDrawPicture_OpType)
2664 , fPicture(SkRef(picture)) {
2665
2666 SkString* str = new SkString;
2667 str->appendf("SkPicture: L: %f T: %f R: %f B: %f",
2668 picture->cullRect().fLeft, picture->cullRect().fTop,
2669 picture->cullRect().fRight, picture->cullRect().fBottom);
2670 fInfo.push(str);
robertphillipsb3f319f2014-08-13 10:46:23 -07002671
bsalomon49f085d2014-09-05 13:34:00 -07002672 if (matrix) {
fmalita160ebb22015-04-01 20:58:37 -07002673 fMatrix.set(*matrix);
robertphillipsb3f319f2014-08-13 10:46:23 -07002674 fInfo.push(SkObjectParser::MatrixToString(*matrix));
2675 }
fmalita160ebb22015-04-01 20:58:37 -07002676
bsalomon49f085d2014-09-05 13:34:00 -07002677 if (paint) {
fmalita160ebb22015-04-01 20:58:37 -07002678 fPaint.set(*paint);
robertphillipsb3f319f2014-08-13 10:46:23 -07002679 fInfo.push(SkObjectParser::PaintToString(*paint));
2680 }
fmalita160ebb22015-04-01 20:58:37 -07002681
2682}
2683
2684void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
2685 if (fPaint.isValid()) {
2686 SkRect bounds = fPicture->cullRect();
2687 if (fMatrix.isValid()) {
2688 fMatrix.get()->mapRect(&bounds);
2689 }
2690 canvas->saveLayer(&bounds, fPaint.get());
2691 }
2692
2693 if (fMatrix.isValid()) {
2694 if (!fPaint.isValid()) {
2695 canvas->save();
2696 }
2697 canvas->concat(*fMatrix.get());
2698 }
chudy@google.com902ebe52012-06-29 14:21:22 +00002699}
2700
fmalita160ebb22015-04-01 20:58:37 -07002701bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00002702 canvas->clear(0xFFFFFFFF);
2703 canvas->save();
2704
robertphillipsa8d7f0b2014-08-29 08:03:56 -07002705 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00002706
robertphillips9b14f262014-06-04 05:40:44 -07002707 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00002708
2709 canvas->restore();
2710
2711 return true;
2712}
2713
fmalita160ebb22015-04-01 20:58:37 -07002714SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
2715 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
2716
2717void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
2718 if (fRestore) {
2719 canvas->restore();
2720 }
2721}
2722
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002723SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002724 const SkPoint pts[], const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002725 : INHERITED(kDrawPoints_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002726 fMode = mode;
2727 fCount = count;
2728 fPts = new SkPoint[count];
2729 memcpy(fPts, pts, count * sizeof(SkPoint));
2730 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002731
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002732 fInfo.push(SkObjectParser::PointsToString(pts, count));
2733 fInfo.push(SkObjectParser::ScalarToString(SkIntToScalar((unsigned int)count),
2734 "Points: "));
2735 fInfo.push(SkObjectParser::PointModeToString(mode));
2736 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002737}
2738
fmalita8c89c522014-11-08 16:18:56 -08002739void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002740 canvas->drawPoints(fMode, fCount, fPts, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002741}
2742
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002743bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002744 canvas->clear(0xFFFFFFFF);
2745 canvas->save();
2746
2747 SkRect bounds;
2748
2749 bounds.setEmpty();
2750 for (unsigned int i = 0; i < fCount; ++i) {
2751 bounds.growToInclude(fPts[i].fX, fPts[i].fY);
2752 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00002753
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002754 xlate_and_scale_to_bounds(canvas, bounds);
2755
2756 SkPaint p;
2757 p.setColor(SK_ColorBLACK);
2758 p.setStyle(SkPaint::kStroke_Style);
2759
2760 canvas->drawPoints(fMode, fCount, fPts, p);
2761 canvas->restore();
2762
2763 return true;
2764}
2765
ethannicholasf62a8b72016-02-11 10:35:21 -08002766Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
2767 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002768 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
2769 Json::Value points(Json::arrayValue);
2770 for (size_t i = 0; i < fCount; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002771 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08002772 }
2773 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07002774 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002775 return result;
2776}
2777
halcanary9d524f22016-03-29 09:03:52 -07002778SkDrawPointsCommand* SkDrawPointsCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002779 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002780 SkCanvas::PointMode mode;
2781 const char* jsonMode = command[SKDEBUGCANVAS_ATTRIBUTE_MODE].asCString();
2782 if (!strcmp(jsonMode, SKDEBUGCANVAS_POINTMODE_POINTS)) {
2783 mode = SkCanvas::kPoints_PointMode;
2784 }
2785 else if (!strcmp(jsonMode, SKDEBUGCANVAS_POINTMODE_LINES)) {
2786 mode = SkCanvas::kLines_PointMode;
2787 }
2788 else if (!strcmp(jsonMode, SKDEBUGCANVAS_POINTMODE_POLYGON)) {
2789 mode = SkCanvas::kPolygon_PointMode;
2790 }
2791 else {
2792 SkASSERT(false);
2793 return nullptr;
2794 }
2795 Json::Value jsonPoints = command[SKDEBUGCANVAS_ATTRIBUTE_POINTS];
2796 int count = (int) jsonPoints.size();
2797 SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint));
2798 for (int i = 0; i < count; i++) {
2799 points[i] = SkPoint::Make(jsonPoints[i][0].asFloat(), jsonPoints[i][1].asFloat());
2800 }
2801 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002802 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002803 SkDrawPointsCommand* result = new SkDrawPointsCommand(mode, count, points, paint);
2804 sk_free(points);
2805 return result;
2806}
2807
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002808SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002809 const SkPoint pos[], const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002810 : INHERITED(kDrawPosText_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002811 size_t numPts = paint.countText(text, byteLength);
chudy@google.com902ebe52012-06-29 14:21:22 +00002812
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002813 fText = new char[byteLength];
2814 memcpy(fText, text, byteLength);
2815 fByteLength = byteLength;
2816
2817 fPos = new SkPoint[numPts];
2818 memcpy(fPos, pos, numPts * sizeof(SkPoint));
2819
2820 fPaint = paint;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002821
2822 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
chudy@google.com902ebe52012-06-29 14:21:22 +00002823 // TODO(chudy): Test that this works.
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002824 fInfo.push(SkObjectParser::PointsToString(pos, 1));
2825 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002826}
2827
fmalita8c89c522014-11-08 16:18:56 -08002828void SkDrawPosTextCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002829 canvas->drawPosText(fText, fByteLength, fPos, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002830}
2831
ethannicholasf62a8b72016-02-11 10:35:21 -08002832Json::Value SkDrawPosTextCommand::toJSON(UrlDataManager& urlDataManager) const {
2833 Json::Value result = INHERITED::toJSON(urlDataManager);
halcanary9d524f22016-03-29 09:03:52 -07002834 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
ethannicholas50a8dd02016-02-10 05:40:46 -08002835 ((const char*) fText) + fByteLength);
2836 Json::Value coords(Json::arrayValue);
bungeman51190df2016-03-09 07:42:54 -08002837 size_t numCoords = fPaint.textToGlyphs(fText, fByteLength, nullptr);
2838 for (size_t i = 0; i < numCoords; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002839 coords.append(MakeJsonPoint(fPos[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08002840 }
2841 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = coords;
brianosmanfad98562016-05-04 11:06:28 -07002842 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002843 return result;
2844}
2845
halcanary9d524f22016-03-29 09:03:52 -07002846SkDrawPosTextCommand* SkDrawPosTextCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08002847 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08002848 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
2849 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08002850 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08002851 Json::Value coords = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
2852 int count = (int) coords.size();
2853 SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint));
2854 for (int i = 0; i < count; i++) {
2855 points[i] = SkPoint::Make(coords[i][0].asFloat(), coords[i][1].asFloat());
2856 }
2857 return new SkDrawPosTextCommand(text, strlen(text), points, paint);
2858}
chudy@google.com902ebe52012-06-29 14:21:22 +00002859
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002860SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength,
2861 const SkScalar xpos[], SkScalar constY,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002862 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002863 : INHERITED(kDrawPosTextH_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002864 size_t numPts = paint.countText(text, byteLength);
2865
2866 fText = new char[byteLength];
2867 memcpy(fText, text, byteLength);
robertphillips@google.com91217d02013-03-17 18:33:46 +00002868 fByteLength = byteLength;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00002869
2870 fXpos = new SkScalar[numPts];
2871 memcpy(fXpos, xpos, numPts * sizeof(SkScalar));
2872
robertphillips@google.com91217d02013-03-17 18:33:46 +00002873 fConstY = constY;
2874 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002875
robertphillips@google.com91217d02013-03-17 18:33:46 +00002876 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
2877 fInfo.push(SkObjectParser::ScalarToString(xpos[0], "XPOS: "));
2878 fInfo.push(SkObjectParser::ScalarToString(constY, "SkScalar constY: "));
2879 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00002880}
2881
fmalita8c89c522014-11-08 16:18:56 -08002882void SkDrawPosTextHCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002883 canvas->drawPosTextH(fText, fByteLength, fXpos, fConstY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002884}
2885
bungeman51190df2016-03-09 07:42:54 -08002886Json::Value SkDrawPosTextHCommand::toJSON(UrlDataManager& urlDataManager) const {
2887 Json::Value result = INHERITED::toJSON(urlDataManager);
2888 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
2889 ((const char*) fText) + fByteLength);
2890 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fConstY);
2891 Json::Value xpos(Json::arrayValue);
2892 size_t numXpos = fPaint.textToGlyphs(fText, fByteLength, nullptr);
2893 for (size_t i = 0; i < numXpos; i++) {
2894 xpos.append(Json::Value(fXpos[i]));
2895 }
2896 result[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = xpos;
brianosmanfad98562016-05-04 11:06:28 -07002897 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
bungeman51190df2016-03-09 07:42:54 -08002898 return result;
2899}
2900
2901SkDrawPosTextHCommand* SkDrawPosTextHCommand::fromJSON(Json::Value& command,
2902 UrlDataManager& urlDataManager) {
2903 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
2904 SkPaint paint;
2905 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
2906 Json::Value jsonXpos = command[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS];
2907 int count = (int) jsonXpos.size();
2908 SkScalar* xpos = (SkScalar*) sk_malloc_throw(count * sizeof(SkScalar));
2909 for (int i = 0; i < count; i++) {
2910 xpos[i] = jsonXpos[i].asFloat();
2911 }
2912 SkScalar y = command[SKDEBUGCANVAS_ATTRIBUTE_Y].asFloat();
2913 return new SkDrawPosTextHCommand(text, strlen(text), xpos, y, paint);
2914}
2915
fmalita0d48e412016-01-04 08:08:04 -08002916static const char* gPositioningLabels[] = {
2917 "kDefault_Positioning",
2918 "kHorizontal_Positioning",
2919 "kFull_Positioning",
2920};
2921
fmalita37283c22016-09-13 10:00:23 -07002922SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07002923 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002924 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07002925 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07002926 , fXPos(x)
2927 , fYPos(y)
2928 , fPaint(paint) {
2929
Ben Wagner145dbcd2016-11-03 14:40:50 -04002930 std::unique_ptr<SkString> runsStr(new SkString);
fmalitab7425172014-08-26 07:56:44 -07002931 fInfo.push(SkObjectParser::ScalarToString(x, "XPOS: "));
fmalitaff3106c2014-12-09 05:28:20 -08002932 fInfo.push(SkObjectParser::ScalarToString(y, "YPOS: "));
2933 fInfo.push(SkObjectParser::RectToString(fBlob->bounds(), "Bounds: "));
Ben Wagner145dbcd2016-11-03 14:40:50 -04002934 fInfo.push(runsStr.get());
fmalitab7425172014-08-26 07:56:44 -07002935 fInfo.push(SkObjectParser::PaintToString(paint));
fmalitae77f2da2015-12-08 18:59:18 -08002936
2937 unsigned runs = 0;
2938 SkPaint runPaint(paint);
fmalita02526bd2016-09-14 14:55:59 -07002939 SkTextBlobRunIterator iter(fBlob.get());
fmalitae77f2da2015-12-08 18:59:18 -08002940 while (!iter.done()) {
Ben Wagner145dbcd2016-11-03 14:40:50 -04002941 std::unique_ptr<SkString> tmpStr(new SkString);
fmalita0d48e412016-01-04 08:08:04 -08002942 tmpStr->printf("==== Run [%d] ====", runs++);
2943 fInfo.push(tmpStr.release());
fmalitae77f2da2015-12-08 18:59:18 -08002944
2945 fInfo.push(SkObjectParser::IntToString(iter.glyphCount(), "GlyphCount: "));
fmalita0d48e412016-01-04 08:08:04 -08002946 tmpStr.reset(new SkString("GlyphPositioning: "));
2947 tmpStr->append(gPositioningLabels[iter.positioning()]);
2948 fInfo.push(tmpStr.release());
2949
fmalitae77f2da2015-12-08 18:59:18 -08002950 iter.applyFontToPaint(&runPaint);
2951 fInfo.push(SkObjectParser::PaintToString(runPaint));
2952
2953 iter.next();
2954 }
2955
2956 runsStr->printf("Runs: %d", runs);
2957 // runStr is owned by fInfo at this point.
2958 runsStr.release();
fmalitab7425172014-08-26 07:56:44 -07002959}
2960
fmalita8c89c522014-11-08 16:18:56 -08002961void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07002962 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
2963}
2964
fmalita55773872014-08-29 15:08:20 -07002965bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
2966 canvas->clear(SK_ColorWHITE);
2967 canvas->save();
2968
2969 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
2970 xlate_and_scale_to_bounds(canvas, bounds);
2971
fmalita37283c22016-09-13 10:00:23 -07002972 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07002973
2974 canvas->restore();
2975
2976 return true;
2977}
2978
ethannicholasf62a8b72016-02-11 10:35:21 -08002979Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
2980 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002981 Json::Value runs(Json::arrayValue);
2982 SkTextBlobRunIterator iter(fBlob.get());
2983 while (!iter.done()) {
2984 Json::Value run(Json::objectValue);
2985 Json::Value jsonPositions(Json::arrayValue);
2986 Json::Value jsonGlyphs(Json::arrayValue);
2987 const SkScalar* iterPositions = iter.pos();
2988 const uint16_t* iterGlyphs = iter.glyphs();
2989 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
2990 switch (iter.positioning()) {
2991 case SkTextBlob::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07002992 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
2993 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08002994 break;
2995 case SkTextBlob::kHorizontal_Positioning:
2996 jsonPositions.append(Json::Value(iterPositions[i]));
2997 break;
2998 case SkTextBlob::kDefault_Positioning:
2999 break;
3000 }
3001 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
3002 }
3003 if (iter.positioning() != SkTextBlob::kDefault_Positioning) {
3004 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
3005 }
3006 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
3007 SkPaint fontPaint;
3008 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07003009 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
3010 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08003011 runs.append(run);
3012 iter.next();
3013 }
reed6d2c3e72016-07-07 14:10:14 -07003014 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08003015 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
3016 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
3017 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07003018 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07003019 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07003020
3021 SkString desc;
3022 // make the bounds local by applying the x,y
3023 bounds.offset(fXPos, fYPos);
3024 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
3025
ethannicholas50a8dd02016-02-10 05:40:46 -08003026 return result;
3027}
3028
halcanary9d524f22016-03-29 09:03:52 -07003029SkDrawTextBlobCommand* SkDrawTextBlobCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003030 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003031 SkTextBlobBuilder builder;
3032 Json::Value runs = command[SKDEBUGCANVAS_ATTRIBUTE_RUNS];
3033 for (Json::ArrayIndex i = 0 ; i < runs.size(); i++) {
3034 Json::Value run = runs[i];
3035 SkPaint font;
3036 font.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
ethannicholasf62a8b72016-02-11 10:35:21 -08003037 extract_json_paint(run[SKDEBUGCANVAS_ATTRIBUTE_FONT], urlDataManager, &font);
ethannicholas50a8dd02016-02-10 05:40:46 -08003038 Json::Value glyphs = run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS];
3039 int count = glyphs.size();
3040 Json::Value coords = run[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
3041 SkScalar x = coords[0].asFloat();
3042 SkScalar y = coords[1].asFloat();
reed6d2c3e72016-07-07 14:10:14 -07003043 SkRect bounds;
3044 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &bounds);
3045
ethannicholas50a8dd02016-02-10 05:40:46 -08003046 if (run.isMember(SKDEBUGCANVAS_ATTRIBUTE_POSITIONS)) {
3047 Json::Value positions = run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS];
3048 if (positions.size() > 0 && positions[0].isNumeric()) {
reed6d2c3e72016-07-07 14:10:14 -07003049 SkTextBlobBuilder::RunBuffer buffer = builder.allocRunPosH(font, count, y, &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] = positions[j].asFloat();
3053 }
3054 }
3055 else {
reed6d2c3e72016-07-07 14:10:14 -07003056 SkTextBlobBuilder::RunBuffer buffer = builder.allocRunPos(font, count, &bounds);
ethannicholas50a8dd02016-02-10 05:40:46 -08003057 for (int j = 0; j < count; j++) {
3058 buffer.glyphs[j] = glyphs[j].asUInt();
3059 buffer.pos[j * 2] = positions[j][0].asFloat();
3060 buffer.pos[j * 2 + 1] = positions[j][1].asFloat();
3061 }
3062 }
3063 }
3064 else {
reed6d2c3e72016-07-07 14:10:14 -07003065 SkTextBlobBuilder::RunBuffer buffer = builder.allocRun(font, count, x, y, &bounds);
ethannicholas50a8dd02016-02-10 05:40:46 -08003066 for (int j = 0; j < count; j++) {
3067 buffer.glyphs[j] = glyphs[j].asUInt();
3068 }
3069 }
3070 }
3071 SkScalar x = command[SKDEBUGCANVAS_ATTRIBUTE_X].asFloat();
3072 SkScalar y = command[SKDEBUGCANVAS_ATTRIBUTE_Y].asFloat();
3073 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003074 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
fmalita37283c22016-09-13 10:00:23 -07003075 return new SkDrawTextBlobCommand(builder.make(), x, y, paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003076}
3077
robertphillips9bafc302015-02-13 11:13:00 -08003078SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04003079 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08003080 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04003081 : INHERITED(kDrawPatch_OpType)
3082 , fBlendMode(bmode)
3083{
robertphillips9bafc302015-02-13 11:13:00 -08003084 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08003085 if (colors != nullptr) {
3086 memcpy(fColors, colors, sizeof(fColors));
3087 fColorsPtr = fColors;
3088 } else {
3089 fColorsPtr = nullptr;
3090 }
3091 if (texCoords != nullptr) {
3092 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
3093 fTexCoordsPtr = fTexCoords;
3094 } else {
3095 fTexCoordsPtr = nullptr;
3096 }
robertphillips9bafc302015-02-13 11:13:00 -08003097 fPaint = paint;
3098
3099 fInfo.push(SkObjectParser::PaintToString(paint));
3100}
3101
3102void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04003103 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08003104}
3105
ethannicholasf62a8b72016-02-11 10:35:21 -08003106Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
3107 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08003108 Json::Value cubics = Json::Value(Json::arrayValue);
3109 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07003110 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08003111 }
3112 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
3113 if (fColorsPtr != nullptr) {
3114 Json::Value colors = Json::Value(Json::arrayValue);
3115 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07003116 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08003117 }
3118 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
3119 }
3120 if (fTexCoordsPtr != nullptr) {
3121 Json::Value texCoords = Json::Value(Json::arrayValue);
3122 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07003123 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08003124 }
3125 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
3126 }
Mike Reed7d954ad2016-10-28 15:42:34 -04003127 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08003128 return result;
3129}
3130
halcanary9d524f22016-03-29 09:03:52 -07003131SkDrawPatchCommand* SkDrawPatchCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003132 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08003133 Json::Value jsonCubics = command[SKDEBUGCANVAS_ATTRIBUTE_CUBICS];
3134 SkPoint cubics[12];
3135 for (int i = 0; i < 12; i++) {
3136 cubics[i] = get_json_point(jsonCubics[i]);
3137 }
3138 SkColor* colorsPtr;
3139 SkColor colors[4];
3140 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLORS)) {
3141 Json::Value jsonColors = command[SKDEBUGCANVAS_ATTRIBUTE_COLORS];
3142 for (int i = 0; i < 4; i++) {
3143 colors[i] = get_json_color(jsonColors[i]);
3144 }
3145 colorsPtr = colors;
3146 }
3147 else {
3148 colorsPtr = nullptr;
3149 }
3150 SkPoint* texCoordsPtr;
3151 SkPoint texCoords[4];
3152 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS)) {
3153 Json::Value jsonTexCoords = command[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS];
3154 for (int i = 0; i < 4; i++) {
3155 texCoords[i] = get_json_point(jsonTexCoords[i]);
3156 }
3157 texCoordsPtr = texCoords;
3158 }
3159 else {
3160 texCoordsPtr = nullptr;
3161 }
Mike Reed7d954ad2016-10-28 15:42:34 -04003162
3163 SkBlendMode bmode = SkBlendMode::kSrcOver; // TODO: extract from json
3164
ethannicholas1446a9a2016-02-10 14:05:02 -08003165 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003166 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
Mike Reed7d954ad2016-10-28 15:42:34 -04003167 return new SkDrawPatchCommand(cubics, colorsPtr, texCoordsPtr, bmode, paint);
robertphillips9bafc302015-02-13 11:13:00 -08003168}
3169
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003170SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003171 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00003172 fRect = rect;
3173 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00003174
robertphillips@google.com91217d02013-03-17 18:33:46 +00003175 fInfo.push(SkObjectParser::RectToString(rect));
3176 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00003177}
3178
fmalita8c89c522014-11-08 16:18:56 -08003179void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00003180 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00003181}
3182
ethannicholasf62a8b72016-02-11 10:35:21 -08003183Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
3184 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07003185 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
3186 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07003187
3188 SkString desc;
3189 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
3190
ethannicholas50a8dd02016-02-10 05:40:46 -08003191 return result;
3192}
3193
halcanary9d524f22016-03-29 09:03:52 -07003194SkDrawRectCommand* SkDrawRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003195 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003196 SkRect coords;
3197 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
3198 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003199 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003200 return new SkDrawRectCommand(coords, paint);
3201}
3202
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003203SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003204 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003205 fRRect = rrect;
3206 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00003207
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003208 fInfo.push(SkObjectParser::RRectToString(rrect));
3209 fInfo.push(SkObjectParser::PaintToString(paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +00003210}
3211
fmalita8c89c522014-11-08 16:18:56 -08003212void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00003213 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00003214}
3215
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00003216bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00003217 render_rrect(canvas, fRRect);
3218 return true;
3219}
3220
ethannicholasf62a8b72016-02-11 10:35:21 -08003221Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
3222 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003223 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07003224 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003225 return result;
3226}
3227
halcanary9d524f22016-03-29 09:03:52 -07003228SkDrawRRectCommand* SkDrawRRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003229 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003230 SkRRect coords;
3231 extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
3232 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003233 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003234 return new SkDrawRRectCommand(coords, paint);
3235}
3236
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00003237SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00003238 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003239 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003240 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00003241 fOuter = outer;
3242 fInner = inner;
3243 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00003244
3245 fInfo.push(SkObjectParser::RRectToString(outer));
3246 fInfo.push(SkObjectParser::RRectToString(inner));
3247 fInfo.push(SkObjectParser::PaintToString(paint));
3248}
3249
fmalita8c89c522014-11-08 16:18:56 -08003250void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00003251 canvas->drawDRRect(fOuter, fInner, fPaint);
3252}
3253
3254bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
3255 render_drrect(canvas, fOuter, fInner);
3256 return true;
3257}
3258
ethannicholasf62a8b72016-02-11 10:35:21 -08003259Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
3260 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003261 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
3262 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07003263 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003264 return result;
3265}
3266
halcanary9d524f22016-03-29 09:03:52 -07003267SkDrawDRRectCommand* SkDrawDRRectCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003268 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003269 SkRRect outer;
3270 extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_INNER], &outer);
3271 SkRRect inner;
3272 extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_INNER], &inner);
3273 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003274 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003275 return new SkDrawDRRectCommand(outer, inner, paint);
3276}
3277
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00003278SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003279 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003280 : INHERITED(kDrawText_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003281 fText = new char[byteLength];
3282 memcpy(fText, text, byteLength);
3283 fByteLength = byteLength;
3284 fX = x;
3285 fY = y;
3286 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00003287
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003288 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
3289 fInfo.push(SkObjectParser::ScalarToString(x, "SkScalar x: "));
3290 fInfo.push(SkObjectParser::ScalarToString(y, "SkScalar y: "));
3291 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00003292}
3293
fmalita8c89c522014-11-08 16:18:56 -08003294void SkDrawTextCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003295 canvas->drawText(fText, fByteLength, fX, fY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00003296}
3297
ethannicholasf62a8b72016-02-11 10:35:21 -08003298Json::Value SkDrawTextCommand::toJSON(UrlDataManager& urlDataManager) const {
3299 Json::Value result = INHERITED::toJSON(urlDataManager);
halcanary9d524f22016-03-29 09:03:52 -07003300 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
ethannicholas50a8dd02016-02-10 05:40:46 -08003301 ((const char*) fText) + fByteLength);
3302 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07003303 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fX, fY);
3304 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003305 return result;
3306}
3307
halcanary9d524f22016-03-29 09:03:52 -07003308SkDrawTextCommand* SkDrawTextCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003309 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003310 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
3311 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003312 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003313 Json::Value coords = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
halcanary9d524f22016-03-29 09:03:52 -07003314 return new SkDrawTextCommand(text, strlen(text), coords[0].asFloat(), coords[1].asFloat(),
ethannicholas50a8dd02016-02-10 05:40:46 -08003315 paint);
3316}
3317
reed45561a02016-07-07 12:47:17 -07003318///////////////////////////////////////////////////////////////////////////////////////////////////
3319
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00003320SkDrawTextOnPathCommand::SkDrawTextOnPathCommand(const void* text, size_t byteLength,
3321 const SkPath& path, const SkMatrix* matrix,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003322 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08003323 : INHERITED(kDrawTextOnPath_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003324 fText = new char[byteLength];
3325 memcpy(fText, text, byteLength);
3326 fByteLength = byteLength;
3327 fPath = path;
bsalomon49f085d2014-09-05 13:34:00 -07003328 if (matrix) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003329 fMatrix = *matrix;
3330 } else {
3331 fMatrix.setIdentity();
3332 }
3333 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00003334
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003335 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
3336 fInfo.push(SkObjectParser::PathToString(path));
bsalomon49f085d2014-09-05 13:34:00 -07003337 if (matrix) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003338 fInfo.push(SkObjectParser::MatrixToString(*matrix));
3339 }
3340 fInfo.push(SkObjectParser::PaintToString(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +00003341}
3342
fmalita8c89c522014-11-08 16:18:56 -08003343void SkDrawTextOnPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003344 canvas->drawTextOnPath(fText, fByteLength, fPath,
halcanary96fcdcc2015-08-27 07:41:13 -07003345 fMatrix.isIdentity() ? nullptr : &fMatrix,
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003346 fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00003347}
3348
ethannicholasf62a8b72016-02-11 10:35:21 -08003349Json::Value SkDrawTextOnPathCommand::toJSON(UrlDataManager& urlDataManager) const {
3350 Json::Value result = INHERITED::toJSON(urlDataManager);
halcanary9d524f22016-03-29 09:03:52 -07003351 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
ethannicholas50a8dd02016-02-10 05:40:46 -08003352 ((const char*) fText) + fByteLength);
3353 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07003354 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08003355 if (!fMatrix.isIdentity()) {
joshualittbd724132016-03-03 11:39:38 -08003356 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08003357 }
brianosmanfad98562016-05-04 11:06:28 -07003358 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003359 return result;
3360}
3361
halcanary9d524f22016-03-29 09:03:52 -07003362SkDrawTextOnPathCommand* SkDrawTextOnPathCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003363 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003364 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
3365 SkPaint paint;
ethannicholasf62a8b72016-02-11 10:35:21 -08003366 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003367 SkPath path;
3368 extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path);
3369 SkMatrix* matrixPtr;
3370 SkMatrix matrix;
3371 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_MATRIX)) {
3372 extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix);
3373 matrixPtr = &matrix;
3374 }
3375 else {
3376 matrixPtr = nullptr;
3377 }
3378 return new SkDrawTextOnPathCommand(text, strlen(text), path, matrixPtr, paint);
3379}
3380
reed45561a02016-07-07 12:47:17 -07003381///////////////////////////////////////////////////////////////////////////////////////////////////
3382
3383SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength,
3384 const SkRSXform xform[], const SkRect* cull,
3385 const SkPaint& paint)
reed63f30d92016-07-07 16:32:51 -07003386 : INHERITED(kDrawTextRSXform_OpType)
reed45561a02016-07-07 12:47:17 -07003387{
3388 fText = new char[byteLength];
3389 memcpy(fText, text, byteLength);
3390 fByteLength = byteLength;
3391 int count = paint.countText(text, byteLength);
3392 fXform = new SkRSXform[count];
3393 memcpy(fXform, xform, count * sizeof(SkRSXform));
3394 if (cull) {
3395 fCullStorage = *cull;
3396 fCull = &fCullStorage;
3397 } else {
3398 fCull = nullptr;
3399 }
3400 fPaint = paint;
3401
3402 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
3403 fInfo.push(SkObjectParser::PaintToString(paint));
3404}
3405
3406void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const {
3407 canvas->drawTextRSXform(fText, fByteLength, fXform, fCull, fPaint);
3408}
3409
3410Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) const {
3411 Json::Value result = INHERITED::toJSON(urlDataManager);
3412 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
3413 ((const char*) fText) + fByteLength);
3414 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
3415 return result;
3416}
3417
3418SkDrawTextRSXformCommand* SkDrawTextRSXformCommand::fromJSON(Json::Value& command,
3419 UrlDataManager& urlDataManager) {
3420 const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
3421 size_t byteLength = strlen(text);
3422 SkPaint paint;
3423 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
3424
3425 // TODO: handle xform and cull
3426 int count = paint.countText(text, byteLength);
3427 SkAutoTArray<SkRSXform> xform(count);
3428 for (int i = 0; i < count; ++i) {
3429 xform[i].fSCos = 1;
3430 xform[i].fSSin = xform[i].fTx = xform[i].fTy = 0;
3431 }
3432 return new SkDrawTextRSXformCommand(text, byteLength, &xform[0], nullptr, paint);
3433}
3434
3435///////////////////////////////////////////////////////////////////////////////////////////////////
3436
Mike Reedfed9cfd2017-03-17 12:09:04 -04003437SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003438 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04003439 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04003440 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04003441 , fBlendMode(bmode)
Mike Reedfed9cfd2017-03-17 12:09:04 -04003442 , fPaint(paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04003443{
chudy@google.com902ebe52012-06-29 14:21:22 +00003444 // TODO(chudy)
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003445 fInfo.push(SkObjectParser::CustomTextToString("To be implemented."));
3446 fInfo.push(SkObjectParser::PaintToString(paint));
3447}
3448
fmalita8c89c522014-11-08 16:18:56 -08003449void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04003450 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00003451}
3452
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003453SkRestoreCommand::SkRestoreCommand()
robertphillips9bafc302015-02-13 11:13:00 -08003454 : INHERITED(kRestore_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003455 fInfo.push(SkObjectParser::CustomTextToString("No Parameters"));
chudy@google.com902ebe52012-06-29 14:21:22 +00003456}
3457
fmalita8c89c522014-11-08 16:18:56 -08003458void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00003459 canvas->restore();
3460}
3461
ethannicholasf62a8b72016-02-11 10:35:21 -08003462SkRestoreCommand* SkRestoreCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003463 return new SkRestoreCommand();
3464}
3465
Florin Malita5f6102d2014-06-30 10:13:28 -04003466SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08003467 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00003468}
3469
fmalita8c89c522014-11-08 16:18:56 -08003470void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04003471 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00003472}
3473
ethannicholasf62a8b72016-02-11 10:35:21 -08003474SkSaveCommand* SkSaveCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003475 return new SkSaveCommand();
3476}
3477
reed4960eee2015-12-18 07:09:18 -08003478SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
robertphillips9bafc302015-02-13 11:13:00 -08003479 : INHERITED(kSaveLayer_OpType) {
reed4960eee2015-12-18 07:09:18 -08003480 if (rec.fBounds) {
3481 fBounds = *rec.fBounds;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003482 } else {
3483 fBounds.setEmpty();
3484 }
chudy@google.com902ebe52012-06-29 14:21:22 +00003485
reed4960eee2015-12-18 07:09:18 -08003486 if (rec.fPaint) {
3487 fPaint = *rec.fPaint;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003488 fPaintPtr = &fPaint;
3489 } else {
halcanary96fcdcc2015-08-27 07:41:13 -07003490 fPaintPtr = nullptr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003491 }
reed4960eee2015-12-18 07:09:18 -08003492 fSaveLayerFlags = rec.fSaveLayerFlags;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003493
ethannicholas50a8dd02016-02-10 05:40:46 -08003494 if (rec.fBackdrop) {
3495 fBackdrop = rec.fBackdrop;
3496 fBackdrop->ref();
3497 } else {
3498 fBackdrop = nullptr;
3499 }
3500
reed4960eee2015-12-18 07:09:18 -08003501 if (rec.fBounds) {
3502 fInfo.push(SkObjectParser::RectToString(*rec.fBounds, "Bounds: "));
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003503 }
reed4960eee2015-12-18 07:09:18 -08003504 if (rec.fPaint) {
3505 fInfo.push(SkObjectParser::PaintToString(*rec.fPaint));
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00003506 }
reed4960eee2015-12-18 07:09:18 -08003507 fInfo.push(SkObjectParser::SaveLayerFlagsToString(fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00003508}
3509
ethannicholas50a8dd02016-02-10 05:40:46 -08003510SkSaveLayerCommand::~SkSaveLayerCommand() {
3511 if (fBackdrop != nullptr) {
3512 fBackdrop->unref();
3513 }
3514}
3515
fmalita8c89c522014-11-08 16:18:56 -08003516void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
reed4960eee2015-12-18 07:09:18 -08003517 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.isEmpty() ? nullptr : &fBounds,
3518 fPaintPtr,
3519 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00003520}
3521
fmalita8c89c522014-11-08 16:18:56 -08003522void SkSaveLayerCommand::vizExecute(SkCanvas* canvas) const {
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +00003523 canvas->save();
3524}
3525
ethannicholasf62a8b72016-02-11 10:35:21 -08003526Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
3527 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003528 if (!fBounds.isEmpty()) {
brianosmanfad98562016-05-04 11:06:28 -07003529 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(fBounds);
ethannicholas50a8dd02016-02-10 05:40:46 -08003530 }
3531 if (fPaintPtr != nullptr) {
brianosmanfad98562016-05-04 11:06:28 -07003532 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr,
ethannicholasf62a8b72016-02-11 10:35:21 -08003533 urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003534 }
3535 if (fBackdrop != nullptr) {
3536 Json::Value jsonBackdrop;
ethannicholasf62a8b72016-02-11 10:35:21 -08003537 flatten(fBackdrop, &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003538 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
3539 }
3540 if (fSaveLayerFlags != 0) {
3541 SkDebugf("unsupported: saveLayer flags\n");
3542 SkASSERT(false);
3543 }
3544 return result;
3545}
3546
halcanary9d524f22016-03-29 09:03:52 -07003547SkSaveLayerCommand* SkSaveLayerCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003548 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003549 SkCanvas::SaveLayerRec rec;
3550 SkRect bounds;
3551 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_BOUNDS)) {
3552 extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS], &bounds);
3553 rec.fBounds = &bounds;
3554 }
3555 SkPaint paint;
3556 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) {
ethannicholasf62a8b72016-02-11 10:35:21 -08003557 extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
ethannicholas50a8dd02016-02-10 05:40:46 -08003558 rec.fPaint = &paint;
3559 }
3560 if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_BACKDROP)) {
3561 Json::Value backdrop = command[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP];
ethannicholasf62a8b72016-02-11 10:35:21 -08003562 rec.fBackdrop = (SkImageFilter*) load_flattenable(backdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08003563 }
3564 SkSaveLayerCommand* result = new SkSaveLayerCommand(rec);
3565 if (rec.fBackdrop != nullptr) {
3566 rec.fBackdrop->unref();
3567 }
3568 return result;
3569}
3570
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00003571SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08003572 : INHERITED(kSetMatrix_OpType) {
robertphillips70171682014-10-16 14:28:28 -07003573 fUserMatrix.reset();
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003574 fMatrix = matrix;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00003575 fInfo.push(SkObjectParser::MatrixToString(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +00003576}
3577
robertphillips70171682014-10-16 14:28:28 -07003578void SkSetMatrixCommand::setUserMatrix(const SkMatrix& userMatrix) {
3579 fUserMatrix = userMatrix;
3580}
3581
fmalita8c89c522014-11-08 16:18:56 -08003582void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
robertphillips70171682014-10-16 14:28:28 -07003583 SkMatrix temp = SkMatrix::Concat(fUserMatrix, fMatrix);
3584 canvas->setMatrix(temp);
chudy@google.com902ebe52012-06-29 14:21:22 +00003585}
3586
ethannicholasf62a8b72016-02-11 10:35:21 -08003587Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
3588 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08003589 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08003590 return result;
3591}
3592
halcanary9d524f22016-03-29 09:03:52 -07003593SkSetMatrixCommand* SkSetMatrixCommand::fromJSON(Json::Value& command,
ethannicholasf62a8b72016-02-11 10:35:21 -08003594 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08003595 SkMatrix matrix;
3596 extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix);
3597 return new SkSetMatrixCommand(matrix);
3598}