blob: 77e371a2421a471461a8ea5374a4e1808ef72168 [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";
robertphillips9bafc302015-02-13 11:13:00 -0800232 case kDrawRect_OpType: return "DrawRect";
233 case kDrawRRect_OpType: return "DrawRRect";
Brian Osmanc25e2692018-03-12 10:57:28 -0400234 case kDrawRegion_OpType: return "DrawRegion";
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400235 case kDrawShadow_OpType: return "DrawShadow";
robertphillips9bafc302015-02-13 11:13:00 -0800236 case kDrawTextBlob_OpType: return "DrawTextBlob";
reed63f30d92016-07-07 16:32:51 -0700237 case kDrawTextRSXform_OpType: return "DrawTextRSXform";
robertphillips9bafc302015-02-13 11:13:00 -0800238 case kDrawVertices_OpType: return "DrawVertices";
Brian Osman616f1cb2018-05-29 11:23:35 -0400239 case kDrawAtlas_OpType: return "DrawAtlas";
Brian Osmanc7611082018-05-29 14:55:50 -0400240 case kDrawDrawable_OpType: return "DrawDrawable";
fmalita160ebb22015-04-01 20:58:37 -0700241 case kEndDrawPicture_OpType: return "EndDrawPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800242 case kRestore_OpType: return "Restore";
243 case kSave_OpType: return "Save";
244 case kSaveLayer_OpType: return "SaveLayer";
245 case kSetMatrix_OpType: return "SetMatrix";
chudy@google.com902ebe52012-06-29 14:21:22 +0000246 default:
robertphillips9bafc302015-02-13 11:13:00 -0800247 SkDebugf("OpType error 0x%08x\n", type);
chudy@google.com902ebe52012-06-29 14:21:22 +0000248 SkASSERT(0);
249 break;
250 }
251 SkDEBUGFAIL("DrawType UNUSED\n");
halcanary96fcdcc2015-08-27 07:41:13 -0700252 return nullptr;
chudy@google.com902ebe52012-06-29 14:21:22 +0000253}
254
ethannicholasf62a8b72016-02-11 10:35:21 -0800255Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const {
ethannicholas50a8dd02016-02-10 05:40:46 -0800256 Json::Value result;
257 result[SKDEBUGCANVAS_ATTRIBUTE_COMMAND] = this->GetCommandString(fOpType);
ethannicholas807dcab2016-02-23 06:53:37 -0800258 result[SKDEBUGCANVAS_ATTRIBUTE_VISIBLE] = Json::Value(this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800259 return result;
260}
261
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000262namespace {
263
264void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
Mike Reed3661bc92017-02-22 13:21:42 -0500265 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000266
267 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
268
269 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
270 if (bounds.width() > bounds.height()) {
271 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
272 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
273 } else {
274 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
275 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
276 }
277 canvas->translate(-bounds.centerX(), -bounds.centerY());
278}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000279
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000280
281void render_path(SkCanvas* canvas, const SkPath& path) {
282 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000283
284 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700285 if (bounds.isEmpty()) {
286 return;
287 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000288
fmalitab0cd8b72015-10-06 07:24:03 -0700289 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000290 xlate_and_scale_to_bounds(canvas, bounds);
291
292 SkPaint p;
293 p.setColor(SK_ColorBLACK);
294 p.setStyle(SkPaint::kStroke_Style);
295
296 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000297}
298
Brian Osmanc25e2692018-03-12 10:57:28 -0400299void render_region(SkCanvas* canvas, const SkRegion& region) {
300 canvas->clear(0xFFFFFFFF);
301
302 const SkIRect& bounds = region.getBounds();
303 if (bounds.isEmpty()) {
304 return;
305 }
306
307 SkAutoCanvasRestore acr(canvas, true);
Brian Osman99b63402018-03-13 10:19:27 -0400308 xlate_and_scale_to_bounds(canvas, SkRect::Make(bounds));
Brian Osmanc25e2692018-03-12 10:57:28 -0400309
310 SkPaint p;
311 p.setColor(SK_ColorBLACK);
312 p.setStyle(SkPaint::kStroke_Style);
313
314 canvas->drawRegion(region, p);
315}
316
halcanary96fcdcc2015-08-27 07:41:13 -0700317void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
Mike Reed3661bc92017-02-22 13:21:42 -0500318 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000319
320 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
321 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
322
323 if (input.width() > input.height()) {
324 yScale *= input.height() / (float) input.width();
325 } else {
326 xScale *= input.width() / (float) input.height();
327 }
328
329 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
330 xScale * input.width(),
331 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000332
robertphillips96a5cff2015-09-24 06:56:27 -0700333 static const int kNumBlocks = 8;
334
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000335 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700336 SkISize block = {
337 canvas->imageInfo().width()/kNumBlocks,
338 canvas->imageInfo().height()/kNumBlocks
339 };
340 for (int y = 0; y < kNumBlocks; ++y) {
341 for (int x = 0; x < kNumBlocks; ++x) {
342 SkPaint paint;
343 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
344 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
345 SkIntToScalar(y*block.height()),
346 SkIntToScalar(block.width()),
347 SkIntToScalar(block.height()));
348 canvas->drawRect(r, paint);
349 }
350 }
351
reede47829b2015-08-06 10:02:53 -0700352 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000353
bsalomon49f085d2014-09-05 13:34:00 -0700354 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000355 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
356 srcRect->fTop * yScale + SK_Scalar1,
357 srcRect->fRight * xScale + SK_Scalar1,
358 srcRect->fBottom * yScale + SK_Scalar1);
359 SkPaint p;
360 p.setColor(SK_ColorRED);
361 p.setStyle(SkPaint::kStroke_Style);
362
363 canvas->drawRect(r, p);
364 }
365}
366
367void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
368 canvas->clear(0xFFFFFFFF);
369 canvas->save();
370
371 const SkRect& bounds = rrect.getBounds();
372
373 xlate_and_scale_to_bounds(canvas, bounds);
374
375 SkPaint p;
376 p.setColor(SK_ColorBLACK);
377 p.setStyle(SkPaint::kStroke_Style);
378
379 canvas->drawRRect(rrect, p);
380 canvas->restore();
381}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000382
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000383void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
384 canvas->clear(0xFFFFFFFF);
385 canvas->save();
386
387 const SkRect& bounds = outer.getBounds();
388
389 xlate_and_scale_to_bounds(canvas, bounds);
390
391 SkPaint p;
392 p.setColor(SK_ColorBLACK);
393 p.setStyle(SkPaint::kStroke_Style);
394
395 canvas->drawDRRect(outer, inner, p);
396 canvas->restore();
397}
398
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400399void render_shadow(SkCanvas* canvas, const SkPath& path, SkDrawShadowRec rec) {
400 canvas->clear(0xFFFFFFFF);
401
402 const SkRect& bounds = path.getBounds();
403 if (bounds.isEmpty()) {
404 return;
405 }
406
407 SkAutoCanvasRestore acr(canvas, true);
408 xlate_and_scale_to_bounds(canvas, bounds);
409
410 rec.fAmbientColor = SK_ColorBLACK;
411 rec.fSpotColor = SK_ColorBLACK;
412 canvas->private_draw_shadow_rec(path, rec);
413}
414
Florin Malita82d80872017-06-06 16:58:40 -0400415static const char* const gBlendModeMap[] = {
416 "clear",
417 "src",
418 "dst",
419 "srcOver",
420 "dstOver",
421 "srcIn",
422 "dstIn",
423 "srcOut",
424 "dstOut",
425 "srcATop",
426 "dstATop",
427 "xor",
428 "plus",
429 "modulate",
430
431 "screen",
432
433 "overlay",
434 "darken",
435 "lighten",
436 "colorDodge",
437 "colorBurn",
438 "hardLight",
439 "softLight",
440 "difference",
441 "exclusion",
442 "multiply",
443
444 "hue",
445 "saturation",
446 "color",
447 "luminosity",
448};
449
450static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
451 "blendMode mismatch");
452static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
453 "blendMode mismatch");
454
455void apply_paint_blend_mode(const SkPaint& paint, Json::Value* target) {
456 const auto mode = paint.getBlendMode();
457 if (mode != SkBlendMode::kSrcOver) {
458 SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
459 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE] =
460 Json::Value(gBlendModeMap[static_cast<size_t>(mode)]);
461 }
462}
463
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000464};
465
brianosmanfad98562016-05-04 11:06:28 -0700466Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800467 Json::Value result(Json::arrayValue);
468 result.append(Json::Value(SkColorGetA(color)));
469 result.append(Json::Value(SkColorGetR(color)));
470 result.append(Json::Value(SkColorGetG(color)));
471 result.append(Json::Value(SkColorGetB(color)));
472 return result;
473}
474
brianosman97bbf822016-09-25 13:15:58 -0700475Json::Value SkDrawCommand::MakeJsonColor4f(const SkColor4f& color) {
476 Json::Value result(Json::arrayValue);
477 result.append(Json::Value(color.fA));
478 result.append(Json::Value(color.fR));
479 result.append(Json::Value(color.fG));
480 result.append(Json::Value(color.fB));
481 return result;
482}
483
brianosmanfad98562016-05-04 11:06:28 -0700484Json::Value SkDrawCommand::MakeJsonPoint(const SkPoint& point) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800485 Json::Value result(Json::arrayValue);
486 result.append(Json::Value(point.x()));
487 result.append(Json::Value(point.y()));
488 return result;
489}
490
brianosmanfad98562016-05-04 11:06:28 -0700491Json::Value SkDrawCommand::MakeJsonPoint(SkScalar x, SkScalar y) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800492 Json::Value result(Json::arrayValue);
493 result.append(Json::Value(x));
494 result.append(Json::Value(y));
495 return result;
496}
497
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400498Json::Value SkDrawCommand::MakeJsonPoint3(const SkPoint3& point) {
499 Json::Value result(Json::arrayValue);
500 result.append(Json::Value(point.x()));
501 result.append(Json::Value(point.y()));
502 result.append(Json::Value(point.z()));
503 return result;
504}
505
brianosmanfad98562016-05-04 11:06:28 -0700506Json::Value SkDrawCommand::MakeJsonRect(const SkRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800507 Json::Value result(Json::arrayValue);
508 result.append(Json::Value(rect.left()));
509 result.append(Json::Value(rect.top()));
510 result.append(Json::Value(rect.right()));
511 result.append(Json::Value(rect.bottom()));
512 return result;
513}
514
joshualittbd724132016-03-03 11:39:38 -0800515Json::Value SkDrawCommand::MakeJsonIRect(const SkIRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800516 Json::Value result(Json::arrayValue);
517 result.append(Json::Value(rect.left()));
518 result.append(Json::Value(rect.top()));
519 result.append(Json::Value(rect.right()));
520 result.append(Json::Value(rect.bottom()));
521 return result;
522}
523
524static Json::Value make_json_rrect(const SkRRect& rrect) {
525 Json::Value result(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700526 result.append(SkDrawCommand::MakeJsonRect(rrect.rect()));
527 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
528 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperRight_Corner)));
529 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerRight_Corner)));
530 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
ethannicholas50a8dd02016-02-10 05:40:46 -0800531 return result;
532}
533
joshualittbd724132016-03-03 11:39:38 -0800534Json::Value SkDrawCommand::MakeJsonMatrix(const SkMatrix& matrix) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800535 Json::Value result(Json::arrayValue);
536 Json::Value row1(Json::arrayValue);
537 row1.append(Json::Value(matrix[0]));
538 row1.append(Json::Value(matrix[1]));
539 row1.append(Json::Value(matrix[2]));
540 result.append(row1);
541 Json::Value row2(Json::arrayValue);
542 row2.append(Json::Value(matrix[3]));
543 row2.append(Json::Value(matrix[4]));
544 row2.append(Json::Value(matrix[5]));
545 result.append(row2);
546 Json::Value row3(Json::arrayValue);
547 row3.append(Json::Value(matrix[6]));
548 row3.append(Json::Value(matrix[7]));
549 row3.append(Json::Value(matrix[8]));
550 result.append(row3);
551 return result;
552}
ethannicholas1446a9a2016-02-10 14:05:02 -0800553
vjiaoblacke5de1302016-07-13 14:05:28 -0700554Json::Value SkDrawCommand::MakeJsonScalar(SkScalar z) {
555 Json::Value result(z);
556 return result;
557}
558
brianosmanfad98562016-05-04 11:06:28 -0700559Json::Value SkDrawCommand::MakeJsonPath(const SkPath& path) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800560 Json::Value result(Json::objectValue);
561 switch (path.getFillType()) {
562 case SkPath::kWinding_FillType:
563 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_WINDING;
564 break;
565 case SkPath::kEvenOdd_FillType:
566 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_EVENODD;
567 break;
568 case SkPath::kInverseWinding_FillType:
569 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING;
570 break;
571 case SkPath::kInverseEvenOdd_FillType:
572 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
573 break;
halcanary9d524f22016-03-29 09:03:52 -0700574 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800575 Json::Value verbs(Json::arrayValue);
576 SkPath::Iter iter(path, false);
577 SkPoint pts[4];
578 SkPath::Verb verb;
579 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
580 switch (verb) {
581 case SkPath::kLine_Verb: {
582 Json::Value line(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700583 line[SKDEBUGCANVAS_VERB_LINE] = MakeJsonPoint(pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800584 verbs.append(line);
585 break;
586 }
587 case SkPath::kQuad_Verb: {
588 Json::Value quad(Json::objectValue);
589 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700590 coords.append(MakeJsonPoint(pts[1]));
591 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800592 quad[SKDEBUGCANVAS_VERB_QUAD] = coords;
593 verbs.append(quad);
594 break;
595 }
596 case SkPath::kCubic_Verb: {
597 Json::Value cubic(Json::objectValue);
598 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700599 coords.append(MakeJsonPoint(pts[1]));
600 coords.append(MakeJsonPoint(pts[2]));
601 coords.append(MakeJsonPoint(pts[3]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800602 cubic[SKDEBUGCANVAS_VERB_CUBIC] = coords;
603 verbs.append(cubic);
604 break;
605 }
606 case SkPath::kConic_Verb: {
607 Json::Value conic(Json::objectValue);
608 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700609 coords.append(MakeJsonPoint(pts[1]));
610 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800611 coords.append(Json::Value(iter.conicWeight()));
612 conic[SKDEBUGCANVAS_VERB_CONIC] = coords;
613 verbs.append(conic);
614 break;
615 }
616 case SkPath::kMove_Verb: {
617 Json::Value move(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700618 move[SKDEBUGCANVAS_VERB_MOVE] = MakeJsonPoint(pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800619 verbs.append(move);
620 break;
621 }
622 case SkPath::kClose_Verb:
623 verbs.append(Json::Value(SKDEBUGCANVAS_VERB_CLOSE));
624 break;
625 case SkPath::kDone_Verb:
626 break;
627 }
628 }
629 result[SKDEBUGCANVAS_ATTRIBUTE_VERBS] = verbs;
630 return result;
631}
632
brianosmanfad98562016-05-04 11:06:28 -0700633Json::Value SkDrawCommand::MakeJsonRegion(const SkRegion& region) {
Brian Osmanc25e2692018-03-12 10:57:28 -0400634 // TODO: Actually serialize the rectangles, rather than just devolving to path
635 SkPath path;
636 region.getBoundaryPath(&path);
637 return MakeJsonPath(path);
ethannicholas50a8dd02016-02-10 05:40:46 -0800638}
639
Mike Reedc1f77742016-12-09 09:00:50 -0500640static Json::Value make_json_regionop(SkClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800641 switch (op) {
Mike Reedc1f77742016-12-09 09:00:50 -0500642 case kDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800643 return Json::Value(SKDEBUGCANVAS_REGIONOP_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500644 case kIntersect_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800645 return Json::Value(SKDEBUGCANVAS_REGIONOP_INTERSECT);
Mike Reedc1f77742016-12-09 09:00:50 -0500646 case kUnion_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800647 return Json::Value(SKDEBUGCANVAS_REGIONOP_UNION);
Mike Reedc1f77742016-12-09 09:00:50 -0500648 case kXOR_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800649 return Json::Value(SKDEBUGCANVAS_REGIONOP_XOR);
Mike Reedc1f77742016-12-09 09:00:50 -0500650 case kReverseDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800651 return Json::Value(SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500652 case kReplace_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800653 return Json::Value(SKDEBUGCANVAS_REGIONOP_REPLACE);
654 default:
655 SkASSERT(false);
656 return Json::Value("<invalid region op>");
Brian Salomon23356442018-11-30 15:33:19 -0500657 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800658}
659
660static Json::Value make_json_pointmode(SkCanvas::PointMode mode) {
661 switch (mode) {
662 case SkCanvas::kPoints_PointMode:
663 return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
664 case SkCanvas::kLines_PointMode:
665 return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
halcanary9d524f22016-03-29 09:03:52 -0700666 case SkCanvas::kPolygon_PointMode:
ethannicholas50a8dd02016-02-10 05:40:46 -0800667 return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
668 default:
669 SkASSERT(false);
670 return Json::Value("<invalid point mode>");
Brian Salomon23356442018-11-30 15:33:19 -0500671 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800672}
673
halcanary9d524f22016-03-29 09:03:52 -0700674static void store_scalar(Json::Value* target, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800675 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800676 if (value != defaultValue) {
677 (*target)[key] = Json::Value(value);
678 }
679}
680
ethannicholasbd3dae82016-02-10 12:10:00 -0800681static void store_bool(Json::Value* target, const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800682 if (value != defaultValue) {
683 (*target)[key] = Json::Value(value);
684 }
685}
686
halcanary9d524f22016-03-29 09:03:52 -0700687static void encode_data(const void* bytes, size_t count, const char* contentType,
ethannicholasf62a8b72016-02-11 10:35:21 -0800688 UrlDataManager& urlDataManager, Json::Value* target) {
bungeman38d909e2016-08-02 14:40:46 -0700689 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
690 SkString url = urlDataManager.addData(data.get(), contentType);
ethannicholasf62a8b72016-02-11 10:35:21 -0800691 *target = Json::Value(url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800692}
693
brianosmanfad98562016-05-04 11:06:28 -0700694void SkDrawCommand::flatten(const SkFlattenable* flattenable, Json::Value* target,
695 UrlDataManager& urlDataManager) {
696 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800697 flattenable->flatten(buffer);
698 void* data = sk_malloc_throw(buffer.bytesWritten());
699 buffer.writeToMemory(data);
700 Json::Value jsonData;
701 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, &jsonData);
702 Json::Value jsonFlattenable;
703 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->getTypeName());
704 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
brianosmanfad98562016-05-04 11:06:28 -0700705
706 SkJsonWriteBuffer jsonBuffer(&urlDataManager);
707 flattenable->flatten(jsonBuffer);
708 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_VALUES] = jsonBuffer.getValue();
709
ethannicholasf62a8b72016-02-11 10:35:21 -0800710 (*target) = jsonFlattenable;
711 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800712}
713
Brian Osmand9ea8162018-08-08 17:03:39 -0400714void SkDrawCommand::WritePNG(SkBitmap bitmap, SkWStream& out) {
715 SkPixmap pm;
716 SkAssertResult(bitmap.peekPixels(&pm));
ethannicholasf67531f2016-03-21 10:19:39 -0700717
Brian Osmand9ea8162018-08-08 17:03:39 -0400718 SkPngEncoder::Options options;
719 options.fZLibLevel = 1;
720 options.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
721 SkPngEncoder::Encode(&out, pm, options);
ethannicholasf67531f2016-03-21 10:19:39 -0700722}
723
brianosmanfad98562016-05-04 11:06:28 -0700724bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
725 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700726 size_t rowBytes = 4 * image.width();
Hal Canary95e3c052017-01-11 12:44:43 -0500727 SkAutoMalloc buffer(rowBytes * image.height());
halcanary9d524f22016-03-29 09:03:52 -0700728 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700729 kN32_SkColorType, kPremul_SkAlphaType);
730 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
731 SkDebugf("readPixels failed\n");
732 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800733 }
msaretta5cf4f42016-06-30 10:06:51 -0700734
735 SkBitmap bm;
736 bm.installPixels(dstInfo, buffer.get(), rowBytes);
msaretta5cf4f42016-06-30 10:06:51 -0700737
ethannicholasf67531f2016-03-21 10:19:39 -0700738 SkDynamicMemoryWStream out;
Brian Osmand9ea8162018-08-08 17:03:39 -0400739 SkDrawCommand::WritePNG(bm, out);
reed42943c82016-09-12 12:01:44 -0700740 sk_sp<SkData> encoded = out.detachAsData();
ethannicholasf62a8b72016-02-11 10:35:21 -0800741 Json::Value jsonData;
742 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
743 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
ethannicholas50a8dd02016-02-10 05:40:46 -0800744 return true;
745}
746
747static const char* color_type_name(SkColorType colorType) {
748 switch (colorType) {
749 case kARGB_4444_SkColorType:
750 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
751 case kRGBA_8888_SkColorType:
752 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
753 case kBGRA_8888_SkColorType:
754 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
755 case kRGB_565_SkColorType:
756 return SKDEBUGCANVAS_COLORTYPE_565;
757 case kGray_8_SkColorType:
758 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
ethannicholas50a8dd02016-02-10 05:40:46 -0800759 case kAlpha_8_SkColorType:
760 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
761 default:
762 SkASSERT(false);
763 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
764 }
765}
766
767static const char* alpha_type_name(SkAlphaType alphaType) {
768 switch (alphaType) {
769 case kOpaque_SkAlphaType:
770 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
771 case kPremul_SkAlphaType:
772 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
773 case kUnpremul_SkAlphaType:
774 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
775 default:
776 SkASSERT(false);
777 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
778 }
779}
780
brianosmanfad98562016-05-04 11:06:28 -0700781bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
782 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700783 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800784 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
785 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800786 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800787 return success;
788}
789
halcanaryf412f092016-08-25 11:10:41 -0700790static void apply_paint_hinting(const SkPaint& paint, Json::Value* target) {
Mike Reed9edbf422018-11-07 19:54:33 -0500791 SkFontHinting hinting = (SkFontHinting)paint.getHinting();
halcanaryf412f092016-08-25 11:10:41 -0700792 if (hinting != SkPaintDefaults_Hinting) {
793 switch (hinting) {
Mike Reed9edbf422018-11-07 19:54:33 -0500794 case kNo_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700795 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
796 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500797 case kSlight_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700798 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
799 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500800 case kNormal_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700801 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
802 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500803 case kFull_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700804 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
805 break;
806 }
807 }
808}
809
ethannicholas50a8dd02016-02-10 05:40:46 -0800810static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
811 SkColor color = paint.getColor();
812 if (color != SK_ColorBLACK) {
813 Json::Value colorValue(Json::arrayValue);
814 colorValue.append(Json::Value(SkColorGetA(color)));
815 colorValue.append(Json::Value(SkColorGetR(color)));
816 colorValue.append(Json::Value(SkColorGetG(color)));
817 colorValue.append(Json::Value(SkColorGetB(color)));
Brian Salomon23356442018-11-30 15:33:19 -0500818 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;
ethannicholas50a8dd02016-02-10 05:40:46 -0800819 }
820}
821
822static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
823 SkPaint::Style style = paint.getStyle();
824 if (style != SkPaint::kFill_Style) {
825 switch (style) {
826 case SkPaint::kStroke_Style: {
827 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
828 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
829 break;
830 }
831 case SkPaint::kStrokeAndFill_Style: {
832 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
833 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
834 break;
835 }
836 default: SkASSERT(false);
837 }
838 }
839}
840
841static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
842 SkPaint::Cap cap = paint.getStrokeCap();
843 if (cap != SkPaint::kDefault_Cap) {
844 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800845 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800846 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
847 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800848 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800849 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
850 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800851 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800852 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
853 break;
ethannicholas50a8dd02016-02-10 05:40:46 -0800854 default: SkASSERT(false);
855 }
856 }
857}
ethannicholas1446a9a2016-02-10 14:05:02 -0800858
859static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
860 SkPaint::Join join = paint.getStrokeJoin();
861 if (join != SkPaint::kDefault_Join) {
862 switch (join) {
863 case SkPaint::kMiter_Join:
864 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
865 SKDEBUGCANVAS_MITER_JOIN);
866 break;
867 case SkPaint::kRound_Join:
868 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
869 SKDEBUGCANVAS_ROUND_JOIN);
870 break;
871 case SkPaint::kBevel_Join:
872 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
873 SKDEBUGCANVAS_BEVEL_JOIN);
874 break;
875 default: SkASSERT(false);
876 }
877 }
878}
879
880static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
881 SkFilterQuality quality = paint.getFilterQuality();
882 switch (quality) {
883 case kNone_SkFilterQuality:
884 break;
885 case kLow_SkFilterQuality:
886 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
887 SKDEBUGCANVAS_FILTERQUALITY_LOW);
888 break;
889 case kMedium_SkFilterQuality:
890 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
891 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
892 break;
893 case kHigh_SkFilterQuality:
894 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
895 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
896 break;
897 }
898}
899
halcanary9d524f22016-03-29 09:03:52 -0700900static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800901 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800902 SkMaskFilter* maskFilter = paint.getMaskFilter();
903 if (maskFilter != nullptr) {
Mike Reed80747ef2018-01-23 15:29:32 -0500904 SkMaskFilterBase::BlurRec blurRec;
905 if (as_MFB(maskFilter)->asABlur(&blurRec)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800906 Json::Value blur(Json::objectValue);
907 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
908 switch (blurRec.fStyle) {
909 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800910 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
911 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -0800912 break;
913 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800914 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
915 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -0800916 break;
917 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800918 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
919 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800920 break;
921 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800922 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
923 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800924 break;
925 default:
926 SkASSERT(false);
927 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800928 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
929 } else {
930 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -0700931 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800932 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
933 }
934 }
935}
936
halcanary9d524f22016-03-29 09:03:52 -0700937static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800938 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800939 SkPathEffect* pathEffect = paint.getPathEffect();
940 if (pathEffect != nullptr) {
941 SkPathEffect::DashInfo dashInfo;
942 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
943 if (dashType == SkPathEffect::kDash_DashType) {
944 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
945 pathEffect->asADash(&dashInfo);
946 Json::Value dashing(Json::objectValue);
947 Json::Value intervals(Json::arrayValue);
948 for (int32_t i = 0; i < dashInfo.fCount; i++) {
949 intervals.append(Json::Value(dashInfo.fIntervals[i]));
950 }
951 sk_free(dashInfo.fIntervals);
952 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
953 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
954 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
955 } else {
956 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -0700957 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800958 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
959 }
960 }
961}
halcanary9d524f22016-03-29 09:03:52 -0700962
halcanary9d524f22016-03-29 09:03:52 -0700963static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800964 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800965 SkTypeface* typeface = paint.getTypeface();
966 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -0800967 Json::Value jsonTypeface;
968 SkDynamicMemoryWStream buffer;
969 typeface->serialize(&buffer);
970 void* data = sk_malloc_throw(buffer.bytesWritten());
971 buffer.copyTo(data);
972 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -0700973 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -0800974 &jsonData);
975 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
976 sk_free(data);
977 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -0800978 }
979}
980
halcanary9d524f22016-03-29 09:03:52 -0700981static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800982 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800983 SkFlattenable* shader = paint.getShader();
984 if (shader != nullptr) {
985 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -0700986 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800987 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
988 }
989}
990
ethannicholasf62a8b72016-02-11 10:35:21 -0800991static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
992 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800993 SkFlattenable* imageFilter = paint.getImageFilter();
994 if (imageFilter != nullptr) {
995 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -0700996 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800997 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
998 }
999}
1000
halcanary9d524f22016-03-29 09:03:52 -07001001static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001002 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001003 SkFlattenable* colorFilter = paint.getColorFilter();
1004 if (colorFilter != nullptr) {
1005 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001006 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001007 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1008 }
1009}
1010
halcanary9d524f22016-03-29 09:03:52 -07001011static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001012 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001013 SkFlattenable* looper = paint.getLooper();
1014 if (looper != nullptr) {
1015 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001016 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001017 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1018 }
1019}
1020
brianosmanfad98562016-05-04 11:06:28 -07001021Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001022 Json::Value result(Json::objectValue);
1023 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001024 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001025 SkPaintDefaults_MiterLimit);
1026 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001027 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001028 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, paint.isFakeBoldText(), false);
1029 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, paint.isLinearText(), false);
1030 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, paint.isSubpixelText(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001031 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT, paint.isLCDRenderText(), false);
1032 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, paint.isEmbeddedBitmapText(), false);
1033 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, paint.isAutohinted(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001034 //kGenA8FromLCD_Flag
1035
halcanary9d524f22016-03-29 09:03:52 -07001036 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001037 SkPaintDefaults_TextSize);
1038 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
1039 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
halcanaryf412f092016-08-25 11:10:41 -07001040 apply_paint_hinting(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001041 apply_paint_color(paint, &result);
1042 apply_paint_style(paint, &result);
Florin Malita82d80872017-06-06 16:58:40 -04001043 apply_paint_blend_mode(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001044 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001045 apply_paint_join(paint, &result);
1046 apply_paint_filterquality(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001047 apply_paint_patheffect(paint, &result, urlDataManager);
1048 apply_paint_maskfilter(paint, &result, urlDataManager);
1049 apply_paint_shader(paint, &result, urlDataManager);
ethannicholasf62a8b72016-02-11 10:35:21 -08001050 apply_paint_looper(paint, &result, urlDataManager);
1051 apply_paint_imagefilter(paint, &result, urlDataManager);
1052 apply_paint_colorfilter(paint, &result, urlDataManager);
1053 apply_paint_typeface(paint, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001054 return result;
1055}
1056
Stan Ilievac42aeb2017-01-12 16:20:50 -05001057Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) {
1058 Json::Value result(Json::objectValue);
1059 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount);
1060 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount);
1061 if (nullptr != lattice.fBounds) {
1062 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds);
1063 }
1064 Json::Value XDivs(Json::arrayValue);
1065 for (int i = 0; i < lattice.fXCount; i++) {
1066 XDivs.append(Json::Value(lattice.fXDivs[i]));
1067 }
1068 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs;
1069 Json::Value YDivs(Json::arrayValue);
1070 for (int i = 0; i < lattice.fYCount; i++) {
1071 YDivs.append(Json::Value(lattice.fYDivs[i]));
1072 }
1073 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs;
Stan Ilievca8c0952017-12-11 13:01:58 -05001074 if (nullptr != lattice.fRectTypes) {
Stan Ilievac42aeb2017-01-12 16:20:50 -05001075 Json::Value flags(Json::arrayValue);
1076 int flagCount = 0;
1077 for (int row = 0; row < lattice.fYCount+1; row++) {
1078 Json::Value flagsRow(Json::arrayValue);
1079 for (int column = 0; column < lattice.fXCount+1; column++) {
Stan Ilievca8c0952017-12-11 13:01:58 -05001080 flagsRow.append(Json::Value(lattice.fRectTypes[flagCount++]));
Stan Ilievac42aeb2017-01-12 16:20:50 -05001081 }
1082 flags.append(flagsRow);
1083 }
1084 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags;
1085 }
1086 return result;
1087}
1088
Brian Osmanc25e2692018-03-12 10:57:28 -04001089SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kClear_OpType) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001090 fColor = color;
ethannicholas1446a9a2016-02-10 14:05:02 -08001091}
1092
1093void SkClearCommand::execute(SkCanvas* canvas) const {
1094 canvas->clear(fColor);
1095}
1096
ethannicholasf62a8b72016-02-11 10:35:21 -08001097Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1098 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001099 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001100 return result;
1101}
1102
Mike Reedc1f77742016-12-09 09:00:50 -05001103SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001104 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001105 fPath = path;
1106 fOp = op;
1107 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001108}
1109
fmalita8c89c522014-11-08 16:18:56 -08001110void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001111 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001112}
1113
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001114bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001115 render_path(canvas, fPath);
1116 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001117}
1118
ethannicholasf62a8b72016-02-11 10:35:21 -08001119Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1120 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001121 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001122 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1123 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1124 return result;
1125}
1126
Mike Reedc1f77742016-12-09 09:00:50 -05001127SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001128 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001129 fRegion = region;
1130 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001131}
1132
fmalita8c89c522014-11-08 16:18:56 -08001133void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001134 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001135}
1136
ethannicholasf62a8b72016-02-11 10:35:21 -08001137Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1138 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001139 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001140 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1141 return result;
1142}
1143
Mike Reedc1f77742016-12-09 09:00:50 -05001144SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001145 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001146 fRect = rect;
1147 fOp = op;
1148 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001149}
1150
fmalita8c89c522014-11-08 16:18:56 -08001151void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001152 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001153}
1154
ethannicholasf62a8b72016-02-11 10:35:21 -08001155Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1156 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001157 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001158 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1159 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001160
1161 SkString desc;
1162 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1163
ethannicholas50a8dd02016-02-10 05:40:46 -08001164 return result;
1165}
1166
Mike Reedc1f77742016-12-09 09:00:50 -05001167SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001168 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001169 fRRect = rrect;
1170 fOp = op;
1171 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001172}
1173
fmalita8c89c522014-11-08 16:18:56 -08001174void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001175 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001176}
1177
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001178bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001179 render_rrect(canvas, fRRect);
1180 return true;
1181}
1182
ethannicholasf62a8b72016-02-11 10:35:21 -08001183Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1184 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001185 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1186 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1187 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1188 return result;
1189}
1190
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001191SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001192 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001193 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001194}
1195
fmalita8c89c522014-11-08 16:18:56 -08001196void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001197 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001198}
1199
ethannicholasf62a8b72016-02-11 10:35:21 -08001200Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1201 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001202 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001203 return result;
1204}
1205
reed97660cc2016-06-28 18:54:19 -07001206////
1207
1208SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1209 sk_sp<SkData> value)
1210 : INHERITED(kDrawAnnotation_OpType)
1211 , fRect(rect)
1212 , fKey(key)
1213 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001214{
robertphillipsfb409232016-06-29 10:28:11 -07001215}
reed97660cc2016-06-28 18:54:19 -07001216
1217void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1218 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1219}
1220
1221Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1222 Json::Value result = INHERITED::toJSON(urlDataManager);
1223
1224 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1225 result["key"] = Json::Value(fKey.c_str());
1226 if (fValue.get()) {
1227 // TODO: dump out the "value"
1228 }
reed67f62fa2016-06-29 11:36:34 -07001229
1230 SkString desc;
1231 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1232 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1233
reed97660cc2016-06-28 18:54:19 -07001234 return result;
1235}
1236
reed97660cc2016-06-28 18:54:19 -07001237////
1238
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001239SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07001240 const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001241 : INHERITED(kDrawBitmap_OpType)
1242 , fBitmap(bitmap)
1243 , fLeft(left)
1244 , fTop(top)
1245 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001246
fmalita8c89c522014-11-08 16:18:56 -08001247void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001248 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001249}
1250
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001251bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001252 render_bitmap(canvas, fBitmap);
1253 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001254}
1255
ethannicholasf62a8b72016-02-11 10:35:21 -08001256Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
1257 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001258 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001259 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001260 Json::Value command(Json::objectValue);
1261 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001262 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
Brian Osman8363be12018-05-29 13:38:07 -04001263 if (fPaint.isValid()) {
1264 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001265 }
1266 }
1267 return result;
1268}
1269
Brian Osman78a76482018-05-18 16:59:13 -04001270SkDrawBitmapLatticeCommand::SkDrawBitmapLatticeCommand(const SkBitmap& bitmap,
1271 const SkCanvas::Lattice& lattice,
1272 const SkRect& dst, const SkPaint* paint)
1273 : INHERITED(kDrawBitmapLattice_OpType)
1274 , fBitmap(bitmap)
1275 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001276 , fDst(dst)
1277 , fPaint(paint) {}
Brian Osman78a76482018-05-18 16:59:13 -04001278
1279void SkDrawBitmapLatticeCommand::execute(SkCanvas* canvas) const {
1280 canvas->drawBitmapLattice(fBitmap, fLattice, fDst, fPaint.getMaybeNull());
1281}
1282
1283bool SkDrawBitmapLatticeCommand::render(SkCanvas* canvas) const {
1284 SkAutoCanvasRestore acr(canvas, true);
1285 canvas->clear(0xFFFFFFFF);
1286
1287 xlate_and_scale_to_bounds(canvas, fDst);
1288
1289 this->execute(canvas);
1290 return true;
1291}
1292
1293Json::Value SkDrawBitmapLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1294 Json::Value result = INHERITED::toJSON(urlDataManager);
1295 Json::Value encoded;
1296 if (flatten(fBitmap, &encoded, urlDataManager)) {
1297 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
1298 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1299 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1300 if (fPaint.isValid()) {
1301 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1302 }
1303 }
1304
1305 SkString desc;
1306 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1307
1308 return result;
1309}
1310
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001311SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00001312 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001313 : INHERITED(kDrawBitmapNine_OpType)
1314 , fBitmap(bitmap)
1315 , fCenter(center)
1316 , fDst(dst)
1317 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001318
fmalita8c89c522014-11-08 16:18:56 -08001319void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001320 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001321}
1322
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001323bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08001324 SkRect tmp = SkRect::Make(fCenter);
1325 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001326 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001327}
1328
ethannicholasf62a8b72016-02-11 10:35:21 -08001329Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1330 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001331 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001332 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001333 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08001334 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07001335 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001336 if (fPaint.isValid()) {
1337 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001338 }
1339 }
1340 return result;
1341}
1342
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001343SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00001344 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07001345 SkCanvas::SrcRectConstraint constraint)
Brian Osman8363be12018-05-29 13:38:07 -04001346 : INHERITED(kDrawBitmapRect_OpType)
1347 , fBitmap(bitmap)
1348 , fSrc(src)
1349 , fDst(dst)
1350 , fPaint(paint)
1351 , fConstraint(constraint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001352
fmalita8c89c522014-11-08 16:18:56 -08001353void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001354 canvas->legacy_drawBitmapRect(fBitmap, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
1355 fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001356}
1357
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001358bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001359 render_bitmap(canvas, fBitmap, fSrc.getMaybeNull());
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001360 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001361}
1362
ethannicholasf62a8b72016-02-11 10:35:21 -08001363Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1364 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001365 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001366 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001367 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
Brian Osman8363be12018-05-29 13:38:07 -04001368 if (fSrc.isValid()) {
1369 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001370 }
brianosmanfad98562016-05-04 11:06:28 -07001371 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001372 if (fPaint.isValid()) {
1373 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001374 }
1375 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1376 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1377 }
1378 }
reed67f62fa2016-06-29 11:36:34 -07001379
1380 SkString desc;
1381 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1382
ethannicholas50a8dd02016-02-10 05:40:46 -08001383 return result;
1384}
1385
fmalita651c9202015-07-22 10:23:01 -07001386SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
1387 const SkPaint* paint)
1388 : INHERITED(kDrawImage_OpType)
1389 , fImage(SkRef(image))
1390 , fLeft(left)
Brian Osman8363be12018-05-29 13:38:07 -04001391 , fTop(top)
1392 , fPaint(paint) {}
fmalita651c9202015-07-22 10:23:01 -07001393
1394void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001395 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07001396}
1397
1398bool SkDrawImageCommand::render(SkCanvas* canvas) const {
1399 SkAutoCanvasRestore acr(canvas, true);
1400 canvas->clear(0xFFFFFFFF);
1401
1402 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
1403 SkIntToScalar(fImage->width()),
1404 SkIntToScalar(fImage->height())));
1405 this->execute(canvas);
1406 return true;
1407}
1408
ethannicholasf62a8b72016-02-11 10:35:21 -08001409Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
1410 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001411 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001412 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001413 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001414 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08001415 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001416 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001417 }
msarett0ac1bec2016-08-29 09:15:33 -07001418
1419 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
1420 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
1421 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
1422 switch (fImage->alphaType()) {
1423 case kOpaque_SkAlphaType:
1424 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
1425 break;
1426 case kPremul_SkAlphaType:
1427 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
1428 break;
1429 case kUnpremul_SkAlphaType:
1430 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
1431 break;
1432 default:
1433 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
1434 break;
1435 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001436 }
1437 return result;
1438}
1439
Stan Ilievac42aeb2017-01-12 16:20:50 -05001440SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
1441 const SkCanvas::Lattice& lattice,
1442 const SkRect& dst, const SkPaint* paint)
1443 : INHERITED(kDrawImageLattice_OpType)
1444 , fImage(SkRef(image))
1445 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001446 , fDst(dst)
1447 , fPaint(paint) {}
Stan Ilievac42aeb2017-01-12 16:20:50 -05001448
1449void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
Brian Osman78a76482018-05-18 16:59:13 -04001450 canvas->drawImageLattice(fImage.get(), fLattice, fDst, fPaint.getMaybeNull());
Stan Ilievac42aeb2017-01-12 16:20:50 -05001451}
1452
1453bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
1454 SkAutoCanvasRestore acr(canvas, true);
1455 canvas->clear(0xFFFFFFFF);
1456
1457 xlate_and_scale_to_bounds(canvas, fDst);
1458
1459 this->execute(canvas);
1460 return true;
1461}
1462
1463Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1464 Json::Value result = INHERITED::toJSON(urlDataManager);
1465 Json::Value encoded;
1466 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001467 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
Stan Ilievac42aeb2017-01-12 16:20:50 -05001468 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1469 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1470 if (fPaint.isValid()) {
1471 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1472 }
1473 }
1474
1475 SkString desc;
1476 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1477
1478 return result;
1479}
1480
fmalita651c9202015-07-22 10:23:01 -07001481SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
1482 const SkRect& dst, const SkPaint* paint,
1483 SkCanvas::SrcRectConstraint constraint)
1484 : INHERITED(kDrawImageRect_OpType)
1485 , fImage(SkRef(image))
Brian Osman8363be12018-05-29 13:38:07 -04001486 , fSrc(src)
fmalita651c9202015-07-22 10:23:01 -07001487 , fDst(dst)
Brian Osman8363be12018-05-29 13:38:07 -04001488 , fPaint(paint)
1489 , fConstraint(constraint) {}
fmalita651c9202015-07-22 10:23:01 -07001490
1491void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001492 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
1493 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07001494}
1495
1496bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
1497 SkAutoCanvasRestore acr(canvas, true);
1498 canvas->clear(0xFFFFFFFF);
1499
1500 xlate_and_scale_to_bounds(canvas, fDst);
1501
1502 this->execute(canvas);
1503 return true;
1504}
1505
ethannicholasf62a8b72016-02-11 10:35:21 -08001506Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1507 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001508 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001509 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001510 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
ethannicholas50a8dd02016-02-10 05:40:46 -08001511 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001512 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001513 }
brianosmanfad98562016-05-04 11:06:28 -07001514 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08001515 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001516 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001517 }
1518 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1519 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1520 }
1521 }
reed67f62fa2016-06-29 11:36:34 -07001522
1523 SkString desc;
1524 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1525
ethannicholas50a8dd02016-02-10 05:40:46 -08001526 return result;
1527}
1528
Brian Salomond7065e72018-10-12 11:42:02 -04001529SkDrawImageSetCommand::SkDrawImageSetCommand(const SkCanvas::ImageSetEntry set[], int count,
Brian Salomond003d222018-11-26 13:25:05 -05001530 SkFilterQuality filterQuality, SkBlendMode mode)
Brian Salomond7065e72018-10-12 11:42:02 -04001531 : INHERITED(kDrawImageSet_OpType)
1532 , fSet(count)
1533 , fCount(count)
Brian Salomond7065e72018-10-12 11:42:02 -04001534 , fFilterQuality(filterQuality)
1535 , fMode(mode) {
1536 std::copy_n(set, count, fSet.get());
1537}
1538
1539void SkDrawImageSetCommand::execute(SkCanvas* canvas) const {
Brian Salomond003d222018-11-26 13:25:05 -05001540 canvas->experimental_DrawImageSetV1(fSet.get(), fCount, fFilterQuality, fMode);
Brian Salomond7065e72018-10-12 11:42:02 -04001541}
1542
Brian Osmanc25e2692018-03-12 10:57:28 -04001543SkDrawImageNineCommand::SkDrawImageNineCommand(const SkImage* image, const SkIRect& center,
1544 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001545 : INHERITED(kDrawImageNine_OpType)
1546 , fImage(SkRef(image))
1547 , fCenter(center)
1548 , fDst(dst)
1549 , fPaint(paint) {}
Brian Osmanc25e2692018-03-12 10:57:28 -04001550
1551void SkDrawImageNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001552 canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaint.getMaybeNull());
Brian Osmanc25e2692018-03-12 10:57:28 -04001553}
1554
1555bool SkDrawImageNineCommand::render(SkCanvas* canvas) const {
1556 SkAutoCanvasRestore acr(canvas, true);
1557 canvas->clear(0xFFFFFFFF);
1558
1559 xlate_and_scale_to_bounds(canvas, fDst);
1560
1561 this->execute(canvas);
1562 return true;
1563}
1564
1565Json::Value SkDrawImageNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1566 Json::Value result = INHERITED::toJSON(urlDataManager);
1567 Json::Value encoded;
1568 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
1569 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
1570 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
1571 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001572 if (fPaint.isValid()) {
1573 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
Brian Osmanc25e2692018-03-12 10:57:28 -04001574 }
1575 }
1576 return result;
1577}
1578
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001579SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001580 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001581 fOval = oval;
1582 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001583}
1584
fmalita8c89c522014-11-08 16:18:56 -08001585void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001586 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001587}
1588
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001589bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001590 canvas->clear(0xFFFFFFFF);
1591 canvas->save();
1592
1593 xlate_and_scale_to_bounds(canvas, fOval);
1594
1595 SkPaint p;
1596 p.setColor(SK_ColorBLACK);
1597 p.setStyle(SkPaint::kStroke_Style);
1598
1599 canvas->drawOval(fOval, p);
1600 canvas->restore();
1601
1602 return true;
1603}
1604
ethannicholasf62a8b72016-02-11 10:35:21 -08001605Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
1606 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001607 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1608 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001609 return result;
1610}
1611
bsalomonac3aa242016-08-19 11:25:19 -07001612SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
1613 bool useCenter, const SkPaint& paint)
Brian Osmanc25e2692018-03-12 10:57:28 -04001614 : INHERITED(kDrawArc_OpType) {
bsalomonac3aa242016-08-19 11:25:19 -07001615 fOval = oval;
1616 fStartAngle = startAngle;
1617 fSweepAngle = sweepAngle;
1618 fUseCenter = useCenter;
1619 fPaint = paint;
bsalomonac3aa242016-08-19 11:25:19 -07001620}
1621
1622void SkDrawArcCommand::execute(SkCanvas* canvas) const {
1623 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
1624}
1625
1626bool SkDrawArcCommand::render(SkCanvas* canvas) const {
1627 canvas->clear(0xFFFFFFFF);
1628 canvas->save();
1629
1630 xlate_and_scale_to_bounds(canvas, fOval);
1631
1632 SkPaint p;
1633 p.setColor(SK_ColorBLACK);
1634 p.setStyle(SkPaint::kStroke_Style);
1635
1636 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
1637 canvas->restore();
1638
1639 return true;
1640}
1641
1642Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
1643 Json::Value result = INHERITED::toJSON(urlDataManager);
1644 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1645 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
1646 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
1647 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
1648 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1649 return result;
1650}
1651
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001652SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001653 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001654 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001655}
1656
fmalita8c89c522014-11-08 16:18:56 -08001657void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001658 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001659}
1660
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001661bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001662 canvas->clear(0xFFFFFFFF);
1663 canvas->drawPaint(fPaint);
1664 return true;
1665}
1666
ethannicholasf62a8b72016-02-11 10:35:21 -08001667Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
1668 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001669 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001670 return result;
1671}
1672
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001673SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001674 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001675 fPath = path;
1676 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001677}
1678
fmalita8c89c522014-11-08 16:18:56 -08001679void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001680 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001681}
1682
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001683bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001684 render_path(canvas, fPath);
1685 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001686}
1687
ethannicholasf62a8b72016-02-11 10:35:21 -08001688Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1689 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001690 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
1691 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001692 return result;
1693}
1694
Brian Osmanc25e2692018-03-12 10:57:28 -04001695SkDrawRegionCommand::SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint)
1696 : INHERITED(kDrawRegion_OpType) {
1697 fRegion = region;
1698 fPaint = paint;
Brian Osmanc25e2692018-03-12 10:57:28 -04001699}
1700
1701void SkDrawRegionCommand::execute(SkCanvas* canvas) const {
1702 canvas->drawRegion(fRegion, fPaint);
1703}
1704
1705bool SkDrawRegionCommand::render(SkCanvas* canvas) const {
1706 render_region(canvas, fRegion);
1707 return true;
1708}
1709
1710Json::Value SkDrawRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1711 Json::Value result = INHERITED::toJSON(urlDataManager);
1712 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
1713 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1714 return result;
1715}
1716
fmalita160ebb22015-04-01 20:58:37 -07001717SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
1718 const SkMatrix* matrix,
1719 const SkPaint* paint)
1720 : INHERITED(kBeginDrawPicture_OpType)
Brian Osman8363be12018-05-29 13:38:07 -04001721 , fPicture(SkRef(picture))
1722 , fMatrix(matrix)
1723 , fPaint(paint) {}
fmalita160ebb22015-04-01 20:58:37 -07001724
1725void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
1726 if (fPaint.isValid()) {
1727 SkRect bounds = fPicture->cullRect();
1728 if (fMatrix.isValid()) {
1729 fMatrix.get()->mapRect(&bounds);
1730 }
1731 canvas->saveLayer(&bounds, fPaint.get());
1732 }
1733
1734 if (fMatrix.isValid()) {
1735 if (!fPaint.isValid()) {
1736 canvas->save();
1737 }
1738 canvas->concat(*fMatrix.get());
1739 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001740}
1741
fmalita160ebb22015-04-01 20:58:37 -07001742bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001743 canvas->clear(0xFFFFFFFF);
1744 canvas->save();
1745
robertphillipsa8d7f0b2014-08-29 08:03:56 -07001746 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001747
robertphillips9b14f262014-06-04 05:40:44 -07001748 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001749
1750 canvas->restore();
1751
1752 return true;
1753}
1754
fmalita160ebb22015-04-01 20:58:37 -07001755SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
1756 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
1757
1758void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
1759 if (fRestore) {
1760 canvas->restore();
1761 }
1762}
1763
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001764SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001765 const SkPoint pts[], const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04001766 : INHERITED(kDrawPoints_OpType)
1767 , fMode(mode)
1768 , fPts(pts, count)
1769 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001770
fmalita8c89c522014-11-08 16:18:56 -08001771void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001772 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001773}
1774
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001775bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001776 canvas->clear(0xFFFFFFFF);
1777 canvas->save();
1778
1779 SkRect bounds;
1780
1781 bounds.setEmpty();
Brian Osman8363be12018-05-29 13:38:07 -04001782 for (int i = 0; i < fPts.count(); ++i) {
Mike Reed185ffe92018-01-08 17:09:54 -05001783 SkRectPriv::GrowToInclude(&bounds, fPts[i]);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001784 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00001785
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001786 xlate_and_scale_to_bounds(canvas, bounds);
1787
1788 SkPaint p;
1789 p.setColor(SK_ColorBLACK);
1790 p.setStyle(SkPaint::kStroke_Style);
1791
Brian Osman8363be12018-05-29 13:38:07 -04001792 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001793 canvas->restore();
1794
1795 return true;
1796}
1797
ethannicholasf62a8b72016-02-11 10:35:21 -08001798Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
1799 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001800 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
1801 Json::Value points(Json::arrayValue);
Brian Osman8363be12018-05-29 13:38:07 -04001802 for (int i = 0; i < fPts.count(); i++) {
brianosmanfad98562016-05-04 11:06:28 -07001803 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001804 }
1805 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07001806 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001807 return result;
1808}
1809
Brian Osman65197ff2018-05-29 14:25:39 -04001810static Json::Value make_json_text(sk_sp<SkData> text) {
1811 return Json::Value((const char*)text->data(), (const char*)text->data() + text->size());
chudy@google.com902ebe52012-06-29 14:21:22 +00001812}
1813
fmalita37283c22016-09-13 10:00:23 -07001814SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07001815 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001816 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07001817 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07001818 , fXPos(x)
1819 , fYPos(y)
Brian Osman255735e2018-04-06 14:51:42 -04001820 , fPaint(paint) {}
fmalitab7425172014-08-26 07:56:44 -07001821
fmalita8c89c522014-11-08 16:18:56 -08001822void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07001823 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1824}
1825
fmalita55773872014-08-29 15:08:20 -07001826bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
1827 canvas->clear(SK_ColorWHITE);
1828 canvas->save();
1829
1830 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
1831 xlate_and_scale_to_bounds(canvas, bounds);
1832
fmalita37283c22016-09-13 10:00:23 -07001833 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07001834
1835 canvas->restore();
1836
1837 return true;
1838}
1839
ethannicholasf62a8b72016-02-11 10:35:21 -08001840Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
1841 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001842 Json::Value runs(Json::arrayValue);
1843 SkTextBlobRunIterator iter(fBlob.get());
1844 while (!iter.done()) {
1845 Json::Value run(Json::objectValue);
1846 Json::Value jsonPositions(Json::arrayValue);
1847 Json::Value jsonGlyphs(Json::arrayValue);
1848 const SkScalar* iterPositions = iter.pos();
1849 const uint16_t* iterGlyphs = iter.glyphs();
1850 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1851 switch (iter.positioning()) {
Florin Malitaab54e732018-07-27 09:47:15 -04001852 case SkTextBlobRunIterator::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07001853 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
1854 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001855 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001856 case SkTextBlobRunIterator::kHorizontal_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001857 jsonPositions.append(Json::Value(iterPositions[i]));
1858 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001859 case SkTextBlobRunIterator::kDefault_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001860 break;
1861 }
1862 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
1863 }
Florin Malitaab54e732018-07-27 09:47:15 -04001864 if (iter.positioning() != SkTextBlobRunIterator::kDefault_Positioning) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001865 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
1866 }
1867 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
1868 SkPaint fontPaint;
1869 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07001870 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
1871 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08001872 runs.append(run);
1873 iter.next();
1874 }
reed6d2c3e72016-07-07 14:10:14 -07001875 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08001876 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
1877 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
1878 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07001879 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07001880 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07001881
1882 SkString desc;
1883 // make the bounds local by applying the x,y
1884 bounds.offset(fXPos, fYPos);
1885 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
1886
ethannicholas50a8dd02016-02-10 05:40:46 -08001887 return result;
1888}
1889
robertphillips9bafc302015-02-13 11:13:00 -08001890SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04001891 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08001892 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04001893 : INHERITED(kDrawPatch_OpType)
1894 , fBlendMode(bmode)
1895{
robertphillips9bafc302015-02-13 11:13:00 -08001896 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08001897 if (colors != nullptr) {
1898 memcpy(fColors, colors, sizeof(fColors));
1899 fColorsPtr = fColors;
1900 } else {
1901 fColorsPtr = nullptr;
1902 }
1903 if (texCoords != nullptr) {
1904 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
1905 fTexCoordsPtr = fTexCoords;
1906 } else {
1907 fTexCoordsPtr = nullptr;
1908 }
robertphillips9bafc302015-02-13 11:13:00 -08001909 fPaint = paint;
robertphillips9bafc302015-02-13 11:13:00 -08001910}
1911
1912void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04001913 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08001914}
1915
ethannicholasf62a8b72016-02-11 10:35:21 -08001916Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
1917 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001918 Json::Value cubics = Json::Value(Json::arrayValue);
1919 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001920 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001921 }
1922 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
1923 if (fColorsPtr != nullptr) {
1924 Json::Value colors = Json::Value(Json::arrayValue);
1925 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001926 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001927 }
1928 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
1929 }
1930 if (fTexCoordsPtr != nullptr) {
1931 Json::Value texCoords = Json::Value(Json::arrayValue);
1932 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001933 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001934 }
1935 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
1936 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001937 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08001938 return result;
1939}
1940
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001941SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001942 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001943 fRect = rect;
1944 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001945}
1946
fmalita8c89c522014-11-08 16:18:56 -08001947void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001948 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001949}
1950
ethannicholasf62a8b72016-02-11 10:35:21 -08001951Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1952 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001953 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1954 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07001955
1956 SkString desc;
1957 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1958
ethannicholas50a8dd02016-02-10 05:40:46 -08001959 return result;
1960}
1961
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001962SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001963 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00001964 fRRect = rrect;
1965 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001966}
1967
fmalita8c89c522014-11-08 16:18:56 -08001968void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00001969 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001970}
1971
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001972bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001973 render_rrect(canvas, fRRect);
1974 return true;
1975}
1976
ethannicholasf62a8b72016-02-11 10:35:21 -08001977Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1978 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001979 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07001980 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001981 return result;
1982}
1983
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00001984SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001985 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001986 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001987 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001988 fOuter = outer;
1989 fInner = inner;
1990 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001991}
1992
fmalita8c89c522014-11-08 16:18:56 -08001993void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001994 canvas->drawDRRect(fOuter, fInner, fPaint);
1995}
1996
1997bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
1998 render_drrect(canvas, fOuter, fInner);
1999 return true;
2000}
2001
ethannicholasf62a8b72016-02-11 10:35:21 -08002002Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2003 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002004 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
2005 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07002006 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002007 return result;
2008}
2009
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04002010SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
2011 : INHERITED(kDrawShadow_OpType) {
2012 fPath = path;
2013 fShadowRec = rec;
2014}
2015
2016void SkDrawShadowCommand::execute(SkCanvas* canvas) const {
2017 canvas->private_draw_shadow_rec(fPath, fShadowRec);
2018}
2019
2020bool SkDrawShadowCommand::render(SkCanvas* canvas) const {
2021 render_shadow(canvas, fPath, fShadowRec);
2022 return true;
2023}
2024
2025Json::Value SkDrawShadowCommand::toJSON(UrlDataManager& urlDataManager) const {
2026 Json::Value result = INHERITED::toJSON(urlDataManager);
2027 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2028
2029 bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
2030 bool transparentOccluder =
2031 SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
2032
2033 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2034 result[SKDEBUGCANVAS_ATTRIBUTE_ZPLANE] = MakeJsonPoint3(fShadowRec.fZPlaneParams);
2035 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION] = MakeJsonPoint3(fShadowRec.fLightPos);
2036 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS] = MakeJsonScalar(fShadowRec.fLightRadius);
2037 result[SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR] = MakeJsonColor(fShadowRec.fAmbientColor);
2038 result[SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR] = MakeJsonColor(fShadowRec.fSpotColor);
2039 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
2040 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
2041 return result;
2042}
2043
Brian Osmanc7611082018-05-29 14:55:50 -04002044///////////////////////////////////////////////////////////////////////////////////////////////////
2045
2046SkDrawDrawableCommand::SkDrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
2047 : INHERITED(kDrawDrawable_OpType)
2048 , fDrawable(SkRef(drawable))
2049 , fMatrix(matrix) {}
2050
2051void SkDrawDrawableCommand::execute(SkCanvas* canvas) const {
2052 canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
2053}
2054
2055///////////////////////////////////////////////////////////////////////////////////////////////////
2056
reed45561a02016-07-07 12:47:17 -07002057SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength,
2058 const SkRSXform xform[], const SkRect* cull,
2059 const SkPaint& paint)
reed63f30d92016-07-07 16:32:51 -07002060 : INHERITED(kDrawTextRSXform_OpType)
Brian Osman65197ff2018-05-29 14:25:39 -04002061 , fText(SkData::MakeWithCopy(text, byteLength))
Mike Reed34c9b6d2018-12-12 15:48:16 -05002062 , fXform(xform, SkFont::LEGACY_ExtractFromPaint(paint).countText(text, byteLength, paint.getTextEncoding()))
Brian Osman8363be12018-05-29 13:38:07 -04002063 , fCull(cull)
Brian Osman65197ff2018-05-29 14:25:39 -04002064 , fPaint(paint) {}
reed45561a02016-07-07 12:47:17 -07002065
2066void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002067 canvas->drawTextRSXform(fText->data(), fText->size(), fXform.begin(), fCull.getMaybeNull(),
2068 fPaint);
reed45561a02016-07-07 12:47:17 -07002069}
2070
2071Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) const {
2072 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002073 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
reed45561a02016-07-07 12:47:17 -07002074 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
2075 return result;
2076}
2077
reed45561a02016-07-07 12:47:17 -07002078///////////////////////////////////////////////////////////////////////////////////////////////////
2079
Mike Reedfed9cfd2017-03-17 12:09:04 -04002080SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002081 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04002082 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04002083 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04002084 , fBlendMode(bmode)
Brian Osman255735e2018-04-06 14:51:42 -04002085 , fPaint(paint) {}
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002086
fmalita8c89c522014-11-08 16:18:56 -08002087void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04002088 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002089}
2090
Brian Osman616f1cb2018-05-29 11:23:35 -04002091///////////////////////////////////////////////////////////////////////////////////////////////////
2092
2093SkDrawAtlasCommand::SkDrawAtlasCommand(const SkImage* image, const SkRSXform xform[],
2094 const SkRect tex[], const SkColor colors[], int count,
2095 SkBlendMode bmode, const SkRect* cull,
2096 const SkPaint* paint)
2097 : INHERITED(kDrawAtlas_OpType)
2098 , fImage(SkRef(image))
2099 , fXform(xform, count)
2100 , fTex(tex, count)
2101 , fColors(colors, colors ? count : 0)
2102 , fBlendMode(bmode)
2103 , fCull(cull)
2104 , fPaint(paint) {}
2105
2106void SkDrawAtlasCommand::execute(SkCanvas* canvas) const {
2107 canvas->drawAtlas(fImage.get(), fXform.begin(), fTex.begin(),
2108 fColors.isEmpty() ? nullptr : fColors.begin(), fXform.count(), fBlendMode,
2109 fCull.getMaybeNull(), fPaint.getMaybeNull());
2110}
2111
2112///////////////////////////////////////////////////////////////////////////////////////////////////
2113
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002114SkRestoreCommand::SkRestoreCommand()
Brian Osman255735e2018-04-06 14:51:42 -04002115 : INHERITED(kRestore_OpType) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002116
fmalita8c89c522014-11-08 16:18:56 -08002117void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00002118 canvas->restore();
2119}
2120
Florin Malita5f6102d2014-06-30 10:13:28 -04002121SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08002122 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00002123}
2124
fmalita8c89c522014-11-08 16:18:56 -08002125void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04002126 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00002127}
2128
reed4960eee2015-12-18 07:09:18 -08002129SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
Brian Osman8363be12018-05-29 13:38:07 -04002130 : INHERITED(kSaveLayer_OpType)
2131 , fBounds(rec.fBounds)
2132 , fPaint(rec.fPaint)
2133 , fBackdrop(SkSafeRef(rec.fBackdrop))
2134 , fSaveLayerFlags(rec.fSaveLayerFlags) {}
ethannicholas50a8dd02016-02-10 05:40:46 -08002135
fmalita8c89c522014-11-08 16:18:56 -08002136void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04002137 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(),
reed4960eee2015-12-18 07:09:18 -08002138 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00002139}
2140
ethannicholasf62a8b72016-02-11 10:35:21 -08002141Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
2142 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman8363be12018-05-29 13:38:07 -04002143 if (fBounds.isValid()) {
2144 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(*fBounds.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002145 }
Brian Osman8363be12018-05-29 13:38:07 -04002146 if (fPaint.isValid()) {
2147 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002148 }
2149 if (fBackdrop != nullptr) {
2150 Json::Value jsonBackdrop;
Brian Osman8363be12018-05-29 13:38:07 -04002151 flatten(fBackdrop.get(), &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002152 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
2153 }
2154 if (fSaveLayerFlags != 0) {
2155 SkDebugf("unsupported: saveLayer flags\n");
2156 SkASSERT(false);
2157 }
2158 return result;
2159}
2160
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002161SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08002162 : INHERITED(kSetMatrix_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002163 fMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -07002164}
2165
fmalita8c89c522014-11-08 16:18:56 -08002166void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
Brian Osman255735e2018-04-06 14:51:42 -04002167 canvas->setMatrix(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00002168}
2169
ethannicholasf62a8b72016-02-11 10:35:21 -08002170Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
2171 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08002172 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08002173 return result;
2174}