blob: 3e4e6ca9d16ab536ad9445f469633712791ace29 [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;
Mike Reed30cf62b2018-12-20 11:18:24 -05001861 case SkTextBlobRunIterator::kRSXform_Positioning:
1862 // TODO_RSXFORM_BLOB
1863 break;
ethannicholas50a8dd02016-02-10 05:40:46 -08001864 }
1865 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
1866 }
Florin Malitaab54e732018-07-27 09:47:15 -04001867 if (iter.positioning() != SkTextBlobRunIterator::kDefault_Positioning) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001868 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
1869 }
1870 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
1871 SkPaint fontPaint;
1872 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07001873 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
1874 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08001875 runs.append(run);
1876 iter.next();
1877 }
reed6d2c3e72016-07-07 14:10:14 -07001878 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08001879 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
1880 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
1881 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07001882 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07001883 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07001884
1885 SkString desc;
1886 // make the bounds local by applying the x,y
1887 bounds.offset(fXPos, fYPos);
1888 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
1889
ethannicholas50a8dd02016-02-10 05:40:46 -08001890 return result;
1891}
1892
robertphillips9bafc302015-02-13 11:13:00 -08001893SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04001894 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08001895 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04001896 : INHERITED(kDrawPatch_OpType)
1897 , fBlendMode(bmode)
1898{
robertphillips9bafc302015-02-13 11:13:00 -08001899 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08001900 if (colors != nullptr) {
1901 memcpy(fColors, colors, sizeof(fColors));
1902 fColorsPtr = fColors;
1903 } else {
1904 fColorsPtr = nullptr;
1905 }
1906 if (texCoords != nullptr) {
1907 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
1908 fTexCoordsPtr = fTexCoords;
1909 } else {
1910 fTexCoordsPtr = nullptr;
1911 }
robertphillips9bafc302015-02-13 11:13:00 -08001912 fPaint = paint;
robertphillips9bafc302015-02-13 11:13:00 -08001913}
1914
1915void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04001916 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08001917}
1918
ethannicholasf62a8b72016-02-11 10:35:21 -08001919Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
1920 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001921 Json::Value cubics = Json::Value(Json::arrayValue);
1922 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001923 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001924 }
1925 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
1926 if (fColorsPtr != nullptr) {
1927 Json::Value colors = Json::Value(Json::arrayValue);
1928 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001929 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001930 }
1931 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
1932 }
1933 if (fTexCoordsPtr != nullptr) {
1934 Json::Value texCoords = Json::Value(Json::arrayValue);
1935 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001936 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001937 }
1938 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
1939 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001940 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08001941 return result;
1942}
1943
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001944SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001945 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001946 fRect = rect;
1947 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001948}
1949
fmalita8c89c522014-11-08 16:18:56 -08001950void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001951 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001952}
1953
ethannicholasf62a8b72016-02-11 10:35:21 -08001954Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1955 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001956 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1957 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07001958
1959 SkString desc;
1960 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1961
ethannicholas50a8dd02016-02-10 05:40:46 -08001962 return result;
1963}
1964
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001965SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001966 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00001967 fRRect = rrect;
1968 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001969}
1970
fmalita8c89c522014-11-08 16:18:56 -08001971void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00001972 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001973}
1974
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001975bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001976 render_rrect(canvas, fRRect);
1977 return true;
1978}
1979
ethannicholasf62a8b72016-02-11 10:35:21 -08001980Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1981 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001982 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07001983 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001984 return result;
1985}
1986
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00001987SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001988 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001989 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001990 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001991 fOuter = outer;
1992 fInner = inner;
1993 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001994}
1995
fmalita8c89c522014-11-08 16:18:56 -08001996void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001997 canvas->drawDRRect(fOuter, fInner, fPaint);
1998}
1999
2000bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
2001 render_drrect(canvas, fOuter, fInner);
2002 return true;
2003}
2004
ethannicholasf62a8b72016-02-11 10:35:21 -08002005Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2006 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002007 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
2008 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07002009 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002010 return result;
2011}
2012
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04002013SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
2014 : INHERITED(kDrawShadow_OpType) {
2015 fPath = path;
2016 fShadowRec = rec;
2017}
2018
2019void SkDrawShadowCommand::execute(SkCanvas* canvas) const {
2020 canvas->private_draw_shadow_rec(fPath, fShadowRec);
2021}
2022
2023bool SkDrawShadowCommand::render(SkCanvas* canvas) const {
2024 render_shadow(canvas, fPath, fShadowRec);
2025 return true;
2026}
2027
2028Json::Value SkDrawShadowCommand::toJSON(UrlDataManager& urlDataManager) const {
2029 Json::Value result = INHERITED::toJSON(urlDataManager);
2030 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2031
2032 bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
2033 bool transparentOccluder =
2034 SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
2035
2036 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2037 result[SKDEBUGCANVAS_ATTRIBUTE_ZPLANE] = MakeJsonPoint3(fShadowRec.fZPlaneParams);
2038 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION] = MakeJsonPoint3(fShadowRec.fLightPos);
2039 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS] = MakeJsonScalar(fShadowRec.fLightRadius);
2040 result[SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR] = MakeJsonColor(fShadowRec.fAmbientColor);
2041 result[SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR] = MakeJsonColor(fShadowRec.fSpotColor);
2042 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
2043 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
2044 return result;
2045}
2046
Brian Osmanc7611082018-05-29 14:55:50 -04002047///////////////////////////////////////////////////////////////////////////////////////////////////
2048
2049SkDrawDrawableCommand::SkDrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
2050 : INHERITED(kDrawDrawable_OpType)
2051 , fDrawable(SkRef(drawable))
2052 , fMatrix(matrix) {}
2053
2054void SkDrawDrawableCommand::execute(SkCanvas* canvas) const {
2055 canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
2056}
2057
2058///////////////////////////////////////////////////////////////////////////////////////////////////
2059
reed45561a02016-07-07 12:47:17 -07002060SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength,
2061 const SkRSXform xform[], const SkRect* cull,
2062 const SkPaint& paint)
reed63f30d92016-07-07 16:32:51 -07002063 : INHERITED(kDrawTextRSXform_OpType)
Brian Osman65197ff2018-05-29 14:25:39 -04002064 , fText(SkData::MakeWithCopy(text, byteLength))
Mike Reed34c9b6d2018-12-12 15:48:16 -05002065 , fXform(xform, SkFont::LEGACY_ExtractFromPaint(paint).countText(text, byteLength, paint.getTextEncoding()))
Brian Osman8363be12018-05-29 13:38:07 -04002066 , fCull(cull)
Brian Osman65197ff2018-05-29 14:25:39 -04002067 , fPaint(paint) {}
reed45561a02016-07-07 12:47:17 -07002068
2069void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002070 canvas->drawTextRSXform(fText->data(), fText->size(), fXform.begin(), fCull.getMaybeNull(),
2071 fPaint);
reed45561a02016-07-07 12:47:17 -07002072}
2073
2074Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) const {
2075 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002076 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
reed45561a02016-07-07 12:47:17 -07002077 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
2078 return result;
2079}
2080
reed45561a02016-07-07 12:47:17 -07002081///////////////////////////////////////////////////////////////////////////////////////////////////
2082
Mike Reedfed9cfd2017-03-17 12:09:04 -04002083SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002084 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04002085 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04002086 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04002087 , fBlendMode(bmode)
Brian Osman255735e2018-04-06 14:51:42 -04002088 , fPaint(paint) {}
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002089
fmalita8c89c522014-11-08 16:18:56 -08002090void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04002091 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002092}
2093
Brian Osman616f1cb2018-05-29 11:23:35 -04002094///////////////////////////////////////////////////////////////////////////////////////////////////
2095
2096SkDrawAtlasCommand::SkDrawAtlasCommand(const SkImage* image, const SkRSXform xform[],
2097 const SkRect tex[], const SkColor colors[], int count,
2098 SkBlendMode bmode, const SkRect* cull,
2099 const SkPaint* paint)
2100 : INHERITED(kDrawAtlas_OpType)
2101 , fImage(SkRef(image))
2102 , fXform(xform, count)
2103 , fTex(tex, count)
2104 , fColors(colors, colors ? count : 0)
2105 , fBlendMode(bmode)
2106 , fCull(cull)
2107 , fPaint(paint) {}
2108
2109void SkDrawAtlasCommand::execute(SkCanvas* canvas) const {
2110 canvas->drawAtlas(fImage.get(), fXform.begin(), fTex.begin(),
2111 fColors.isEmpty() ? nullptr : fColors.begin(), fXform.count(), fBlendMode,
2112 fCull.getMaybeNull(), fPaint.getMaybeNull());
2113}
2114
2115///////////////////////////////////////////////////////////////////////////////////////////////////
2116
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002117SkRestoreCommand::SkRestoreCommand()
Brian Osman255735e2018-04-06 14:51:42 -04002118 : INHERITED(kRestore_OpType) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002119
fmalita8c89c522014-11-08 16:18:56 -08002120void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00002121 canvas->restore();
2122}
2123
Florin Malita5f6102d2014-06-30 10:13:28 -04002124SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08002125 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00002126}
2127
fmalita8c89c522014-11-08 16:18:56 -08002128void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04002129 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00002130}
2131
reed4960eee2015-12-18 07:09:18 -08002132SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
Brian Osman8363be12018-05-29 13:38:07 -04002133 : INHERITED(kSaveLayer_OpType)
2134 , fBounds(rec.fBounds)
2135 , fPaint(rec.fPaint)
2136 , fBackdrop(SkSafeRef(rec.fBackdrop))
2137 , fSaveLayerFlags(rec.fSaveLayerFlags) {}
ethannicholas50a8dd02016-02-10 05:40:46 -08002138
fmalita8c89c522014-11-08 16:18:56 -08002139void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04002140 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(),
reed4960eee2015-12-18 07:09:18 -08002141 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00002142}
2143
ethannicholasf62a8b72016-02-11 10:35:21 -08002144Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
2145 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman8363be12018-05-29 13:38:07 -04002146 if (fBounds.isValid()) {
2147 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(*fBounds.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002148 }
Brian Osman8363be12018-05-29 13:38:07 -04002149 if (fPaint.isValid()) {
2150 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002151 }
2152 if (fBackdrop != nullptr) {
2153 Json::Value jsonBackdrop;
Brian Osman8363be12018-05-29 13:38:07 -04002154 flatten(fBackdrop.get(), &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002155 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
2156 }
2157 if (fSaveLayerFlags != 0) {
2158 SkDebugf("unsupported: saveLayer flags\n");
2159 SkASSERT(false);
2160 }
2161 return result;
2162}
2163
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002164SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08002165 : INHERITED(kSetMatrix_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002166 fMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -07002167}
2168
fmalita8c89c522014-11-08 16:18:56 -08002169void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
Brian Osman255735e2018-04-06 14:51:42 -04002170 canvas->setMatrix(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00002171}
2172
ethannicholasf62a8b72016-02-11 10:35:21 -08002173Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
2174 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08002175 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08002176 return result;
2177}