blob: 6bdba388d8839086e53a94eee521a385349c0138 [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
Brian Salomon0a0304c2018-10-11 10:16:33 -040010#include <algorithm>
Hal Canary95e3c052017-01-11 12:44:43 -050011#include "SkAutoMalloc.h"
Brian Salomon0a0304c2018-10-11 10:16:33 -040012#include "SkClipOpPriv.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080013#include "SkColorFilter.h"
14#include "SkDashPathEffect.h"
Brian Osmanc7611082018-05-29 14:55:50 -040015#include "SkDrawable.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080016#include "SkImageFilter.h"
brianosmanfad98562016-05-04 11:06:28 -070017#include "SkJsonWriteBuffer.h"
Brian Salomon0a0304c2018-10-11 10:16:33 -040018#include "SkLatticeIter.h"
Mike Reed80747ef2018-01-23 15:29:32 -050019#include "SkMaskFilterBase.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"
Brian Osmand9ea8162018-08-08 17:03:39 -040023#include "SkPngEncoder.h"
Mike Reedfadbfcd2017-12-06 16:09:20 -050024#include "SkReadBuffer.h"
Mike Reed185ffe92018-01-08 17:09:54 -050025#include "SkRectPriv.h"
Brian Salomon0a0304c2018-10-11 10:16:33 -040026#include "SkShadowFlags.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080027#include "SkTHash.h"
Brian Salomon0a0304c2018-10-11 10:16:33 -040028#include "SkTextBlobPriv.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080029#include "SkTypeface.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080030#include "SkWriteBuffer.h"
31
ethannicholas50a8dd02016-02-10 05:40:46 -080032#define SKDEBUGCANVAS_ATTRIBUTE_COMMAND "command"
ethannicholas807dcab2016-02-23 06:53:37 -080033#define SKDEBUGCANVAS_ATTRIBUTE_VISIBLE "visible"
ethannicholas50a8dd02016-02-10 05:40:46 -080034#define SKDEBUGCANVAS_ATTRIBUTE_MATRIX "matrix"
vjiaoblacke5de1302016-07-13 14:05:28 -070035#define SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS "drawDepthTranslation"
ethannicholas50a8dd02016-02-10 05:40:46 -080036#define SKDEBUGCANVAS_ATTRIBUTE_COORDS "coords"
halcanaryf412f092016-08-25 11:10:41 -070037#define SKDEBUGCANVAS_ATTRIBUTE_HINTING "hinting"
ethannicholas50a8dd02016-02-10 05:40:46 -080038#define SKDEBUGCANVAS_ATTRIBUTE_BOUNDS "bounds"
39#define SKDEBUGCANVAS_ATTRIBUTE_PAINT "paint"
40#define SKDEBUGCANVAS_ATTRIBUTE_OUTER "outer"
41#define SKDEBUGCANVAS_ATTRIBUTE_INNER "inner"
42#define SKDEBUGCANVAS_ATTRIBUTE_MODE "mode"
43#define SKDEBUGCANVAS_ATTRIBUTE_POINTS "points"
44#define SKDEBUGCANVAS_ATTRIBUTE_PATH "path"
45#define SKDEBUGCANVAS_ATTRIBUTE_TEXT "text"
46#define SKDEBUGCANVAS_ATTRIBUTE_COLOR "color"
47#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Florin Malita82d80872017-06-06 16:58:40 -040048#define SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE "blendMode"
ethannicholas50a8dd02016-02-10 05:40:46 -080049#define SKDEBUGCANVAS_ATTRIBUTE_STYLE "style"
50#define SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH "strokeWidth"
51#define SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER "strokeMiter"
ethannicholas1446a9a2016-02-10 14:05:02 -080052#define SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN "strokeJoin"
ethannicholas50a8dd02016-02-10 05:40:46 -080053#define SKDEBUGCANVAS_ATTRIBUTE_CAP "cap"
54#define SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS "antiAlias"
ethannicholas1446a9a2016-02-10 14:05:02 -080055#define SKDEBUGCANVAS_ATTRIBUTE_DITHER "dither"
Ben Wagner78f1f5a2017-06-23 14:35:07 -040056#define SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT "fakeBoldText"
57#define SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT "linearText"
58#define SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT "subpixelText"
59#define SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT "devKernText"
60#define SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT "lcdRenderText"
61#define SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT "embeddedBitmapText"
62#define SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING "forceAutoHinting"
63#define SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT "verticalText"
ethannicholas50a8dd02016-02-10 05:40:46 -080064#define SKDEBUGCANVAS_ATTRIBUTE_REGION "region"
65#define SKDEBUGCANVAS_ATTRIBUTE_REGIONOP "op"
66#define SKDEBUGCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle"
67#define SKDEBUGCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion"
68#define SKDEBUGCANVAS_ATTRIBUTE_BLUR "blur"
69#define SKDEBUGCANVAS_ATTRIBUTE_SIGMA "sigma"
70#define SKDEBUGCANVAS_ATTRIBUTE_QUALITY "quality"
71#define SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN "textAlign"
72#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE "textSize"
73#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX"
74#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX"
75#define SKDEBUGCANVAS_ATTRIBUTE_DASHING "dashing"
76#define SKDEBUGCANVAS_ATTRIBUTE_INTERVALS "intervals"
77#define SKDEBUGCANVAS_ATTRIBUTE_PHASE "phase"
78#define SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE "fillType"
79#define SKDEBUGCANVAS_ATTRIBUTE_VERBS "verbs"
80#define SKDEBUGCANVAS_ATTRIBUTE_NAME "name"
ethannicholasf62a8b72016-02-11 10:35:21 -080081#define SKDEBUGCANVAS_ATTRIBUTE_DATA "data"
brianosmanfad98562016-05-04 11:06:28 -070082#define SKDEBUGCANVAS_ATTRIBUTE_VALUES "values"
ethannicholas50a8dd02016-02-10 05:40:46 -080083#define SKDEBUGCANVAS_ATTRIBUTE_SHADER "shader"
84#define SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect"
85#define SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER "maskFilter"
86#define SKDEBUGCANVAS_ATTRIBUTE_XFERMODE "xfermode"
ethannicholas1446a9a2016-02-10 14:05:02 -080087#define SKDEBUGCANVAS_ATTRIBUTE_LOOPER "looper"
ethannicholas50a8dd02016-02-10 05:40:46 -080088#define SKDEBUGCANVAS_ATTRIBUTE_BACKDROP "backdrop"
89#define SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER "colorfilter"
90#define SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter"
91#define SKDEBUGCANVAS_ATTRIBUTE_IMAGE "image"
92#define SKDEBUGCANVAS_ATTRIBUTE_BITMAP "bitmap"
93#define SKDEBUGCANVAS_ATTRIBUTE_SRC "src"
94#define SKDEBUGCANVAS_ATTRIBUTE_DST "dst"
95#define SKDEBUGCANVAS_ATTRIBUTE_CENTER "center"
96#define SKDEBUGCANVAS_ATTRIBUTE_STRICT "strict"
97#define SKDEBUGCANVAS_ATTRIBUTE_DESCRIPTION "description"
98#define SKDEBUGCANVAS_ATTRIBUTE_X "x"
99#define SKDEBUGCANVAS_ATTRIBUTE_Y "y"
100#define SKDEBUGCANVAS_ATTRIBUTE_RUNS "runs"
101#define SKDEBUGCANVAS_ATTRIBUTE_POSITIONS "positions"
102#define SKDEBUGCANVAS_ATTRIBUTE_GLYPHS "glyphs"
103#define SKDEBUGCANVAS_ATTRIBUTE_FONT "font"
104#define SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE "typeface"
ethannicholas1446a9a2016-02-10 14:05:02 -0800105#define SKDEBUGCANVAS_ATTRIBUTE_CUBICS "cubics"
106#define SKDEBUGCANVAS_ATTRIBUTE_COLORS "colors"
107#define SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS "textureCoords"
108#define SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY "filterQuality"
bsalomonac3aa242016-08-19 11:25:19 -0700109#define SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE "startAngle"
110#define SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE "sweepAngle"
111#define SKDEBUGCANVAS_ATTRIBUTE_USECENTER "useCenter"
jcgregorioee0c5552016-06-30 09:18:27 -0700112#define SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC "shortDesc"
msarett0ac1bec2016-08-29 09:15:33 -0700113#define SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID "uniqueID"
114#define SKDEBUGCANVAS_ATTRIBUTE_WIDTH "width"
115#define SKDEBUGCANVAS_ATTRIBUTE_HEIGHT "height"
116#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Stan Ilievac42aeb2017-01-12 16:20:50 -0500117#define SKDEBUGCANVAS_ATTRIBUTE_LATTICE "lattice"
118#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT "xCount"
119#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT "yCount"
120#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS "xDivs"
121#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS "yDivs"
122#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS "flags"
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400123#define SKDEBUGCANVAS_ATTRIBUTE_ZPLANE "zPlane"
124#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION "lightPositions"
125#define SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR "ambientColor"
126#define SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR "spotColor"
127#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS "lightRadius"
reed67f62fa2016-06-29 11:36:34 -0700128
ethannicholas50a8dd02016-02-10 05:40:46 -0800129#define SKDEBUGCANVAS_VERB_MOVE "move"
130#define SKDEBUGCANVAS_VERB_LINE "line"
131#define SKDEBUGCANVAS_VERB_QUAD "quad"
132#define SKDEBUGCANVAS_VERB_CUBIC "cubic"
133#define SKDEBUGCANVAS_VERB_CONIC "conic"
134#define SKDEBUGCANVAS_VERB_CLOSE "close"
135
136#define SKDEBUGCANVAS_STYLE_FILL "fill"
137#define SKDEBUGCANVAS_STYLE_STROKE "stroke"
138#define SKDEBUGCANVAS_STYLE_STROKEANDFILL "strokeAndFill"
139
140#define SKDEBUGCANVAS_POINTMODE_POINTS "points"
141#define SKDEBUGCANVAS_POINTMODE_LINES "lines"
142#define SKDEBUGCANVAS_POINTMODE_POLYGON "polygon"
143
144#define SKDEBUGCANVAS_REGIONOP_DIFFERENCE "difference"
145#define SKDEBUGCANVAS_REGIONOP_INTERSECT "intersect"
146#define SKDEBUGCANVAS_REGIONOP_UNION "union"
147#define SKDEBUGCANVAS_REGIONOP_XOR "xor"
148#define SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE "reverseDifference"
149#define SKDEBUGCANVAS_REGIONOP_REPLACE "replace"
150
151#define SKDEBUGCANVAS_BLURSTYLE_NORMAL "normal"
152#define SKDEBUGCANVAS_BLURSTYLE_SOLID "solid"
153#define SKDEBUGCANVAS_BLURSTYLE_OUTER "outer"
154#define SKDEBUGCANVAS_BLURSTYLE_INNER "inner"
155
156#define SKDEBUGCANVAS_BLURQUALITY_LOW "low"
157#define SKDEBUGCANVAS_BLURQUALITY_HIGH "high"
158
159#define SKDEBUGCANVAS_ALIGN_LEFT "left"
160#define SKDEBUGCANVAS_ALIGN_CENTER "center"
161#define SKDEBUGCANVAS_ALIGN_RIGHT "right"
162
163#define SKDEBUGCANVAS_FILLTYPE_WINDING "winding"
164#define SKDEBUGCANVAS_FILLTYPE_EVENODD "evenOdd"
165#define SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding"
166#define SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd"
167
168#define SKDEBUGCANVAS_CAP_BUTT "butt"
169#define SKDEBUGCANVAS_CAP_ROUND "round"
170#define SKDEBUGCANVAS_CAP_SQUARE "square"
171
ethannicholas1446a9a2016-02-10 14:05:02 -0800172#define SKDEBUGCANVAS_MITER_JOIN "miter"
173#define SKDEBUGCANVAS_ROUND_JOIN "round"
174#define SKDEBUGCANVAS_BEVEL_JOIN "bevel"
175
ethannicholas50a8dd02016-02-10 05:40:46 -0800176#define SKDEBUGCANVAS_COLORTYPE_ARGB4444 "ARGB4444"
177#define SKDEBUGCANVAS_COLORTYPE_RGBA8888 "RGBA8888"
178#define SKDEBUGCANVAS_COLORTYPE_BGRA8888 "BGRA8888"
179#define SKDEBUGCANVAS_COLORTYPE_565 "565"
180#define SKDEBUGCANVAS_COLORTYPE_GRAY8 "Gray8"
181#define SKDEBUGCANVAS_COLORTYPE_INDEX8 "Index8"
182#define SKDEBUGCANVAS_COLORTYPE_ALPHA8 "Alpha8"
183
184#define SKDEBUGCANVAS_ALPHATYPE_OPAQUE "opaque"
185#define SKDEBUGCANVAS_ALPHATYPE_PREMUL "premul"
186#define SKDEBUGCANVAS_ALPHATYPE_UNPREMUL "unpremul"
msarett0ac1bec2016-08-29 09:15:33 -0700187#define SKDEBUGCANVAS_ALPHATYPE_UNKNOWN "unknown"
ethannicholas50a8dd02016-02-10 05:40:46 -0800188
ethannicholas1446a9a2016-02-10 14:05:02 -0800189#define SKDEBUGCANVAS_FILTERQUALITY_NONE "none"
190#define SKDEBUGCANVAS_FILTERQUALITY_LOW "low"
191#define SKDEBUGCANVAS_FILTERQUALITY_MEDIUM "medium"
192#define SKDEBUGCANVAS_FILTERQUALITY_HIGH "high"
193
halcanaryf412f092016-08-25 11:10:41 -0700194#define SKDEBUGCANVAS_HINTING_NONE "none"
195#define SKDEBUGCANVAS_HINTING_SLIGHT "slight"
196#define SKDEBUGCANVAS_HINTING_NORMAL "normal"
197#define SKDEBUGCANVAS_HINTING_FULL "full"
198
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400199#define SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC "transparentOccluder"
200#define SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY "geometricOnly"
201
reed67f62fa2016-06-29 11:36:34 -0700202static SkString* str_append(SkString* str, const SkRect& r) {
203 str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom());
204 return str;
205}
206
robertphillips9bafc302015-02-13 11:13:00 -0800207SkDrawCommand::SkDrawCommand(OpType type)
208 : fOpType(type)
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000209 , fVisible(true) {
210}
211
robertphillips9bafc302015-02-13 11:13:00 -0800212const char* SkDrawCommand::GetCommandString(OpType type) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000213 switch (type) {
fmalita160ebb22015-04-01 20:58:37 -0700214 case kBeginDrawPicture_OpType: return "BeginDrawPicture";
Brian Osmanc25e2692018-03-12 10:57:28 -0400215 case kClear_OpType: return "DrawClear";
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";
Brian Osman78a76482018-05-18 16:59:13 -0400223 case kDrawBitmapLattice_OpType: return "DrawBitmapLattice";
robertphillips9bafc302015-02-13 11:13:00 -0800224 case kDrawBitmapNine_OpType: return "DrawBitmapNine";
225 case kDrawBitmapRect_OpType: return "DrawBitmapRect";
robertphillips9bafc302015-02-13 11:13:00 -0800226 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";
Brian Osmanc25e2692018-03-12 10:57:28 -0400229 case kDrawImageNine_OpType: return "DrawImageNine";
fmalita651c9202015-07-22 10:23:01 -0700230 case kDrawImageRect_OpType: return "DrawImageRect";
Brian Salomon0a0304c2018-10-11 10:16:33 -0400231 case kDrawImageSet_OpType: return "DrawImageSet";
robertphillips9bafc302015-02-13 11:13:00 -0800232 case kDrawOval_OpType: return "DrawOval";
233 case kDrawPaint_OpType: return "DrawPaint";
234 case kDrawPatch_OpType: return "DrawPatch";
235 case kDrawPath_OpType: return "DrawPath";
Brian Osmanc25e2692018-03-12 10:57:28 -0400236 case kDrawArc_OpType: return "DrawArc";
robertphillips9bafc302015-02-13 11:13:00 -0800237 case kDrawPoints_OpType: return "DrawPoints";
238 case kDrawPosText_OpType: return "DrawPosText";
239 case kDrawPosTextH_OpType: return "DrawPosTextH";
240 case kDrawRect_OpType: return "DrawRect";
241 case kDrawRRect_OpType: return "DrawRRect";
Brian Osmanc25e2692018-03-12 10:57:28 -0400242 case kDrawRegion_OpType: return "DrawRegion";
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400243 case kDrawShadow_OpType: return "DrawShadow";
robertphillips9bafc302015-02-13 11:13:00 -0800244 case kDrawText_OpType: return "DrawText";
245 case kDrawTextBlob_OpType: return "DrawTextBlob";
reed63f30d92016-07-07 16:32:51 -0700246 case kDrawTextRSXform_OpType: return "DrawTextRSXform";
robertphillips9bafc302015-02-13 11:13:00 -0800247 case kDrawVertices_OpType: return "DrawVertices";
Brian Osman616f1cb2018-05-29 11:23:35 -0400248 case kDrawAtlas_OpType: return "DrawAtlas";
Brian Osmanc7611082018-05-29 14:55:50 -0400249 case kDrawDrawable_OpType: return "DrawDrawable";
fmalita160ebb22015-04-01 20:58:37 -0700250 case kEndDrawPicture_OpType: return "EndDrawPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800251 case kRestore_OpType: return "Restore";
252 case kSave_OpType: return "Save";
253 case kSaveLayer_OpType: return "SaveLayer";
254 case kSetMatrix_OpType: return "SetMatrix";
chudy@google.com902ebe52012-06-29 14:21:22 +0000255 default:
robertphillips9bafc302015-02-13 11:13:00 -0800256 SkDebugf("OpType error 0x%08x\n", type);
chudy@google.com902ebe52012-06-29 14:21:22 +0000257 SkASSERT(0);
258 break;
259 }
260 SkDEBUGFAIL("DrawType UNUSED\n");
halcanary96fcdcc2015-08-27 07:41:13 -0700261 return nullptr;
chudy@google.com902ebe52012-06-29 14:21:22 +0000262}
263
ethannicholasf62a8b72016-02-11 10:35:21 -0800264Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const {
ethannicholas50a8dd02016-02-10 05:40:46 -0800265 Json::Value result;
266 result[SKDEBUGCANVAS_ATTRIBUTE_COMMAND] = this->GetCommandString(fOpType);
ethannicholas807dcab2016-02-23 06:53:37 -0800267 result[SKDEBUGCANVAS_ATTRIBUTE_VISIBLE] = Json::Value(this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800268 return result;
269}
270
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000271namespace {
272
273void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
Mike Reed3661bc92017-02-22 13:21:42 -0500274 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000275
276 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
277
278 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
279 if (bounds.width() > bounds.height()) {
280 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
281 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
282 } else {
283 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
284 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
285 }
286 canvas->translate(-bounds.centerX(), -bounds.centerY());
287}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000288
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000289
290void render_path(SkCanvas* canvas, const SkPath& path) {
291 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000292
293 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700294 if (bounds.isEmpty()) {
295 return;
296 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000297
fmalitab0cd8b72015-10-06 07:24:03 -0700298 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000299 xlate_and_scale_to_bounds(canvas, bounds);
300
301 SkPaint p;
302 p.setColor(SK_ColorBLACK);
303 p.setStyle(SkPaint::kStroke_Style);
304
305 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000306}
307
Brian Osmanc25e2692018-03-12 10:57:28 -0400308void render_region(SkCanvas* canvas, const SkRegion& region) {
309 canvas->clear(0xFFFFFFFF);
310
311 const SkIRect& bounds = region.getBounds();
312 if (bounds.isEmpty()) {
313 return;
314 }
315
316 SkAutoCanvasRestore acr(canvas, true);
Brian Osman99b63402018-03-13 10:19:27 -0400317 xlate_and_scale_to_bounds(canvas, SkRect::Make(bounds));
Brian Osmanc25e2692018-03-12 10:57:28 -0400318
319 SkPaint p;
320 p.setColor(SK_ColorBLACK);
321 p.setStyle(SkPaint::kStroke_Style);
322
323 canvas->drawRegion(region, p);
324}
325
halcanary96fcdcc2015-08-27 07:41:13 -0700326void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
Mike Reed3661bc92017-02-22 13:21:42 -0500327 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000328
329 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
330 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
331
332 if (input.width() > input.height()) {
333 yScale *= input.height() / (float) input.width();
334 } else {
335 xScale *= input.width() / (float) input.height();
336 }
337
338 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
339 xScale * input.width(),
340 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000341
robertphillips96a5cff2015-09-24 06:56:27 -0700342 static const int kNumBlocks = 8;
343
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000344 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700345 SkISize block = {
346 canvas->imageInfo().width()/kNumBlocks,
347 canvas->imageInfo().height()/kNumBlocks
348 };
349 for (int y = 0; y < kNumBlocks; ++y) {
350 for (int x = 0; x < kNumBlocks; ++x) {
351 SkPaint paint;
352 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
353 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
354 SkIntToScalar(y*block.height()),
355 SkIntToScalar(block.width()),
356 SkIntToScalar(block.height()));
357 canvas->drawRect(r, paint);
358 }
359 }
360
reede47829b2015-08-06 10:02:53 -0700361 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000362
bsalomon49f085d2014-09-05 13:34:00 -0700363 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000364 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
365 srcRect->fTop * yScale + SK_Scalar1,
366 srcRect->fRight * xScale + SK_Scalar1,
367 srcRect->fBottom * yScale + SK_Scalar1);
368 SkPaint p;
369 p.setColor(SK_ColorRED);
370 p.setStyle(SkPaint::kStroke_Style);
371
372 canvas->drawRect(r, p);
373 }
374}
375
376void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
377 canvas->clear(0xFFFFFFFF);
378 canvas->save();
379
380 const SkRect& bounds = rrect.getBounds();
381
382 xlate_and_scale_to_bounds(canvas, bounds);
383
384 SkPaint p;
385 p.setColor(SK_ColorBLACK);
386 p.setStyle(SkPaint::kStroke_Style);
387
388 canvas->drawRRect(rrect, p);
389 canvas->restore();
390}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000391
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000392void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
393 canvas->clear(0xFFFFFFFF);
394 canvas->save();
395
396 const SkRect& bounds = outer.getBounds();
397
398 xlate_and_scale_to_bounds(canvas, bounds);
399
400 SkPaint p;
401 p.setColor(SK_ColorBLACK);
402 p.setStyle(SkPaint::kStroke_Style);
403
404 canvas->drawDRRect(outer, inner, p);
405 canvas->restore();
406}
407
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400408void render_shadow(SkCanvas* canvas, const SkPath& path, SkDrawShadowRec rec) {
409 canvas->clear(0xFFFFFFFF);
410
411 const SkRect& bounds = path.getBounds();
412 if (bounds.isEmpty()) {
413 return;
414 }
415
416 SkAutoCanvasRestore acr(canvas, true);
417 xlate_and_scale_to_bounds(canvas, bounds);
418
419 rec.fAmbientColor = SK_ColorBLACK;
420 rec.fSpotColor = SK_ColorBLACK;
421 canvas->private_draw_shadow_rec(path, rec);
422}
423
Florin Malita82d80872017-06-06 16:58:40 -0400424static const char* const gBlendModeMap[] = {
425 "clear",
426 "src",
427 "dst",
428 "srcOver",
429 "dstOver",
430 "srcIn",
431 "dstIn",
432 "srcOut",
433 "dstOut",
434 "srcATop",
435 "dstATop",
436 "xor",
437 "plus",
438 "modulate",
439
440 "screen",
441
442 "overlay",
443 "darken",
444 "lighten",
445 "colorDodge",
446 "colorBurn",
447 "hardLight",
448 "softLight",
449 "difference",
450 "exclusion",
451 "multiply",
452
453 "hue",
454 "saturation",
455 "color",
456 "luminosity",
457};
458
459static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
460 "blendMode mismatch");
461static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
462 "blendMode mismatch");
463
464void apply_paint_blend_mode(const SkPaint& paint, Json::Value* target) {
465 const auto mode = paint.getBlendMode();
466 if (mode != SkBlendMode::kSrcOver) {
467 SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
468 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE] =
469 Json::Value(gBlendModeMap[static_cast<size_t>(mode)]);
470 }
471}
472
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000473};
474
brianosmanfad98562016-05-04 11:06:28 -0700475Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800476 Json::Value result(Json::arrayValue);
477 result.append(Json::Value(SkColorGetA(color)));
478 result.append(Json::Value(SkColorGetR(color)));
479 result.append(Json::Value(SkColorGetG(color)));
480 result.append(Json::Value(SkColorGetB(color)));
481 return result;
482}
483
brianosman97bbf822016-09-25 13:15:58 -0700484Json::Value SkDrawCommand::MakeJsonColor4f(const SkColor4f& color) {
485 Json::Value result(Json::arrayValue);
486 result.append(Json::Value(color.fA));
487 result.append(Json::Value(color.fR));
488 result.append(Json::Value(color.fG));
489 result.append(Json::Value(color.fB));
490 return result;
491}
492
brianosmanfad98562016-05-04 11:06:28 -0700493Json::Value SkDrawCommand::MakeJsonPoint(const SkPoint& point) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800494 Json::Value result(Json::arrayValue);
495 result.append(Json::Value(point.x()));
496 result.append(Json::Value(point.y()));
497 return result;
498}
499
brianosmanfad98562016-05-04 11:06:28 -0700500Json::Value SkDrawCommand::MakeJsonPoint(SkScalar x, SkScalar y) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800501 Json::Value result(Json::arrayValue);
502 result.append(Json::Value(x));
503 result.append(Json::Value(y));
504 return result;
505}
506
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400507Json::Value SkDrawCommand::MakeJsonPoint3(const SkPoint3& point) {
508 Json::Value result(Json::arrayValue);
509 result.append(Json::Value(point.x()));
510 result.append(Json::Value(point.y()));
511 result.append(Json::Value(point.z()));
512 return result;
513}
514
brianosmanfad98562016-05-04 11:06:28 -0700515Json::Value SkDrawCommand::MakeJsonRect(const SkRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800516 Json::Value result(Json::arrayValue);
517 result.append(Json::Value(rect.left()));
518 result.append(Json::Value(rect.top()));
519 result.append(Json::Value(rect.right()));
520 result.append(Json::Value(rect.bottom()));
521 return result;
522}
523
joshualittbd724132016-03-03 11:39:38 -0800524Json::Value SkDrawCommand::MakeJsonIRect(const SkIRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800525 Json::Value result(Json::arrayValue);
526 result.append(Json::Value(rect.left()));
527 result.append(Json::Value(rect.top()));
528 result.append(Json::Value(rect.right()));
529 result.append(Json::Value(rect.bottom()));
530 return result;
531}
532
533static Json::Value make_json_rrect(const SkRRect& rrect) {
534 Json::Value result(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700535 result.append(SkDrawCommand::MakeJsonRect(rrect.rect()));
536 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
537 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperRight_Corner)));
538 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerRight_Corner)));
539 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
ethannicholas50a8dd02016-02-10 05:40:46 -0800540 return result;
541}
542
joshualittbd724132016-03-03 11:39:38 -0800543Json::Value SkDrawCommand::MakeJsonMatrix(const SkMatrix& matrix) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800544 Json::Value result(Json::arrayValue);
545 Json::Value row1(Json::arrayValue);
546 row1.append(Json::Value(matrix[0]));
547 row1.append(Json::Value(matrix[1]));
548 row1.append(Json::Value(matrix[2]));
549 result.append(row1);
550 Json::Value row2(Json::arrayValue);
551 row2.append(Json::Value(matrix[3]));
552 row2.append(Json::Value(matrix[4]));
553 row2.append(Json::Value(matrix[5]));
554 result.append(row2);
555 Json::Value row3(Json::arrayValue);
556 row3.append(Json::Value(matrix[6]));
557 row3.append(Json::Value(matrix[7]));
558 row3.append(Json::Value(matrix[8]));
559 result.append(row3);
560 return result;
561}
ethannicholas1446a9a2016-02-10 14:05:02 -0800562
vjiaoblacke5de1302016-07-13 14:05:28 -0700563Json::Value SkDrawCommand::MakeJsonScalar(SkScalar z) {
564 Json::Value result(z);
565 return result;
566}
567
brianosmanfad98562016-05-04 11:06:28 -0700568Json::Value SkDrawCommand::MakeJsonPath(const SkPath& path) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800569 Json::Value result(Json::objectValue);
570 switch (path.getFillType()) {
571 case SkPath::kWinding_FillType:
572 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_WINDING;
573 break;
574 case SkPath::kEvenOdd_FillType:
575 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_EVENODD;
576 break;
577 case SkPath::kInverseWinding_FillType:
578 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING;
579 break;
580 case SkPath::kInverseEvenOdd_FillType:
581 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
582 break;
halcanary9d524f22016-03-29 09:03:52 -0700583 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800584 Json::Value verbs(Json::arrayValue);
585 SkPath::Iter iter(path, false);
586 SkPoint pts[4];
587 SkPath::Verb verb;
588 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
589 switch (verb) {
590 case SkPath::kLine_Verb: {
591 Json::Value line(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700592 line[SKDEBUGCANVAS_VERB_LINE] = MakeJsonPoint(pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800593 verbs.append(line);
594 break;
595 }
596 case SkPath::kQuad_Verb: {
597 Json::Value quad(Json::objectValue);
598 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700599 coords.append(MakeJsonPoint(pts[1]));
600 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800601 quad[SKDEBUGCANVAS_VERB_QUAD] = coords;
602 verbs.append(quad);
603 break;
604 }
605 case SkPath::kCubic_Verb: {
606 Json::Value cubic(Json::objectValue);
607 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700608 coords.append(MakeJsonPoint(pts[1]));
609 coords.append(MakeJsonPoint(pts[2]));
610 coords.append(MakeJsonPoint(pts[3]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800611 cubic[SKDEBUGCANVAS_VERB_CUBIC] = coords;
612 verbs.append(cubic);
613 break;
614 }
615 case SkPath::kConic_Verb: {
616 Json::Value conic(Json::objectValue);
617 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700618 coords.append(MakeJsonPoint(pts[1]));
619 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800620 coords.append(Json::Value(iter.conicWeight()));
621 conic[SKDEBUGCANVAS_VERB_CONIC] = coords;
622 verbs.append(conic);
623 break;
624 }
625 case SkPath::kMove_Verb: {
626 Json::Value move(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700627 move[SKDEBUGCANVAS_VERB_MOVE] = MakeJsonPoint(pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800628 verbs.append(move);
629 break;
630 }
631 case SkPath::kClose_Verb:
632 verbs.append(Json::Value(SKDEBUGCANVAS_VERB_CLOSE));
633 break;
634 case SkPath::kDone_Verb:
635 break;
636 }
637 }
638 result[SKDEBUGCANVAS_ATTRIBUTE_VERBS] = verbs;
639 return result;
640}
641
brianosmanfad98562016-05-04 11:06:28 -0700642Json::Value SkDrawCommand::MakeJsonRegion(const SkRegion& region) {
Brian Osmanc25e2692018-03-12 10:57:28 -0400643 // TODO: Actually serialize the rectangles, rather than just devolving to path
644 SkPath path;
645 region.getBoundaryPath(&path);
646 return MakeJsonPath(path);
ethannicholas50a8dd02016-02-10 05:40:46 -0800647}
648
Mike Reedc1f77742016-12-09 09:00:50 -0500649static Json::Value make_json_regionop(SkClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800650 switch (op) {
Mike Reedc1f77742016-12-09 09:00:50 -0500651 case kDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800652 return Json::Value(SKDEBUGCANVAS_REGIONOP_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500653 case kIntersect_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800654 return Json::Value(SKDEBUGCANVAS_REGIONOP_INTERSECT);
Mike Reedc1f77742016-12-09 09:00:50 -0500655 case kUnion_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800656 return Json::Value(SKDEBUGCANVAS_REGIONOP_UNION);
Mike Reedc1f77742016-12-09 09:00:50 -0500657 case kXOR_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800658 return Json::Value(SKDEBUGCANVAS_REGIONOP_XOR);
Mike Reedc1f77742016-12-09 09:00:50 -0500659 case kReverseDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800660 return Json::Value(SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500661 case kReplace_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800662 return Json::Value(SKDEBUGCANVAS_REGIONOP_REPLACE);
663 default:
664 SkASSERT(false);
665 return Json::Value("<invalid region op>");
666 };
667}
668
669static Json::Value make_json_pointmode(SkCanvas::PointMode mode) {
670 switch (mode) {
671 case SkCanvas::kPoints_PointMode:
672 return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
673 case SkCanvas::kLines_PointMode:
674 return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
halcanary9d524f22016-03-29 09:03:52 -0700675 case SkCanvas::kPolygon_PointMode:
ethannicholas50a8dd02016-02-10 05:40:46 -0800676 return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
677 default:
678 SkASSERT(false);
679 return Json::Value("<invalid point mode>");
680 };
681}
682
halcanary9d524f22016-03-29 09:03:52 -0700683static void store_scalar(Json::Value* target, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800684 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800685 if (value != defaultValue) {
686 (*target)[key] = Json::Value(value);
687 }
688}
689
ethannicholasbd3dae82016-02-10 12:10:00 -0800690static void store_bool(Json::Value* target, const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800691 if (value != defaultValue) {
692 (*target)[key] = Json::Value(value);
693 }
694}
695
halcanary9d524f22016-03-29 09:03:52 -0700696static void encode_data(const void* bytes, size_t count, const char* contentType,
ethannicholasf62a8b72016-02-11 10:35:21 -0800697 UrlDataManager& urlDataManager, Json::Value* target) {
bungeman38d909e2016-08-02 14:40:46 -0700698 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
699 SkString url = urlDataManager.addData(data.get(), contentType);
ethannicholasf62a8b72016-02-11 10:35:21 -0800700 *target = Json::Value(url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800701}
702
brianosmanfad98562016-05-04 11:06:28 -0700703void SkDrawCommand::flatten(const SkFlattenable* flattenable, Json::Value* target,
704 UrlDataManager& urlDataManager) {
705 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800706 flattenable->flatten(buffer);
707 void* data = sk_malloc_throw(buffer.bytesWritten());
708 buffer.writeToMemory(data);
709 Json::Value jsonData;
710 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, &jsonData);
711 Json::Value jsonFlattenable;
712 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->getTypeName());
713 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
brianosmanfad98562016-05-04 11:06:28 -0700714
715 SkJsonWriteBuffer jsonBuffer(&urlDataManager);
716 flattenable->flatten(jsonBuffer);
717 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_VALUES] = jsonBuffer.getValue();
718
ethannicholasf62a8b72016-02-11 10:35:21 -0800719 (*target) = jsonFlattenable;
720 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800721}
722
Brian Osmand9ea8162018-08-08 17:03:39 -0400723void SkDrawCommand::WritePNG(SkBitmap bitmap, SkWStream& out) {
724 SkPixmap pm;
725 SkAssertResult(bitmap.peekPixels(&pm));
ethannicholasf67531f2016-03-21 10:19:39 -0700726
Brian Osmand9ea8162018-08-08 17:03:39 -0400727 SkPngEncoder::Options options;
728 options.fZLibLevel = 1;
729 options.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
730 SkPngEncoder::Encode(&out, pm, options);
ethannicholasf67531f2016-03-21 10:19:39 -0700731}
732
brianosmanfad98562016-05-04 11:06:28 -0700733bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
734 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700735 size_t rowBytes = 4 * image.width();
Hal Canary95e3c052017-01-11 12:44:43 -0500736 SkAutoMalloc buffer(rowBytes * image.height());
halcanary9d524f22016-03-29 09:03:52 -0700737 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700738 kN32_SkColorType, kPremul_SkAlphaType);
739 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
740 SkDebugf("readPixels failed\n");
741 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800742 }
msaretta5cf4f42016-06-30 10:06:51 -0700743
744 SkBitmap bm;
745 bm.installPixels(dstInfo, buffer.get(), rowBytes);
msaretta5cf4f42016-06-30 10:06:51 -0700746
ethannicholasf67531f2016-03-21 10:19:39 -0700747 SkDynamicMemoryWStream out;
Brian Osmand9ea8162018-08-08 17:03:39 -0400748 SkDrawCommand::WritePNG(bm, out);
reed42943c82016-09-12 12:01:44 -0700749 sk_sp<SkData> encoded = out.detachAsData();
ethannicholasf62a8b72016-02-11 10:35:21 -0800750 Json::Value jsonData;
751 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
752 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
ethannicholas50a8dd02016-02-10 05:40:46 -0800753 return true;
754}
755
756static const char* color_type_name(SkColorType colorType) {
757 switch (colorType) {
758 case kARGB_4444_SkColorType:
759 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
760 case kRGBA_8888_SkColorType:
761 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
762 case kBGRA_8888_SkColorType:
763 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
764 case kRGB_565_SkColorType:
765 return SKDEBUGCANVAS_COLORTYPE_565;
766 case kGray_8_SkColorType:
767 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
ethannicholas50a8dd02016-02-10 05:40:46 -0800768 case kAlpha_8_SkColorType:
769 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
770 default:
771 SkASSERT(false);
772 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
773 }
774}
775
776static const char* alpha_type_name(SkAlphaType alphaType) {
777 switch (alphaType) {
778 case kOpaque_SkAlphaType:
779 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
780 case kPremul_SkAlphaType:
781 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
782 case kUnpremul_SkAlphaType:
783 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
784 default:
785 SkASSERT(false);
786 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
787 }
788}
789
brianosmanfad98562016-05-04 11:06:28 -0700790bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
791 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700792 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800793 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
794 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800795 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800796 return success;
797}
798
halcanaryf412f092016-08-25 11:10:41 -0700799static void apply_paint_hinting(const SkPaint& paint, Json::Value* target) {
800 SkPaint::Hinting hinting = paint.getHinting();
801 if (hinting != SkPaintDefaults_Hinting) {
802 switch (hinting) {
803 case SkPaint::kNo_Hinting:
804 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
805 break;
806 case SkPaint::kSlight_Hinting:
807 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
808 break;
809 case SkPaint::kNormal_Hinting:
810 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
811 break;
812 case SkPaint::kFull_Hinting:
813 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
814 break;
815 }
816 }
817}
818
ethannicholas50a8dd02016-02-10 05:40:46 -0800819static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
820 SkColor color = paint.getColor();
821 if (color != SK_ColorBLACK) {
822 Json::Value colorValue(Json::arrayValue);
823 colorValue.append(Json::Value(SkColorGetA(color)));
824 colorValue.append(Json::Value(SkColorGetR(color)));
825 colorValue.append(Json::Value(SkColorGetG(color)));
826 colorValue.append(Json::Value(SkColorGetB(color)));
827 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;;
828 }
829}
830
831static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
832 SkPaint::Style style = paint.getStyle();
833 if (style != SkPaint::kFill_Style) {
834 switch (style) {
835 case SkPaint::kStroke_Style: {
836 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
837 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
838 break;
839 }
840 case SkPaint::kStrokeAndFill_Style: {
841 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
842 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
843 break;
844 }
845 default: SkASSERT(false);
846 }
847 }
848}
849
850static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
851 SkPaint::Cap cap = paint.getStrokeCap();
852 if (cap != SkPaint::kDefault_Cap) {
853 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800854 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800855 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
856 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800857 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800858 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
859 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800860 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800861 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
862 break;
ethannicholas50a8dd02016-02-10 05:40:46 -0800863 default: SkASSERT(false);
864 }
865 }
866}
ethannicholas1446a9a2016-02-10 14:05:02 -0800867
868static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
869 SkPaint::Join join = paint.getStrokeJoin();
870 if (join != SkPaint::kDefault_Join) {
871 switch (join) {
872 case SkPaint::kMiter_Join:
873 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
874 SKDEBUGCANVAS_MITER_JOIN);
875 break;
876 case SkPaint::kRound_Join:
877 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
878 SKDEBUGCANVAS_ROUND_JOIN);
879 break;
880 case SkPaint::kBevel_Join:
881 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
882 SKDEBUGCANVAS_BEVEL_JOIN);
883 break;
884 default: SkASSERT(false);
885 }
886 }
887}
888
889static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
890 SkFilterQuality quality = paint.getFilterQuality();
891 switch (quality) {
892 case kNone_SkFilterQuality:
893 break;
894 case kLow_SkFilterQuality:
895 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
896 SKDEBUGCANVAS_FILTERQUALITY_LOW);
897 break;
898 case kMedium_SkFilterQuality:
899 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
900 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
901 break;
902 case kHigh_SkFilterQuality:
903 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
904 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
905 break;
906 }
907}
908
halcanary9d524f22016-03-29 09:03:52 -0700909static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800910 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800911 SkMaskFilter* maskFilter = paint.getMaskFilter();
912 if (maskFilter != nullptr) {
Mike Reed80747ef2018-01-23 15:29:32 -0500913 SkMaskFilterBase::BlurRec blurRec;
914 if (as_MFB(maskFilter)->asABlur(&blurRec)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800915 Json::Value blur(Json::objectValue);
916 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
917 switch (blurRec.fStyle) {
918 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800919 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
920 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -0800921 break;
922 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800923 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
924 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -0800925 break;
926 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800927 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
928 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800929 break;
930 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800931 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
932 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800933 break;
934 default:
935 SkASSERT(false);
936 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800937 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
938 } else {
939 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -0700940 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800941 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
942 }
943 }
944}
945
halcanary9d524f22016-03-29 09:03:52 -0700946static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800947 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800948 SkPathEffect* pathEffect = paint.getPathEffect();
949 if (pathEffect != nullptr) {
950 SkPathEffect::DashInfo dashInfo;
951 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
952 if (dashType == SkPathEffect::kDash_DashType) {
953 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
954 pathEffect->asADash(&dashInfo);
955 Json::Value dashing(Json::objectValue);
956 Json::Value intervals(Json::arrayValue);
957 for (int32_t i = 0; i < dashInfo.fCount; i++) {
958 intervals.append(Json::Value(dashInfo.fIntervals[i]));
959 }
960 sk_free(dashInfo.fIntervals);
961 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
962 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
963 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
964 } else {
965 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -0700966 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800967 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
968 }
969 }
970}
halcanary9d524f22016-03-29 09:03:52 -0700971
ethannicholas50a8dd02016-02-10 05:40:46 -0800972static void apply_paint_textalign(const SkPaint& paint, Json::Value* target) {
973 SkPaint::Align textAlign = paint.getTextAlign();
974 if (textAlign != SkPaint::kLeft_Align) {
975 switch (textAlign) {
976 case SkPaint::kCenter_Align: {
977 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_CENTER;
978 break;
979 }
980 case SkPaint::kRight_Align: {
981 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_RIGHT;
982 break;
983 }
984 default: SkASSERT(false);
985 }
986 }
987}
988
halcanary9d524f22016-03-29 09:03:52 -0700989static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800990 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800991 SkTypeface* typeface = paint.getTypeface();
992 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -0800993 Json::Value jsonTypeface;
994 SkDynamicMemoryWStream buffer;
995 typeface->serialize(&buffer);
996 void* data = sk_malloc_throw(buffer.bytesWritten());
997 buffer.copyTo(data);
998 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -0700999 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001000 &jsonData);
1001 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
1002 sk_free(data);
1003 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -08001004 }
1005}
1006
halcanary9d524f22016-03-29 09:03:52 -07001007static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001008 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001009 SkFlattenable* shader = paint.getShader();
1010 if (shader != nullptr) {
1011 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -07001012 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001013 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
1014 }
1015}
1016
ethannicholasf62a8b72016-02-11 10:35:21 -08001017static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
1018 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001019 SkFlattenable* imageFilter = paint.getImageFilter();
1020 if (imageFilter != nullptr) {
1021 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -07001022 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001023 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
1024 }
1025}
1026
halcanary9d524f22016-03-29 09:03:52 -07001027static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001028 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001029 SkFlattenable* colorFilter = paint.getColorFilter();
1030 if (colorFilter != nullptr) {
1031 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001032 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001033 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1034 }
1035}
1036
halcanary9d524f22016-03-29 09:03:52 -07001037static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001038 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001039 SkFlattenable* looper = paint.getLooper();
1040 if (looper != nullptr) {
1041 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001042 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001043 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1044 }
1045}
1046
brianosmanfad98562016-05-04 11:06:28 -07001047Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001048 Json::Value result(Json::objectValue);
1049 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001050 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001051 SkPaintDefaults_MiterLimit);
1052 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001053 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001054 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, paint.isFakeBoldText(), false);
1055 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, paint.isLinearText(), false);
1056 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, paint.isSubpixelText(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001057 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT, paint.isLCDRenderText(), false);
1058 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, paint.isEmbeddedBitmapText(), false);
1059 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, paint.isAutohinted(), false);
1060 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT, paint.isVerticalText(), false);
1061 //kGenA8FromLCD_Flag
1062
halcanary9d524f22016-03-29 09:03:52 -07001063 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001064 SkPaintDefaults_TextSize);
1065 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
1066 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
halcanaryf412f092016-08-25 11:10:41 -07001067 apply_paint_hinting(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001068 apply_paint_color(paint, &result);
1069 apply_paint_style(paint, &result);
Florin Malita82d80872017-06-06 16:58:40 -04001070 apply_paint_blend_mode(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001071 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001072 apply_paint_join(paint, &result);
1073 apply_paint_filterquality(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001074 apply_paint_textalign(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001075 apply_paint_patheffect(paint, &result, urlDataManager);
1076 apply_paint_maskfilter(paint, &result, urlDataManager);
1077 apply_paint_shader(paint, &result, urlDataManager);
ethannicholasf62a8b72016-02-11 10:35:21 -08001078 apply_paint_looper(paint, &result, urlDataManager);
1079 apply_paint_imagefilter(paint, &result, urlDataManager);
1080 apply_paint_colorfilter(paint, &result, urlDataManager);
1081 apply_paint_typeface(paint, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001082 return result;
1083}
1084
Stan Ilievac42aeb2017-01-12 16:20:50 -05001085Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) {
1086 Json::Value result(Json::objectValue);
1087 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount);
1088 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount);
1089 if (nullptr != lattice.fBounds) {
1090 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds);
1091 }
1092 Json::Value XDivs(Json::arrayValue);
1093 for (int i = 0; i < lattice.fXCount; i++) {
1094 XDivs.append(Json::Value(lattice.fXDivs[i]));
1095 }
1096 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs;
1097 Json::Value YDivs(Json::arrayValue);
1098 for (int i = 0; i < lattice.fYCount; i++) {
1099 YDivs.append(Json::Value(lattice.fYDivs[i]));
1100 }
1101 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs;
Stan Ilievca8c0952017-12-11 13:01:58 -05001102 if (nullptr != lattice.fRectTypes) {
Stan Ilievac42aeb2017-01-12 16:20:50 -05001103 Json::Value flags(Json::arrayValue);
1104 int flagCount = 0;
1105 for (int row = 0; row < lattice.fYCount+1; row++) {
1106 Json::Value flagsRow(Json::arrayValue);
1107 for (int column = 0; column < lattice.fXCount+1; column++) {
Stan Ilievca8c0952017-12-11 13:01:58 -05001108 flagsRow.append(Json::Value(lattice.fRectTypes[flagCount++]));
Stan Ilievac42aeb2017-01-12 16:20:50 -05001109 }
1110 flags.append(flagsRow);
1111 }
1112 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags;
1113 }
1114 return result;
1115}
1116
Brian Osmanc25e2692018-03-12 10:57:28 -04001117SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kClear_OpType) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001118 fColor = color;
ethannicholas1446a9a2016-02-10 14:05:02 -08001119}
1120
1121void SkClearCommand::execute(SkCanvas* canvas) const {
1122 canvas->clear(fColor);
1123}
1124
ethannicholasf62a8b72016-02-11 10:35:21 -08001125Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1126 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001127 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001128 return result;
1129}
1130
Mike Reedc1f77742016-12-09 09:00:50 -05001131SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001132 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001133 fPath = path;
1134 fOp = op;
1135 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001136}
1137
fmalita8c89c522014-11-08 16:18:56 -08001138void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001139 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001140}
1141
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001142bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001143 render_path(canvas, fPath);
1144 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001145}
1146
ethannicholasf62a8b72016-02-11 10:35:21 -08001147Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1148 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001149 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001150 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1151 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1152 return result;
1153}
1154
Mike Reedc1f77742016-12-09 09:00:50 -05001155SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001156 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001157 fRegion = region;
1158 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001159}
1160
fmalita8c89c522014-11-08 16:18:56 -08001161void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001162 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001163}
1164
ethannicholasf62a8b72016-02-11 10:35:21 -08001165Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1166 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001167 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001168 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1169 return result;
1170}
1171
Mike Reedc1f77742016-12-09 09:00:50 -05001172SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001173 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001174 fRect = rect;
1175 fOp = op;
1176 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001177}
1178
fmalita8c89c522014-11-08 16:18:56 -08001179void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001180 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001181}
1182
ethannicholasf62a8b72016-02-11 10:35:21 -08001183Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1184 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001185 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001186 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1187 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001188
1189 SkString desc;
1190 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1191
ethannicholas50a8dd02016-02-10 05:40:46 -08001192 return result;
1193}
1194
Mike Reedc1f77742016-12-09 09:00:50 -05001195SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001196 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001197 fRRect = rrect;
1198 fOp = op;
1199 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001200}
1201
fmalita8c89c522014-11-08 16:18:56 -08001202void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001203 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001204}
1205
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001206bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001207 render_rrect(canvas, fRRect);
1208 return true;
1209}
1210
ethannicholasf62a8b72016-02-11 10:35:21 -08001211Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1212 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001213 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1214 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1215 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1216 return result;
1217}
1218
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001219SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001220 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001221 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001222}
1223
fmalita8c89c522014-11-08 16:18:56 -08001224void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001225 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001226}
1227
ethannicholasf62a8b72016-02-11 10:35:21 -08001228Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1229 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001230 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001231 return result;
1232}
1233
reed97660cc2016-06-28 18:54:19 -07001234////
1235
1236SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1237 sk_sp<SkData> value)
1238 : INHERITED(kDrawAnnotation_OpType)
1239 , fRect(rect)
1240 , fKey(key)
1241 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001242{
robertphillipsfb409232016-06-29 10:28:11 -07001243}
reed97660cc2016-06-28 18:54:19 -07001244
1245void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1246 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1247}
1248
1249Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1250 Json::Value result = INHERITED::toJSON(urlDataManager);
1251
1252 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1253 result["key"] = Json::Value(fKey.c_str());
1254 if (fValue.get()) {
1255 // TODO: dump out the "value"
1256 }
reed67f62fa2016-06-29 11:36:34 -07001257
1258 SkString desc;
1259 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1260 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1261
reed97660cc2016-06-28 18:54:19 -07001262 return result;
1263}
1264
reed97660cc2016-06-28 18:54:19 -07001265////
1266
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001267SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07001268 const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001269 : INHERITED(kDrawBitmap_OpType)
1270 , fBitmap(bitmap)
1271 , fLeft(left)
1272 , fTop(top)
1273 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001274
fmalita8c89c522014-11-08 16:18:56 -08001275void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001276 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001277}
1278
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001279bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001280 render_bitmap(canvas, fBitmap);
1281 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001282}
1283
ethannicholasf62a8b72016-02-11 10:35:21 -08001284Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
1285 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001286 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001287 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001288 Json::Value command(Json::objectValue);
1289 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001290 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
Brian Osman8363be12018-05-29 13:38:07 -04001291 if (fPaint.isValid()) {
1292 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001293 }
1294 }
1295 return result;
1296}
1297
Brian Osman78a76482018-05-18 16:59:13 -04001298SkDrawBitmapLatticeCommand::SkDrawBitmapLatticeCommand(const SkBitmap& bitmap,
1299 const SkCanvas::Lattice& lattice,
1300 const SkRect& dst, const SkPaint* paint)
1301 : INHERITED(kDrawBitmapLattice_OpType)
1302 , fBitmap(bitmap)
1303 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001304 , fDst(dst)
1305 , fPaint(paint) {}
Brian Osman78a76482018-05-18 16:59:13 -04001306
1307void SkDrawBitmapLatticeCommand::execute(SkCanvas* canvas) const {
1308 canvas->drawBitmapLattice(fBitmap, fLattice, fDst, fPaint.getMaybeNull());
1309}
1310
1311bool SkDrawBitmapLatticeCommand::render(SkCanvas* canvas) const {
1312 SkAutoCanvasRestore acr(canvas, true);
1313 canvas->clear(0xFFFFFFFF);
1314
1315 xlate_and_scale_to_bounds(canvas, fDst);
1316
1317 this->execute(canvas);
1318 return true;
1319}
1320
1321Json::Value SkDrawBitmapLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1322 Json::Value result = INHERITED::toJSON(urlDataManager);
1323 Json::Value encoded;
1324 if (flatten(fBitmap, &encoded, urlDataManager)) {
1325 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
1326 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1327 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1328 if (fPaint.isValid()) {
1329 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1330 }
1331 }
1332
1333 SkString desc;
1334 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1335
1336 return result;
1337}
1338
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001339SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00001340 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001341 : INHERITED(kDrawBitmapNine_OpType)
1342 , fBitmap(bitmap)
1343 , fCenter(center)
1344 , fDst(dst)
1345 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001346
fmalita8c89c522014-11-08 16:18:56 -08001347void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001348 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001349}
1350
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001351bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08001352 SkRect tmp = SkRect::Make(fCenter);
1353 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001354 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001355}
1356
ethannicholasf62a8b72016-02-11 10:35:21 -08001357Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1358 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001359 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001360 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001361 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08001362 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07001363 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001364 if (fPaint.isValid()) {
1365 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001366 }
1367 }
1368 return result;
1369}
1370
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001371SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00001372 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07001373 SkCanvas::SrcRectConstraint constraint)
Brian Osman8363be12018-05-29 13:38:07 -04001374 : INHERITED(kDrawBitmapRect_OpType)
1375 , fBitmap(bitmap)
1376 , fSrc(src)
1377 , fDst(dst)
1378 , fPaint(paint)
1379 , fConstraint(constraint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001380
fmalita8c89c522014-11-08 16:18:56 -08001381void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001382 canvas->legacy_drawBitmapRect(fBitmap, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
1383 fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001384}
1385
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001386bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001387 render_bitmap(canvas, fBitmap, fSrc.getMaybeNull());
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001388 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001389}
1390
ethannicholasf62a8b72016-02-11 10:35:21 -08001391Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1392 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001393 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001394 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001395 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
Brian Osman8363be12018-05-29 13:38:07 -04001396 if (fSrc.isValid()) {
1397 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001398 }
brianosmanfad98562016-05-04 11:06:28 -07001399 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001400 if (fPaint.isValid()) {
1401 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001402 }
1403 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1404 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1405 }
1406 }
reed67f62fa2016-06-29 11:36:34 -07001407
1408 SkString desc;
1409 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1410
ethannicholas50a8dd02016-02-10 05:40:46 -08001411 return result;
1412}
1413
fmalita651c9202015-07-22 10:23:01 -07001414SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
1415 const SkPaint* paint)
1416 : INHERITED(kDrawImage_OpType)
1417 , fImage(SkRef(image))
1418 , fLeft(left)
Brian Osman8363be12018-05-29 13:38:07 -04001419 , fTop(top)
1420 , fPaint(paint) {}
fmalita651c9202015-07-22 10:23:01 -07001421
1422void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001423 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07001424}
1425
1426bool SkDrawImageCommand::render(SkCanvas* canvas) const {
1427 SkAutoCanvasRestore acr(canvas, true);
1428 canvas->clear(0xFFFFFFFF);
1429
1430 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
1431 SkIntToScalar(fImage->width()),
1432 SkIntToScalar(fImage->height())));
1433 this->execute(canvas);
1434 return true;
1435}
1436
ethannicholasf62a8b72016-02-11 10:35:21 -08001437Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
1438 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001439 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001440 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001441 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001442 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08001443 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001444 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001445 }
msarett0ac1bec2016-08-29 09:15:33 -07001446
1447 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
1448 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
1449 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
1450 switch (fImage->alphaType()) {
1451 case kOpaque_SkAlphaType:
1452 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
1453 break;
1454 case kPremul_SkAlphaType:
1455 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
1456 break;
1457 case kUnpremul_SkAlphaType:
1458 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
1459 break;
1460 default:
1461 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
1462 break;
1463 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001464 }
1465 return result;
1466}
1467
Stan Ilievac42aeb2017-01-12 16:20:50 -05001468SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
1469 const SkCanvas::Lattice& lattice,
1470 const SkRect& dst, const SkPaint* paint)
1471 : INHERITED(kDrawImageLattice_OpType)
1472 , fImage(SkRef(image))
1473 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001474 , fDst(dst)
1475 , fPaint(paint) {}
Stan Ilievac42aeb2017-01-12 16:20:50 -05001476
1477void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
Brian Osman78a76482018-05-18 16:59:13 -04001478 canvas->drawImageLattice(fImage.get(), fLattice, fDst, fPaint.getMaybeNull());
Stan Ilievac42aeb2017-01-12 16:20:50 -05001479}
1480
1481bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
1482 SkAutoCanvasRestore acr(canvas, true);
1483 canvas->clear(0xFFFFFFFF);
1484
1485 xlate_and_scale_to_bounds(canvas, fDst);
1486
1487 this->execute(canvas);
1488 return true;
1489}
1490
1491Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1492 Json::Value result = INHERITED::toJSON(urlDataManager);
1493 Json::Value encoded;
1494 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001495 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
Stan Ilievac42aeb2017-01-12 16:20:50 -05001496 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1497 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1498 if (fPaint.isValid()) {
1499 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1500 }
1501 }
1502
1503 SkString desc;
1504 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1505
1506 return result;
1507}
1508
fmalita651c9202015-07-22 10:23:01 -07001509SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
1510 const SkRect& dst, const SkPaint* paint,
1511 SkCanvas::SrcRectConstraint constraint)
1512 : INHERITED(kDrawImageRect_OpType)
1513 , fImage(SkRef(image))
Brian Osman8363be12018-05-29 13:38:07 -04001514 , fSrc(src)
fmalita651c9202015-07-22 10:23:01 -07001515 , fDst(dst)
Brian Osman8363be12018-05-29 13:38:07 -04001516 , fPaint(paint)
1517 , fConstraint(constraint) {}
fmalita651c9202015-07-22 10:23:01 -07001518
1519void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001520 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
1521 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07001522}
1523
1524bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
1525 SkAutoCanvasRestore acr(canvas, true);
1526 canvas->clear(0xFFFFFFFF);
1527
1528 xlate_and_scale_to_bounds(canvas, fDst);
1529
1530 this->execute(canvas);
1531 return true;
1532}
1533
ethannicholasf62a8b72016-02-11 10:35:21 -08001534Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1535 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001536 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001537 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001538 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
ethannicholas50a8dd02016-02-10 05:40:46 -08001539 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001540 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001541 }
brianosmanfad98562016-05-04 11:06:28 -07001542 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08001543 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001544 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001545 }
1546 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1547 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1548 }
1549 }
reed67f62fa2016-06-29 11:36:34 -07001550
1551 SkString desc;
1552 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1553
ethannicholas50a8dd02016-02-10 05:40:46 -08001554 return result;
1555}
1556
Brian Salomon0a0304c2018-10-11 10:16:33 -04001557SkDrawImageSetCommand::SkDrawImageSetCommand(const SkCanvas::ImageSetEntry set[], int count,
1558 float alpha, SkFilterQuality filterQuality,
1559 SkBlendMode mode)
1560 : INHERITED(kDrawImageSet_OpType)
1561 , fSet(count)
1562 , fCount(count)
1563 , fAlpha(alpha)
1564 , fFilterQuality(filterQuality)
1565 , fMode(mode) {
1566 std::copy_n(set, count, fSet.get());
1567}
1568
1569void SkDrawImageSetCommand::execute(SkCanvas* canvas) const {
1570 canvas->experimental_DrawImageSetV0(fSet.get(), fCount, fAlpha, fFilterQuality, fMode);
1571}
1572
Brian Osmanc25e2692018-03-12 10:57:28 -04001573SkDrawImageNineCommand::SkDrawImageNineCommand(const SkImage* image, const SkIRect& center,
1574 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001575 : INHERITED(kDrawImageNine_OpType)
1576 , fImage(SkRef(image))
1577 , fCenter(center)
1578 , fDst(dst)
1579 , fPaint(paint) {}
Brian Osmanc25e2692018-03-12 10:57:28 -04001580
1581void SkDrawImageNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001582 canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaint.getMaybeNull());
Brian Osmanc25e2692018-03-12 10:57:28 -04001583}
1584
1585bool SkDrawImageNineCommand::render(SkCanvas* canvas) const {
1586 SkAutoCanvasRestore acr(canvas, true);
1587 canvas->clear(0xFFFFFFFF);
1588
1589 xlate_and_scale_to_bounds(canvas, fDst);
1590
1591 this->execute(canvas);
1592 return true;
1593}
1594
1595Json::Value SkDrawImageNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1596 Json::Value result = INHERITED::toJSON(urlDataManager);
1597 Json::Value encoded;
1598 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
1599 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
1600 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
1601 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001602 if (fPaint.isValid()) {
1603 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
Brian Osmanc25e2692018-03-12 10:57:28 -04001604 }
1605 }
1606 return result;
1607}
1608
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001609SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001610 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001611 fOval = oval;
1612 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001613}
1614
fmalita8c89c522014-11-08 16:18:56 -08001615void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001616 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001617}
1618
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001619bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001620 canvas->clear(0xFFFFFFFF);
1621 canvas->save();
1622
1623 xlate_and_scale_to_bounds(canvas, fOval);
1624
1625 SkPaint p;
1626 p.setColor(SK_ColorBLACK);
1627 p.setStyle(SkPaint::kStroke_Style);
1628
1629 canvas->drawOval(fOval, p);
1630 canvas->restore();
1631
1632 return true;
1633}
1634
ethannicholasf62a8b72016-02-11 10:35:21 -08001635Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
1636 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001637 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1638 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001639 return result;
1640}
1641
bsalomonac3aa242016-08-19 11:25:19 -07001642SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
1643 bool useCenter, const SkPaint& paint)
Brian Osmanc25e2692018-03-12 10:57:28 -04001644 : INHERITED(kDrawArc_OpType) {
bsalomonac3aa242016-08-19 11:25:19 -07001645 fOval = oval;
1646 fStartAngle = startAngle;
1647 fSweepAngle = sweepAngle;
1648 fUseCenter = useCenter;
1649 fPaint = paint;
bsalomonac3aa242016-08-19 11:25:19 -07001650}
1651
1652void SkDrawArcCommand::execute(SkCanvas* canvas) const {
1653 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
1654}
1655
1656bool SkDrawArcCommand::render(SkCanvas* canvas) const {
1657 canvas->clear(0xFFFFFFFF);
1658 canvas->save();
1659
1660 xlate_and_scale_to_bounds(canvas, fOval);
1661
1662 SkPaint p;
1663 p.setColor(SK_ColorBLACK);
1664 p.setStyle(SkPaint::kStroke_Style);
1665
1666 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
1667 canvas->restore();
1668
1669 return true;
1670}
1671
1672Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
1673 Json::Value result = INHERITED::toJSON(urlDataManager);
1674 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1675 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
1676 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
1677 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
1678 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1679 return result;
1680}
1681
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001682SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001683 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001684 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001685}
1686
fmalita8c89c522014-11-08 16:18:56 -08001687void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001688 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001689}
1690
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001691bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001692 canvas->clear(0xFFFFFFFF);
1693 canvas->drawPaint(fPaint);
1694 return true;
1695}
1696
ethannicholasf62a8b72016-02-11 10:35:21 -08001697Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
1698 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001699 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001700 return result;
1701}
1702
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001703SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001704 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001705 fPath = path;
1706 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001707}
1708
fmalita8c89c522014-11-08 16:18:56 -08001709void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001710 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001711}
1712
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001713bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001714 render_path(canvas, fPath);
1715 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001716}
1717
ethannicholasf62a8b72016-02-11 10:35:21 -08001718Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1719 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001720 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
1721 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001722 return result;
1723}
1724
Brian Osmanc25e2692018-03-12 10:57:28 -04001725SkDrawRegionCommand::SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint)
1726 : INHERITED(kDrawRegion_OpType) {
1727 fRegion = region;
1728 fPaint = paint;
Brian Osmanc25e2692018-03-12 10:57:28 -04001729}
1730
1731void SkDrawRegionCommand::execute(SkCanvas* canvas) const {
1732 canvas->drawRegion(fRegion, fPaint);
1733}
1734
1735bool SkDrawRegionCommand::render(SkCanvas* canvas) const {
1736 render_region(canvas, fRegion);
1737 return true;
1738}
1739
1740Json::Value SkDrawRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1741 Json::Value result = INHERITED::toJSON(urlDataManager);
1742 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
1743 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1744 return result;
1745}
1746
fmalita160ebb22015-04-01 20:58:37 -07001747SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
1748 const SkMatrix* matrix,
1749 const SkPaint* paint)
1750 : INHERITED(kBeginDrawPicture_OpType)
Brian Osman8363be12018-05-29 13:38:07 -04001751 , fPicture(SkRef(picture))
1752 , fMatrix(matrix)
1753 , fPaint(paint) {}
fmalita160ebb22015-04-01 20:58:37 -07001754
1755void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
1756 if (fPaint.isValid()) {
1757 SkRect bounds = fPicture->cullRect();
1758 if (fMatrix.isValid()) {
1759 fMatrix.get()->mapRect(&bounds);
1760 }
1761 canvas->saveLayer(&bounds, fPaint.get());
1762 }
1763
1764 if (fMatrix.isValid()) {
1765 if (!fPaint.isValid()) {
1766 canvas->save();
1767 }
1768 canvas->concat(*fMatrix.get());
1769 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001770}
1771
fmalita160ebb22015-04-01 20:58:37 -07001772bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001773 canvas->clear(0xFFFFFFFF);
1774 canvas->save();
1775
robertphillipsa8d7f0b2014-08-29 08:03:56 -07001776 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001777
robertphillips9b14f262014-06-04 05:40:44 -07001778 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001779
1780 canvas->restore();
1781
1782 return true;
1783}
1784
fmalita160ebb22015-04-01 20:58:37 -07001785SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
1786 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
1787
1788void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
1789 if (fRestore) {
1790 canvas->restore();
1791 }
1792}
1793
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001794SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001795 const SkPoint pts[], const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04001796 : INHERITED(kDrawPoints_OpType)
1797 , fMode(mode)
1798 , fPts(pts, count)
1799 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001800
fmalita8c89c522014-11-08 16:18:56 -08001801void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001802 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001803}
1804
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001805bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001806 canvas->clear(0xFFFFFFFF);
1807 canvas->save();
1808
1809 SkRect bounds;
1810
1811 bounds.setEmpty();
Brian Osman8363be12018-05-29 13:38:07 -04001812 for (int i = 0; i < fPts.count(); ++i) {
Mike Reed185ffe92018-01-08 17:09:54 -05001813 SkRectPriv::GrowToInclude(&bounds, fPts[i]);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001814 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00001815
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001816 xlate_and_scale_to_bounds(canvas, bounds);
1817
1818 SkPaint p;
1819 p.setColor(SK_ColorBLACK);
1820 p.setStyle(SkPaint::kStroke_Style);
1821
Brian Osman8363be12018-05-29 13:38:07 -04001822 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001823 canvas->restore();
1824
1825 return true;
1826}
1827
ethannicholasf62a8b72016-02-11 10:35:21 -08001828Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
1829 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001830 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
1831 Json::Value points(Json::arrayValue);
Brian Osman8363be12018-05-29 13:38:07 -04001832 for (int i = 0; i < fPts.count(); i++) {
brianosmanfad98562016-05-04 11:06:28 -07001833 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001834 }
1835 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07001836 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001837 return result;
1838}
1839
Brian Osman65197ff2018-05-29 14:25:39 -04001840static Json::Value make_json_text(sk_sp<SkData> text) {
1841 return Json::Value((const char*)text->data(), (const char*)text->data() + text->size());
chudy@google.com902ebe52012-06-29 14:21:22 +00001842}
1843
Brian Osman65197ff2018-05-29 14:25:39 -04001844SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength,
1845 const SkPoint pos[], const SkPaint& paint)
1846 : INHERITED(kDrawPosText_OpType)
1847 , fText(SkData::MakeWithCopy(text, byteLength))
1848 , fPos(pos, paint.countText(text, byteLength))
1849 , fPaint(paint) {}
1850
fmalita8c89c522014-11-08 16:18:56 -08001851void SkDrawPosTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001852 canvas->drawPosText(fText->data(), fText->size(), fPos.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001853}
1854
ethannicholasf62a8b72016-02-11 10:35:21 -08001855Json::Value SkDrawPosTextCommand::toJSON(UrlDataManager& urlDataManager) const {
1856 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001857 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08001858 Json::Value coords(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001859 size_t numCoords = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001860 for (size_t i = 0; i < numCoords; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001861 coords.append(MakeJsonPoint(fPos[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001862 }
1863 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = coords;
brianosmanfad98562016-05-04 11:06:28 -07001864 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001865 return result;
1866}
1867
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001868SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength,
1869 const SkScalar xpos[], SkScalar constY,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001870 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04001871 : INHERITED(kDrawPosTextH_OpType)
1872 , fText(SkData::MakeWithCopy(text, byteLength))
1873 , fXpos(xpos, paint.countText(text, byteLength))
1874 , fConstY(constY)
1875 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001876
fmalita8c89c522014-11-08 16:18:56 -08001877void SkDrawPosTextHCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001878 canvas->drawPosTextH(fText->data(), fText->size(), fXpos.begin(), fConstY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001879}
1880
bungeman51190df2016-03-09 07:42:54 -08001881Json::Value SkDrawPosTextHCommand::toJSON(UrlDataManager& urlDataManager) const {
1882 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001883 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
bungeman51190df2016-03-09 07:42:54 -08001884 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fConstY);
1885 Json::Value xpos(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001886 size_t numXpos = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001887 for (size_t i = 0; i < numXpos; i++) {
1888 xpos.append(Json::Value(fXpos[i]));
1889 }
1890 result[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = xpos;
brianosmanfad98562016-05-04 11:06:28 -07001891 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
bungeman51190df2016-03-09 07:42:54 -08001892 return result;
1893}
1894
fmalita37283c22016-09-13 10:00:23 -07001895SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07001896 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001897 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07001898 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07001899 , fXPos(x)
1900 , fYPos(y)
Brian Osman255735e2018-04-06 14:51:42 -04001901 , fPaint(paint) {}
fmalitab7425172014-08-26 07:56:44 -07001902
fmalita8c89c522014-11-08 16:18:56 -08001903void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07001904 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1905}
1906
fmalita55773872014-08-29 15:08:20 -07001907bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
1908 canvas->clear(SK_ColorWHITE);
1909 canvas->save();
1910
1911 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
1912 xlate_and_scale_to_bounds(canvas, bounds);
1913
fmalita37283c22016-09-13 10:00:23 -07001914 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07001915
1916 canvas->restore();
1917
1918 return true;
1919}
1920
ethannicholasf62a8b72016-02-11 10:35:21 -08001921Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
1922 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001923 Json::Value runs(Json::arrayValue);
1924 SkTextBlobRunIterator iter(fBlob.get());
1925 while (!iter.done()) {
1926 Json::Value run(Json::objectValue);
1927 Json::Value jsonPositions(Json::arrayValue);
1928 Json::Value jsonGlyphs(Json::arrayValue);
1929 const SkScalar* iterPositions = iter.pos();
1930 const uint16_t* iterGlyphs = iter.glyphs();
1931 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1932 switch (iter.positioning()) {
Florin Malitaab54e732018-07-27 09:47:15 -04001933 case SkTextBlobRunIterator::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07001934 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
1935 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001936 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001937 case SkTextBlobRunIterator::kHorizontal_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001938 jsonPositions.append(Json::Value(iterPositions[i]));
1939 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001940 case SkTextBlobRunIterator::kDefault_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001941 break;
1942 }
1943 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
1944 }
Florin Malitaab54e732018-07-27 09:47:15 -04001945 if (iter.positioning() != SkTextBlobRunIterator::kDefault_Positioning) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001946 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
1947 }
1948 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
1949 SkPaint fontPaint;
1950 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07001951 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
1952 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08001953 runs.append(run);
1954 iter.next();
1955 }
reed6d2c3e72016-07-07 14:10:14 -07001956 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08001957 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
1958 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
1959 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07001960 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07001961 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07001962
1963 SkString desc;
1964 // make the bounds local by applying the x,y
1965 bounds.offset(fXPos, fYPos);
1966 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
1967
ethannicholas50a8dd02016-02-10 05:40:46 -08001968 return result;
1969}
1970
robertphillips9bafc302015-02-13 11:13:00 -08001971SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04001972 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08001973 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04001974 : INHERITED(kDrawPatch_OpType)
1975 , fBlendMode(bmode)
1976{
robertphillips9bafc302015-02-13 11:13:00 -08001977 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08001978 if (colors != nullptr) {
1979 memcpy(fColors, colors, sizeof(fColors));
1980 fColorsPtr = fColors;
1981 } else {
1982 fColorsPtr = nullptr;
1983 }
1984 if (texCoords != nullptr) {
1985 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
1986 fTexCoordsPtr = fTexCoords;
1987 } else {
1988 fTexCoordsPtr = nullptr;
1989 }
robertphillips9bafc302015-02-13 11:13:00 -08001990 fPaint = paint;
robertphillips9bafc302015-02-13 11:13:00 -08001991}
1992
1993void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04001994 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08001995}
1996
ethannicholasf62a8b72016-02-11 10:35:21 -08001997Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
1998 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001999 Json::Value cubics = Json::Value(Json::arrayValue);
2000 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002001 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08002002 }
2003 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
2004 if (fColorsPtr != nullptr) {
2005 Json::Value colors = Json::Value(Json::arrayValue);
2006 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002007 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08002008 }
2009 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
2010 }
2011 if (fTexCoordsPtr != nullptr) {
2012 Json::Value texCoords = Json::Value(Json::arrayValue);
2013 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002014 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08002015 }
2016 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
2017 }
Mike Reed7d954ad2016-10-28 15:42:34 -04002018 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08002019 return result;
2020}
2021
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002022SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002023 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002024 fRect = rect;
2025 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002026}
2027
fmalita8c89c522014-11-08 16:18:56 -08002028void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002029 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002030}
2031
ethannicholasf62a8b72016-02-11 10:35:21 -08002032Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2033 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002034 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
2035 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07002036
2037 SkString desc;
2038 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
2039
ethannicholas50a8dd02016-02-10 05:40:46 -08002040 return result;
2041}
2042
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002043SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002044 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002045 fRRect = rrect;
2046 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00002047}
2048
fmalita8c89c522014-11-08 16:18:56 -08002049void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00002050 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00002051}
2052
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002053bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002054 render_rrect(canvas, fRRect);
2055 return true;
2056}
2057
ethannicholasf62a8b72016-02-11 10:35:21 -08002058Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2059 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002060 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07002061 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002062 return result;
2063}
2064
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00002065SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002066 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002067 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002068 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002069 fOuter = outer;
2070 fInner = inner;
2071 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002072}
2073
fmalita8c89c522014-11-08 16:18:56 -08002074void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002075 canvas->drawDRRect(fOuter, fInner, fPaint);
2076}
2077
2078bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
2079 render_drrect(canvas, fOuter, fInner);
2080 return true;
2081}
2082
ethannicholasf62a8b72016-02-11 10:35:21 -08002083Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2084 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002085 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
2086 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07002087 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002088 return result;
2089}
2090
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04002091SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
2092 : INHERITED(kDrawShadow_OpType) {
2093 fPath = path;
2094 fShadowRec = rec;
2095}
2096
2097void SkDrawShadowCommand::execute(SkCanvas* canvas) const {
2098 canvas->private_draw_shadow_rec(fPath, fShadowRec);
2099}
2100
2101bool SkDrawShadowCommand::render(SkCanvas* canvas) const {
2102 render_shadow(canvas, fPath, fShadowRec);
2103 return true;
2104}
2105
2106Json::Value SkDrawShadowCommand::toJSON(UrlDataManager& urlDataManager) const {
2107 Json::Value result = INHERITED::toJSON(urlDataManager);
2108 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2109
2110 bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
2111 bool transparentOccluder =
2112 SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
2113
2114 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2115 result[SKDEBUGCANVAS_ATTRIBUTE_ZPLANE] = MakeJsonPoint3(fShadowRec.fZPlaneParams);
2116 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION] = MakeJsonPoint3(fShadowRec.fLightPos);
2117 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS] = MakeJsonScalar(fShadowRec.fLightRadius);
2118 result[SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR] = MakeJsonColor(fShadowRec.fAmbientColor);
2119 result[SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR] = MakeJsonColor(fShadowRec.fSpotColor);
2120 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
2121 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
2122 return result;
2123}
2124
Brian Osmanc7611082018-05-29 14:55:50 -04002125///////////////////////////////////////////////////////////////////////////////////////////////////
2126
2127SkDrawDrawableCommand::SkDrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
2128 : INHERITED(kDrawDrawable_OpType)
2129 , fDrawable(SkRef(drawable))
2130 , fMatrix(matrix) {}
2131
2132void SkDrawDrawableCommand::execute(SkCanvas* canvas) const {
2133 canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
2134}
2135
2136///////////////////////////////////////////////////////////////////////////////////////////////////
2137
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002138SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002139 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04002140 : INHERITED(kDrawText_OpType)
2141 , fText(SkData::MakeWithCopy(text, byteLength))
2142 , fX(x)
2143 , fY(y)
2144 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002145
fmalita8c89c522014-11-08 16:18:56 -08002146void SkDrawTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002147 canvas->drawText(fText->data(), fText->size(), fX, fY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002148}
2149
ethannicholasf62a8b72016-02-11 10:35:21 -08002150Json::Value SkDrawTextCommand::toJSON(UrlDataManager& urlDataManager) const {
2151 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002152 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08002153 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07002154 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fX, fY);
2155 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002156 return result;
2157}
2158
reed45561a02016-07-07 12:47:17 -07002159///////////////////////////////////////////////////////////////////////////////////////////////////
2160
reed45561a02016-07-07 12:47:17 -07002161SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength,
2162 const SkRSXform xform[], const SkRect* cull,
2163 const SkPaint& paint)
reed63f30d92016-07-07 16:32:51 -07002164 : INHERITED(kDrawTextRSXform_OpType)
Brian Osman65197ff2018-05-29 14:25:39 -04002165 , fText(SkData::MakeWithCopy(text, byteLength))
2166 , fXform(xform, paint.countText(text, byteLength))
Brian Osman8363be12018-05-29 13:38:07 -04002167 , fCull(cull)
Brian Osman65197ff2018-05-29 14:25:39 -04002168 , fPaint(paint) {}
reed45561a02016-07-07 12:47:17 -07002169
2170void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002171 canvas->drawTextRSXform(fText->data(), fText->size(), fXform.begin(), fCull.getMaybeNull(),
2172 fPaint);
reed45561a02016-07-07 12:47:17 -07002173}
2174
2175Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) const {
2176 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002177 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
reed45561a02016-07-07 12:47:17 -07002178 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
2179 return result;
2180}
2181
reed45561a02016-07-07 12:47:17 -07002182///////////////////////////////////////////////////////////////////////////////////////////////////
2183
Mike Reedfed9cfd2017-03-17 12:09:04 -04002184SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002185 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04002186 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04002187 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04002188 , fBlendMode(bmode)
Brian Osman255735e2018-04-06 14:51:42 -04002189 , fPaint(paint) {}
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002190
fmalita8c89c522014-11-08 16:18:56 -08002191void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04002192 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002193}
2194
Brian Osman616f1cb2018-05-29 11:23:35 -04002195///////////////////////////////////////////////////////////////////////////////////////////////////
2196
2197SkDrawAtlasCommand::SkDrawAtlasCommand(const SkImage* image, const SkRSXform xform[],
2198 const SkRect tex[], const SkColor colors[], int count,
2199 SkBlendMode bmode, const SkRect* cull,
2200 const SkPaint* paint)
2201 : INHERITED(kDrawAtlas_OpType)
2202 , fImage(SkRef(image))
2203 , fXform(xform, count)
2204 , fTex(tex, count)
2205 , fColors(colors, colors ? count : 0)
2206 , fBlendMode(bmode)
2207 , fCull(cull)
2208 , fPaint(paint) {}
2209
2210void SkDrawAtlasCommand::execute(SkCanvas* canvas) const {
2211 canvas->drawAtlas(fImage.get(), fXform.begin(), fTex.begin(),
2212 fColors.isEmpty() ? nullptr : fColors.begin(), fXform.count(), fBlendMode,
2213 fCull.getMaybeNull(), fPaint.getMaybeNull());
2214}
2215
2216///////////////////////////////////////////////////////////////////////////////////////////////////
2217
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002218SkRestoreCommand::SkRestoreCommand()
Brian Osman255735e2018-04-06 14:51:42 -04002219 : INHERITED(kRestore_OpType) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002220
fmalita8c89c522014-11-08 16:18:56 -08002221void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00002222 canvas->restore();
2223}
2224
Florin Malita5f6102d2014-06-30 10:13:28 -04002225SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08002226 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00002227}
2228
fmalita8c89c522014-11-08 16:18:56 -08002229void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04002230 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00002231}
2232
reed4960eee2015-12-18 07:09:18 -08002233SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
Brian Osman8363be12018-05-29 13:38:07 -04002234 : INHERITED(kSaveLayer_OpType)
2235 , fBounds(rec.fBounds)
2236 , fPaint(rec.fPaint)
2237 , fBackdrop(SkSafeRef(rec.fBackdrop))
2238 , fSaveLayerFlags(rec.fSaveLayerFlags) {}
ethannicholas50a8dd02016-02-10 05:40:46 -08002239
fmalita8c89c522014-11-08 16:18:56 -08002240void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04002241 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(),
reed4960eee2015-12-18 07:09:18 -08002242 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00002243}
2244
ethannicholasf62a8b72016-02-11 10:35:21 -08002245Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
2246 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman8363be12018-05-29 13:38:07 -04002247 if (fBounds.isValid()) {
2248 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(*fBounds.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002249 }
Brian Osman8363be12018-05-29 13:38:07 -04002250 if (fPaint.isValid()) {
2251 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002252 }
2253 if (fBackdrop != nullptr) {
2254 Json::Value jsonBackdrop;
Brian Osman8363be12018-05-29 13:38:07 -04002255 flatten(fBackdrop.get(), &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002256 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
2257 }
2258 if (fSaveLayerFlags != 0) {
2259 SkDebugf("unsupported: saveLayer flags\n");
2260 SkASSERT(false);
2261 }
2262 return result;
2263}
2264
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002265SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08002266 : INHERITED(kSetMatrix_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002267 fMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -07002268}
2269
fmalita8c89c522014-11-08 16:18:56 -08002270void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
Brian Osman255735e2018-04-06 14:51:42 -04002271 canvas->setMatrix(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00002272}
2273
ethannicholasf62a8b72016-02-11 10:35:21 -08002274Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
2275 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08002276 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08002277 return result;
2278}