blob: 2be535dbc3826c4f447ac3cd42ff37c7d0bf5f38 [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"
Mike Reed60a0e872019-01-04 09:41:49 -050037#define SKDEBUGCANVAS_ATTRIBUTE_EDGING "edging"
halcanaryf412f092016-08-25 11:10:41 -070038#define SKDEBUGCANVAS_ATTRIBUTE_HINTING "hinting"
ethannicholas50a8dd02016-02-10 05:40:46 -080039#define SKDEBUGCANVAS_ATTRIBUTE_BOUNDS "bounds"
40#define SKDEBUGCANVAS_ATTRIBUTE_PAINT "paint"
41#define SKDEBUGCANVAS_ATTRIBUTE_OUTER "outer"
42#define SKDEBUGCANVAS_ATTRIBUTE_INNER "inner"
43#define SKDEBUGCANVAS_ATTRIBUTE_MODE "mode"
44#define SKDEBUGCANVAS_ATTRIBUTE_POINTS "points"
45#define SKDEBUGCANVAS_ATTRIBUTE_PATH "path"
46#define SKDEBUGCANVAS_ATTRIBUTE_TEXT "text"
47#define SKDEBUGCANVAS_ATTRIBUTE_COLOR "color"
48#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Florin Malita82d80872017-06-06 16:58:40 -040049#define SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE "blendMode"
ethannicholas50a8dd02016-02-10 05:40:46 -080050#define SKDEBUGCANVAS_ATTRIBUTE_STYLE "style"
51#define SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH "strokeWidth"
52#define SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER "strokeMiter"
ethannicholas1446a9a2016-02-10 14:05:02 -080053#define SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN "strokeJoin"
ethannicholas50a8dd02016-02-10 05:40:46 -080054#define SKDEBUGCANVAS_ATTRIBUTE_CAP "cap"
55#define SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS "antiAlias"
ethannicholas1446a9a2016-02-10 14:05:02 -080056#define SKDEBUGCANVAS_ATTRIBUTE_DITHER "dither"
Ben Wagner78f1f5a2017-06-23 14:35:07 -040057#define SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT "fakeBoldText"
58#define SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT "linearText"
59#define SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT "subpixelText"
60#define SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT "devKernText"
61#define SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT "lcdRenderText"
62#define SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT "embeddedBitmapText"
63#define SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING "forceAutoHinting"
ethannicholas50a8dd02016-02-10 05:40:46 -080064#define SKDEBUGCANVAS_ATTRIBUTE_REGION "region"
65#define SKDEBUGCANVAS_ATTRIBUTE_REGIONOP "op"
66#define SKDEBUGCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle"
67#define SKDEBUGCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion"
68#define SKDEBUGCANVAS_ATTRIBUTE_BLUR "blur"
69#define SKDEBUGCANVAS_ATTRIBUTE_SIGMA "sigma"
70#define SKDEBUGCANVAS_ATTRIBUTE_QUALITY "quality"
ethannicholas50a8dd02016-02-10 05:40:46 -080071#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE "textSize"
72#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX"
73#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX"
74#define SKDEBUGCANVAS_ATTRIBUTE_DASHING "dashing"
75#define SKDEBUGCANVAS_ATTRIBUTE_INTERVALS "intervals"
76#define SKDEBUGCANVAS_ATTRIBUTE_PHASE "phase"
77#define SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE "fillType"
78#define SKDEBUGCANVAS_ATTRIBUTE_VERBS "verbs"
79#define SKDEBUGCANVAS_ATTRIBUTE_NAME "name"
ethannicholasf62a8b72016-02-11 10:35:21 -080080#define SKDEBUGCANVAS_ATTRIBUTE_DATA "data"
brianosmanfad98562016-05-04 11:06:28 -070081#define SKDEBUGCANVAS_ATTRIBUTE_VALUES "values"
ethannicholas50a8dd02016-02-10 05:40:46 -080082#define SKDEBUGCANVAS_ATTRIBUTE_SHADER "shader"
83#define SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect"
84#define SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER "maskFilter"
85#define SKDEBUGCANVAS_ATTRIBUTE_XFERMODE "xfermode"
ethannicholas1446a9a2016-02-10 14:05:02 -080086#define SKDEBUGCANVAS_ATTRIBUTE_LOOPER "looper"
ethannicholas50a8dd02016-02-10 05:40:46 -080087#define SKDEBUGCANVAS_ATTRIBUTE_BACKDROP "backdrop"
88#define SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER "colorfilter"
89#define SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter"
90#define SKDEBUGCANVAS_ATTRIBUTE_IMAGE "image"
91#define SKDEBUGCANVAS_ATTRIBUTE_BITMAP "bitmap"
92#define SKDEBUGCANVAS_ATTRIBUTE_SRC "src"
93#define SKDEBUGCANVAS_ATTRIBUTE_DST "dst"
94#define SKDEBUGCANVAS_ATTRIBUTE_CENTER "center"
95#define SKDEBUGCANVAS_ATTRIBUTE_STRICT "strict"
96#define SKDEBUGCANVAS_ATTRIBUTE_DESCRIPTION "description"
97#define SKDEBUGCANVAS_ATTRIBUTE_X "x"
98#define SKDEBUGCANVAS_ATTRIBUTE_Y "y"
99#define SKDEBUGCANVAS_ATTRIBUTE_RUNS "runs"
100#define SKDEBUGCANVAS_ATTRIBUTE_POSITIONS "positions"
101#define SKDEBUGCANVAS_ATTRIBUTE_GLYPHS "glyphs"
102#define SKDEBUGCANVAS_ATTRIBUTE_FONT "font"
103#define SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE "typeface"
ethannicholas1446a9a2016-02-10 14:05:02 -0800104#define SKDEBUGCANVAS_ATTRIBUTE_CUBICS "cubics"
105#define SKDEBUGCANVAS_ATTRIBUTE_COLORS "colors"
106#define SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS "textureCoords"
107#define SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY "filterQuality"
bsalomonac3aa242016-08-19 11:25:19 -0700108#define SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE "startAngle"
109#define SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE "sweepAngle"
110#define SKDEBUGCANVAS_ATTRIBUTE_USECENTER "useCenter"
jcgregorioee0c5552016-06-30 09:18:27 -0700111#define SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC "shortDesc"
msarett0ac1bec2016-08-29 09:15:33 -0700112#define SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID "uniqueID"
113#define SKDEBUGCANVAS_ATTRIBUTE_WIDTH "width"
114#define SKDEBUGCANVAS_ATTRIBUTE_HEIGHT "height"
115#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Stan Ilievac42aeb2017-01-12 16:20:50 -0500116#define SKDEBUGCANVAS_ATTRIBUTE_LATTICE "lattice"
117#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT "xCount"
118#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT "yCount"
119#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS "xDivs"
120#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS "yDivs"
121#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS "flags"
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400122#define SKDEBUGCANVAS_ATTRIBUTE_ZPLANE "zPlane"
123#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION "lightPositions"
124#define SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR "ambientColor"
125#define SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR "spotColor"
126#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS "lightRadius"
reed67f62fa2016-06-29 11:36:34 -0700127
ethannicholas50a8dd02016-02-10 05:40:46 -0800128#define SKDEBUGCANVAS_VERB_MOVE "move"
129#define SKDEBUGCANVAS_VERB_LINE "line"
130#define SKDEBUGCANVAS_VERB_QUAD "quad"
131#define SKDEBUGCANVAS_VERB_CUBIC "cubic"
132#define SKDEBUGCANVAS_VERB_CONIC "conic"
133#define SKDEBUGCANVAS_VERB_CLOSE "close"
134
135#define SKDEBUGCANVAS_STYLE_FILL "fill"
136#define SKDEBUGCANVAS_STYLE_STROKE "stroke"
137#define SKDEBUGCANVAS_STYLE_STROKEANDFILL "strokeAndFill"
138
139#define SKDEBUGCANVAS_POINTMODE_POINTS "points"
140#define SKDEBUGCANVAS_POINTMODE_LINES "lines"
141#define SKDEBUGCANVAS_POINTMODE_POLYGON "polygon"
142
143#define SKDEBUGCANVAS_REGIONOP_DIFFERENCE "difference"
144#define SKDEBUGCANVAS_REGIONOP_INTERSECT "intersect"
145#define SKDEBUGCANVAS_REGIONOP_UNION "union"
146#define SKDEBUGCANVAS_REGIONOP_XOR "xor"
147#define SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE "reverseDifference"
148#define SKDEBUGCANVAS_REGIONOP_REPLACE "replace"
149
150#define SKDEBUGCANVAS_BLURSTYLE_NORMAL "normal"
151#define SKDEBUGCANVAS_BLURSTYLE_SOLID "solid"
152#define SKDEBUGCANVAS_BLURSTYLE_OUTER "outer"
153#define SKDEBUGCANVAS_BLURSTYLE_INNER "inner"
154
155#define SKDEBUGCANVAS_BLURQUALITY_LOW "low"
156#define SKDEBUGCANVAS_BLURQUALITY_HIGH "high"
157
ethannicholas50a8dd02016-02-10 05:40:46 -0800158#define SKDEBUGCANVAS_FILLTYPE_WINDING "winding"
159#define SKDEBUGCANVAS_FILLTYPE_EVENODD "evenOdd"
160#define SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding"
161#define SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd"
162
163#define SKDEBUGCANVAS_CAP_BUTT "butt"
164#define SKDEBUGCANVAS_CAP_ROUND "round"
165#define SKDEBUGCANVAS_CAP_SQUARE "square"
166
ethannicholas1446a9a2016-02-10 14:05:02 -0800167#define SKDEBUGCANVAS_MITER_JOIN "miter"
168#define SKDEBUGCANVAS_ROUND_JOIN "round"
169#define SKDEBUGCANVAS_BEVEL_JOIN "bevel"
170
ethannicholas50a8dd02016-02-10 05:40:46 -0800171#define SKDEBUGCANVAS_COLORTYPE_ARGB4444 "ARGB4444"
172#define SKDEBUGCANVAS_COLORTYPE_RGBA8888 "RGBA8888"
173#define SKDEBUGCANVAS_COLORTYPE_BGRA8888 "BGRA8888"
174#define SKDEBUGCANVAS_COLORTYPE_565 "565"
175#define SKDEBUGCANVAS_COLORTYPE_GRAY8 "Gray8"
176#define SKDEBUGCANVAS_COLORTYPE_INDEX8 "Index8"
177#define SKDEBUGCANVAS_COLORTYPE_ALPHA8 "Alpha8"
178
179#define SKDEBUGCANVAS_ALPHATYPE_OPAQUE "opaque"
180#define SKDEBUGCANVAS_ALPHATYPE_PREMUL "premul"
181#define SKDEBUGCANVAS_ALPHATYPE_UNPREMUL "unpremul"
msarett0ac1bec2016-08-29 09:15:33 -0700182#define SKDEBUGCANVAS_ALPHATYPE_UNKNOWN "unknown"
ethannicholas50a8dd02016-02-10 05:40:46 -0800183
ethannicholas1446a9a2016-02-10 14:05:02 -0800184#define SKDEBUGCANVAS_FILTERQUALITY_NONE "none"
185#define SKDEBUGCANVAS_FILTERQUALITY_LOW "low"
186#define SKDEBUGCANVAS_FILTERQUALITY_MEDIUM "medium"
187#define SKDEBUGCANVAS_FILTERQUALITY_HIGH "high"
188
halcanaryf412f092016-08-25 11:10:41 -0700189#define SKDEBUGCANVAS_HINTING_NONE "none"
190#define SKDEBUGCANVAS_HINTING_SLIGHT "slight"
191#define SKDEBUGCANVAS_HINTING_NORMAL "normal"
192#define SKDEBUGCANVAS_HINTING_FULL "full"
193
Mike Reed60a0e872019-01-04 09:41:49 -0500194#define SKDEBUGCANVAS_EDGING_ALIAS "alias"
195#define SKDEBUGCANVAS_EDGING_ANTIALIAS "antialias"
196#define SKDEBUGCANVAS_EDGING_SUBPIXELANTIALIAS "subpixelantialias"
197
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400198#define SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC "transparentOccluder"
199#define SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY "geometricOnly"
200
reed67f62fa2016-06-29 11:36:34 -0700201static SkString* str_append(SkString* str, const SkRect& r) {
202 str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom());
203 return str;
204}
205
robertphillips9bafc302015-02-13 11:13:00 -0800206SkDrawCommand::SkDrawCommand(OpType type)
207 : fOpType(type)
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000208 , fVisible(true) {
209}
210
robertphillips9bafc302015-02-13 11:13:00 -0800211const char* SkDrawCommand::GetCommandString(OpType type) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000212 switch (type) {
fmalita160ebb22015-04-01 20:58:37 -0700213 case kBeginDrawPicture_OpType: return "BeginDrawPicture";
Brian Osmanc25e2692018-03-12 10:57:28 -0400214 case kClear_OpType: return "DrawClear";
robertphillips9bafc302015-02-13 11:13:00 -0800215 case kClipPath_OpType: return "ClipPath";
216 case kClipRegion_OpType: return "ClipRegion";
217 case kClipRect_OpType: return "ClipRect";
218 case kClipRRect_OpType: return "ClipRRect";
robertphillips9bafc302015-02-13 11:13:00 -0800219 case kConcat_OpType: return "Concat";
robertphillipsfb409232016-06-29 10:28:11 -0700220 case kDrawAnnotation_OpType: return "DrawAnnotation";
robertphillips9bafc302015-02-13 11:13:00 -0800221 case kDrawBitmap_OpType: return "DrawBitmap";
Brian Osman78a76482018-05-18 16:59:13 -0400222 case kDrawBitmapLattice_OpType: return "DrawBitmapLattice";
robertphillips9bafc302015-02-13 11:13:00 -0800223 case kDrawBitmapNine_OpType: return "DrawBitmapNine";
224 case kDrawBitmapRect_OpType: return "DrawBitmapRect";
robertphillips9bafc302015-02-13 11:13:00 -0800225 case kDrawDRRect_OpType: return "DrawDRRect";
fmalita651c9202015-07-22 10:23:01 -0700226 case kDrawImage_OpType: return "DrawImage";
Stan Ilievac42aeb2017-01-12 16:20:50 -0500227 case kDrawImageLattice_OpType: return "DrawImageLattice";
Brian Osmanc25e2692018-03-12 10:57:28 -0400228 case kDrawImageNine_OpType: return "DrawImageNine";
fmalita651c9202015-07-22 10:23:01 -0700229 case kDrawImageRect_OpType: return "DrawImageRect";
Brian Salomond7065e72018-10-12 11:42:02 -0400230 case kDrawImageSet_OpType: return "DrawImageSet";
robertphillips9bafc302015-02-13 11:13:00 -0800231 case kDrawOval_OpType: return "DrawOval";
232 case kDrawPaint_OpType: return "DrawPaint";
233 case kDrawPatch_OpType: return "DrawPatch";
234 case kDrawPath_OpType: return "DrawPath";
Brian Osmanc25e2692018-03-12 10:57:28 -0400235 case kDrawArc_OpType: return "DrawArc";
robertphillips9bafc302015-02-13 11:13:00 -0800236 case kDrawPoints_OpType: return "DrawPoints";
robertphillips9bafc302015-02-13 11:13:00 -0800237 case kDrawRect_OpType: return "DrawRect";
238 case kDrawRRect_OpType: return "DrawRRect";
Brian Osmanc25e2692018-03-12 10:57:28 -0400239 case kDrawRegion_OpType: return "DrawRegion";
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400240 case kDrawShadow_OpType: return "DrawShadow";
robertphillips9bafc302015-02-13 11:13:00 -0800241 case kDrawTextBlob_OpType: return "DrawTextBlob";
robertphillips9bafc302015-02-13 11:13:00 -0800242 case kDrawVertices_OpType: return "DrawVertices";
Brian Osman616f1cb2018-05-29 11:23:35 -0400243 case kDrawAtlas_OpType: return "DrawAtlas";
Brian Osmanc7611082018-05-29 14:55:50 -0400244 case kDrawDrawable_OpType: return "DrawDrawable";
fmalita160ebb22015-04-01 20:58:37 -0700245 case kEndDrawPicture_OpType: return "EndDrawPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800246 case kRestore_OpType: return "Restore";
247 case kSave_OpType: return "Save";
248 case kSaveLayer_OpType: return "SaveLayer";
249 case kSetMatrix_OpType: return "SetMatrix";
chudy@google.com902ebe52012-06-29 14:21:22 +0000250 default:
robertphillips9bafc302015-02-13 11:13:00 -0800251 SkDebugf("OpType error 0x%08x\n", type);
chudy@google.com902ebe52012-06-29 14:21:22 +0000252 SkASSERT(0);
253 break;
254 }
255 SkDEBUGFAIL("DrawType UNUSED\n");
halcanary96fcdcc2015-08-27 07:41:13 -0700256 return nullptr;
chudy@google.com902ebe52012-06-29 14:21:22 +0000257}
258
ethannicholasf62a8b72016-02-11 10:35:21 -0800259Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const {
ethannicholas50a8dd02016-02-10 05:40:46 -0800260 Json::Value result;
261 result[SKDEBUGCANVAS_ATTRIBUTE_COMMAND] = this->GetCommandString(fOpType);
ethannicholas807dcab2016-02-23 06:53:37 -0800262 result[SKDEBUGCANVAS_ATTRIBUTE_VISIBLE] = Json::Value(this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800263 return result;
264}
265
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000266namespace {
267
268void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
Mike Reed3661bc92017-02-22 13:21:42 -0500269 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000270
271 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
272
273 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
274 if (bounds.width() > bounds.height()) {
275 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
276 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
277 } else {
278 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
279 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
280 }
281 canvas->translate(-bounds.centerX(), -bounds.centerY());
282}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000283
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000284
285void render_path(SkCanvas* canvas, const SkPath& path) {
286 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000287
288 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700289 if (bounds.isEmpty()) {
290 return;
291 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000292
fmalitab0cd8b72015-10-06 07:24:03 -0700293 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000294 xlate_and_scale_to_bounds(canvas, bounds);
295
296 SkPaint p;
297 p.setColor(SK_ColorBLACK);
298 p.setStyle(SkPaint::kStroke_Style);
299
300 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000301}
302
Brian Osmanc25e2692018-03-12 10:57:28 -0400303void render_region(SkCanvas* canvas, const SkRegion& region) {
304 canvas->clear(0xFFFFFFFF);
305
306 const SkIRect& bounds = region.getBounds();
307 if (bounds.isEmpty()) {
308 return;
309 }
310
311 SkAutoCanvasRestore acr(canvas, true);
Brian Osman99b63402018-03-13 10:19:27 -0400312 xlate_and_scale_to_bounds(canvas, SkRect::Make(bounds));
Brian Osmanc25e2692018-03-12 10:57:28 -0400313
314 SkPaint p;
315 p.setColor(SK_ColorBLACK);
316 p.setStyle(SkPaint::kStroke_Style);
317
318 canvas->drawRegion(region, p);
319}
320
halcanary96fcdcc2015-08-27 07:41:13 -0700321void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
Mike Reed3661bc92017-02-22 13:21:42 -0500322 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000323
324 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
325 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
326
327 if (input.width() > input.height()) {
328 yScale *= input.height() / (float) input.width();
329 } else {
330 xScale *= input.width() / (float) input.height();
331 }
332
333 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
334 xScale * input.width(),
335 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000336
robertphillips96a5cff2015-09-24 06:56:27 -0700337 static const int kNumBlocks = 8;
338
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000339 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700340 SkISize block = {
341 canvas->imageInfo().width()/kNumBlocks,
342 canvas->imageInfo().height()/kNumBlocks
343 };
344 for (int y = 0; y < kNumBlocks; ++y) {
345 for (int x = 0; x < kNumBlocks; ++x) {
346 SkPaint paint;
347 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
348 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
349 SkIntToScalar(y*block.height()),
350 SkIntToScalar(block.width()),
351 SkIntToScalar(block.height()));
352 canvas->drawRect(r, paint);
353 }
354 }
355
reede47829b2015-08-06 10:02:53 -0700356 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000357
bsalomon49f085d2014-09-05 13:34:00 -0700358 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000359 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
360 srcRect->fTop * yScale + SK_Scalar1,
361 srcRect->fRight * xScale + SK_Scalar1,
362 srcRect->fBottom * yScale + SK_Scalar1);
363 SkPaint p;
364 p.setColor(SK_ColorRED);
365 p.setStyle(SkPaint::kStroke_Style);
366
367 canvas->drawRect(r, p);
368 }
369}
370
371void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
372 canvas->clear(0xFFFFFFFF);
373 canvas->save();
374
375 const SkRect& bounds = rrect.getBounds();
376
377 xlate_and_scale_to_bounds(canvas, bounds);
378
379 SkPaint p;
380 p.setColor(SK_ColorBLACK);
381 p.setStyle(SkPaint::kStroke_Style);
382
383 canvas->drawRRect(rrect, p);
384 canvas->restore();
385}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000386
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000387void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
388 canvas->clear(0xFFFFFFFF);
389 canvas->save();
390
391 const SkRect& bounds = outer.getBounds();
392
393 xlate_and_scale_to_bounds(canvas, bounds);
394
395 SkPaint p;
396 p.setColor(SK_ColorBLACK);
397 p.setStyle(SkPaint::kStroke_Style);
398
399 canvas->drawDRRect(outer, inner, p);
400 canvas->restore();
401}
402
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400403void render_shadow(SkCanvas* canvas, const SkPath& path, SkDrawShadowRec rec) {
404 canvas->clear(0xFFFFFFFF);
405
406 const SkRect& bounds = path.getBounds();
407 if (bounds.isEmpty()) {
408 return;
409 }
410
411 SkAutoCanvasRestore acr(canvas, true);
412 xlate_and_scale_to_bounds(canvas, bounds);
413
414 rec.fAmbientColor = SK_ColorBLACK;
415 rec.fSpotColor = SK_ColorBLACK;
416 canvas->private_draw_shadow_rec(path, rec);
417}
418
Florin Malita82d80872017-06-06 16:58:40 -0400419static const char* const gBlendModeMap[] = {
420 "clear",
421 "src",
422 "dst",
423 "srcOver",
424 "dstOver",
425 "srcIn",
426 "dstIn",
427 "srcOut",
428 "dstOut",
429 "srcATop",
430 "dstATop",
431 "xor",
432 "plus",
433 "modulate",
434
435 "screen",
436
437 "overlay",
438 "darken",
439 "lighten",
440 "colorDodge",
441 "colorBurn",
442 "hardLight",
443 "softLight",
444 "difference",
445 "exclusion",
446 "multiply",
447
448 "hue",
449 "saturation",
450 "color",
451 "luminosity",
452};
453
454static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
455 "blendMode mismatch");
456static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
457 "blendMode mismatch");
458
459void apply_paint_blend_mode(const SkPaint& paint, Json::Value* target) {
460 const auto mode = paint.getBlendMode();
461 if (mode != SkBlendMode::kSrcOver) {
462 SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
463 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE] =
464 Json::Value(gBlendModeMap[static_cast<size_t>(mode)]);
465 }
466}
467
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000468};
469
brianosmanfad98562016-05-04 11:06:28 -0700470Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800471 Json::Value result(Json::arrayValue);
472 result.append(Json::Value(SkColorGetA(color)));
473 result.append(Json::Value(SkColorGetR(color)));
474 result.append(Json::Value(SkColorGetG(color)));
475 result.append(Json::Value(SkColorGetB(color)));
476 return result;
477}
478
brianosman97bbf822016-09-25 13:15:58 -0700479Json::Value SkDrawCommand::MakeJsonColor4f(const SkColor4f& color) {
480 Json::Value result(Json::arrayValue);
481 result.append(Json::Value(color.fA));
482 result.append(Json::Value(color.fR));
483 result.append(Json::Value(color.fG));
484 result.append(Json::Value(color.fB));
485 return result;
486}
487
brianosmanfad98562016-05-04 11:06:28 -0700488Json::Value SkDrawCommand::MakeJsonPoint(const SkPoint& point) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800489 Json::Value result(Json::arrayValue);
490 result.append(Json::Value(point.x()));
491 result.append(Json::Value(point.y()));
492 return result;
493}
494
brianosmanfad98562016-05-04 11:06:28 -0700495Json::Value SkDrawCommand::MakeJsonPoint(SkScalar x, SkScalar y) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800496 Json::Value result(Json::arrayValue);
497 result.append(Json::Value(x));
498 result.append(Json::Value(y));
499 return result;
500}
501
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400502Json::Value SkDrawCommand::MakeJsonPoint3(const SkPoint3& point) {
503 Json::Value result(Json::arrayValue);
504 result.append(Json::Value(point.x()));
505 result.append(Json::Value(point.y()));
506 result.append(Json::Value(point.z()));
507 return result;
508}
509
brianosmanfad98562016-05-04 11:06:28 -0700510Json::Value SkDrawCommand::MakeJsonRect(const SkRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800511 Json::Value result(Json::arrayValue);
512 result.append(Json::Value(rect.left()));
513 result.append(Json::Value(rect.top()));
514 result.append(Json::Value(rect.right()));
515 result.append(Json::Value(rect.bottom()));
516 return result;
517}
518
joshualittbd724132016-03-03 11:39:38 -0800519Json::Value SkDrawCommand::MakeJsonIRect(const SkIRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800520 Json::Value result(Json::arrayValue);
521 result.append(Json::Value(rect.left()));
522 result.append(Json::Value(rect.top()));
523 result.append(Json::Value(rect.right()));
524 result.append(Json::Value(rect.bottom()));
525 return result;
526}
527
528static Json::Value make_json_rrect(const SkRRect& rrect) {
529 Json::Value result(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700530 result.append(SkDrawCommand::MakeJsonRect(rrect.rect()));
531 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
532 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperRight_Corner)));
533 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerRight_Corner)));
534 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
ethannicholas50a8dd02016-02-10 05:40:46 -0800535 return result;
536}
537
joshualittbd724132016-03-03 11:39:38 -0800538Json::Value SkDrawCommand::MakeJsonMatrix(const SkMatrix& matrix) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800539 Json::Value result(Json::arrayValue);
540 Json::Value row1(Json::arrayValue);
541 row1.append(Json::Value(matrix[0]));
542 row1.append(Json::Value(matrix[1]));
543 row1.append(Json::Value(matrix[2]));
544 result.append(row1);
545 Json::Value row2(Json::arrayValue);
546 row2.append(Json::Value(matrix[3]));
547 row2.append(Json::Value(matrix[4]));
548 row2.append(Json::Value(matrix[5]));
549 result.append(row2);
550 Json::Value row3(Json::arrayValue);
551 row3.append(Json::Value(matrix[6]));
552 row3.append(Json::Value(matrix[7]));
553 row3.append(Json::Value(matrix[8]));
554 result.append(row3);
555 return result;
556}
ethannicholas1446a9a2016-02-10 14:05:02 -0800557
vjiaoblacke5de1302016-07-13 14:05:28 -0700558Json::Value SkDrawCommand::MakeJsonScalar(SkScalar z) {
559 Json::Value result(z);
560 return result;
561}
562
brianosmanfad98562016-05-04 11:06:28 -0700563Json::Value SkDrawCommand::MakeJsonPath(const SkPath& path) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800564 Json::Value result(Json::objectValue);
565 switch (path.getFillType()) {
566 case SkPath::kWinding_FillType:
567 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_WINDING;
568 break;
569 case SkPath::kEvenOdd_FillType:
570 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_EVENODD;
571 break;
572 case SkPath::kInverseWinding_FillType:
573 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING;
574 break;
575 case SkPath::kInverseEvenOdd_FillType:
576 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
577 break;
halcanary9d524f22016-03-29 09:03:52 -0700578 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800579 Json::Value verbs(Json::arrayValue);
580 SkPath::Iter iter(path, false);
581 SkPoint pts[4];
582 SkPath::Verb verb;
583 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
584 switch (verb) {
585 case SkPath::kLine_Verb: {
586 Json::Value line(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700587 line[SKDEBUGCANVAS_VERB_LINE] = MakeJsonPoint(pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800588 verbs.append(line);
589 break;
590 }
591 case SkPath::kQuad_Verb: {
592 Json::Value quad(Json::objectValue);
593 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700594 coords.append(MakeJsonPoint(pts[1]));
595 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800596 quad[SKDEBUGCANVAS_VERB_QUAD] = coords;
597 verbs.append(quad);
598 break;
599 }
600 case SkPath::kCubic_Verb: {
601 Json::Value cubic(Json::objectValue);
602 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700603 coords.append(MakeJsonPoint(pts[1]));
604 coords.append(MakeJsonPoint(pts[2]));
605 coords.append(MakeJsonPoint(pts[3]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800606 cubic[SKDEBUGCANVAS_VERB_CUBIC] = coords;
607 verbs.append(cubic);
608 break;
609 }
610 case SkPath::kConic_Verb: {
611 Json::Value conic(Json::objectValue);
612 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700613 coords.append(MakeJsonPoint(pts[1]));
614 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800615 coords.append(Json::Value(iter.conicWeight()));
616 conic[SKDEBUGCANVAS_VERB_CONIC] = coords;
617 verbs.append(conic);
618 break;
619 }
620 case SkPath::kMove_Verb: {
621 Json::Value move(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700622 move[SKDEBUGCANVAS_VERB_MOVE] = MakeJsonPoint(pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800623 verbs.append(move);
624 break;
625 }
626 case SkPath::kClose_Verb:
627 verbs.append(Json::Value(SKDEBUGCANVAS_VERB_CLOSE));
628 break;
629 case SkPath::kDone_Verb:
630 break;
631 }
632 }
633 result[SKDEBUGCANVAS_ATTRIBUTE_VERBS] = verbs;
634 return result;
635}
636
brianosmanfad98562016-05-04 11:06:28 -0700637Json::Value SkDrawCommand::MakeJsonRegion(const SkRegion& region) {
Brian Osmanc25e2692018-03-12 10:57:28 -0400638 // TODO: Actually serialize the rectangles, rather than just devolving to path
639 SkPath path;
640 region.getBoundaryPath(&path);
641 return MakeJsonPath(path);
ethannicholas50a8dd02016-02-10 05:40:46 -0800642}
643
Mike Reedc1f77742016-12-09 09:00:50 -0500644static Json::Value make_json_regionop(SkClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800645 switch (op) {
Mike Reedc1f77742016-12-09 09:00:50 -0500646 case kDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800647 return Json::Value(SKDEBUGCANVAS_REGIONOP_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500648 case kIntersect_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800649 return Json::Value(SKDEBUGCANVAS_REGIONOP_INTERSECT);
Mike Reedc1f77742016-12-09 09:00:50 -0500650 case kUnion_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800651 return Json::Value(SKDEBUGCANVAS_REGIONOP_UNION);
Mike Reedc1f77742016-12-09 09:00:50 -0500652 case kXOR_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800653 return Json::Value(SKDEBUGCANVAS_REGIONOP_XOR);
Mike Reedc1f77742016-12-09 09:00:50 -0500654 case kReverseDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800655 return Json::Value(SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500656 case kReplace_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800657 return Json::Value(SKDEBUGCANVAS_REGIONOP_REPLACE);
658 default:
659 SkASSERT(false);
660 return Json::Value("<invalid region op>");
Brian Salomon23356442018-11-30 15:33:19 -0500661 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800662}
663
664static Json::Value make_json_pointmode(SkCanvas::PointMode mode) {
665 switch (mode) {
666 case SkCanvas::kPoints_PointMode:
667 return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
668 case SkCanvas::kLines_PointMode:
669 return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
halcanary9d524f22016-03-29 09:03:52 -0700670 case SkCanvas::kPolygon_PointMode:
ethannicholas50a8dd02016-02-10 05:40:46 -0800671 return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
672 default:
673 SkASSERT(false);
674 return Json::Value("<invalid point mode>");
Brian Salomon23356442018-11-30 15:33:19 -0500675 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800676}
677
halcanary9d524f22016-03-29 09:03:52 -0700678static void store_scalar(Json::Value* target, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800679 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800680 if (value != defaultValue) {
681 (*target)[key] = Json::Value(value);
682 }
683}
684
ethannicholasbd3dae82016-02-10 12:10:00 -0800685static void store_bool(Json::Value* target, const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800686 if (value != defaultValue) {
687 (*target)[key] = Json::Value(value);
688 }
689}
690
halcanary9d524f22016-03-29 09:03:52 -0700691static void encode_data(const void* bytes, size_t count, const char* contentType,
ethannicholasf62a8b72016-02-11 10:35:21 -0800692 UrlDataManager& urlDataManager, Json::Value* target) {
bungeman38d909e2016-08-02 14:40:46 -0700693 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
694 SkString url = urlDataManager.addData(data.get(), contentType);
ethannicholasf62a8b72016-02-11 10:35:21 -0800695 *target = Json::Value(url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800696}
697
brianosmanfad98562016-05-04 11:06:28 -0700698void SkDrawCommand::flatten(const SkFlattenable* flattenable, Json::Value* target,
699 UrlDataManager& urlDataManager) {
700 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800701 flattenable->flatten(buffer);
702 void* data = sk_malloc_throw(buffer.bytesWritten());
703 buffer.writeToMemory(data);
704 Json::Value jsonData;
705 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, &jsonData);
706 Json::Value jsonFlattenable;
707 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->getTypeName());
708 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
brianosmanfad98562016-05-04 11:06:28 -0700709
710 SkJsonWriteBuffer jsonBuffer(&urlDataManager);
711 flattenable->flatten(jsonBuffer);
712 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_VALUES] = jsonBuffer.getValue();
713
ethannicholasf62a8b72016-02-11 10:35:21 -0800714 (*target) = jsonFlattenable;
715 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800716}
717
Brian Osmand9ea8162018-08-08 17:03:39 -0400718void SkDrawCommand::WritePNG(SkBitmap bitmap, SkWStream& out) {
719 SkPixmap pm;
720 SkAssertResult(bitmap.peekPixels(&pm));
ethannicholasf67531f2016-03-21 10:19:39 -0700721
Brian Osmand9ea8162018-08-08 17:03:39 -0400722 SkPngEncoder::Options options;
723 options.fZLibLevel = 1;
724 options.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
725 SkPngEncoder::Encode(&out, pm, options);
ethannicholasf67531f2016-03-21 10:19:39 -0700726}
727
brianosmanfad98562016-05-04 11:06:28 -0700728bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
729 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700730 size_t rowBytes = 4 * image.width();
Hal Canary95e3c052017-01-11 12:44:43 -0500731 SkAutoMalloc buffer(rowBytes * image.height());
halcanary9d524f22016-03-29 09:03:52 -0700732 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700733 kN32_SkColorType, kPremul_SkAlphaType);
734 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
735 SkDebugf("readPixels failed\n");
736 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800737 }
msaretta5cf4f42016-06-30 10:06:51 -0700738
739 SkBitmap bm;
740 bm.installPixels(dstInfo, buffer.get(), rowBytes);
msaretta5cf4f42016-06-30 10:06:51 -0700741
ethannicholasf67531f2016-03-21 10:19:39 -0700742 SkDynamicMemoryWStream out;
Brian Osmand9ea8162018-08-08 17:03:39 -0400743 SkDrawCommand::WritePNG(bm, out);
reed42943c82016-09-12 12:01:44 -0700744 sk_sp<SkData> encoded = out.detachAsData();
ethannicholasf62a8b72016-02-11 10:35:21 -0800745 Json::Value jsonData;
746 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
747 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
ethannicholas50a8dd02016-02-10 05:40:46 -0800748 return true;
749}
750
751static const char* color_type_name(SkColorType colorType) {
752 switch (colorType) {
753 case kARGB_4444_SkColorType:
754 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
755 case kRGBA_8888_SkColorType:
756 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
757 case kBGRA_8888_SkColorType:
758 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
759 case kRGB_565_SkColorType:
760 return SKDEBUGCANVAS_COLORTYPE_565;
761 case kGray_8_SkColorType:
762 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
ethannicholas50a8dd02016-02-10 05:40:46 -0800763 case kAlpha_8_SkColorType:
764 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
765 default:
766 SkASSERT(false);
767 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
768 }
769}
770
771static const char* alpha_type_name(SkAlphaType alphaType) {
772 switch (alphaType) {
773 case kOpaque_SkAlphaType:
774 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
775 case kPremul_SkAlphaType:
776 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
777 case kUnpremul_SkAlphaType:
778 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
779 default:
780 SkASSERT(false);
781 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
782 }
783}
784
brianosmanfad98562016-05-04 11:06:28 -0700785bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
786 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700787 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800788 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
789 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800790 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800791 return success;
792}
793
Mike Reed60a0e872019-01-04 09:41:49 -0500794static void apply_font_hinting(const SkFont& font, Json::Value* target) {
795 SkFontHinting hinting = font.getHinting();
halcanaryf412f092016-08-25 11:10:41 -0700796 if (hinting != SkPaintDefaults_Hinting) {
797 switch (hinting) {
Mike Reed9edbf422018-11-07 19:54:33 -0500798 case kNo_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700799 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
800 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500801 case kSlight_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700802 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
803 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500804 case kNormal_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700805 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
806 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500807 case kFull_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700808 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
809 break;
810 }
811 }
812}
813
Mike Reed60a0e872019-01-04 09:41:49 -0500814static void apply_font_edging(const SkFont& font, Json::Value* target) {
815 switch (font.getEdging()) {
816 case SkFont::Edging::kAlias:
817 (*target)[SKDEBUGCANVAS_ATTRIBUTE_EDGING] = SKDEBUGCANVAS_EDGING_ALIAS;
818 break;
819 case SkFont::Edging::kAntiAlias:
820 (*target)[SKDEBUGCANVAS_ATTRIBUTE_EDGING] = SKDEBUGCANVAS_EDGING_ANTIALIAS;
821 break;
822 case SkFont::Edging::kSubpixelAntiAlias:
823 (*target)[SKDEBUGCANVAS_ATTRIBUTE_EDGING] = SKDEBUGCANVAS_EDGING_SUBPIXELANTIALIAS;
824 break;
825 }
826}
827
ethannicholas50a8dd02016-02-10 05:40:46 -0800828static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
829 SkColor color = paint.getColor();
830 if (color != SK_ColorBLACK) {
831 Json::Value colorValue(Json::arrayValue);
832 colorValue.append(Json::Value(SkColorGetA(color)));
833 colorValue.append(Json::Value(SkColorGetR(color)));
834 colorValue.append(Json::Value(SkColorGetG(color)));
835 colorValue.append(Json::Value(SkColorGetB(color)));
Brian Salomon23356442018-11-30 15:33:19 -0500836 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;
ethannicholas50a8dd02016-02-10 05:40:46 -0800837 }
838}
839
840static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
841 SkPaint::Style style = paint.getStyle();
842 if (style != SkPaint::kFill_Style) {
843 switch (style) {
844 case SkPaint::kStroke_Style: {
845 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
846 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
847 break;
848 }
849 case SkPaint::kStrokeAndFill_Style: {
850 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
851 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
852 break;
853 }
854 default: SkASSERT(false);
855 }
856 }
857}
858
859static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
860 SkPaint::Cap cap = paint.getStrokeCap();
861 if (cap != SkPaint::kDefault_Cap) {
862 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800863 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800864 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
865 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800866 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800867 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
868 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800869 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800870 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
871 break;
ethannicholas50a8dd02016-02-10 05:40:46 -0800872 default: SkASSERT(false);
873 }
874 }
875}
ethannicholas1446a9a2016-02-10 14:05:02 -0800876
877static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
878 SkPaint::Join join = paint.getStrokeJoin();
879 if (join != SkPaint::kDefault_Join) {
880 switch (join) {
881 case SkPaint::kMiter_Join:
882 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
883 SKDEBUGCANVAS_MITER_JOIN);
884 break;
885 case SkPaint::kRound_Join:
886 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
887 SKDEBUGCANVAS_ROUND_JOIN);
888 break;
889 case SkPaint::kBevel_Join:
890 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
891 SKDEBUGCANVAS_BEVEL_JOIN);
892 break;
893 default: SkASSERT(false);
894 }
895 }
896}
897
898static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
899 SkFilterQuality quality = paint.getFilterQuality();
900 switch (quality) {
901 case kNone_SkFilterQuality:
902 break;
903 case kLow_SkFilterQuality:
904 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
905 SKDEBUGCANVAS_FILTERQUALITY_LOW);
906 break;
907 case kMedium_SkFilterQuality:
908 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
909 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
910 break;
911 case kHigh_SkFilterQuality:
912 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
913 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
914 break;
915 }
916}
917
halcanary9d524f22016-03-29 09:03:52 -0700918static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800919 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800920 SkMaskFilter* maskFilter = paint.getMaskFilter();
921 if (maskFilter != nullptr) {
Mike Reed80747ef2018-01-23 15:29:32 -0500922 SkMaskFilterBase::BlurRec blurRec;
923 if (as_MFB(maskFilter)->asABlur(&blurRec)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800924 Json::Value blur(Json::objectValue);
925 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
926 switch (blurRec.fStyle) {
927 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800928 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
929 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -0800930 break;
931 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800932 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
933 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -0800934 break;
935 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800936 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
937 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800938 break;
939 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800940 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
941 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800942 break;
943 default:
944 SkASSERT(false);
945 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800946 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
947 } else {
948 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -0700949 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800950 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
951 }
952 }
953}
954
halcanary9d524f22016-03-29 09:03:52 -0700955static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800956 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800957 SkPathEffect* pathEffect = paint.getPathEffect();
958 if (pathEffect != nullptr) {
959 SkPathEffect::DashInfo dashInfo;
960 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
961 if (dashType == SkPathEffect::kDash_DashType) {
962 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
963 pathEffect->asADash(&dashInfo);
964 Json::Value dashing(Json::objectValue);
965 Json::Value intervals(Json::arrayValue);
966 for (int32_t i = 0; i < dashInfo.fCount; i++) {
967 intervals.append(Json::Value(dashInfo.fIntervals[i]));
968 }
969 sk_free(dashInfo.fIntervals);
970 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
971 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
972 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
973 } else {
974 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -0700975 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800976 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
977 }
978 }
979}
halcanary9d524f22016-03-29 09:03:52 -0700980
Mike Reed60a0e872019-01-04 09:41:49 -0500981static void apply_font_typeface(const SkFont& font, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800982 UrlDataManager& urlDataManager) {
Herb Derby087fad72019-01-22 14:45:16 -0500983 SkTypeface* typeface = font.getTypefaceOrDefault();
ethannicholas50a8dd02016-02-10 05:40:46 -0800984 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -0800985 Json::Value jsonTypeface;
986 SkDynamicMemoryWStream buffer;
987 typeface->serialize(&buffer);
988 void* data = sk_malloc_throw(buffer.bytesWritten());
989 buffer.copyTo(data);
990 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -0700991 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -0800992 &jsonData);
993 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
994 sk_free(data);
995 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -0800996 }
997}
998
halcanary9d524f22016-03-29 09:03:52 -0700999static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001000 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001001 SkFlattenable* shader = paint.getShader();
1002 if (shader != nullptr) {
1003 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -07001004 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001005 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
1006 }
1007}
1008
ethannicholasf62a8b72016-02-11 10:35:21 -08001009static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
1010 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001011 SkFlattenable* imageFilter = paint.getImageFilter();
1012 if (imageFilter != nullptr) {
1013 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -07001014 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001015 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
1016 }
1017}
1018
halcanary9d524f22016-03-29 09:03:52 -07001019static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001020 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001021 SkFlattenable* colorFilter = paint.getColorFilter();
1022 if (colorFilter != nullptr) {
1023 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001024 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001025 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1026 }
1027}
1028
halcanary9d524f22016-03-29 09:03:52 -07001029static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001030 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001031 SkFlattenable* looper = paint.getLooper();
1032 if (looper != nullptr) {
1033 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001034 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001035 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1036 }
1037}
1038
brianosmanfad98562016-05-04 11:06:28 -07001039Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001040 Json::Value result(Json::objectValue);
1041 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001042 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001043 SkPaintDefaults_MiterLimit);
1044 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001045 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001046
ethannicholas50a8dd02016-02-10 05:40:46 -08001047 apply_paint_color(paint, &result);
1048 apply_paint_style(paint, &result);
Florin Malita82d80872017-06-06 16:58:40 -04001049 apply_paint_blend_mode(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001050 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001051 apply_paint_join(paint, &result);
1052 apply_paint_filterquality(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001053 apply_paint_patheffect(paint, &result, urlDataManager);
1054 apply_paint_maskfilter(paint, &result, urlDataManager);
1055 apply_paint_shader(paint, &result, urlDataManager);
ethannicholasf62a8b72016-02-11 10:35:21 -08001056 apply_paint_looper(paint, &result, urlDataManager);
1057 apply_paint_imagefilter(paint, &result, urlDataManager);
1058 apply_paint_colorfilter(paint, &result, urlDataManager);
Mike Reed60a0e872019-01-04 09:41:49 -05001059 return result;
1060}
1061
1062static Json::Value MakeJsonFont(const SkFont& font, UrlDataManager& urlDataManager) {
1063 Json::Value result(Json::objectValue);
1064 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, font.isEmbolden(), false);
1065 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, font.isLinearMetrics(), false);
1066 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, font.isSubpixel(), false);
1067 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, font.isEmbeddedBitmaps(), false);
1068 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, font.isForceAutoHinting(), false);
1069
1070 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, font.getSize(),
1071 SkPaintDefaults_TextSize);
1072 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, font.getScaleX(), SK_Scalar1);
1073 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, font.getSkewX(), 0.0f);
1074 apply_font_edging(font, &result);
1075 apply_font_hinting(font, &result);
1076 apply_font_typeface(font, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001077 return result;
1078}
1079
Stan Ilievac42aeb2017-01-12 16:20:50 -05001080Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) {
1081 Json::Value result(Json::objectValue);
1082 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount);
1083 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount);
1084 if (nullptr != lattice.fBounds) {
1085 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds);
1086 }
1087 Json::Value XDivs(Json::arrayValue);
1088 for (int i = 0; i < lattice.fXCount; i++) {
1089 XDivs.append(Json::Value(lattice.fXDivs[i]));
1090 }
1091 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs;
1092 Json::Value YDivs(Json::arrayValue);
1093 for (int i = 0; i < lattice.fYCount; i++) {
1094 YDivs.append(Json::Value(lattice.fYDivs[i]));
1095 }
1096 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs;
Stan Ilievca8c0952017-12-11 13:01:58 -05001097 if (nullptr != lattice.fRectTypes) {
Stan Ilievac42aeb2017-01-12 16:20:50 -05001098 Json::Value flags(Json::arrayValue);
1099 int flagCount = 0;
1100 for (int row = 0; row < lattice.fYCount+1; row++) {
1101 Json::Value flagsRow(Json::arrayValue);
1102 for (int column = 0; column < lattice.fXCount+1; column++) {
Stan Ilievca8c0952017-12-11 13:01:58 -05001103 flagsRow.append(Json::Value(lattice.fRectTypes[flagCount++]));
Stan Ilievac42aeb2017-01-12 16:20:50 -05001104 }
1105 flags.append(flagsRow);
1106 }
1107 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags;
1108 }
1109 return result;
1110}
1111
Brian Osmanc25e2692018-03-12 10:57:28 -04001112SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kClear_OpType) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001113 fColor = color;
ethannicholas1446a9a2016-02-10 14:05:02 -08001114}
1115
1116void SkClearCommand::execute(SkCanvas* canvas) const {
1117 canvas->clear(fColor);
1118}
1119
ethannicholasf62a8b72016-02-11 10:35:21 -08001120Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1121 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001122 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001123 return result;
1124}
1125
Mike Reedc1f77742016-12-09 09:00:50 -05001126SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001127 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001128 fPath = path;
1129 fOp = op;
1130 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001131}
1132
fmalita8c89c522014-11-08 16:18:56 -08001133void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001134 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001135}
1136
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001137bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001138 render_path(canvas, fPath);
1139 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001140}
1141
ethannicholasf62a8b72016-02-11 10:35:21 -08001142Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1143 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001144 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001145 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1146 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1147 return result;
1148}
1149
Mike Reedc1f77742016-12-09 09:00:50 -05001150SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001151 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001152 fRegion = region;
1153 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001154}
1155
fmalita8c89c522014-11-08 16:18:56 -08001156void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001157 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001158}
1159
ethannicholasf62a8b72016-02-11 10:35:21 -08001160Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1161 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001162 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001163 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1164 return result;
1165}
1166
Mike Reedc1f77742016-12-09 09:00:50 -05001167SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001168 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001169 fRect = rect;
1170 fOp = op;
1171 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001172}
1173
fmalita8c89c522014-11-08 16:18:56 -08001174void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001175 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001176}
1177
ethannicholasf62a8b72016-02-11 10:35:21 -08001178Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1179 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001180 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001181 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1182 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001183
1184 SkString desc;
1185 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1186
ethannicholas50a8dd02016-02-10 05:40:46 -08001187 return result;
1188}
1189
Mike Reedc1f77742016-12-09 09:00:50 -05001190SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001191 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001192 fRRect = rrect;
1193 fOp = op;
1194 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001195}
1196
fmalita8c89c522014-11-08 16:18:56 -08001197void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001198 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001199}
1200
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001201bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001202 render_rrect(canvas, fRRect);
1203 return true;
1204}
1205
ethannicholasf62a8b72016-02-11 10:35:21 -08001206Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1207 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001208 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1209 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1210 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1211 return result;
1212}
1213
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001214SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001215 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001216 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001217}
1218
fmalita8c89c522014-11-08 16:18:56 -08001219void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001220 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001221}
1222
ethannicholasf62a8b72016-02-11 10:35:21 -08001223Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1224 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001225 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001226 return result;
1227}
1228
reed97660cc2016-06-28 18:54:19 -07001229////
1230
1231SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1232 sk_sp<SkData> value)
1233 : INHERITED(kDrawAnnotation_OpType)
1234 , fRect(rect)
1235 , fKey(key)
1236 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001237{
robertphillipsfb409232016-06-29 10:28:11 -07001238}
reed97660cc2016-06-28 18:54:19 -07001239
1240void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1241 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1242}
1243
1244Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1245 Json::Value result = INHERITED::toJSON(urlDataManager);
1246
1247 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1248 result["key"] = Json::Value(fKey.c_str());
1249 if (fValue.get()) {
1250 // TODO: dump out the "value"
1251 }
reed67f62fa2016-06-29 11:36:34 -07001252
1253 SkString desc;
1254 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1255 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1256
reed97660cc2016-06-28 18:54:19 -07001257 return result;
1258}
1259
reed97660cc2016-06-28 18:54:19 -07001260////
1261
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001262SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07001263 const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001264 : INHERITED(kDrawBitmap_OpType)
1265 , fBitmap(bitmap)
1266 , fLeft(left)
1267 , fTop(top)
1268 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001269
fmalita8c89c522014-11-08 16:18:56 -08001270void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001271 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001272}
1273
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001274bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001275 render_bitmap(canvas, fBitmap);
1276 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001277}
1278
ethannicholasf62a8b72016-02-11 10:35:21 -08001279Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
1280 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001281 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001282 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001283 Json::Value command(Json::objectValue);
1284 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001285 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
Brian Osman8363be12018-05-29 13:38:07 -04001286 if (fPaint.isValid()) {
1287 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001288 }
1289 }
1290 return result;
1291}
1292
Brian Osman78a76482018-05-18 16:59:13 -04001293SkDrawBitmapLatticeCommand::SkDrawBitmapLatticeCommand(const SkBitmap& bitmap,
1294 const SkCanvas::Lattice& lattice,
1295 const SkRect& dst, const SkPaint* paint)
1296 : INHERITED(kDrawBitmapLattice_OpType)
1297 , fBitmap(bitmap)
1298 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001299 , fDst(dst)
1300 , fPaint(paint) {}
Brian Osman78a76482018-05-18 16:59:13 -04001301
1302void SkDrawBitmapLatticeCommand::execute(SkCanvas* canvas) const {
1303 canvas->drawBitmapLattice(fBitmap, fLattice, fDst, fPaint.getMaybeNull());
1304}
1305
1306bool SkDrawBitmapLatticeCommand::render(SkCanvas* canvas) const {
1307 SkAutoCanvasRestore acr(canvas, true);
1308 canvas->clear(0xFFFFFFFF);
1309
1310 xlate_and_scale_to_bounds(canvas, fDst);
1311
1312 this->execute(canvas);
1313 return true;
1314}
1315
1316Json::Value SkDrawBitmapLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1317 Json::Value result = INHERITED::toJSON(urlDataManager);
1318 Json::Value encoded;
1319 if (flatten(fBitmap, &encoded, urlDataManager)) {
1320 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
1321 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1322 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1323 if (fPaint.isValid()) {
1324 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1325 }
1326 }
1327
1328 SkString desc;
1329 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1330
1331 return result;
1332}
1333
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001334SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00001335 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001336 : INHERITED(kDrawBitmapNine_OpType)
1337 , fBitmap(bitmap)
1338 , fCenter(center)
1339 , fDst(dst)
1340 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001341
fmalita8c89c522014-11-08 16:18:56 -08001342void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001343 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001344}
1345
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001346bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08001347 SkRect tmp = SkRect::Make(fCenter);
1348 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001349 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001350}
1351
ethannicholasf62a8b72016-02-11 10:35:21 -08001352Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1353 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001354 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001355 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001356 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08001357 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07001358 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001359 if (fPaint.isValid()) {
1360 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001361 }
1362 }
1363 return result;
1364}
1365
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001366SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00001367 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07001368 SkCanvas::SrcRectConstraint constraint)
Brian Osman8363be12018-05-29 13:38:07 -04001369 : INHERITED(kDrawBitmapRect_OpType)
1370 , fBitmap(bitmap)
1371 , fSrc(src)
1372 , fDst(dst)
1373 , fPaint(paint)
1374 , fConstraint(constraint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001375
fmalita8c89c522014-11-08 16:18:56 -08001376void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001377 canvas->legacy_drawBitmapRect(fBitmap, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
1378 fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001379}
1380
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001381bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001382 render_bitmap(canvas, fBitmap, fSrc.getMaybeNull());
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001383 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001384}
1385
ethannicholasf62a8b72016-02-11 10:35:21 -08001386Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1387 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001388 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001389 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001390 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
Brian Osman8363be12018-05-29 13:38:07 -04001391 if (fSrc.isValid()) {
1392 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001393 }
brianosmanfad98562016-05-04 11:06:28 -07001394 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001395 if (fPaint.isValid()) {
1396 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001397 }
1398 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1399 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1400 }
1401 }
reed67f62fa2016-06-29 11:36:34 -07001402
1403 SkString desc;
1404 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1405
ethannicholas50a8dd02016-02-10 05:40:46 -08001406 return result;
1407}
1408
fmalita651c9202015-07-22 10:23:01 -07001409SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
1410 const SkPaint* paint)
1411 : INHERITED(kDrawImage_OpType)
1412 , fImage(SkRef(image))
1413 , fLeft(left)
Brian Osman8363be12018-05-29 13:38:07 -04001414 , fTop(top)
1415 , fPaint(paint) {}
fmalita651c9202015-07-22 10:23:01 -07001416
1417void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001418 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07001419}
1420
1421bool SkDrawImageCommand::render(SkCanvas* canvas) const {
1422 SkAutoCanvasRestore acr(canvas, true);
1423 canvas->clear(0xFFFFFFFF);
1424
1425 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
1426 SkIntToScalar(fImage->width()),
1427 SkIntToScalar(fImage->height())));
1428 this->execute(canvas);
1429 return true;
1430}
1431
ethannicholasf62a8b72016-02-11 10:35:21 -08001432Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
1433 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001434 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001435 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001436 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001437 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08001438 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001439 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001440 }
msarett0ac1bec2016-08-29 09:15:33 -07001441
1442 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
1443 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
1444 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
1445 switch (fImage->alphaType()) {
1446 case kOpaque_SkAlphaType:
1447 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
1448 break;
1449 case kPremul_SkAlphaType:
1450 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
1451 break;
1452 case kUnpremul_SkAlphaType:
1453 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
1454 break;
1455 default:
1456 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
1457 break;
1458 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001459 }
1460 return result;
1461}
1462
Stan Ilievac42aeb2017-01-12 16:20:50 -05001463SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
1464 const SkCanvas::Lattice& lattice,
1465 const SkRect& dst, const SkPaint* paint)
1466 : INHERITED(kDrawImageLattice_OpType)
1467 , fImage(SkRef(image))
1468 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001469 , fDst(dst)
1470 , fPaint(paint) {}
Stan Ilievac42aeb2017-01-12 16:20:50 -05001471
1472void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
Brian Osman78a76482018-05-18 16:59:13 -04001473 canvas->drawImageLattice(fImage.get(), fLattice, fDst, fPaint.getMaybeNull());
Stan Ilievac42aeb2017-01-12 16:20:50 -05001474}
1475
1476bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
1477 SkAutoCanvasRestore acr(canvas, true);
1478 canvas->clear(0xFFFFFFFF);
1479
1480 xlate_and_scale_to_bounds(canvas, fDst);
1481
1482 this->execute(canvas);
1483 return true;
1484}
1485
1486Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1487 Json::Value result = INHERITED::toJSON(urlDataManager);
1488 Json::Value encoded;
1489 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001490 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
Stan Ilievac42aeb2017-01-12 16:20:50 -05001491 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1492 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1493 if (fPaint.isValid()) {
1494 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1495 }
1496 }
1497
1498 SkString desc;
1499 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1500
1501 return result;
1502}
1503
fmalita651c9202015-07-22 10:23:01 -07001504SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
1505 const SkRect& dst, const SkPaint* paint,
1506 SkCanvas::SrcRectConstraint constraint)
1507 : INHERITED(kDrawImageRect_OpType)
1508 , fImage(SkRef(image))
Brian Osman8363be12018-05-29 13:38:07 -04001509 , fSrc(src)
fmalita651c9202015-07-22 10:23:01 -07001510 , fDst(dst)
Brian Osman8363be12018-05-29 13:38:07 -04001511 , fPaint(paint)
1512 , fConstraint(constraint) {}
fmalita651c9202015-07-22 10:23:01 -07001513
1514void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001515 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
1516 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07001517}
1518
1519bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
1520 SkAutoCanvasRestore acr(canvas, true);
1521 canvas->clear(0xFFFFFFFF);
1522
1523 xlate_and_scale_to_bounds(canvas, fDst);
1524
1525 this->execute(canvas);
1526 return true;
1527}
1528
ethannicholasf62a8b72016-02-11 10:35:21 -08001529Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1530 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001531 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001532 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001533 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
ethannicholas50a8dd02016-02-10 05:40:46 -08001534 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001535 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001536 }
brianosmanfad98562016-05-04 11:06:28 -07001537 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08001538 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001539 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001540 }
1541 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1542 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1543 }
1544 }
reed67f62fa2016-06-29 11:36:34 -07001545
1546 SkString desc;
1547 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1548
ethannicholas50a8dd02016-02-10 05:40:46 -08001549 return result;
1550}
1551
Brian Salomond7065e72018-10-12 11:42:02 -04001552SkDrawImageSetCommand::SkDrawImageSetCommand(const SkCanvas::ImageSetEntry set[], int count,
Brian Salomond003d222018-11-26 13:25:05 -05001553 SkFilterQuality filterQuality, SkBlendMode mode)
Brian Salomond7065e72018-10-12 11:42:02 -04001554 : INHERITED(kDrawImageSet_OpType)
1555 , fSet(count)
1556 , fCount(count)
Brian Salomond7065e72018-10-12 11:42:02 -04001557 , fFilterQuality(filterQuality)
1558 , fMode(mode) {
1559 std::copy_n(set, count, fSet.get());
1560}
1561
1562void SkDrawImageSetCommand::execute(SkCanvas* canvas) const {
Brian Salomond003d222018-11-26 13:25:05 -05001563 canvas->experimental_DrawImageSetV1(fSet.get(), fCount, fFilterQuality, fMode);
Brian Salomond7065e72018-10-12 11:42:02 -04001564}
1565
Brian Osmanc25e2692018-03-12 10:57:28 -04001566SkDrawImageNineCommand::SkDrawImageNineCommand(const SkImage* image, const SkIRect& center,
1567 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001568 : INHERITED(kDrawImageNine_OpType)
1569 , fImage(SkRef(image))
1570 , fCenter(center)
1571 , fDst(dst)
1572 , fPaint(paint) {}
Brian Osmanc25e2692018-03-12 10:57:28 -04001573
1574void SkDrawImageNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001575 canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaint.getMaybeNull());
Brian Osmanc25e2692018-03-12 10:57:28 -04001576}
1577
1578bool SkDrawImageNineCommand::render(SkCanvas* canvas) const {
1579 SkAutoCanvasRestore acr(canvas, true);
1580 canvas->clear(0xFFFFFFFF);
1581
1582 xlate_and_scale_to_bounds(canvas, fDst);
1583
1584 this->execute(canvas);
1585 return true;
1586}
1587
1588Json::Value SkDrawImageNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1589 Json::Value result = INHERITED::toJSON(urlDataManager);
1590 Json::Value encoded;
1591 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
1592 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
1593 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
1594 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001595 if (fPaint.isValid()) {
1596 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
Brian Osmanc25e2692018-03-12 10:57:28 -04001597 }
1598 }
1599 return result;
1600}
1601
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001602SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001603 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001604 fOval = oval;
1605 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001606}
1607
fmalita8c89c522014-11-08 16:18:56 -08001608void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001609 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001610}
1611
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001612bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001613 canvas->clear(0xFFFFFFFF);
1614 canvas->save();
1615
1616 xlate_and_scale_to_bounds(canvas, fOval);
1617
1618 SkPaint p;
1619 p.setColor(SK_ColorBLACK);
1620 p.setStyle(SkPaint::kStroke_Style);
1621
1622 canvas->drawOval(fOval, p);
1623 canvas->restore();
1624
1625 return true;
1626}
1627
ethannicholasf62a8b72016-02-11 10:35:21 -08001628Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
1629 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001630 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1631 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001632 return result;
1633}
1634
bsalomonac3aa242016-08-19 11:25:19 -07001635SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
1636 bool useCenter, const SkPaint& paint)
Brian Osmanc25e2692018-03-12 10:57:28 -04001637 : INHERITED(kDrawArc_OpType) {
bsalomonac3aa242016-08-19 11:25:19 -07001638 fOval = oval;
1639 fStartAngle = startAngle;
1640 fSweepAngle = sweepAngle;
1641 fUseCenter = useCenter;
1642 fPaint = paint;
bsalomonac3aa242016-08-19 11:25:19 -07001643}
1644
1645void SkDrawArcCommand::execute(SkCanvas* canvas) const {
1646 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
1647}
1648
1649bool SkDrawArcCommand::render(SkCanvas* canvas) const {
1650 canvas->clear(0xFFFFFFFF);
1651 canvas->save();
1652
1653 xlate_and_scale_to_bounds(canvas, fOval);
1654
1655 SkPaint p;
1656 p.setColor(SK_ColorBLACK);
1657 p.setStyle(SkPaint::kStroke_Style);
1658
1659 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
1660 canvas->restore();
1661
1662 return true;
1663}
1664
1665Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
1666 Json::Value result = INHERITED::toJSON(urlDataManager);
1667 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1668 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
1669 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
1670 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
1671 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1672 return result;
1673}
1674
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001675SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001676 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001677 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001678}
1679
fmalita8c89c522014-11-08 16:18:56 -08001680void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001681 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001682}
1683
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001684bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001685 canvas->clear(0xFFFFFFFF);
1686 canvas->drawPaint(fPaint);
1687 return true;
1688}
1689
ethannicholasf62a8b72016-02-11 10:35:21 -08001690Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
1691 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001692 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001693 return result;
1694}
1695
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001696SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001697 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001698 fPath = path;
1699 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001700}
1701
fmalita8c89c522014-11-08 16:18:56 -08001702void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001703 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001704}
1705
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001706bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001707 render_path(canvas, fPath);
1708 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001709}
1710
ethannicholasf62a8b72016-02-11 10:35:21 -08001711Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1712 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001713 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
1714 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001715 return result;
1716}
1717
Brian Osmanc25e2692018-03-12 10:57:28 -04001718SkDrawRegionCommand::SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint)
1719 : INHERITED(kDrawRegion_OpType) {
1720 fRegion = region;
1721 fPaint = paint;
Brian Osmanc25e2692018-03-12 10:57:28 -04001722}
1723
1724void SkDrawRegionCommand::execute(SkCanvas* canvas) const {
1725 canvas->drawRegion(fRegion, fPaint);
1726}
1727
1728bool SkDrawRegionCommand::render(SkCanvas* canvas) const {
1729 render_region(canvas, fRegion);
1730 return true;
1731}
1732
1733Json::Value SkDrawRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1734 Json::Value result = INHERITED::toJSON(urlDataManager);
1735 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
1736 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1737 return result;
1738}
1739
fmalita160ebb22015-04-01 20:58:37 -07001740SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
1741 const SkMatrix* matrix,
1742 const SkPaint* paint)
1743 : INHERITED(kBeginDrawPicture_OpType)
Brian Osman8363be12018-05-29 13:38:07 -04001744 , fPicture(SkRef(picture))
1745 , fMatrix(matrix)
1746 , fPaint(paint) {}
fmalita160ebb22015-04-01 20:58:37 -07001747
1748void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
1749 if (fPaint.isValid()) {
1750 SkRect bounds = fPicture->cullRect();
1751 if (fMatrix.isValid()) {
1752 fMatrix.get()->mapRect(&bounds);
1753 }
1754 canvas->saveLayer(&bounds, fPaint.get());
1755 }
1756
1757 if (fMatrix.isValid()) {
1758 if (!fPaint.isValid()) {
1759 canvas->save();
1760 }
1761 canvas->concat(*fMatrix.get());
1762 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001763}
1764
fmalita160ebb22015-04-01 20:58:37 -07001765bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001766 canvas->clear(0xFFFFFFFF);
1767 canvas->save();
1768
robertphillipsa8d7f0b2014-08-29 08:03:56 -07001769 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001770
robertphillips9b14f262014-06-04 05:40:44 -07001771 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001772
1773 canvas->restore();
1774
1775 return true;
1776}
1777
fmalita160ebb22015-04-01 20:58:37 -07001778SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
1779 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
1780
1781void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
1782 if (fRestore) {
1783 canvas->restore();
1784 }
1785}
1786
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001787SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001788 const SkPoint pts[], const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04001789 : INHERITED(kDrawPoints_OpType)
1790 , fMode(mode)
1791 , fPts(pts, count)
1792 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001793
fmalita8c89c522014-11-08 16:18:56 -08001794void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001795 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001796}
1797
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001798bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001799 canvas->clear(0xFFFFFFFF);
1800 canvas->save();
1801
1802 SkRect bounds;
1803
1804 bounds.setEmpty();
Brian Osman8363be12018-05-29 13:38:07 -04001805 for (int i = 0; i < fPts.count(); ++i) {
Mike Reed185ffe92018-01-08 17:09:54 -05001806 SkRectPriv::GrowToInclude(&bounds, fPts[i]);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001807 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00001808
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001809 xlate_and_scale_to_bounds(canvas, bounds);
1810
1811 SkPaint p;
1812 p.setColor(SK_ColorBLACK);
1813 p.setStyle(SkPaint::kStroke_Style);
1814
Brian Osman8363be12018-05-29 13:38:07 -04001815 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001816 canvas->restore();
1817
1818 return true;
1819}
1820
ethannicholasf62a8b72016-02-11 10:35:21 -08001821Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
1822 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001823 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
1824 Json::Value points(Json::arrayValue);
Brian Osman8363be12018-05-29 13:38:07 -04001825 for (int i = 0; i < fPts.count(); i++) {
brianosmanfad98562016-05-04 11:06:28 -07001826 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001827 }
1828 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07001829 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001830 return result;
1831}
1832
fmalita37283c22016-09-13 10:00:23 -07001833SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07001834 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001835 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07001836 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07001837 , fXPos(x)
1838 , fYPos(y)
Brian Osman255735e2018-04-06 14:51:42 -04001839 , fPaint(paint) {}
fmalitab7425172014-08-26 07:56:44 -07001840
fmalita8c89c522014-11-08 16:18:56 -08001841void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07001842 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1843}
1844
fmalita55773872014-08-29 15:08:20 -07001845bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
1846 canvas->clear(SK_ColorWHITE);
1847 canvas->save();
1848
1849 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
1850 xlate_and_scale_to_bounds(canvas, bounds);
1851
fmalita37283c22016-09-13 10:00:23 -07001852 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07001853
1854 canvas->restore();
1855
1856 return true;
1857}
1858
ethannicholasf62a8b72016-02-11 10:35:21 -08001859Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
1860 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001861 Json::Value runs(Json::arrayValue);
1862 SkTextBlobRunIterator iter(fBlob.get());
1863 while (!iter.done()) {
1864 Json::Value run(Json::objectValue);
1865 Json::Value jsonPositions(Json::arrayValue);
1866 Json::Value jsonGlyphs(Json::arrayValue);
1867 const SkScalar* iterPositions = iter.pos();
1868 const uint16_t* iterGlyphs = iter.glyphs();
1869 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1870 switch (iter.positioning()) {
Florin Malitaab54e732018-07-27 09:47:15 -04001871 case SkTextBlobRunIterator::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07001872 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
1873 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001874 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001875 case SkTextBlobRunIterator::kHorizontal_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001876 jsonPositions.append(Json::Value(iterPositions[i]));
1877 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001878 case SkTextBlobRunIterator::kDefault_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001879 break;
Mike Reed30cf62b2018-12-20 11:18:24 -05001880 case SkTextBlobRunIterator::kRSXform_Positioning:
1881 // TODO_RSXFORM_BLOB
1882 break;
ethannicholas50a8dd02016-02-10 05:40:46 -08001883 }
1884 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
1885 }
Florin Malitaab54e732018-07-27 09:47:15 -04001886 if (iter.positioning() != SkTextBlobRunIterator::kDefault_Positioning) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001887 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
1888 }
1889 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
1890 SkPaint fontPaint;
Mike Reed60a0e872019-01-04 09:41:49 -05001891 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonFont(iter.font(), urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001892 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08001893 runs.append(run);
1894 iter.next();
1895 }
reed6d2c3e72016-07-07 14:10:14 -07001896 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08001897 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
1898 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
1899 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07001900 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07001901 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07001902
1903 SkString desc;
1904 // make the bounds local by applying the x,y
1905 bounds.offset(fXPos, fYPos);
1906 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
1907
ethannicholas50a8dd02016-02-10 05:40:46 -08001908 return result;
1909}
1910
robertphillips9bafc302015-02-13 11:13:00 -08001911SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04001912 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08001913 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04001914 : INHERITED(kDrawPatch_OpType)
1915 , fBlendMode(bmode)
1916{
robertphillips9bafc302015-02-13 11:13:00 -08001917 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08001918 if (colors != nullptr) {
1919 memcpy(fColors, colors, sizeof(fColors));
1920 fColorsPtr = fColors;
1921 } else {
1922 fColorsPtr = nullptr;
1923 }
1924 if (texCoords != nullptr) {
1925 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
1926 fTexCoordsPtr = fTexCoords;
1927 } else {
1928 fTexCoordsPtr = nullptr;
1929 }
robertphillips9bafc302015-02-13 11:13:00 -08001930 fPaint = paint;
robertphillips9bafc302015-02-13 11:13:00 -08001931}
1932
1933void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04001934 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08001935}
1936
ethannicholasf62a8b72016-02-11 10:35:21 -08001937Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
1938 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001939 Json::Value cubics = Json::Value(Json::arrayValue);
1940 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001941 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001942 }
1943 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
1944 if (fColorsPtr != nullptr) {
1945 Json::Value colors = Json::Value(Json::arrayValue);
1946 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001947 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001948 }
1949 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
1950 }
1951 if (fTexCoordsPtr != nullptr) {
1952 Json::Value texCoords = Json::Value(Json::arrayValue);
1953 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001954 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001955 }
1956 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
1957 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001958 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08001959 return result;
1960}
1961
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001962SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001963 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001964 fRect = rect;
1965 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001966}
1967
fmalita8c89c522014-11-08 16:18:56 -08001968void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001969 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001970}
1971
ethannicholasf62a8b72016-02-11 10:35:21 -08001972Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1973 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001974 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1975 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07001976
1977 SkString desc;
1978 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1979
ethannicholas50a8dd02016-02-10 05:40:46 -08001980 return result;
1981}
1982
Michael Ludwig75451902019-01-23 11:14:29 -05001983SkDrawEdgeAARectCommand::SkDrawEdgeAARectCommand(const SkRect& rect, SkCanvas::QuadAAFlags aa,
1984 SkColor color, SkBlendMode mode)
1985 : INHERITED(kDrawEdgeAARect_OpType) {
1986 fRect = rect;
1987 fAA = aa;
1988 fColor = color;
1989 fMode = mode;
1990}
1991
1992void SkDrawEdgeAARectCommand::execute(SkCanvas* canvas) const {
1993 canvas->experimental_DrawEdgeAARectV1(fRect, fAA, fColor, fMode);
1994}
1995
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001996SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001997 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00001998 fRRect = rrect;
1999 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00002000}
2001
fmalita8c89c522014-11-08 16:18:56 -08002002void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00002003 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00002004}
2005
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002006bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002007 render_rrect(canvas, fRRect);
2008 return true;
2009}
2010
ethannicholasf62a8b72016-02-11 10:35:21 -08002011Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2012 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002013 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07002014 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002015 return result;
2016}
2017
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00002018SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002019 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002020 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002021 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002022 fOuter = outer;
2023 fInner = inner;
2024 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002025}
2026
fmalita8c89c522014-11-08 16:18:56 -08002027void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002028 canvas->drawDRRect(fOuter, fInner, fPaint);
2029}
2030
2031bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
2032 render_drrect(canvas, fOuter, fInner);
2033 return true;
2034}
2035
ethannicholasf62a8b72016-02-11 10:35:21 -08002036Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2037 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002038 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
2039 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07002040 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002041 return result;
2042}
2043
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04002044SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
2045 : INHERITED(kDrawShadow_OpType) {
2046 fPath = path;
2047 fShadowRec = rec;
2048}
2049
2050void SkDrawShadowCommand::execute(SkCanvas* canvas) const {
2051 canvas->private_draw_shadow_rec(fPath, fShadowRec);
2052}
2053
2054bool SkDrawShadowCommand::render(SkCanvas* canvas) const {
2055 render_shadow(canvas, fPath, fShadowRec);
2056 return true;
2057}
2058
2059Json::Value SkDrawShadowCommand::toJSON(UrlDataManager& urlDataManager) const {
2060 Json::Value result = INHERITED::toJSON(urlDataManager);
2061 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2062
2063 bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
2064 bool transparentOccluder =
2065 SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
2066
2067 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2068 result[SKDEBUGCANVAS_ATTRIBUTE_ZPLANE] = MakeJsonPoint3(fShadowRec.fZPlaneParams);
2069 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION] = MakeJsonPoint3(fShadowRec.fLightPos);
2070 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS] = MakeJsonScalar(fShadowRec.fLightRadius);
2071 result[SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR] = MakeJsonColor(fShadowRec.fAmbientColor);
2072 result[SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR] = MakeJsonColor(fShadowRec.fSpotColor);
2073 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
2074 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
2075 return result;
2076}
2077
Brian Osmanc7611082018-05-29 14:55:50 -04002078///////////////////////////////////////////////////////////////////////////////////////////////////
2079
2080SkDrawDrawableCommand::SkDrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
2081 : INHERITED(kDrawDrawable_OpType)
2082 , fDrawable(SkRef(drawable))
2083 , fMatrix(matrix) {}
2084
2085void SkDrawDrawableCommand::execute(SkCanvas* canvas) const {
2086 canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
2087}
2088
2089///////////////////////////////////////////////////////////////////////////////////////////////////
2090
Mike Reedfed9cfd2017-03-17 12:09:04 -04002091SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002092 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04002093 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04002094 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04002095 , fBlendMode(bmode)
Brian Osman255735e2018-04-06 14:51:42 -04002096 , fPaint(paint) {}
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002097
fmalita8c89c522014-11-08 16:18:56 -08002098void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04002099 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002100}
2101
Brian Osman616f1cb2018-05-29 11:23:35 -04002102///////////////////////////////////////////////////////////////////////////////////////////////////
2103
2104SkDrawAtlasCommand::SkDrawAtlasCommand(const SkImage* image, const SkRSXform xform[],
2105 const SkRect tex[], const SkColor colors[], int count,
2106 SkBlendMode bmode, const SkRect* cull,
2107 const SkPaint* paint)
2108 : INHERITED(kDrawAtlas_OpType)
2109 , fImage(SkRef(image))
2110 , fXform(xform, count)
2111 , fTex(tex, count)
2112 , fColors(colors, colors ? count : 0)
2113 , fBlendMode(bmode)
2114 , fCull(cull)
2115 , fPaint(paint) {}
2116
2117void SkDrawAtlasCommand::execute(SkCanvas* canvas) const {
2118 canvas->drawAtlas(fImage.get(), fXform.begin(), fTex.begin(),
2119 fColors.isEmpty() ? nullptr : fColors.begin(), fXform.count(), fBlendMode,
2120 fCull.getMaybeNull(), fPaint.getMaybeNull());
2121}
2122
2123///////////////////////////////////////////////////////////////////////////////////////////////////
2124
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002125SkRestoreCommand::SkRestoreCommand()
Brian Osman255735e2018-04-06 14:51:42 -04002126 : INHERITED(kRestore_OpType) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002127
fmalita8c89c522014-11-08 16:18:56 -08002128void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00002129 canvas->restore();
2130}
2131
Florin Malita5f6102d2014-06-30 10:13:28 -04002132SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08002133 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00002134}
2135
fmalita8c89c522014-11-08 16:18:56 -08002136void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04002137 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00002138}
2139
reed4960eee2015-12-18 07:09:18 -08002140SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
Brian Osman8363be12018-05-29 13:38:07 -04002141 : INHERITED(kSaveLayer_OpType)
2142 , fBounds(rec.fBounds)
2143 , fPaint(rec.fPaint)
2144 , fBackdrop(SkSafeRef(rec.fBackdrop))
2145 , fSaveLayerFlags(rec.fSaveLayerFlags) {}
ethannicholas50a8dd02016-02-10 05:40:46 -08002146
fmalita8c89c522014-11-08 16:18:56 -08002147void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04002148 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(),
reed4960eee2015-12-18 07:09:18 -08002149 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00002150}
2151
ethannicholasf62a8b72016-02-11 10:35:21 -08002152Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
2153 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman8363be12018-05-29 13:38:07 -04002154 if (fBounds.isValid()) {
2155 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(*fBounds.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002156 }
Brian Osman8363be12018-05-29 13:38:07 -04002157 if (fPaint.isValid()) {
2158 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002159 }
2160 if (fBackdrop != nullptr) {
2161 Json::Value jsonBackdrop;
Brian Osman8363be12018-05-29 13:38:07 -04002162 flatten(fBackdrop.get(), &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002163 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
2164 }
2165 if (fSaveLayerFlags != 0) {
2166 SkDebugf("unsupported: saveLayer flags\n");
2167 SkASSERT(false);
2168 }
2169 return result;
2170}
2171
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002172SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08002173 : INHERITED(kSetMatrix_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002174 fMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -07002175}
2176
fmalita8c89c522014-11-08 16:18:56 -08002177void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
Brian Osman255735e2018-04-06 14:51:42 -04002178 canvas->setMatrix(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00002179}
2180
ethannicholasf62a8b72016-02-11 10:35:21 -08002181Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
2182 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08002183 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08002184 return result;
2185}