blob: 229cd490c86203302b074faa448c1f867f21f284 [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 Salomond7065e72018-10-12 11:42:02 -040010#include <algorithm>
Hal Canary95e3c052017-01-11 12:44:43 -050011#include "SkAutoMalloc.h"
Brian Salomond7065e72018-10-12 11:42:02 -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 Salomond7065e72018-10-12 11:42:02 -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 Salomond7065e72018-10-12 11:42:02 -040026#include "SkShadowFlags.h"
Brian Salomon8d5b41b2018-10-12 14:22:49 +000027#include "SkTHash.h"
Brian Salomond7065e72018-10-12 11:42:02 -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"
ethannicholas50a8dd02016-02-10 05:40:46 -080063#define SKDEBUGCANVAS_ATTRIBUTE_REGION "region"
64#define SKDEBUGCANVAS_ATTRIBUTE_REGIONOP "op"
65#define SKDEBUGCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle"
66#define SKDEBUGCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion"
67#define SKDEBUGCANVAS_ATTRIBUTE_BLUR "blur"
68#define SKDEBUGCANVAS_ATTRIBUTE_SIGMA "sigma"
69#define SKDEBUGCANVAS_ATTRIBUTE_QUALITY "quality"
ethannicholas50a8dd02016-02-10 05:40:46 -080070#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE "textSize"
71#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX"
72#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX"
73#define SKDEBUGCANVAS_ATTRIBUTE_DASHING "dashing"
74#define SKDEBUGCANVAS_ATTRIBUTE_INTERVALS "intervals"
75#define SKDEBUGCANVAS_ATTRIBUTE_PHASE "phase"
76#define SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE "fillType"
77#define SKDEBUGCANVAS_ATTRIBUTE_VERBS "verbs"
78#define SKDEBUGCANVAS_ATTRIBUTE_NAME "name"
ethannicholasf62a8b72016-02-11 10:35:21 -080079#define SKDEBUGCANVAS_ATTRIBUTE_DATA "data"
brianosmanfad98562016-05-04 11:06:28 -070080#define SKDEBUGCANVAS_ATTRIBUTE_VALUES "values"
ethannicholas50a8dd02016-02-10 05:40:46 -080081#define SKDEBUGCANVAS_ATTRIBUTE_SHADER "shader"
82#define SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect"
83#define SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER "maskFilter"
84#define SKDEBUGCANVAS_ATTRIBUTE_XFERMODE "xfermode"
ethannicholas1446a9a2016-02-10 14:05:02 -080085#define SKDEBUGCANVAS_ATTRIBUTE_LOOPER "looper"
ethannicholas50a8dd02016-02-10 05:40:46 -080086#define SKDEBUGCANVAS_ATTRIBUTE_BACKDROP "backdrop"
87#define SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER "colorfilter"
88#define SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter"
89#define SKDEBUGCANVAS_ATTRIBUTE_IMAGE "image"
90#define SKDEBUGCANVAS_ATTRIBUTE_BITMAP "bitmap"
91#define SKDEBUGCANVAS_ATTRIBUTE_SRC "src"
92#define SKDEBUGCANVAS_ATTRIBUTE_DST "dst"
93#define SKDEBUGCANVAS_ATTRIBUTE_CENTER "center"
94#define SKDEBUGCANVAS_ATTRIBUTE_STRICT "strict"
95#define SKDEBUGCANVAS_ATTRIBUTE_DESCRIPTION "description"
96#define SKDEBUGCANVAS_ATTRIBUTE_X "x"
97#define SKDEBUGCANVAS_ATTRIBUTE_Y "y"
98#define SKDEBUGCANVAS_ATTRIBUTE_RUNS "runs"
99#define SKDEBUGCANVAS_ATTRIBUTE_POSITIONS "positions"
100#define SKDEBUGCANVAS_ATTRIBUTE_GLYPHS "glyphs"
101#define SKDEBUGCANVAS_ATTRIBUTE_FONT "font"
102#define SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE "typeface"
ethannicholas1446a9a2016-02-10 14:05:02 -0800103#define SKDEBUGCANVAS_ATTRIBUTE_CUBICS "cubics"
104#define SKDEBUGCANVAS_ATTRIBUTE_COLORS "colors"
105#define SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS "textureCoords"
106#define SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY "filterQuality"
bsalomonac3aa242016-08-19 11:25:19 -0700107#define SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE "startAngle"
108#define SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE "sweepAngle"
109#define SKDEBUGCANVAS_ATTRIBUTE_USECENTER "useCenter"
jcgregorioee0c5552016-06-30 09:18:27 -0700110#define SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC "shortDesc"
msarett0ac1bec2016-08-29 09:15:33 -0700111#define SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID "uniqueID"
112#define SKDEBUGCANVAS_ATTRIBUTE_WIDTH "width"
113#define SKDEBUGCANVAS_ATTRIBUTE_HEIGHT "height"
114#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Stan Ilievac42aeb2017-01-12 16:20:50 -0500115#define SKDEBUGCANVAS_ATTRIBUTE_LATTICE "lattice"
116#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT "xCount"
117#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT "yCount"
118#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS "xDivs"
119#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS "yDivs"
120#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS "flags"
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400121#define SKDEBUGCANVAS_ATTRIBUTE_ZPLANE "zPlane"
122#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION "lightPositions"
123#define SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR "ambientColor"
124#define SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR "spotColor"
125#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS "lightRadius"
reed67f62fa2016-06-29 11:36:34 -0700126
ethannicholas50a8dd02016-02-10 05:40:46 -0800127#define SKDEBUGCANVAS_VERB_MOVE "move"
128#define SKDEBUGCANVAS_VERB_LINE "line"
129#define SKDEBUGCANVAS_VERB_QUAD "quad"
130#define SKDEBUGCANVAS_VERB_CUBIC "cubic"
131#define SKDEBUGCANVAS_VERB_CONIC "conic"
132#define SKDEBUGCANVAS_VERB_CLOSE "close"
133
134#define SKDEBUGCANVAS_STYLE_FILL "fill"
135#define SKDEBUGCANVAS_STYLE_STROKE "stroke"
136#define SKDEBUGCANVAS_STYLE_STROKEANDFILL "strokeAndFill"
137
138#define SKDEBUGCANVAS_POINTMODE_POINTS "points"
139#define SKDEBUGCANVAS_POINTMODE_LINES "lines"
140#define SKDEBUGCANVAS_POINTMODE_POLYGON "polygon"
141
142#define SKDEBUGCANVAS_REGIONOP_DIFFERENCE "difference"
143#define SKDEBUGCANVAS_REGIONOP_INTERSECT "intersect"
144#define SKDEBUGCANVAS_REGIONOP_UNION "union"
145#define SKDEBUGCANVAS_REGIONOP_XOR "xor"
146#define SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE "reverseDifference"
147#define SKDEBUGCANVAS_REGIONOP_REPLACE "replace"
148
149#define SKDEBUGCANVAS_BLURSTYLE_NORMAL "normal"
150#define SKDEBUGCANVAS_BLURSTYLE_SOLID "solid"
151#define SKDEBUGCANVAS_BLURSTYLE_OUTER "outer"
152#define SKDEBUGCANVAS_BLURSTYLE_INNER "inner"
153
154#define SKDEBUGCANVAS_BLURQUALITY_LOW "low"
155#define SKDEBUGCANVAS_BLURQUALITY_HIGH "high"
156
ethannicholas50a8dd02016-02-10 05:40:46 -0800157#define SKDEBUGCANVAS_FILLTYPE_WINDING "winding"
158#define SKDEBUGCANVAS_FILLTYPE_EVENODD "evenOdd"
159#define SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding"
160#define SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd"
161
162#define SKDEBUGCANVAS_CAP_BUTT "butt"
163#define SKDEBUGCANVAS_CAP_ROUND "round"
164#define SKDEBUGCANVAS_CAP_SQUARE "square"
165
ethannicholas1446a9a2016-02-10 14:05:02 -0800166#define SKDEBUGCANVAS_MITER_JOIN "miter"
167#define SKDEBUGCANVAS_ROUND_JOIN "round"
168#define SKDEBUGCANVAS_BEVEL_JOIN "bevel"
169
ethannicholas50a8dd02016-02-10 05:40:46 -0800170#define SKDEBUGCANVAS_COLORTYPE_ARGB4444 "ARGB4444"
171#define SKDEBUGCANVAS_COLORTYPE_RGBA8888 "RGBA8888"
172#define SKDEBUGCANVAS_COLORTYPE_BGRA8888 "BGRA8888"
173#define SKDEBUGCANVAS_COLORTYPE_565 "565"
174#define SKDEBUGCANVAS_COLORTYPE_GRAY8 "Gray8"
175#define SKDEBUGCANVAS_COLORTYPE_INDEX8 "Index8"
176#define SKDEBUGCANVAS_COLORTYPE_ALPHA8 "Alpha8"
177
178#define SKDEBUGCANVAS_ALPHATYPE_OPAQUE "opaque"
179#define SKDEBUGCANVAS_ALPHATYPE_PREMUL "premul"
180#define SKDEBUGCANVAS_ALPHATYPE_UNPREMUL "unpremul"
msarett0ac1bec2016-08-29 09:15:33 -0700181#define SKDEBUGCANVAS_ALPHATYPE_UNKNOWN "unknown"
ethannicholas50a8dd02016-02-10 05:40:46 -0800182
ethannicholas1446a9a2016-02-10 14:05:02 -0800183#define SKDEBUGCANVAS_FILTERQUALITY_NONE "none"
184#define SKDEBUGCANVAS_FILTERQUALITY_LOW "low"
185#define SKDEBUGCANVAS_FILTERQUALITY_MEDIUM "medium"
186#define SKDEBUGCANVAS_FILTERQUALITY_HIGH "high"
187
halcanaryf412f092016-08-25 11:10:41 -0700188#define SKDEBUGCANVAS_HINTING_NONE "none"
189#define SKDEBUGCANVAS_HINTING_SLIGHT "slight"
190#define SKDEBUGCANVAS_HINTING_NORMAL "normal"
191#define SKDEBUGCANVAS_HINTING_FULL "full"
192
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400193#define SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC "transparentOccluder"
194#define SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY "geometricOnly"
195
reed67f62fa2016-06-29 11:36:34 -0700196static SkString* str_append(SkString* str, const SkRect& r) {
197 str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom());
198 return str;
199}
200
robertphillips9bafc302015-02-13 11:13:00 -0800201SkDrawCommand::SkDrawCommand(OpType type)
202 : fOpType(type)
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000203 , fVisible(true) {
204}
205
robertphillips9bafc302015-02-13 11:13:00 -0800206const char* SkDrawCommand::GetCommandString(OpType type) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000207 switch (type) {
fmalita160ebb22015-04-01 20:58:37 -0700208 case kBeginDrawPicture_OpType: return "BeginDrawPicture";
Brian Osmanc25e2692018-03-12 10:57:28 -0400209 case kClear_OpType: return "DrawClear";
robertphillips9bafc302015-02-13 11:13:00 -0800210 case kClipPath_OpType: return "ClipPath";
211 case kClipRegion_OpType: return "ClipRegion";
212 case kClipRect_OpType: return "ClipRect";
213 case kClipRRect_OpType: return "ClipRRect";
robertphillips9bafc302015-02-13 11:13:00 -0800214 case kConcat_OpType: return "Concat";
robertphillipsfb409232016-06-29 10:28:11 -0700215 case kDrawAnnotation_OpType: return "DrawAnnotation";
robertphillips9bafc302015-02-13 11:13:00 -0800216 case kDrawBitmap_OpType: return "DrawBitmap";
Brian Osman78a76482018-05-18 16:59:13 -0400217 case kDrawBitmapLattice_OpType: return "DrawBitmapLattice";
robertphillips9bafc302015-02-13 11:13:00 -0800218 case kDrawBitmapNine_OpType: return "DrawBitmapNine";
219 case kDrawBitmapRect_OpType: return "DrawBitmapRect";
robertphillips9bafc302015-02-13 11:13:00 -0800220 case kDrawDRRect_OpType: return "DrawDRRect";
fmalita651c9202015-07-22 10:23:01 -0700221 case kDrawImage_OpType: return "DrawImage";
Stan Ilievac42aeb2017-01-12 16:20:50 -0500222 case kDrawImageLattice_OpType: return "DrawImageLattice";
Brian Osmanc25e2692018-03-12 10:57:28 -0400223 case kDrawImageNine_OpType: return "DrawImageNine";
fmalita651c9202015-07-22 10:23:01 -0700224 case kDrawImageRect_OpType: return "DrawImageRect";
Brian Salomond7065e72018-10-12 11:42:02 -0400225 case kDrawImageSet_OpType: return "DrawImageSet";
robertphillips9bafc302015-02-13 11:13:00 -0800226 case kDrawOval_OpType: return "DrawOval";
227 case kDrawPaint_OpType: return "DrawPaint";
228 case kDrawPatch_OpType: return "DrawPatch";
229 case kDrawPath_OpType: return "DrawPath";
Brian Osmanc25e2692018-03-12 10:57:28 -0400230 case kDrawArc_OpType: return "DrawArc";
robertphillips9bafc302015-02-13 11:13:00 -0800231 case kDrawPoints_OpType: return "DrawPoints";
232 case kDrawPosText_OpType: return "DrawPosText";
233 case kDrawPosTextH_OpType: return "DrawPosTextH";
234 case kDrawRect_OpType: return "DrawRect";
235 case kDrawRRect_OpType: return "DrawRRect";
Brian Osmanc25e2692018-03-12 10:57:28 -0400236 case kDrawRegion_OpType: return "DrawRegion";
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400237 case kDrawShadow_OpType: return "DrawShadow";
robertphillips9bafc302015-02-13 11:13:00 -0800238 case kDrawText_OpType: return "DrawText";
239 case kDrawTextBlob_OpType: return "DrawTextBlob";
reed63f30d92016-07-07 16:32:51 -0700240 case kDrawTextRSXform_OpType: return "DrawTextRSXform";
robertphillips9bafc302015-02-13 11:13:00 -0800241 case kDrawVertices_OpType: return "DrawVertices";
Brian Osman616f1cb2018-05-29 11:23:35 -0400242 case kDrawAtlas_OpType: return "DrawAtlas";
Brian Osmanc7611082018-05-29 14:55:50 -0400243 case kDrawDrawable_OpType: return "DrawDrawable";
fmalita160ebb22015-04-01 20:58:37 -0700244 case kEndDrawPicture_OpType: return "EndDrawPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800245 case kRestore_OpType: return "Restore";
246 case kSave_OpType: return "Save";
247 case kSaveLayer_OpType: return "SaveLayer";
248 case kSetMatrix_OpType: return "SetMatrix";
chudy@google.com902ebe52012-06-29 14:21:22 +0000249 default:
robertphillips9bafc302015-02-13 11:13:00 -0800250 SkDebugf("OpType error 0x%08x\n", type);
chudy@google.com902ebe52012-06-29 14:21:22 +0000251 SkASSERT(0);
252 break;
253 }
254 SkDEBUGFAIL("DrawType UNUSED\n");
halcanary96fcdcc2015-08-27 07:41:13 -0700255 return nullptr;
chudy@google.com902ebe52012-06-29 14:21:22 +0000256}
257
ethannicholasf62a8b72016-02-11 10:35:21 -0800258Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const {
ethannicholas50a8dd02016-02-10 05:40:46 -0800259 Json::Value result;
260 result[SKDEBUGCANVAS_ATTRIBUTE_COMMAND] = this->GetCommandString(fOpType);
ethannicholas807dcab2016-02-23 06:53:37 -0800261 result[SKDEBUGCANVAS_ATTRIBUTE_VISIBLE] = Json::Value(this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800262 return result;
263}
264
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000265namespace {
266
267void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
Mike Reed3661bc92017-02-22 13:21:42 -0500268 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000269
270 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
271
272 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
273 if (bounds.width() > bounds.height()) {
274 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
275 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
276 } else {
277 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
278 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
279 }
280 canvas->translate(-bounds.centerX(), -bounds.centerY());
281}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000282
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000283
284void render_path(SkCanvas* canvas, const SkPath& path) {
285 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000286
287 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700288 if (bounds.isEmpty()) {
289 return;
290 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000291
fmalitab0cd8b72015-10-06 07:24:03 -0700292 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000293 xlate_and_scale_to_bounds(canvas, bounds);
294
295 SkPaint p;
296 p.setColor(SK_ColorBLACK);
297 p.setStyle(SkPaint::kStroke_Style);
298
299 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000300}
301
Brian Osmanc25e2692018-03-12 10:57:28 -0400302void render_region(SkCanvas* canvas, const SkRegion& region) {
303 canvas->clear(0xFFFFFFFF);
304
305 const SkIRect& bounds = region.getBounds();
306 if (bounds.isEmpty()) {
307 return;
308 }
309
310 SkAutoCanvasRestore acr(canvas, true);
Brian Osman99b63402018-03-13 10:19:27 -0400311 xlate_and_scale_to_bounds(canvas, SkRect::Make(bounds));
Brian Osmanc25e2692018-03-12 10:57:28 -0400312
313 SkPaint p;
314 p.setColor(SK_ColorBLACK);
315 p.setStyle(SkPaint::kStroke_Style);
316
317 canvas->drawRegion(region, p);
318}
319
halcanary96fcdcc2015-08-27 07:41:13 -0700320void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
Mike Reed3661bc92017-02-22 13:21:42 -0500321 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000322
323 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
324 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
325
326 if (input.width() > input.height()) {
327 yScale *= input.height() / (float) input.width();
328 } else {
329 xScale *= input.width() / (float) input.height();
330 }
331
332 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
333 xScale * input.width(),
334 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000335
robertphillips96a5cff2015-09-24 06:56:27 -0700336 static const int kNumBlocks = 8;
337
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000338 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700339 SkISize block = {
340 canvas->imageInfo().width()/kNumBlocks,
341 canvas->imageInfo().height()/kNumBlocks
342 };
343 for (int y = 0; y < kNumBlocks; ++y) {
344 for (int x = 0; x < kNumBlocks; ++x) {
345 SkPaint paint;
346 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
347 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
348 SkIntToScalar(y*block.height()),
349 SkIntToScalar(block.width()),
350 SkIntToScalar(block.height()));
351 canvas->drawRect(r, paint);
352 }
353 }
354
reede47829b2015-08-06 10:02:53 -0700355 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000356
bsalomon49f085d2014-09-05 13:34:00 -0700357 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000358 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
359 srcRect->fTop * yScale + SK_Scalar1,
360 srcRect->fRight * xScale + SK_Scalar1,
361 srcRect->fBottom * yScale + SK_Scalar1);
362 SkPaint p;
363 p.setColor(SK_ColorRED);
364 p.setStyle(SkPaint::kStroke_Style);
365
366 canvas->drawRect(r, p);
367 }
368}
369
370void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
371 canvas->clear(0xFFFFFFFF);
372 canvas->save();
373
374 const SkRect& bounds = rrect.getBounds();
375
376 xlate_and_scale_to_bounds(canvas, bounds);
377
378 SkPaint p;
379 p.setColor(SK_ColorBLACK);
380 p.setStyle(SkPaint::kStroke_Style);
381
382 canvas->drawRRect(rrect, p);
383 canvas->restore();
384}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000385
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000386void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
387 canvas->clear(0xFFFFFFFF);
388 canvas->save();
389
390 const SkRect& bounds = outer.getBounds();
391
392 xlate_and_scale_to_bounds(canvas, bounds);
393
394 SkPaint p;
395 p.setColor(SK_ColorBLACK);
396 p.setStyle(SkPaint::kStroke_Style);
397
398 canvas->drawDRRect(outer, inner, p);
399 canvas->restore();
400}
401
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400402void render_shadow(SkCanvas* canvas, const SkPath& path, SkDrawShadowRec rec) {
403 canvas->clear(0xFFFFFFFF);
404
405 const SkRect& bounds = path.getBounds();
406 if (bounds.isEmpty()) {
407 return;
408 }
409
410 SkAutoCanvasRestore acr(canvas, true);
411 xlate_and_scale_to_bounds(canvas, bounds);
412
413 rec.fAmbientColor = SK_ColorBLACK;
414 rec.fSpotColor = SK_ColorBLACK;
415 canvas->private_draw_shadow_rec(path, rec);
416}
417
Florin Malita82d80872017-06-06 16:58:40 -0400418static const char* const gBlendModeMap[] = {
419 "clear",
420 "src",
421 "dst",
422 "srcOver",
423 "dstOver",
424 "srcIn",
425 "dstIn",
426 "srcOut",
427 "dstOut",
428 "srcATop",
429 "dstATop",
430 "xor",
431 "plus",
432 "modulate",
433
434 "screen",
435
436 "overlay",
437 "darken",
438 "lighten",
439 "colorDodge",
440 "colorBurn",
441 "hardLight",
442 "softLight",
443 "difference",
444 "exclusion",
445 "multiply",
446
447 "hue",
448 "saturation",
449 "color",
450 "luminosity",
451};
452
453static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
454 "blendMode mismatch");
455static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
456 "blendMode mismatch");
457
458void apply_paint_blend_mode(const SkPaint& paint, Json::Value* target) {
459 const auto mode = paint.getBlendMode();
460 if (mode != SkBlendMode::kSrcOver) {
461 SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
462 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE] =
463 Json::Value(gBlendModeMap[static_cast<size_t>(mode)]);
464 }
465}
466
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000467};
468
brianosmanfad98562016-05-04 11:06:28 -0700469Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800470 Json::Value result(Json::arrayValue);
471 result.append(Json::Value(SkColorGetA(color)));
472 result.append(Json::Value(SkColorGetR(color)));
473 result.append(Json::Value(SkColorGetG(color)));
474 result.append(Json::Value(SkColorGetB(color)));
475 return result;
476}
477
brianosman97bbf822016-09-25 13:15:58 -0700478Json::Value SkDrawCommand::MakeJsonColor4f(const SkColor4f& color) {
479 Json::Value result(Json::arrayValue);
480 result.append(Json::Value(color.fA));
481 result.append(Json::Value(color.fR));
482 result.append(Json::Value(color.fG));
483 result.append(Json::Value(color.fB));
484 return result;
485}
486
brianosmanfad98562016-05-04 11:06:28 -0700487Json::Value SkDrawCommand::MakeJsonPoint(const SkPoint& point) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800488 Json::Value result(Json::arrayValue);
489 result.append(Json::Value(point.x()));
490 result.append(Json::Value(point.y()));
491 return result;
492}
493
brianosmanfad98562016-05-04 11:06:28 -0700494Json::Value SkDrawCommand::MakeJsonPoint(SkScalar x, SkScalar y) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800495 Json::Value result(Json::arrayValue);
496 result.append(Json::Value(x));
497 result.append(Json::Value(y));
498 return result;
499}
500
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400501Json::Value SkDrawCommand::MakeJsonPoint3(const SkPoint3& point) {
502 Json::Value result(Json::arrayValue);
503 result.append(Json::Value(point.x()));
504 result.append(Json::Value(point.y()));
505 result.append(Json::Value(point.z()));
506 return result;
507}
508
brianosmanfad98562016-05-04 11:06:28 -0700509Json::Value SkDrawCommand::MakeJsonRect(const SkRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800510 Json::Value result(Json::arrayValue);
511 result.append(Json::Value(rect.left()));
512 result.append(Json::Value(rect.top()));
513 result.append(Json::Value(rect.right()));
514 result.append(Json::Value(rect.bottom()));
515 return result;
516}
517
joshualittbd724132016-03-03 11:39:38 -0800518Json::Value SkDrawCommand::MakeJsonIRect(const SkIRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800519 Json::Value result(Json::arrayValue);
520 result.append(Json::Value(rect.left()));
521 result.append(Json::Value(rect.top()));
522 result.append(Json::Value(rect.right()));
523 result.append(Json::Value(rect.bottom()));
524 return result;
525}
526
527static Json::Value make_json_rrect(const SkRRect& rrect) {
528 Json::Value result(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700529 result.append(SkDrawCommand::MakeJsonRect(rrect.rect()));
530 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
531 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperRight_Corner)));
532 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerRight_Corner)));
533 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
ethannicholas50a8dd02016-02-10 05:40:46 -0800534 return result;
535}
536
joshualittbd724132016-03-03 11:39:38 -0800537Json::Value SkDrawCommand::MakeJsonMatrix(const SkMatrix& matrix) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800538 Json::Value result(Json::arrayValue);
539 Json::Value row1(Json::arrayValue);
540 row1.append(Json::Value(matrix[0]));
541 row1.append(Json::Value(matrix[1]));
542 row1.append(Json::Value(matrix[2]));
543 result.append(row1);
544 Json::Value row2(Json::arrayValue);
545 row2.append(Json::Value(matrix[3]));
546 row2.append(Json::Value(matrix[4]));
547 row2.append(Json::Value(matrix[5]));
548 result.append(row2);
549 Json::Value row3(Json::arrayValue);
550 row3.append(Json::Value(matrix[6]));
551 row3.append(Json::Value(matrix[7]));
552 row3.append(Json::Value(matrix[8]));
553 result.append(row3);
554 return result;
555}
ethannicholas1446a9a2016-02-10 14:05:02 -0800556
vjiaoblacke5de1302016-07-13 14:05:28 -0700557Json::Value SkDrawCommand::MakeJsonScalar(SkScalar z) {
558 Json::Value result(z);
559 return result;
560}
561
brianosmanfad98562016-05-04 11:06:28 -0700562Json::Value SkDrawCommand::MakeJsonPath(const SkPath& path) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800563 Json::Value result(Json::objectValue);
564 switch (path.getFillType()) {
565 case SkPath::kWinding_FillType:
566 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_WINDING;
567 break;
568 case SkPath::kEvenOdd_FillType:
569 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_EVENODD;
570 break;
571 case SkPath::kInverseWinding_FillType:
572 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING;
573 break;
574 case SkPath::kInverseEvenOdd_FillType:
575 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
576 break;
halcanary9d524f22016-03-29 09:03:52 -0700577 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800578 Json::Value verbs(Json::arrayValue);
579 SkPath::Iter iter(path, false);
580 SkPoint pts[4];
581 SkPath::Verb verb;
582 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
583 switch (verb) {
584 case SkPath::kLine_Verb: {
585 Json::Value line(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700586 line[SKDEBUGCANVAS_VERB_LINE] = MakeJsonPoint(pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800587 verbs.append(line);
588 break;
589 }
590 case SkPath::kQuad_Verb: {
591 Json::Value quad(Json::objectValue);
592 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700593 coords.append(MakeJsonPoint(pts[1]));
594 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800595 quad[SKDEBUGCANVAS_VERB_QUAD] = coords;
596 verbs.append(quad);
597 break;
598 }
599 case SkPath::kCubic_Verb: {
600 Json::Value cubic(Json::objectValue);
601 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700602 coords.append(MakeJsonPoint(pts[1]));
603 coords.append(MakeJsonPoint(pts[2]));
604 coords.append(MakeJsonPoint(pts[3]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800605 cubic[SKDEBUGCANVAS_VERB_CUBIC] = coords;
606 verbs.append(cubic);
607 break;
608 }
609 case SkPath::kConic_Verb: {
610 Json::Value conic(Json::objectValue);
611 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700612 coords.append(MakeJsonPoint(pts[1]));
613 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800614 coords.append(Json::Value(iter.conicWeight()));
615 conic[SKDEBUGCANVAS_VERB_CONIC] = coords;
616 verbs.append(conic);
617 break;
618 }
619 case SkPath::kMove_Verb: {
620 Json::Value move(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700621 move[SKDEBUGCANVAS_VERB_MOVE] = MakeJsonPoint(pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800622 verbs.append(move);
623 break;
624 }
625 case SkPath::kClose_Verb:
626 verbs.append(Json::Value(SKDEBUGCANVAS_VERB_CLOSE));
627 break;
628 case SkPath::kDone_Verb:
629 break;
630 }
631 }
632 result[SKDEBUGCANVAS_ATTRIBUTE_VERBS] = verbs;
633 return result;
634}
635
brianosmanfad98562016-05-04 11:06:28 -0700636Json::Value SkDrawCommand::MakeJsonRegion(const SkRegion& region) {
Brian Osmanc25e2692018-03-12 10:57:28 -0400637 // TODO: Actually serialize the rectangles, rather than just devolving to path
638 SkPath path;
639 region.getBoundaryPath(&path);
640 return MakeJsonPath(path);
ethannicholas50a8dd02016-02-10 05:40:46 -0800641}
642
Mike Reedc1f77742016-12-09 09:00:50 -0500643static Json::Value make_json_regionop(SkClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800644 switch (op) {
Mike Reedc1f77742016-12-09 09:00:50 -0500645 case kDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800646 return Json::Value(SKDEBUGCANVAS_REGIONOP_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500647 case kIntersect_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800648 return Json::Value(SKDEBUGCANVAS_REGIONOP_INTERSECT);
Mike Reedc1f77742016-12-09 09:00:50 -0500649 case kUnion_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800650 return Json::Value(SKDEBUGCANVAS_REGIONOP_UNION);
Mike Reedc1f77742016-12-09 09:00:50 -0500651 case kXOR_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800652 return Json::Value(SKDEBUGCANVAS_REGIONOP_XOR);
Mike Reedc1f77742016-12-09 09:00:50 -0500653 case kReverseDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800654 return Json::Value(SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500655 case kReplace_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800656 return Json::Value(SKDEBUGCANVAS_REGIONOP_REPLACE);
657 default:
658 SkASSERT(false);
659 return Json::Value("<invalid region op>");
660 };
661}
662
663static Json::Value make_json_pointmode(SkCanvas::PointMode mode) {
664 switch (mode) {
665 case SkCanvas::kPoints_PointMode:
666 return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
667 case SkCanvas::kLines_PointMode:
668 return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
halcanary9d524f22016-03-29 09:03:52 -0700669 case SkCanvas::kPolygon_PointMode:
ethannicholas50a8dd02016-02-10 05:40:46 -0800670 return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
671 default:
672 SkASSERT(false);
673 return Json::Value("<invalid point mode>");
674 };
675}
676
halcanary9d524f22016-03-29 09:03:52 -0700677static void store_scalar(Json::Value* target, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800678 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800679 if (value != defaultValue) {
680 (*target)[key] = Json::Value(value);
681 }
682}
683
ethannicholasbd3dae82016-02-10 12:10:00 -0800684static void store_bool(Json::Value* target, const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800685 if (value != defaultValue) {
686 (*target)[key] = Json::Value(value);
687 }
688}
689
halcanary9d524f22016-03-29 09:03:52 -0700690static void encode_data(const void* bytes, size_t count, const char* contentType,
ethannicholasf62a8b72016-02-11 10:35:21 -0800691 UrlDataManager& urlDataManager, Json::Value* target) {
bungeman38d909e2016-08-02 14:40:46 -0700692 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
693 SkString url = urlDataManager.addData(data.get(), contentType);
ethannicholasf62a8b72016-02-11 10:35:21 -0800694 *target = Json::Value(url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800695}
696
brianosmanfad98562016-05-04 11:06:28 -0700697void SkDrawCommand::flatten(const SkFlattenable* flattenable, Json::Value* target,
698 UrlDataManager& urlDataManager) {
699 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800700 flattenable->flatten(buffer);
701 void* data = sk_malloc_throw(buffer.bytesWritten());
702 buffer.writeToMemory(data);
703 Json::Value jsonData;
704 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, &jsonData);
705 Json::Value jsonFlattenable;
706 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->getTypeName());
707 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
brianosmanfad98562016-05-04 11:06:28 -0700708
709 SkJsonWriteBuffer jsonBuffer(&urlDataManager);
710 flattenable->flatten(jsonBuffer);
711 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_VALUES] = jsonBuffer.getValue();
712
ethannicholasf62a8b72016-02-11 10:35:21 -0800713 (*target) = jsonFlattenable;
714 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800715}
716
Brian Osmand9ea8162018-08-08 17:03:39 -0400717void SkDrawCommand::WritePNG(SkBitmap bitmap, SkWStream& out) {
718 SkPixmap pm;
719 SkAssertResult(bitmap.peekPixels(&pm));
ethannicholasf67531f2016-03-21 10:19:39 -0700720
Brian Osmand9ea8162018-08-08 17:03:39 -0400721 SkPngEncoder::Options options;
722 options.fZLibLevel = 1;
723 options.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
724 SkPngEncoder::Encode(&out, pm, options);
ethannicholasf67531f2016-03-21 10:19:39 -0700725}
726
brianosmanfad98562016-05-04 11:06:28 -0700727bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
728 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700729 size_t rowBytes = 4 * image.width();
Hal Canary95e3c052017-01-11 12:44:43 -0500730 SkAutoMalloc buffer(rowBytes * image.height());
halcanary9d524f22016-03-29 09:03:52 -0700731 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700732 kN32_SkColorType, kPremul_SkAlphaType);
733 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
734 SkDebugf("readPixels failed\n");
735 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800736 }
msaretta5cf4f42016-06-30 10:06:51 -0700737
738 SkBitmap bm;
739 bm.installPixels(dstInfo, buffer.get(), rowBytes);
msaretta5cf4f42016-06-30 10:06:51 -0700740
ethannicholasf67531f2016-03-21 10:19:39 -0700741 SkDynamicMemoryWStream out;
Brian Osmand9ea8162018-08-08 17:03:39 -0400742 SkDrawCommand::WritePNG(bm, out);
reed42943c82016-09-12 12:01:44 -0700743 sk_sp<SkData> encoded = out.detachAsData();
ethannicholasf62a8b72016-02-11 10:35:21 -0800744 Json::Value jsonData;
745 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
746 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
ethannicholas50a8dd02016-02-10 05:40:46 -0800747 return true;
748}
749
750static const char* color_type_name(SkColorType colorType) {
751 switch (colorType) {
752 case kARGB_4444_SkColorType:
753 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
754 case kRGBA_8888_SkColorType:
755 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
756 case kBGRA_8888_SkColorType:
757 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
758 case kRGB_565_SkColorType:
759 return SKDEBUGCANVAS_COLORTYPE_565;
760 case kGray_8_SkColorType:
761 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
ethannicholas50a8dd02016-02-10 05:40:46 -0800762 case kAlpha_8_SkColorType:
763 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
764 default:
765 SkASSERT(false);
766 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
767 }
768}
769
770static const char* alpha_type_name(SkAlphaType alphaType) {
771 switch (alphaType) {
772 case kOpaque_SkAlphaType:
773 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
774 case kPremul_SkAlphaType:
775 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
776 case kUnpremul_SkAlphaType:
777 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
778 default:
779 SkASSERT(false);
780 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
781 }
782}
783
brianosmanfad98562016-05-04 11:06:28 -0700784bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
785 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700786 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800787 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
788 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800789 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800790 return success;
791}
792
halcanaryf412f092016-08-25 11:10:41 -0700793static void apply_paint_hinting(const SkPaint& paint, Json::Value* target) {
Mike Reed9edbf422018-11-07 19:54:33 -0500794 SkFontHinting hinting = (SkFontHinting)paint.getHinting();
halcanaryf412f092016-08-25 11:10:41 -0700795 if (hinting != SkPaintDefaults_Hinting) {
796 switch (hinting) {
Mike Reed9edbf422018-11-07 19:54:33 -0500797 case kNo_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700798 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
799 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500800 case kSlight_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700801 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
802 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500803 case kNormal_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700804 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
805 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500806 case kFull_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700807 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
808 break;
809 }
810 }
811}
812
ethannicholas50a8dd02016-02-10 05:40:46 -0800813static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
814 SkColor color = paint.getColor();
815 if (color != SK_ColorBLACK) {
816 Json::Value colorValue(Json::arrayValue);
817 colorValue.append(Json::Value(SkColorGetA(color)));
818 colorValue.append(Json::Value(SkColorGetR(color)));
819 colorValue.append(Json::Value(SkColorGetG(color)));
820 colorValue.append(Json::Value(SkColorGetB(color)));
821 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;;
822 }
823}
824
825static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
826 SkPaint::Style style = paint.getStyle();
827 if (style != SkPaint::kFill_Style) {
828 switch (style) {
829 case SkPaint::kStroke_Style: {
830 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
831 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
832 break;
833 }
834 case SkPaint::kStrokeAndFill_Style: {
835 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
836 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
837 break;
838 }
839 default: SkASSERT(false);
840 }
841 }
842}
843
844static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
845 SkPaint::Cap cap = paint.getStrokeCap();
846 if (cap != SkPaint::kDefault_Cap) {
847 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800848 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800849 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
850 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800851 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800852 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
853 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800854 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800855 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
856 break;
ethannicholas50a8dd02016-02-10 05:40:46 -0800857 default: SkASSERT(false);
858 }
859 }
860}
ethannicholas1446a9a2016-02-10 14:05:02 -0800861
862static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
863 SkPaint::Join join = paint.getStrokeJoin();
864 if (join != SkPaint::kDefault_Join) {
865 switch (join) {
866 case SkPaint::kMiter_Join:
867 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
868 SKDEBUGCANVAS_MITER_JOIN);
869 break;
870 case SkPaint::kRound_Join:
871 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
872 SKDEBUGCANVAS_ROUND_JOIN);
873 break;
874 case SkPaint::kBevel_Join:
875 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
876 SKDEBUGCANVAS_BEVEL_JOIN);
877 break;
878 default: SkASSERT(false);
879 }
880 }
881}
882
883static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
884 SkFilterQuality quality = paint.getFilterQuality();
885 switch (quality) {
886 case kNone_SkFilterQuality:
887 break;
888 case kLow_SkFilterQuality:
889 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
890 SKDEBUGCANVAS_FILTERQUALITY_LOW);
891 break;
892 case kMedium_SkFilterQuality:
893 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
894 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
895 break;
896 case kHigh_SkFilterQuality:
897 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
898 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
899 break;
900 }
901}
902
halcanary9d524f22016-03-29 09:03:52 -0700903static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800904 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800905 SkMaskFilter* maskFilter = paint.getMaskFilter();
906 if (maskFilter != nullptr) {
Mike Reed80747ef2018-01-23 15:29:32 -0500907 SkMaskFilterBase::BlurRec blurRec;
908 if (as_MFB(maskFilter)->asABlur(&blurRec)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800909 Json::Value blur(Json::objectValue);
910 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
911 switch (blurRec.fStyle) {
912 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800913 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
914 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -0800915 break;
916 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800917 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
918 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -0800919 break;
920 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800921 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
922 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800923 break;
924 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800925 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
926 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800927 break;
928 default:
929 SkASSERT(false);
930 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800931 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
932 } else {
933 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -0700934 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800935 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
936 }
937 }
938}
939
halcanary9d524f22016-03-29 09:03:52 -0700940static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800941 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800942 SkPathEffect* pathEffect = paint.getPathEffect();
943 if (pathEffect != nullptr) {
944 SkPathEffect::DashInfo dashInfo;
945 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
946 if (dashType == SkPathEffect::kDash_DashType) {
947 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
948 pathEffect->asADash(&dashInfo);
949 Json::Value dashing(Json::objectValue);
950 Json::Value intervals(Json::arrayValue);
951 for (int32_t i = 0; i < dashInfo.fCount; i++) {
952 intervals.append(Json::Value(dashInfo.fIntervals[i]));
953 }
954 sk_free(dashInfo.fIntervals);
955 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
956 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
957 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
958 } else {
959 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -0700960 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800961 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
962 }
963 }
964}
halcanary9d524f22016-03-29 09:03:52 -0700965
halcanary9d524f22016-03-29 09:03:52 -0700966static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800967 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800968 SkTypeface* typeface = paint.getTypeface();
969 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -0800970 Json::Value jsonTypeface;
971 SkDynamicMemoryWStream buffer;
972 typeface->serialize(&buffer);
973 void* data = sk_malloc_throw(buffer.bytesWritten());
974 buffer.copyTo(data);
975 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -0700976 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -0800977 &jsonData);
978 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
979 sk_free(data);
980 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -0800981 }
982}
983
halcanary9d524f22016-03-29 09:03:52 -0700984static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800985 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800986 SkFlattenable* shader = paint.getShader();
987 if (shader != nullptr) {
988 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -0700989 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800990 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
991 }
992}
993
ethannicholasf62a8b72016-02-11 10:35:21 -0800994static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
995 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800996 SkFlattenable* imageFilter = paint.getImageFilter();
997 if (imageFilter != nullptr) {
998 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -0700999 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001000 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
1001 }
1002}
1003
halcanary9d524f22016-03-29 09:03:52 -07001004static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001005 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001006 SkFlattenable* colorFilter = paint.getColorFilter();
1007 if (colorFilter != nullptr) {
1008 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001009 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001010 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1011 }
1012}
1013
halcanary9d524f22016-03-29 09:03:52 -07001014static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001015 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001016 SkFlattenable* looper = paint.getLooper();
1017 if (looper != nullptr) {
1018 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001019 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001020 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1021 }
1022}
1023
brianosmanfad98562016-05-04 11:06:28 -07001024Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001025 Json::Value result(Json::objectValue);
1026 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001027 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001028 SkPaintDefaults_MiterLimit);
1029 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001030 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001031 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, paint.isFakeBoldText(), false);
1032 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, paint.isLinearText(), false);
1033 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, paint.isSubpixelText(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001034 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT, paint.isLCDRenderText(), false);
1035 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, paint.isEmbeddedBitmapText(), false);
1036 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, paint.isAutohinted(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001037 //kGenA8FromLCD_Flag
1038
halcanary9d524f22016-03-29 09:03:52 -07001039 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001040 SkPaintDefaults_TextSize);
1041 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
1042 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
halcanaryf412f092016-08-25 11:10:41 -07001043 apply_paint_hinting(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001044 apply_paint_color(paint, &result);
1045 apply_paint_style(paint, &result);
Florin Malita82d80872017-06-06 16:58:40 -04001046 apply_paint_blend_mode(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001047 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001048 apply_paint_join(paint, &result);
1049 apply_paint_filterquality(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001050 apply_paint_patheffect(paint, &result, urlDataManager);
1051 apply_paint_maskfilter(paint, &result, urlDataManager);
1052 apply_paint_shader(paint, &result, urlDataManager);
ethannicholasf62a8b72016-02-11 10:35:21 -08001053 apply_paint_looper(paint, &result, urlDataManager);
1054 apply_paint_imagefilter(paint, &result, urlDataManager);
1055 apply_paint_colorfilter(paint, &result, urlDataManager);
1056 apply_paint_typeface(paint, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001057 return result;
1058}
1059
Stan Ilievac42aeb2017-01-12 16:20:50 -05001060Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) {
1061 Json::Value result(Json::objectValue);
1062 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount);
1063 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount);
1064 if (nullptr != lattice.fBounds) {
1065 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds);
1066 }
1067 Json::Value XDivs(Json::arrayValue);
1068 for (int i = 0; i < lattice.fXCount; i++) {
1069 XDivs.append(Json::Value(lattice.fXDivs[i]));
1070 }
1071 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs;
1072 Json::Value YDivs(Json::arrayValue);
1073 for (int i = 0; i < lattice.fYCount; i++) {
1074 YDivs.append(Json::Value(lattice.fYDivs[i]));
1075 }
1076 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs;
Stan Ilievca8c0952017-12-11 13:01:58 -05001077 if (nullptr != lattice.fRectTypes) {
Stan Ilievac42aeb2017-01-12 16:20:50 -05001078 Json::Value flags(Json::arrayValue);
1079 int flagCount = 0;
1080 for (int row = 0; row < lattice.fYCount+1; row++) {
1081 Json::Value flagsRow(Json::arrayValue);
1082 for (int column = 0; column < lattice.fXCount+1; column++) {
Stan Ilievca8c0952017-12-11 13:01:58 -05001083 flagsRow.append(Json::Value(lattice.fRectTypes[flagCount++]));
Stan Ilievac42aeb2017-01-12 16:20:50 -05001084 }
1085 flags.append(flagsRow);
1086 }
1087 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags;
1088 }
1089 return result;
1090}
1091
Brian Osmanc25e2692018-03-12 10:57:28 -04001092SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kClear_OpType) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001093 fColor = color;
ethannicholas1446a9a2016-02-10 14:05:02 -08001094}
1095
1096void SkClearCommand::execute(SkCanvas* canvas) const {
1097 canvas->clear(fColor);
1098}
1099
ethannicholasf62a8b72016-02-11 10:35:21 -08001100Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1101 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001102 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001103 return result;
1104}
1105
Mike Reedc1f77742016-12-09 09:00:50 -05001106SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001107 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001108 fPath = path;
1109 fOp = op;
1110 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001111}
1112
fmalita8c89c522014-11-08 16:18:56 -08001113void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001114 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001115}
1116
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001117bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001118 render_path(canvas, fPath);
1119 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001120}
1121
ethannicholasf62a8b72016-02-11 10:35:21 -08001122Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1123 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001124 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001125 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1126 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1127 return result;
1128}
1129
Mike Reedc1f77742016-12-09 09:00:50 -05001130SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001131 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001132 fRegion = region;
1133 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001134}
1135
fmalita8c89c522014-11-08 16:18:56 -08001136void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001137 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001138}
1139
ethannicholasf62a8b72016-02-11 10:35:21 -08001140Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1141 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001142 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001143 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1144 return result;
1145}
1146
Mike Reedc1f77742016-12-09 09:00:50 -05001147SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001148 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001149 fRect = rect;
1150 fOp = op;
1151 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001152}
1153
fmalita8c89c522014-11-08 16:18:56 -08001154void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001155 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001156}
1157
ethannicholasf62a8b72016-02-11 10:35:21 -08001158Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1159 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001160 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001161 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1162 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001163
1164 SkString desc;
1165 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1166
ethannicholas50a8dd02016-02-10 05:40:46 -08001167 return result;
1168}
1169
Mike Reedc1f77742016-12-09 09:00:50 -05001170SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001171 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001172 fRRect = rrect;
1173 fOp = op;
1174 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001175}
1176
fmalita8c89c522014-11-08 16:18:56 -08001177void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001178 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001179}
1180
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001181bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001182 render_rrect(canvas, fRRect);
1183 return true;
1184}
1185
ethannicholasf62a8b72016-02-11 10:35:21 -08001186Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1187 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001188 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1189 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1190 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1191 return result;
1192}
1193
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001194SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001195 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001196 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001197}
1198
fmalita8c89c522014-11-08 16:18:56 -08001199void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001200 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001201}
1202
ethannicholasf62a8b72016-02-11 10:35:21 -08001203Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1204 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001205 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001206 return result;
1207}
1208
reed97660cc2016-06-28 18:54:19 -07001209////
1210
1211SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1212 sk_sp<SkData> value)
1213 : INHERITED(kDrawAnnotation_OpType)
1214 , fRect(rect)
1215 , fKey(key)
1216 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001217{
robertphillipsfb409232016-06-29 10:28:11 -07001218}
reed97660cc2016-06-28 18:54:19 -07001219
1220void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1221 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1222}
1223
1224Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1225 Json::Value result = INHERITED::toJSON(urlDataManager);
1226
1227 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1228 result["key"] = Json::Value(fKey.c_str());
1229 if (fValue.get()) {
1230 // TODO: dump out the "value"
1231 }
reed67f62fa2016-06-29 11:36:34 -07001232
1233 SkString desc;
1234 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1235 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1236
reed97660cc2016-06-28 18:54:19 -07001237 return result;
1238}
1239
reed97660cc2016-06-28 18:54:19 -07001240////
1241
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001242SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07001243 const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001244 : INHERITED(kDrawBitmap_OpType)
1245 , fBitmap(bitmap)
1246 , fLeft(left)
1247 , fTop(top)
1248 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001249
fmalita8c89c522014-11-08 16:18:56 -08001250void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001251 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001252}
1253
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001254bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001255 render_bitmap(canvas, fBitmap);
1256 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001257}
1258
ethannicholasf62a8b72016-02-11 10:35:21 -08001259Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
1260 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001261 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001262 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001263 Json::Value command(Json::objectValue);
1264 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001265 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
Brian Osman8363be12018-05-29 13:38:07 -04001266 if (fPaint.isValid()) {
1267 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001268 }
1269 }
1270 return result;
1271}
1272
Brian Osman78a76482018-05-18 16:59:13 -04001273SkDrawBitmapLatticeCommand::SkDrawBitmapLatticeCommand(const SkBitmap& bitmap,
1274 const SkCanvas::Lattice& lattice,
1275 const SkRect& dst, const SkPaint* paint)
1276 : INHERITED(kDrawBitmapLattice_OpType)
1277 , fBitmap(bitmap)
1278 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001279 , fDst(dst)
1280 , fPaint(paint) {}
Brian Osman78a76482018-05-18 16:59:13 -04001281
1282void SkDrawBitmapLatticeCommand::execute(SkCanvas* canvas) const {
1283 canvas->drawBitmapLattice(fBitmap, fLattice, fDst, fPaint.getMaybeNull());
1284}
1285
1286bool SkDrawBitmapLatticeCommand::render(SkCanvas* canvas) const {
1287 SkAutoCanvasRestore acr(canvas, true);
1288 canvas->clear(0xFFFFFFFF);
1289
1290 xlate_and_scale_to_bounds(canvas, fDst);
1291
1292 this->execute(canvas);
1293 return true;
1294}
1295
1296Json::Value SkDrawBitmapLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1297 Json::Value result = INHERITED::toJSON(urlDataManager);
1298 Json::Value encoded;
1299 if (flatten(fBitmap, &encoded, urlDataManager)) {
1300 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
1301 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1302 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1303 if (fPaint.isValid()) {
1304 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1305 }
1306 }
1307
1308 SkString desc;
1309 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1310
1311 return result;
1312}
1313
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001314SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00001315 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001316 : INHERITED(kDrawBitmapNine_OpType)
1317 , fBitmap(bitmap)
1318 , fCenter(center)
1319 , fDst(dst)
1320 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001321
fmalita8c89c522014-11-08 16:18:56 -08001322void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001323 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001324}
1325
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001326bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08001327 SkRect tmp = SkRect::Make(fCenter);
1328 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001329 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001330}
1331
ethannicholasf62a8b72016-02-11 10:35:21 -08001332Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1333 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001334 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001335 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001336 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08001337 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07001338 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001339 if (fPaint.isValid()) {
1340 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001341 }
1342 }
1343 return result;
1344}
1345
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001346SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00001347 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07001348 SkCanvas::SrcRectConstraint constraint)
Brian Osman8363be12018-05-29 13:38:07 -04001349 : INHERITED(kDrawBitmapRect_OpType)
1350 , fBitmap(bitmap)
1351 , fSrc(src)
1352 , fDst(dst)
1353 , fPaint(paint)
1354 , fConstraint(constraint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001355
fmalita8c89c522014-11-08 16:18:56 -08001356void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001357 canvas->legacy_drawBitmapRect(fBitmap, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
1358 fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001359}
1360
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001361bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001362 render_bitmap(canvas, fBitmap, fSrc.getMaybeNull());
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001363 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001364}
1365
ethannicholasf62a8b72016-02-11 10:35:21 -08001366Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1367 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001368 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001369 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001370 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
Brian Osman8363be12018-05-29 13:38:07 -04001371 if (fSrc.isValid()) {
1372 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001373 }
brianosmanfad98562016-05-04 11:06:28 -07001374 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001375 if (fPaint.isValid()) {
1376 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001377 }
1378 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1379 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1380 }
1381 }
reed67f62fa2016-06-29 11:36:34 -07001382
1383 SkString desc;
1384 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1385
ethannicholas50a8dd02016-02-10 05:40:46 -08001386 return result;
1387}
1388
fmalita651c9202015-07-22 10:23:01 -07001389SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
1390 const SkPaint* paint)
1391 : INHERITED(kDrawImage_OpType)
1392 , fImage(SkRef(image))
1393 , fLeft(left)
Brian Osman8363be12018-05-29 13:38:07 -04001394 , fTop(top)
1395 , fPaint(paint) {}
fmalita651c9202015-07-22 10:23:01 -07001396
1397void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001398 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07001399}
1400
1401bool SkDrawImageCommand::render(SkCanvas* canvas) const {
1402 SkAutoCanvasRestore acr(canvas, true);
1403 canvas->clear(0xFFFFFFFF);
1404
1405 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
1406 SkIntToScalar(fImage->width()),
1407 SkIntToScalar(fImage->height())));
1408 this->execute(canvas);
1409 return true;
1410}
1411
ethannicholasf62a8b72016-02-11 10:35:21 -08001412Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
1413 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001414 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001415 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001416 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001417 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08001418 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001419 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001420 }
msarett0ac1bec2016-08-29 09:15:33 -07001421
1422 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
1423 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
1424 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
1425 switch (fImage->alphaType()) {
1426 case kOpaque_SkAlphaType:
1427 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
1428 break;
1429 case kPremul_SkAlphaType:
1430 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
1431 break;
1432 case kUnpremul_SkAlphaType:
1433 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
1434 break;
1435 default:
1436 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
1437 break;
1438 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001439 }
1440 return result;
1441}
1442
Stan Ilievac42aeb2017-01-12 16:20:50 -05001443SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
1444 const SkCanvas::Lattice& lattice,
1445 const SkRect& dst, const SkPaint* paint)
1446 : INHERITED(kDrawImageLattice_OpType)
1447 , fImage(SkRef(image))
1448 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001449 , fDst(dst)
1450 , fPaint(paint) {}
Stan Ilievac42aeb2017-01-12 16:20:50 -05001451
1452void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
Brian Osman78a76482018-05-18 16:59:13 -04001453 canvas->drawImageLattice(fImage.get(), fLattice, fDst, fPaint.getMaybeNull());
Stan Ilievac42aeb2017-01-12 16:20:50 -05001454}
1455
1456bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
1457 SkAutoCanvasRestore acr(canvas, true);
1458 canvas->clear(0xFFFFFFFF);
1459
1460 xlate_and_scale_to_bounds(canvas, fDst);
1461
1462 this->execute(canvas);
1463 return true;
1464}
1465
1466Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1467 Json::Value result = INHERITED::toJSON(urlDataManager);
1468 Json::Value encoded;
1469 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001470 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
Stan Ilievac42aeb2017-01-12 16:20:50 -05001471 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1472 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1473 if (fPaint.isValid()) {
1474 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1475 }
1476 }
1477
1478 SkString desc;
1479 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1480
1481 return result;
1482}
1483
fmalita651c9202015-07-22 10:23:01 -07001484SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
1485 const SkRect& dst, const SkPaint* paint,
1486 SkCanvas::SrcRectConstraint constraint)
1487 : INHERITED(kDrawImageRect_OpType)
1488 , fImage(SkRef(image))
Brian Osman8363be12018-05-29 13:38:07 -04001489 , fSrc(src)
fmalita651c9202015-07-22 10:23:01 -07001490 , fDst(dst)
Brian Osman8363be12018-05-29 13:38:07 -04001491 , fPaint(paint)
1492 , fConstraint(constraint) {}
fmalita651c9202015-07-22 10:23:01 -07001493
1494void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001495 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
1496 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07001497}
1498
1499bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
1500 SkAutoCanvasRestore acr(canvas, true);
1501 canvas->clear(0xFFFFFFFF);
1502
1503 xlate_and_scale_to_bounds(canvas, fDst);
1504
1505 this->execute(canvas);
1506 return true;
1507}
1508
ethannicholasf62a8b72016-02-11 10:35:21 -08001509Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1510 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001511 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001512 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001513 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
ethannicholas50a8dd02016-02-10 05:40:46 -08001514 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001515 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001516 }
brianosmanfad98562016-05-04 11:06:28 -07001517 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08001518 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001519 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001520 }
1521 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1522 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1523 }
1524 }
reed67f62fa2016-06-29 11:36:34 -07001525
1526 SkString desc;
1527 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1528
ethannicholas50a8dd02016-02-10 05:40:46 -08001529 return result;
1530}
1531
Brian Salomond7065e72018-10-12 11:42:02 -04001532SkDrawImageSetCommand::SkDrawImageSetCommand(const SkCanvas::ImageSetEntry set[], int count,
1533 float alpha, SkFilterQuality filterQuality,
1534 SkBlendMode mode)
1535 : INHERITED(kDrawImageSet_OpType)
1536 , fSet(count)
1537 , fCount(count)
1538 , fAlpha(alpha)
1539 , fFilterQuality(filterQuality)
1540 , fMode(mode) {
1541 std::copy_n(set, count, fSet.get());
1542}
1543
1544void SkDrawImageSetCommand::execute(SkCanvas* canvas) const {
1545 canvas->experimental_DrawImageSetV0(fSet.get(), fCount, fAlpha, fFilterQuality, fMode);
1546}
1547
Brian Osmanc25e2692018-03-12 10:57:28 -04001548SkDrawImageNineCommand::SkDrawImageNineCommand(const SkImage* image, const SkIRect& center,
1549 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001550 : INHERITED(kDrawImageNine_OpType)
1551 , fImage(SkRef(image))
1552 , fCenter(center)
1553 , fDst(dst)
1554 , fPaint(paint) {}
Brian Osmanc25e2692018-03-12 10:57:28 -04001555
1556void SkDrawImageNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001557 canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaint.getMaybeNull());
Brian Osmanc25e2692018-03-12 10:57:28 -04001558}
1559
1560bool SkDrawImageNineCommand::render(SkCanvas* canvas) const {
1561 SkAutoCanvasRestore acr(canvas, true);
1562 canvas->clear(0xFFFFFFFF);
1563
1564 xlate_and_scale_to_bounds(canvas, fDst);
1565
1566 this->execute(canvas);
1567 return true;
1568}
1569
1570Json::Value SkDrawImageNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1571 Json::Value result = INHERITED::toJSON(urlDataManager);
1572 Json::Value encoded;
1573 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
1574 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
1575 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
1576 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001577 if (fPaint.isValid()) {
1578 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
Brian Osmanc25e2692018-03-12 10:57:28 -04001579 }
1580 }
1581 return result;
1582}
1583
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001584SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001585 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001586 fOval = oval;
1587 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001588}
1589
fmalita8c89c522014-11-08 16:18:56 -08001590void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001591 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001592}
1593
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001594bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001595 canvas->clear(0xFFFFFFFF);
1596 canvas->save();
1597
1598 xlate_and_scale_to_bounds(canvas, fOval);
1599
1600 SkPaint p;
1601 p.setColor(SK_ColorBLACK);
1602 p.setStyle(SkPaint::kStroke_Style);
1603
1604 canvas->drawOval(fOval, p);
1605 canvas->restore();
1606
1607 return true;
1608}
1609
ethannicholasf62a8b72016-02-11 10:35:21 -08001610Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
1611 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001612 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1613 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001614 return result;
1615}
1616
bsalomonac3aa242016-08-19 11:25:19 -07001617SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
1618 bool useCenter, const SkPaint& paint)
Brian Osmanc25e2692018-03-12 10:57:28 -04001619 : INHERITED(kDrawArc_OpType) {
bsalomonac3aa242016-08-19 11:25:19 -07001620 fOval = oval;
1621 fStartAngle = startAngle;
1622 fSweepAngle = sweepAngle;
1623 fUseCenter = useCenter;
1624 fPaint = paint;
bsalomonac3aa242016-08-19 11:25:19 -07001625}
1626
1627void SkDrawArcCommand::execute(SkCanvas* canvas) const {
1628 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
1629}
1630
1631bool SkDrawArcCommand::render(SkCanvas* canvas) const {
1632 canvas->clear(0xFFFFFFFF);
1633 canvas->save();
1634
1635 xlate_and_scale_to_bounds(canvas, fOval);
1636
1637 SkPaint p;
1638 p.setColor(SK_ColorBLACK);
1639 p.setStyle(SkPaint::kStroke_Style);
1640
1641 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
1642 canvas->restore();
1643
1644 return true;
1645}
1646
1647Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
1648 Json::Value result = INHERITED::toJSON(urlDataManager);
1649 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1650 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
1651 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
1652 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
1653 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1654 return result;
1655}
1656
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001657SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001658 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001659 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001660}
1661
fmalita8c89c522014-11-08 16:18:56 -08001662void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001663 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001664}
1665
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001666bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001667 canvas->clear(0xFFFFFFFF);
1668 canvas->drawPaint(fPaint);
1669 return true;
1670}
1671
ethannicholasf62a8b72016-02-11 10:35:21 -08001672Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
1673 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001674 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001675 return result;
1676}
1677
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001678SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001679 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001680 fPath = path;
1681 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001682}
1683
fmalita8c89c522014-11-08 16:18:56 -08001684void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001685 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001686}
1687
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001688bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001689 render_path(canvas, fPath);
1690 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001691}
1692
ethannicholasf62a8b72016-02-11 10:35:21 -08001693Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1694 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001695 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
1696 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001697 return result;
1698}
1699
Brian Osmanc25e2692018-03-12 10:57:28 -04001700SkDrawRegionCommand::SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint)
1701 : INHERITED(kDrawRegion_OpType) {
1702 fRegion = region;
1703 fPaint = paint;
Brian Osmanc25e2692018-03-12 10:57:28 -04001704}
1705
1706void SkDrawRegionCommand::execute(SkCanvas* canvas) const {
1707 canvas->drawRegion(fRegion, fPaint);
1708}
1709
1710bool SkDrawRegionCommand::render(SkCanvas* canvas) const {
1711 render_region(canvas, fRegion);
1712 return true;
1713}
1714
1715Json::Value SkDrawRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1716 Json::Value result = INHERITED::toJSON(urlDataManager);
1717 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
1718 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1719 return result;
1720}
1721
fmalita160ebb22015-04-01 20:58:37 -07001722SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
1723 const SkMatrix* matrix,
1724 const SkPaint* paint)
1725 : INHERITED(kBeginDrawPicture_OpType)
Brian Osman8363be12018-05-29 13:38:07 -04001726 , fPicture(SkRef(picture))
1727 , fMatrix(matrix)
1728 , fPaint(paint) {}
fmalita160ebb22015-04-01 20:58:37 -07001729
1730void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
1731 if (fPaint.isValid()) {
1732 SkRect bounds = fPicture->cullRect();
1733 if (fMatrix.isValid()) {
1734 fMatrix.get()->mapRect(&bounds);
1735 }
1736 canvas->saveLayer(&bounds, fPaint.get());
1737 }
1738
1739 if (fMatrix.isValid()) {
1740 if (!fPaint.isValid()) {
1741 canvas->save();
1742 }
1743 canvas->concat(*fMatrix.get());
1744 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001745}
1746
fmalita160ebb22015-04-01 20:58:37 -07001747bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001748 canvas->clear(0xFFFFFFFF);
1749 canvas->save();
1750
robertphillipsa8d7f0b2014-08-29 08:03:56 -07001751 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001752
robertphillips9b14f262014-06-04 05:40:44 -07001753 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001754
1755 canvas->restore();
1756
1757 return true;
1758}
1759
fmalita160ebb22015-04-01 20:58:37 -07001760SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
1761 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
1762
1763void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
1764 if (fRestore) {
1765 canvas->restore();
1766 }
1767}
1768
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001769SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001770 const SkPoint pts[], const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04001771 : INHERITED(kDrawPoints_OpType)
1772 , fMode(mode)
1773 , fPts(pts, count)
1774 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001775
fmalita8c89c522014-11-08 16:18:56 -08001776void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001777 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001778}
1779
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001780bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001781 canvas->clear(0xFFFFFFFF);
1782 canvas->save();
1783
1784 SkRect bounds;
1785
1786 bounds.setEmpty();
Brian Osman8363be12018-05-29 13:38:07 -04001787 for (int i = 0; i < fPts.count(); ++i) {
Mike Reed185ffe92018-01-08 17:09:54 -05001788 SkRectPriv::GrowToInclude(&bounds, fPts[i]);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001789 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00001790
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001791 xlate_and_scale_to_bounds(canvas, bounds);
1792
1793 SkPaint p;
1794 p.setColor(SK_ColorBLACK);
1795 p.setStyle(SkPaint::kStroke_Style);
1796
Brian Osman8363be12018-05-29 13:38:07 -04001797 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001798 canvas->restore();
1799
1800 return true;
1801}
1802
ethannicholasf62a8b72016-02-11 10:35:21 -08001803Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
1804 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001805 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
1806 Json::Value points(Json::arrayValue);
Brian Osman8363be12018-05-29 13:38:07 -04001807 for (int i = 0; i < fPts.count(); i++) {
brianosmanfad98562016-05-04 11:06:28 -07001808 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001809 }
1810 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07001811 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001812 return result;
1813}
1814
Brian Osman65197ff2018-05-29 14:25:39 -04001815static Json::Value make_json_text(sk_sp<SkData> text) {
1816 return Json::Value((const char*)text->data(), (const char*)text->data() + text->size());
chudy@google.com902ebe52012-06-29 14:21:22 +00001817}
1818
Brian Osman65197ff2018-05-29 14:25:39 -04001819SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength,
1820 const SkPoint pos[], const SkPaint& paint)
1821 : INHERITED(kDrawPosText_OpType)
1822 , fText(SkData::MakeWithCopy(text, byteLength))
1823 , fPos(pos, paint.countText(text, byteLength))
1824 , fPaint(paint) {}
1825
fmalita8c89c522014-11-08 16:18:56 -08001826void SkDrawPosTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001827 canvas->drawPosText(fText->data(), fText->size(), fPos.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001828}
1829
ethannicholasf62a8b72016-02-11 10:35:21 -08001830Json::Value SkDrawPosTextCommand::toJSON(UrlDataManager& urlDataManager) const {
1831 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001832 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08001833 Json::Value coords(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001834 size_t numCoords = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001835 for (size_t i = 0; i < numCoords; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001836 coords.append(MakeJsonPoint(fPos[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001837 }
1838 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = coords;
brianosmanfad98562016-05-04 11:06:28 -07001839 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001840 return result;
1841}
1842
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001843SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength,
1844 const SkScalar xpos[], SkScalar constY,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001845 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04001846 : INHERITED(kDrawPosTextH_OpType)
1847 , fText(SkData::MakeWithCopy(text, byteLength))
1848 , fXpos(xpos, paint.countText(text, byteLength))
1849 , fConstY(constY)
1850 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001851
fmalita8c89c522014-11-08 16:18:56 -08001852void SkDrawPosTextHCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001853 canvas->drawPosTextH(fText->data(), fText->size(), fXpos.begin(), fConstY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001854}
1855
bungeman51190df2016-03-09 07:42:54 -08001856Json::Value SkDrawPosTextHCommand::toJSON(UrlDataManager& urlDataManager) const {
1857 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001858 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
bungeman51190df2016-03-09 07:42:54 -08001859 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fConstY);
1860 Json::Value xpos(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001861 size_t numXpos = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001862 for (size_t i = 0; i < numXpos; i++) {
1863 xpos.append(Json::Value(fXpos[i]));
1864 }
1865 result[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = xpos;
brianosmanfad98562016-05-04 11:06:28 -07001866 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
bungeman51190df2016-03-09 07:42:54 -08001867 return result;
1868}
1869
fmalita37283c22016-09-13 10:00:23 -07001870SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07001871 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001872 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07001873 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07001874 , fXPos(x)
1875 , fYPos(y)
Brian Osman255735e2018-04-06 14:51:42 -04001876 , fPaint(paint) {}
fmalitab7425172014-08-26 07:56:44 -07001877
fmalita8c89c522014-11-08 16:18:56 -08001878void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07001879 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1880}
1881
fmalita55773872014-08-29 15:08:20 -07001882bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
1883 canvas->clear(SK_ColorWHITE);
1884 canvas->save();
1885
1886 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
1887 xlate_and_scale_to_bounds(canvas, bounds);
1888
fmalita37283c22016-09-13 10:00:23 -07001889 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07001890
1891 canvas->restore();
1892
1893 return true;
1894}
1895
ethannicholasf62a8b72016-02-11 10:35:21 -08001896Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
1897 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001898 Json::Value runs(Json::arrayValue);
1899 SkTextBlobRunIterator iter(fBlob.get());
1900 while (!iter.done()) {
1901 Json::Value run(Json::objectValue);
1902 Json::Value jsonPositions(Json::arrayValue);
1903 Json::Value jsonGlyphs(Json::arrayValue);
1904 const SkScalar* iterPositions = iter.pos();
1905 const uint16_t* iterGlyphs = iter.glyphs();
1906 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1907 switch (iter.positioning()) {
Florin Malitaab54e732018-07-27 09:47:15 -04001908 case SkTextBlobRunIterator::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07001909 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
1910 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001911 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001912 case SkTextBlobRunIterator::kHorizontal_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001913 jsonPositions.append(Json::Value(iterPositions[i]));
1914 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001915 case SkTextBlobRunIterator::kDefault_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001916 break;
1917 }
1918 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
1919 }
Florin Malitaab54e732018-07-27 09:47:15 -04001920 if (iter.positioning() != SkTextBlobRunIterator::kDefault_Positioning) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001921 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
1922 }
1923 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
1924 SkPaint fontPaint;
1925 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07001926 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
1927 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08001928 runs.append(run);
1929 iter.next();
1930 }
reed6d2c3e72016-07-07 14:10:14 -07001931 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08001932 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
1933 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
1934 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07001935 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07001936 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07001937
1938 SkString desc;
1939 // make the bounds local by applying the x,y
1940 bounds.offset(fXPos, fYPos);
1941 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
1942
ethannicholas50a8dd02016-02-10 05:40:46 -08001943 return result;
1944}
1945
robertphillips9bafc302015-02-13 11:13:00 -08001946SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04001947 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08001948 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04001949 : INHERITED(kDrawPatch_OpType)
1950 , fBlendMode(bmode)
1951{
robertphillips9bafc302015-02-13 11:13:00 -08001952 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08001953 if (colors != nullptr) {
1954 memcpy(fColors, colors, sizeof(fColors));
1955 fColorsPtr = fColors;
1956 } else {
1957 fColorsPtr = nullptr;
1958 }
1959 if (texCoords != nullptr) {
1960 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
1961 fTexCoordsPtr = fTexCoords;
1962 } else {
1963 fTexCoordsPtr = nullptr;
1964 }
robertphillips9bafc302015-02-13 11:13:00 -08001965 fPaint = paint;
robertphillips9bafc302015-02-13 11:13:00 -08001966}
1967
1968void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04001969 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08001970}
1971
ethannicholasf62a8b72016-02-11 10:35:21 -08001972Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
1973 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001974 Json::Value cubics = Json::Value(Json::arrayValue);
1975 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001976 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001977 }
1978 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
1979 if (fColorsPtr != nullptr) {
1980 Json::Value colors = Json::Value(Json::arrayValue);
1981 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001982 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001983 }
1984 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
1985 }
1986 if (fTexCoordsPtr != nullptr) {
1987 Json::Value texCoords = Json::Value(Json::arrayValue);
1988 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001989 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001990 }
1991 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
1992 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001993 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08001994 return result;
1995}
1996
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001997SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001998 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001999 fRect = rect;
2000 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002001}
2002
fmalita8c89c522014-11-08 16:18:56 -08002003void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002004 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002005}
2006
ethannicholasf62a8b72016-02-11 10:35:21 -08002007Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2008 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002009 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
2010 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07002011
2012 SkString desc;
2013 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
2014
ethannicholas50a8dd02016-02-10 05:40:46 -08002015 return result;
2016}
2017
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002018SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002019 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002020 fRRect = rrect;
2021 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00002022}
2023
fmalita8c89c522014-11-08 16:18:56 -08002024void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00002025 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00002026}
2027
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002028bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002029 render_rrect(canvas, fRRect);
2030 return true;
2031}
2032
ethannicholasf62a8b72016-02-11 10:35:21 -08002033Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2034 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002035 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07002036 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002037 return result;
2038}
2039
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00002040SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002041 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002042 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002043 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002044 fOuter = outer;
2045 fInner = inner;
2046 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002047}
2048
fmalita8c89c522014-11-08 16:18:56 -08002049void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002050 canvas->drawDRRect(fOuter, fInner, fPaint);
2051}
2052
2053bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
2054 render_drrect(canvas, fOuter, fInner);
2055 return true;
2056}
2057
ethannicholasf62a8b72016-02-11 10:35:21 -08002058Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2059 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002060 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
2061 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07002062 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002063 return result;
2064}
2065
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04002066SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
2067 : INHERITED(kDrawShadow_OpType) {
2068 fPath = path;
2069 fShadowRec = rec;
2070}
2071
2072void SkDrawShadowCommand::execute(SkCanvas* canvas) const {
2073 canvas->private_draw_shadow_rec(fPath, fShadowRec);
2074}
2075
2076bool SkDrawShadowCommand::render(SkCanvas* canvas) const {
2077 render_shadow(canvas, fPath, fShadowRec);
2078 return true;
2079}
2080
2081Json::Value SkDrawShadowCommand::toJSON(UrlDataManager& urlDataManager) const {
2082 Json::Value result = INHERITED::toJSON(urlDataManager);
2083 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2084
2085 bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
2086 bool transparentOccluder =
2087 SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
2088
2089 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2090 result[SKDEBUGCANVAS_ATTRIBUTE_ZPLANE] = MakeJsonPoint3(fShadowRec.fZPlaneParams);
2091 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION] = MakeJsonPoint3(fShadowRec.fLightPos);
2092 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS] = MakeJsonScalar(fShadowRec.fLightRadius);
2093 result[SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR] = MakeJsonColor(fShadowRec.fAmbientColor);
2094 result[SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR] = MakeJsonColor(fShadowRec.fSpotColor);
2095 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
2096 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
2097 return result;
2098}
2099
Brian Osmanc7611082018-05-29 14:55:50 -04002100///////////////////////////////////////////////////////////////////////////////////////////////////
2101
2102SkDrawDrawableCommand::SkDrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
2103 : INHERITED(kDrawDrawable_OpType)
2104 , fDrawable(SkRef(drawable))
2105 , fMatrix(matrix) {}
2106
2107void SkDrawDrawableCommand::execute(SkCanvas* canvas) const {
2108 canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
2109}
2110
2111///////////////////////////////////////////////////////////////////////////////////////////////////
2112
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002113SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002114 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04002115 : INHERITED(kDrawText_OpType)
2116 , fText(SkData::MakeWithCopy(text, byteLength))
2117 , fX(x)
2118 , fY(y)
2119 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002120
fmalita8c89c522014-11-08 16:18:56 -08002121void SkDrawTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002122 canvas->drawText(fText->data(), fText->size(), fX, fY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002123}
2124
ethannicholasf62a8b72016-02-11 10:35:21 -08002125Json::Value SkDrawTextCommand::toJSON(UrlDataManager& urlDataManager) const {
2126 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002127 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08002128 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07002129 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fX, fY);
2130 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002131 return result;
2132}
2133
reed45561a02016-07-07 12:47:17 -07002134///////////////////////////////////////////////////////////////////////////////////////////////////
2135
reed45561a02016-07-07 12:47:17 -07002136SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength,
2137 const SkRSXform xform[], const SkRect* cull,
2138 const SkPaint& paint)
reed63f30d92016-07-07 16:32:51 -07002139 : INHERITED(kDrawTextRSXform_OpType)
Brian Osman65197ff2018-05-29 14:25:39 -04002140 , fText(SkData::MakeWithCopy(text, byteLength))
2141 , fXform(xform, paint.countText(text, byteLength))
Brian Osman8363be12018-05-29 13:38:07 -04002142 , fCull(cull)
Brian Osman65197ff2018-05-29 14:25:39 -04002143 , fPaint(paint) {}
reed45561a02016-07-07 12:47:17 -07002144
2145void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002146 canvas->drawTextRSXform(fText->data(), fText->size(), fXform.begin(), fCull.getMaybeNull(),
2147 fPaint);
reed45561a02016-07-07 12:47:17 -07002148}
2149
2150Json::Value SkDrawTextRSXformCommand::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);
reed45561a02016-07-07 12:47:17 -07002153 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
2154 return result;
2155}
2156
reed45561a02016-07-07 12:47:17 -07002157///////////////////////////////////////////////////////////////////////////////////////////////////
2158
Mike Reedfed9cfd2017-03-17 12:09:04 -04002159SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002160 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04002161 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04002162 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04002163 , fBlendMode(bmode)
Brian Osman255735e2018-04-06 14:51:42 -04002164 , fPaint(paint) {}
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002165
fmalita8c89c522014-11-08 16:18:56 -08002166void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04002167 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002168}
2169
Brian Osman616f1cb2018-05-29 11:23:35 -04002170///////////////////////////////////////////////////////////////////////////////////////////////////
2171
2172SkDrawAtlasCommand::SkDrawAtlasCommand(const SkImage* image, const SkRSXform xform[],
2173 const SkRect tex[], const SkColor colors[], int count,
2174 SkBlendMode bmode, const SkRect* cull,
2175 const SkPaint* paint)
2176 : INHERITED(kDrawAtlas_OpType)
2177 , fImage(SkRef(image))
2178 , fXform(xform, count)
2179 , fTex(tex, count)
2180 , fColors(colors, colors ? count : 0)
2181 , fBlendMode(bmode)
2182 , fCull(cull)
2183 , fPaint(paint) {}
2184
2185void SkDrawAtlasCommand::execute(SkCanvas* canvas) const {
2186 canvas->drawAtlas(fImage.get(), fXform.begin(), fTex.begin(),
2187 fColors.isEmpty() ? nullptr : fColors.begin(), fXform.count(), fBlendMode,
2188 fCull.getMaybeNull(), fPaint.getMaybeNull());
2189}
2190
2191///////////////////////////////////////////////////////////////////////////////////////////////////
2192
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002193SkRestoreCommand::SkRestoreCommand()
Brian Osman255735e2018-04-06 14:51:42 -04002194 : INHERITED(kRestore_OpType) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002195
fmalita8c89c522014-11-08 16:18:56 -08002196void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00002197 canvas->restore();
2198}
2199
Florin Malita5f6102d2014-06-30 10:13:28 -04002200SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08002201 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00002202}
2203
fmalita8c89c522014-11-08 16:18:56 -08002204void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04002205 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00002206}
2207
reed4960eee2015-12-18 07:09:18 -08002208SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
Brian Osman8363be12018-05-29 13:38:07 -04002209 : INHERITED(kSaveLayer_OpType)
2210 , fBounds(rec.fBounds)
2211 , fPaint(rec.fPaint)
2212 , fBackdrop(SkSafeRef(rec.fBackdrop))
2213 , fSaveLayerFlags(rec.fSaveLayerFlags) {}
ethannicholas50a8dd02016-02-10 05:40:46 -08002214
fmalita8c89c522014-11-08 16:18:56 -08002215void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04002216 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(),
reed4960eee2015-12-18 07:09:18 -08002217 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00002218}
2219
ethannicholasf62a8b72016-02-11 10:35:21 -08002220Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
2221 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman8363be12018-05-29 13:38:07 -04002222 if (fBounds.isValid()) {
2223 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(*fBounds.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002224 }
Brian Osman8363be12018-05-29 13:38:07 -04002225 if (fPaint.isValid()) {
2226 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002227 }
2228 if (fBackdrop != nullptr) {
2229 Json::Value jsonBackdrop;
Brian Osman8363be12018-05-29 13:38:07 -04002230 flatten(fBackdrop.get(), &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002231 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
2232 }
2233 if (fSaveLayerFlags != 0) {
2234 SkDebugf("unsupported: saveLayer flags\n");
2235 SkASSERT(false);
2236 }
2237 return result;
2238}
2239
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002240SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08002241 : INHERITED(kSetMatrix_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002242 fMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -07002243}
2244
fmalita8c89c522014-11-08 16:18:56 -08002245void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
Brian Osman255735e2018-04-06 14:51:42 -04002246 canvas->setMatrix(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00002247}
2248
ethannicholasf62a8b72016-02-11 10:35:21 -08002249Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
2250 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08002251 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08002252 return result;
2253}