blob: d9723acd7b38b3310f07a906317ce51d41a712fb [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
Brian Osmand8a90f92019-01-28 13:41:19 -0500259void SkDrawCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
260 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_COMMAND, this->GetCommandString(fOpType));
261 writer.appendBool(SKDEBUGCANVAS_ATTRIBUTE_VISIBLE, this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800262}
263
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000264namespace {
265
266void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
Mike Reed3661bc92017-02-22 13:21:42 -0500267 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000268
269 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
270
271 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
272 if (bounds.width() > bounds.height()) {
273 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
274 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
275 } else {
276 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
277 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
278 }
279 canvas->translate(-bounds.centerX(), -bounds.centerY());
280}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000281
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000282
283void render_path(SkCanvas* canvas, const SkPath& path) {
284 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000285
286 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700287 if (bounds.isEmpty()) {
288 return;
289 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000290
fmalitab0cd8b72015-10-06 07:24:03 -0700291 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000292 xlate_and_scale_to_bounds(canvas, bounds);
293
294 SkPaint p;
295 p.setColor(SK_ColorBLACK);
296 p.setStyle(SkPaint::kStroke_Style);
297
298 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000299}
300
Brian Osmanc25e2692018-03-12 10:57:28 -0400301void render_region(SkCanvas* canvas, const SkRegion& region) {
302 canvas->clear(0xFFFFFFFF);
303
304 const SkIRect& bounds = region.getBounds();
305 if (bounds.isEmpty()) {
306 return;
307 }
308
309 SkAutoCanvasRestore acr(canvas, true);
Brian Osman99b63402018-03-13 10:19:27 -0400310 xlate_and_scale_to_bounds(canvas, SkRect::Make(bounds));
Brian Osmanc25e2692018-03-12 10:57:28 -0400311
312 SkPaint p;
313 p.setColor(SK_ColorBLACK);
314 p.setStyle(SkPaint::kStroke_Style);
315
316 canvas->drawRegion(region, p);
317}
318
halcanary96fcdcc2015-08-27 07:41:13 -0700319void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
Mike Reed3661bc92017-02-22 13:21:42 -0500320 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000321
322 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
323 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
324
325 if (input.width() > input.height()) {
326 yScale *= input.height() / (float) input.width();
327 } else {
328 xScale *= input.width() / (float) input.height();
329 }
330
331 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
332 xScale * input.width(),
333 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000334
robertphillips96a5cff2015-09-24 06:56:27 -0700335 static const int kNumBlocks = 8;
336
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000337 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700338 SkISize block = {
339 canvas->imageInfo().width()/kNumBlocks,
340 canvas->imageInfo().height()/kNumBlocks
341 };
342 for (int y = 0; y < kNumBlocks; ++y) {
343 for (int x = 0; x < kNumBlocks; ++x) {
344 SkPaint paint;
345 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
346 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
347 SkIntToScalar(y*block.height()),
348 SkIntToScalar(block.width()),
349 SkIntToScalar(block.height()));
350 canvas->drawRect(r, paint);
351 }
352 }
353
reede47829b2015-08-06 10:02:53 -0700354 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000355
bsalomon49f085d2014-09-05 13:34:00 -0700356 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000357 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
358 srcRect->fTop * yScale + SK_Scalar1,
359 srcRect->fRight * xScale + SK_Scalar1,
360 srcRect->fBottom * yScale + SK_Scalar1);
361 SkPaint p;
362 p.setColor(SK_ColorRED);
363 p.setStyle(SkPaint::kStroke_Style);
364
365 canvas->drawRect(r, p);
366 }
367}
368
369void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
370 canvas->clear(0xFFFFFFFF);
371 canvas->save();
372
373 const SkRect& bounds = rrect.getBounds();
374
375 xlate_and_scale_to_bounds(canvas, bounds);
376
377 SkPaint p;
378 p.setColor(SK_ColorBLACK);
379 p.setStyle(SkPaint::kStroke_Style);
380
381 canvas->drawRRect(rrect, p);
382 canvas->restore();
383}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000384
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000385void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
386 canvas->clear(0xFFFFFFFF);
387 canvas->save();
388
389 const SkRect& bounds = outer.getBounds();
390
391 xlate_and_scale_to_bounds(canvas, bounds);
392
393 SkPaint p;
394 p.setColor(SK_ColorBLACK);
395 p.setStyle(SkPaint::kStroke_Style);
396
397 canvas->drawDRRect(outer, inner, p);
398 canvas->restore();
399}
400
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400401void render_shadow(SkCanvas* canvas, const SkPath& path, SkDrawShadowRec rec) {
402 canvas->clear(0xFFFFFFFF);
403
404 const SkRect& bounds = path.getBounds();
405 if (bounds.isEmpty()) {
406 return;
407 }
408
409 SkAutoCanvasRestore acr(canvas, true);
410 xlate_and_scale_to_bounds(canvas, bounds);
411
412 rec.fAmbientColor = SK_ColorBLACK;
413 rec.fSpotColor = SK_ColorBLACK;
414 canvas->private_draw_shadow_rec(path, rec);
415}
416
Florin Malita82d80872017-06-06 16:58:40 -0400417static const char* const gBlendModeMap[] = {
418 "clear",
419 "src",
420 "dst",
421 "srcOver",
422 "dstOver",
423 "srcIn",
424 "dstIn",
425 "srcOut",
426 "dstOut",
427 "srcATop",
428 "dstATop",
429 "xor",
430 "plus",
431 "modulate",
432
433 "screen",
434
435 "overlay",
436 "darken",
437 "lighten",
438 "colorDodge",
439 "colorBurn",
440 "hardLight",
441 "softLight",
442 "difference",
443 "exclusion",
444 "multiply",
445
446 "hue",
447 "saturation",
448 "color",
449 "luminosity",
450};
451
452static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
453 "blendMode mismatch");
454static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
455 "blendMode mismatch");
456
Brian Osmand8a90f92019-01-28 13:41:19 -0500457void apply_paint_blend_mode(const SkPaint& paint, SkJSONWriter& writer) {
Florin Malita82d80872017-06-06 16:58:40 -0400458 const auto mode = paint.getBlendMode();
459 if (mode != SkBlendMode::kSrcOver) {
460 SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
Brian Osmand8a90f92019-01-28 13:41:19 -0500461 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE,
462 gBlendModeMap[static_cast<size_t>(mode)]);
Florin Malita82d80872017-06-06 16:58:40 -0400463 }
464}
465
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000466};
467
Brian Osmand8a90f92019-01-28 13:41:19 -0500468void SkDrawCommand::MakeJsonColor(SkJSONWriter& writer, const SkColor color) {
469 writer.beginArray(nullptr, false);
470 writer.appendS32(SkColorGetA(color));
471 writer.appendS32(SkColorGetR(color));
472 writer.appendS32(SkColorGetG(color));
473 writer.appendS32(SkColorGetB(color));
474 writer.endArray();
ethannicholas1446a9a2016-02-10 14:05:02 -0800475}
476
Brian Osmand8a90f92019-01-28 13:41:19 -0500477void SkDrawCommand::MakeJsonColor4f(SkJSONWriter& writer, const SkColor4f& color) {
478 writer.beginArray(nullptr, false);
479 writer.appendFloat(color.fA);
480 writer.appendFloat(color.fR);
481 writer.appendFloat(color.fG);
482 writer.appendFloat(color.fB);
483 writer.endArray();
brianosman97bbf822016-09-25 13:15:58 -0700484}
485
Brian Osmand8a90f92019-01-28 13:41:19 -0500486void SkDrawCommand::MakeJsonPoint(SkJSONWriter& writer, const SkPoint& point) {
487 writer.beginArray(nullptr, false);
488 writer.appendFloat(point.x());
489 writer.appendFloat(point.y());
490 writer.endArray();
ethannicholas50a8dd02016-02-10 05:40:46 -0800491}
492
Brian Osmand8a90f92019-01-28 13:41:19 -0500493void SkDrawCommand::MakeJsonPoint(SkJSONWriter& writer, SkScalar x, SkScalar y) {
494 writer.beginArray(nullptr, false);
495 writer.appendFloat(x);
496 writer.appendFloat(y);
497 writer.endArray();
ethannicholas50a8dd02016-02-10 05:40:46 -0800498}
499
Brian Osmand8a90f92019-01-28 13:41:19 -0500500void SkDrawCommand::MakeJsonPoint3(SkJSONWriter& writer, const SkPoint3& point) {
501 writer.beginArray(nullptr, false);
502 writer.appendFloat(point.x());
503 writer.appendFloat(point.y());
504 writer.appendFloat(point.z());
505 writer.endArray();
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400506}
507
Brian Osmand8a90f92019-01-28 13:41:19 -0500508void SkDrawCommand::MakeJsonRect(SkJSONWriter& writer, const SkRect& rect) {
509 writer.beginArray(nullptr, false);
510 writer.appendFloat(rect.left());
511 writer.appendFloat(rect.top());
512 writer.appendFloat(rect.right());
513 writer.appendFloat(rect.bottom());
514 writer.endArray();
ethannicholas50a8dd02016-02-10 05:40:46 -0800515}
516
Brian Osmand8a90f92019-01-28 13:41:19 -0500517void SkDrawCommand::MakeJsonIRect(SkJSONWriter& writer, const SkIRect& rect) {
518 writer.beginArray(nullptr, false);
519 writer.appendS32(rect.left());
520 writer.appendS32(rect.top());
521 writer.appendS32(rect.right());
522 writer.appendS32(rect.bottom());
523 writer.endArray();
ethannicholas50a8dd02016-02-10 05:40:46 -0800524}
525
Brian Osmand8a90f92019-01-28 13:41:19 -0500526static void make_json_rrect(SkJSONWriter& writer, const SkRRect& rrect) {
527 writer.beginArray(nullptr, false);
528 SkDrawCommand::MakeJsonRect(writer, rrect.rect());
529 SkDrawCommand::MakeJsonPoint(writer, rrect.radii(SkRRect::kUpperLeft_Corner));
530 SkDrawCommand::MakeJsonPoint(writer, rrect.radii(SkRRect::kUpperRight_Corner));
531 SkDrawCommand::MakeJsonPoint(writer, rrect.radii(SkRRect::kLowerRight_Corner));
532 SkDrawCommand::MakeJsonPoint(writer, rrect.radii(SkRRect::kLowerLeft_Corner));
533 writer.endArray();
ethannicholas50a8dd02016-02-10 05:40:46 -0800534}
535
Brian Osmand8a90f92019-01-28 13:41:19 -0500536void SkDrawCommand::MakeJsonMatrix(SkJSONWriter& writer, const SkMatrix& matrix) {
537 writer.beginArray();
538 for (int r = 0; r < 3; ++r) {
539 writer.beginArray(nullptr, false);
540 for (int c = 0; c < 3; ++c) {
541 writer.appendFloat(matrix[r * 3 + c]);
542 }
543 writer.endArray();
544 }
545 writer.endArray();
ethannicholas50a8dd02016-02-10 05:40:46 -0800546}
ethannicholas1446a9a2016-02-10 14:05:02 -0800547
Brian Osmand8a90f92019-01-28 13:41:19 -0500548void SkDrawCommand::MakeJsonPath(SkJSONWriter& writer, const SkPath& path) {
549 writer.beginObject();
ethannicholas50a8dd02016-02-10 05:40:46 -0800550 switch (path.getFillType()) {
551 case SkPath::kWinding_FillType:
Brian Osmand8a90f92019-01-28 13:41:19 -0500552 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE, SKDEBUGCANVAS_FILLTYPE_WINDING);
ethannicholas50a8dd02016-02-10 05:40:46 -0800553 break;
554 case SkPath::kEvenOdd_FillType:
Brian Osmand8a90f92019-01-28 13:41:19 -0500555 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE, SKDEBUGCANVAS_FILLTYPE_EVENODD);
ethannicholas50a8dd02016-02-10 05:40:46 -0800556 break;
557 case SkPath::kInverseWinding_FillType:
Brian Osmand8a90f92019-01-28 13:41:19 -0500558 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE, SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING);
ethannicholas50a8dd02016-02-10 05:40:46 -0800559 break;
560 case SkPath::kInverseEvenOdd_FillType:
Brian Osmand8a90f92019-01-28 13:41:19 -0500561 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE, SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD);
ethannicholas50a8dd02016-02-10 05:40:46 -0800562 break;
halcanary9d524f22016-03-29 09:03:52 -0700563 }
Brian Osmand8a90f92019-01-28 13:41:19 -0500564 writer.beginArray(SKDEBUGCANVAS_ATTRIBUTE_VERBS);
ethannicholas50a8dd02016-02-10 05:40:46 -0800565 SkPath::Iter iter(path, false);
566 SkPoint pts[4];
567 SkPath::Verb verb;
568 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
Brian Osmand8a90f92019-01-28 13:41:19 -0500569 if (verb == SkPath::kClose_Verb) {
570 writer.appendString(SKDEBUGCANVAS_VERB_CLOSE);
571 continue;
572 }
573 writer.beginObject(); // verb
ethannicholas50a8dd02016-02-10 05:40:46 -0800574 switch (verb) {
575 case SkPath::kLine_Verb: {
Brian Osmand8a90f92019-01-28 13:41:19 -0500576 writer.appendName(SKDEBUGCANVAS_VERB_LINE);
577 MakeJsonPoint(writer, pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800578 break;
579 }
580 case SkPath::kQuad_Verb: {
Brian Osmand8a90f92019-01-28 13:41:19 -0500581 writer.beginArray(SKDEBUGCANVAS_VERB_QUAD);
582 MakeJsonPoint(writer, pts[1]);
583 MakeJsonPoint(writer, pts[2]);
584 writer.endArray(); // quad coords
ethannicholas50a8dd02016-02-10 05:40:46 -0800585 break;
586 }
587 case SkPath::kCubic_Verb: {
Brian Osmand8a90f92019-01-28 13:41:19 -0500588 writer.beginArray(SKDEBUGCANVAS_VERB_CUBIC);
589 MakeJsonPoint(writer, pts[1]);
590 MakeJsonPoint(writer, pts[2]);
591 MakeJsonPoint(writer, pts[3]);
592 writer.endArray(); // cubic coords
ethannicholas50a8dd02016-02-10 05:40:46 -0800593 break;
594 }
595 case SkPath::kConic_Verb: {
Brian Osmand8a90f92019-01-28 13:41:19 -0500596 writer.beginArray(SKDEBUGCANVAS_VERB_CONIC);
597 MakeJsonPoint(writer, pts[1]);
598 MakeJsonPoint(writer, pts[2]);
599 writer.appendFloat(iter.conicWeight());
600 writer.endArray(); // conic coords
ethannicholas50a8dd02016-02-10 05:40:46 -0800601 break;
602 }
603 case SkPath::kMove_Verb: {
Brian Osmand8a90f92019-01-28 13:41:19 -0500604 writer.appendName(SKDEBUGCANVAS_VERB_MOVE);
605 MakeJsonPoint(writer, pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800606 break;
607 }
608 case SkPath::kClose_Verb:
ethannicholas50a8dd02016-02-10 05:40:46 -0800609 case SkPath::kDone_Verb:
Brian Osmand8a90f92019-01-28 13:41:19 -0500610 // Unreachable
ethannicholas50a8dd02016-02-10 05:40:46 -0800611 break;
612 }
Brian Osmand8a90f92019-01-28 13:41:19 -0500613 writer.endObject(); // verb
ethannicholas50a8dd02016-02-10 05:40:46 -0800614 }
Brian Osmand8a90f92019-01-28 13:41:19 -0500615 writer.endArray(); // verbs
616 writer.endObject(); // path
ethannicholas50a8dd02016-02-10 05:40:46 -0800617}
618
Brian Osmand8a90f92019-01-28 13:41:19 -0500619void SkDrawCommand::MakeJsonRegion(SkJSONWriter& writer, const SkRegion& region) {
Brian Osmanc25e2692018-03-12 10:57:28 -0400620 // TODO: Actually serialize the rectangles, rather than just devolving to path
621 SkPath path;
622 region.getBoundaryPath(&path);
Brian Osmand8a90f92019-01-28 13:41:19 -0500623 MakeJsonPath(writer, path);
ethannicholas50a8dd02016-02-10 05:40:46 -0800624}
625
Brian Osmand8a90f92019-01-28 13:41:19 -0500626static const char* regionop_name(SkClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800627 switch (op) {
Mike Reedc1f77742016-12-09 09:00:50 -0500628 case kDifference_SkClipOp:
Brian Osmand8a90f92019-01-28 13:41:19 -0500629 return SKDEBUGCANVAS_REGIONOP_DIFFERENCE;
Mike Reedc1f77742016-12-09 09:00:50 -0500630 case kIntersect_SkClipOp:
Brian Osmand8a90f92019-01-28 13:41:19 -0500631 return SKDEBUGCANVAS_REGIONOP_INTERSECT;
Mike Reedc1f77742016-12-09 09:00:50 -0500632 case kUnion_SkClipOp:
Brian Osmand8a90f92019-01-28 13:41:19 -0500633 return SKDEBUGCANVAS_REGIONOP_UNION;
Mike Reedc1f77742016-12-09 09:00:50 -0500634 case kXOR_SkClipOp:
Brian Osmand8a90f92019-01-28 13:41:19 -0500635 return SKDEBUGCANVAS_REGIONOP_XOR;
Mike Reedc1f77742016-12-09 09:00:50 -0500636 case kReverseDifference_SkClipOp:
Brian Osmand8a90f92019-01-28 13:41:19 -0500637 return SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE;
Mike Reedc1f77742016-12-09 09:00:50 -0500638 case kReplace_SkClipOp:
Brian Osmand8a90f92019-01-28 13:41:19 -0500639 return SKDEBUGCANVAS_REGIONOP_REPLACE;
ethannicholas50a8dd02016-02-10 05:40:46 -0800640 default:
641 SkASSERT(false);
Brian Osmand8a90f92019-01-28 13:41:19 -0500642 return "<invalid region op>";
Brian Salomon23356442018-11-30 15:33:19 -0500643 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800644}
645
Brian Osmand8a90f92019-01-28 13:41:19 -0500646static const char* pointmode_name(SkCanvas::PointMode mode) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800647 switch (mode) {
648 case SkCanvas::kPoints_PointMode:
Brian Osmand8a90f92019-01-28 13:41:19 -0500649 return SKDEBUGCANVAS_POINTMODE_POINTS;
ethannicholas50a8dd02016-02-10 05:40:46 -0800650 case SkCanvas::kLines_PointMode:
Brian Osmand8a90f92019-01-28 13:41:19 -0500651 return SKDEBUGCANVAS_POINTMODE_LINES;
halcanary9d524f22016-03-29 09:03:52 -0700652 case SkCanvas::kPolygon_PointMode:
Brian Osmand8a90f92019-01-28 13:41:19 -0500653 return SKDEBUGCANVAS_POINTMODE_POLYGON;
ethannicholas50a8dd02016-02-10 05:40:46 -0800654 default:
655 SkASSERT(false);
Brian Osmand8a90f92019-01-28 13:41:19 -0500656 return "<invalid point mode>";
Brian Salomon23356442018-11-30 15:33:19 -0500657 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800658}
659
Brian Osmand8a90f92019-01-28 13:41:19 -0500660static void store_scalar(SkJSONWriter& writer, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800661 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800662 if (value != defaultValue) {
Brian Osmand8a90f92019-01-28 13:41:19 -0500663 writer.appendFloat(key, value);
ethannicholas50a8dd02016-02-10 05:40:46 -0800664 }
665}
666
Brian Osmand8a90f92019-01-28 13:41:19 -0500667static void store_bool(SkJSONWriter& writer,const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800668 if (value != defaultValue) {
Brian Osmand8a90f92019-01-28 13:41:19 -0500669 writer.appendBool(key, value);
ethannicholas50a8dd02016-02-10 05:40:46 -0800670 }
671}
672
Brian Osmand8a90f92019-01-28 13:41:19 -0500673static SkString encode_data(const void* bytes, size_t count, const char* contentType,
674 UrlDataManager& urlDataManager) {
bungeman38d909e2016-08-02 14:40:46 -0700675 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
Brian Osmand8a90f92019-01-28 13:41:19 -0500676 return urlDataManager.addData(data.get(), contentType);
ethannicholas50a8dd02016-02-10 05:40:46 -0800677}
678
Brian Osmand8a90f92019-01-28 13:41:19 -0500679void SkDrawCommand::flatten(const SkFlattenable* flattenable, SkJSONWriter& writer,
brianosmanfad98562016-05-04 11:06:28 -0700680 UrlDataManager& urlDataManager) {
681 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800682 flattenable->flatten(buffer);
683 void* data = sk_malloc_throw(buffer.bytesWritten());
684 buffer.writeToMemory(data);
Brian Osmand8a90f92019-01-28 13:41:19 -0500685 SkString url = encode_data(data, buffer.bytesWritten(), "application/octet-stream",
686 urlDataManager);
687 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_NAME, flattenable->getTypeName());
688 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_DATA, url.c_str());
brianosmanfad98562016-05-04 11:06:28 -0700689
Brian Osmand8a90f92019-01-28 13:41:19 -0500690 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_VALUES);
691 SkJsonWriteBuffer jsonBuffer(&writer, &urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -0700692 flattenable->flatten(jsonBuffer);
Brian Osmand8a90f92019-01-28 13:41:19 -0500693 writer.endObject(); // values
brianosmanfad98562016-05-04 11:06:28 -0700694
ethannicholasf62a8b72016-02-11 10:35:21 -0800695 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800696}
697
Brian Osmand9ea8162018-08-08 17:03:39 -0400698void SkDrawCommand::WritePNG(SkBitmap bitmap, SkWStream& out) {
699 SkPixmap pm;
700 SkAssertResult(bitmap.peekPixels(&pm));
ethannicholasf67531f2016-03-21 10:19:39 -0700701
Brian Osmand9ea8162018-08-08 17:03:39 -0400702 SkPngEncoder::Options options;
703 options.fZLibLevel = 1;
704 options.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
705 SkPngEncoder::Encode(&out, pm, options);
ethannicholasf67531f2016-03-21 10:19:39 -0700706}
707
Brian Osmand8a90f92019-01-28 13:41:19 -0500708bool SkDrawCommand::flatten(const SkImage& image, SkJSONWriter& writer,
brianosmanfad98562016-05-04 11:06:28 -0700709 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700710 size_t rowBytes = 4 * image.width();
Hal Canary95e3c052017-01-11 12:44:43 -0500711 SkAutoMalloc buffer(rowBytes * image.height());
halcanary9d524f22016-03-29 09:03:52 -0700712 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700713 kN32_SkColorType, kPremul_SkAlphaType);
714 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
715 SkDebugf("readPixels failed\n");
716 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800717 }
msaretta5cf4f42016-06-30 10:06:51 -0700718
719 SkBitmap bm;
720 bm.installPixels(dstInfo, buffer.get(), rowBytes);
msaretta5cf4f42016-06-30 10:06:51 -0700721
ethannicholasf67531f2016-03-21 10:19:39 -0700722 SkDynamicMemoryWStream out;
Brian Osmand9ea8162018-08-08 17:03:39 -0400723 SkDrawCommand::WritePNG(bm, out);
reed42943c82016-09-12 12:01:44 -0700724 sk_sp<SkData> encoded = out.detachAsData();
Brian Osmand8a90f92019-01-28 13:41:19 -0500725 SkString url = encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager);
726 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_DATA, url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800727 return true;
728}
729
730static const char* color_type_name(SkColorType colorType) {
731 switch (colorType) {
732 case kARGB_4444_SkColorType:
733 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
734 case kRGBA_8888_SkColorType:
735 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
736 case kBGRA_8888_SkColorType:
737 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
738 case kRGB_565_SkColorType:
739 return SKDEBUGCANVAS_COLORTYPE_565;
740 case kGray_8_SkColorType:
741 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
ethannicholas50a8dd02016-02-10 05:40:46 -0800742 case kAlpha_8_SkColorType:
743 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
744 default:
745 SkASSERT(false);
746 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
747 }
748}
749
750static const char* alpha_type_name(SkAlphaType alphaType) {
751 switch (alphaType) {
752 case kOpaque_SkAlphaType:
753 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
754 case kPremul_SkAlphaType:
755 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
756 case kUnpremul_SkAlphaType:
757 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
758 default:
759 SkASSERT(false);
760 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
761 }
762}
763
Brian Osmand8a90f92019-01-28 13:41:19 -0500764bool SkDrawCommand::flatten(const SkBitmap& bitmap, SkJSONWriter& writer,
brianosmanfad98562016-05-04 11:06:28 -0700765 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700766 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
Brian Osmand8a90f92019-01-28 13:41:19 -0500767 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_COLOR, color_type_name(bitmap.colorType()));
768 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_ALPHA, alpha_type_name(bitmap.alphaType()));
769 bool success = flatten(*image, writer, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800770 return success;
771}
772
Brian Osmand8a90f92019-01-28 13:41:19 -0500773static void apply_font_hinting(const SkFont& font, SkJSONWriter& writer) {
Mike Reed60a0e872019-01-04 09:41:49 -0500774 SkFontHinting hinting = font.getHinting();
halcanaryf412f092016-08-25 11:10:41 -0700775 if (hinting != SkPaintDefaults_Hinting) {
776 switch (hinting) {
Mike Reed9edbf422018-11-07 19:54:33 -0500777 case kNo_SkFontHinting:
Brian Osmand8a90f92019-01-28 13:41:19 -0500778 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_HINTING, SKDEBUGCANVAS_HINTING_NONE);
halcanaryf412f092016-08-25 11:10:41 -0700779 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500780 case kSlight_SkFontHinting:
Brian Osmand8a90f92019-01-28 13:41:19 -0500781 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_HINTING, SKDEBUGCANVAS_HINTING_SLIGHT);
halcanaryf412f092016-08-25 11:10:41 -0700782 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500783 case kNormal_SkFontHinting:
Brian Osmand8a90f92019-01-28 13:41:19 -0500784 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_HINTING, SKDEBUGCANVAS_HINTING_NORMAL);
halcanaryf412f092016-08-25 11:10:41 -0700785 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500786 case kFull_SkFontHinting:
Brian Osmand8a90f92019-01-28 13:41:19 -0500787 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_HINTING, SKDEBUGCANVAS_HINTING_FULL);
halcanaryf412f092016-08-25 11:10:41 -0700788 break;
789 }
790 }
791}
792
Brian Osmand8a90f92019-01-28 13:41:19 -0500793static void apply_font_edging(const SkFont& font, SkJSONWriter& writer) {
Mike Reed60a0e872019-01-04 09:41:49 -0500794 switch (font.getEdging()) {
795 case SkFont::Edging::kAlias:
Brian Osmand8a90f92019-01-28 13:41:19 -0500796 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_EDGING, SKDEBUGCANVAS_EDGING_ALIAS);
Mike Reed60a0e872019-01-04 09:41:49 -0500797 break;
798 case SkFont::Edging::kAntiAlias:
Brian Osmand8a90f92019-01-28 13:41:19 -0500799 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_EDGING, SKDEBUGCANVAS_EDGING_ANTIALIAS);
Mike Reed60a0e872019-01-04 09:41:49 -0500800 break;
801 case SkFont::Edging::kSubpixelAntiAlias:
Brian Osmand8a90f92019-01-28 13:41:19 -0500802 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_EDGING, SKDEBUGCANVAS_EDGING_SUBPIXELANTIALIAS);
Mike Reed60a0e872019-01-04 09:41:49 -0500803 break;
804 }
805}
806
Brian Osmand8a90f92019-01-28 13:41:19 -0500807static void apply_paint_color(const SkPaint& paint, SkJSONWriter& writer) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800808 SkColor color = paint.getColor();
809 if (color != SK_ColorBLACK) {
Brian Osmand8a90f92019-01-28 13:41:19 -0500810 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COLOR);
811 SkDrawCommand::MakeJsonColor(writer, color);
ethannicholas50a8dd02016-02-10 05:40:46 -0800812 }
813}
814
Brian Osmand8a90f92019-01-28 13:41:19 -0500815static void apply_paint_style(const SkPaint& paint, SkJSONWriter& writer) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800816 SkPaint::Style style = paint.getStyle();
817 if (style != SkPaint::kFill_Style) {
818 switch (style) {
819 case SkPaint::kStroke_Style: {
Brian Osmand8a90f92019-01-28 13:41:19 -0500820 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_STYLE, SKDEBUGCANVAS_STYLE_STROKE);
ethannicholas50a8dd02016-02-10 05:40:46 -0800821 break;
822 }
823 case SkPaint::kStrokeAndFill_Style: {
Brian Osmand8a90f92019-01-28 13:41:19 -0500824 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_STYLE, SKDEBUGCANVAS_STYLE_STROKEANDFILL);
ethannicholas50a8dd02016-02-10 05:40:46 -0800825 break;
826 }
827 default: SkASSERT(false);
828 }
829 }
830}
831
Brian Osmand8a90f92019-01-28 13:41:19 -0500832static void apply_paint_cap(const SkPaint& paint, SkJSONWriter& writer) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800833 SkPaint::Cap cap = paint.getStrokeCap();
834 if (cap != SkPaint::kDefault_Cap) {
835 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800836 case SkPaint::kButt_Cap:
Brian Osmand8a90f92019-01-28 13:41:19 -0500837 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_CAP, SKDEBUGCANVAS_CAP_BUTT);
ethannicholas50a8dd02016-02-10 05:40:46 -0800838 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800839 case SkPaint::kRound_Cap:
Brian Osmand8a90f92019-01-28 13:41:19 -0500840 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_CAP, SKDEBUGCANVAS_CAP_ROUND);
ethannicholas50a8dd02016-02-10 05:40:46 -0800841 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800842 case SkPaint::kSquare_Cap:
Brian Osmand8a90f92019-01-28 13:41:19 -0500843 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_CAP, SKDEBUGCANVAS_CAP_SQUARE);
ethannicholas50a8dd02016-02-10 05:40:46 -0800844 break;
ethannicholas50a8dd02016-02-10 05:40:46 -0800845 default: SkASSERT(false);
846 }
847 }
848}
ethannicholas1446a9a2016-02-10 14:05:02 -0800849
Brian Osmand8a90f92019-01-28 13:41:19 -0500850static void apply_paint_join(const SkPaint& paint, SkJSONWriter& writer) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800851 SkPaint::Join join = paint.getStrokeJoin();
852 if (join != SkPaint::kDefault_Join) {
853 switch (join) {
854 case SkPaint::kMiter_Join:
Brian Osmand8a90f92019-01-28 13:41:19 -0500855 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN, SKDEBUGCANVAS_MITER_JOIN);
ethannicholas1446a9a2016-02-10 14:05:02 -0800856 break;
857 case SkPaint::kRound_Join:
Brian Osmand8a90f92019-01-28 13:41:19 -0500858 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN, SKDEBUGCANVAS_ROUND_JOIN);
ethannicholas1446a9a2016-02-10 14:05:02 -0800859 break;
860 case SkPaint::kBevel_Join:
Brian Osmand8a90f92019-01-28 13:41:19 -0500861 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN, SKDEBUGCANVAS_BEVEL_JOIN);
ethannicholas1446a9a2016-02-10 14:05:02 -0800862 break;
863 default: SkASSERT(false);
864 }
865 }
866}
867
Brian Osmand8a90f92019-01-28 13:41:19 -0500868static void apply_paint_filterquality(const SkPaint& paint, SkJSONWriter& writer) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800869 SkFilterQuality quality = paint.getFilterQuality();
870 switch (quality) {
871 case kNone_SkFilterQuality:
872 break;
873 case kLow_SkFilterQuality:
Brian Osmand8a90f92019-01-28 13:41:19 -0500874 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY,
875 SKDEBUGCANVAS_FILTERQUALITY_LOW);
ethannicholas1446a9a2016-02-10 14:05:02 -0800876 break;
877 case kMedium_SkFilterQuality:
Brian Osmand8a90f92019-01-28 13:41:19 -0500878 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY,
879 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
ethannicholas1446a9a2016-02-10 14:05:02 -0800880 break;
881 case kHigh_SkFilterQuality:
Brian Osmand8a90f92019-01-28 13:41:19 -0500882 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY,
883 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
ethannicholas1446a9a2016-02-10 14:05:02 -0800884 break;
885 }
886}
887
Brian Osmand8a90f92019-01-28 13:41:19 -0500888static void apply_paint_maskfilter(const SkPaint& paint, SkJSONWriter& writer,
ethannicholasf62a8b72016-02-11 10:35:21 -0800889 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800890 SkMaskFilter* maskFilter = paint.getMaskFilter();
891 if (maskFilter != nullptr) {
Mike Reed80747ef2018-01-23 15:29:32 -0500892 SkMaskFilterBase::BlurRec blurRec;
893 if (as_MFB(maskFilter)->asABlur(&blurRec)) {
Brian Osmand8a90f92019-01-28 13:41:19 -0500894 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_BLUR);
895 writer.appendFloat(SKDEBUGCANVAS_ATTRIBUTE_SIGMA, blurRec.fSigma);
ethannicholas50a8dd02016-02-10 05:40:46 -0800896 switch (blurRec.fStyle) {
897 case SkBlurStyle::kNormal_SkBlurStyle:
Brian Osmand8a90f92019-01-28 13:41:19 -0500898 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_STYLE,
899 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -0800900 break;
901 case SkBlurStyle::kSolid_SkBlurStyle:
Brian Osmand8a90f92019-01-28 13:41:19 -0500902 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_STYLE,
903 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -0800904 break;
905 case SkBlurStyle::kOuter_SkBlurStyle:
Brian Osmand8a90f92019-01-28 13:41:19 -0500906 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_STYLE,
907 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800908 break;
909 case SkBlurStyle::kInner_SkBlurStyle:
Brian Osmand8a90f92019-01-28 13:41:19 -0500910 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_STYLE,
911 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800912 break;
913 default:
914 SkASSERT(false);
915 }
Brian Osmand8a90f92019-01-28 13:41:19 -0500916 writer.endObject(); // blur
ethannicholas50a8dd02016-02-10 05:40:46 -0800917 } else {
Brian Osmand8a90f92019-01-28 13:41:19 -0500918 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER);
919 SkDrawCommand::flatten(maskFilter, writer, urlDataManager);
920 writer.endObject(); // maskFilter
ethannicholas50a8dd02016-02-10 05:40:46 -0800921 }
922 }
923}
924
Brian Osmand8a90f92019-01-28 13:41:19 -0500925static void apply_paint_patheffect(const SkPaint& paint, SkJSONWriter& writer,
ethannicholasf62a8b72016-02-11 10:35:21 -0800926 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800927 SkPathEffect* pathEffect = paint.getPathEffect();
928 if (pathEffect != nullptr) {
929 SkPathEffect::DashInfo dashInfo;
930 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
931 if (dashType == SkPathEffect::kDash_DashType) {
932 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
933 pathEffect->asADash(&dashInfo);
Brian Osmand8a90f92019-01-28 13:41:19 -0500934 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_DASHING);
935 writer.beginArray(SKDEBUGCANVAS_ATTRIBUTE_INTERVALS, false);
ethannicholas50a8dd02016-02-10 05:40:46 -0800936 for (int32_t i = 0; i < dashInfo.fCount; i++) {
Brian Osmand8a90f92019-01-28 13:41:19 -0500937 writer.appendFloat(dashInfo.fIntervals[i]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800938 }
Brian Osmand8a90f92019-01-28 13:41:19 -0500939 writer.endArray(); // intervals
ethannicholas50a8dd02016-02-10 05:40:46 -0800940 sk_free(dashInfo.fIntervals);
Brian Osmand8a90f92019-01-28 13:41:19 -0500941 writer.appendFloat(SKDEBUGCANVAS_ATTRIBUTE_PHASE, dashInfo.fPhase);
942 writer.endObject(); // dashing
ethannicholas50a8dd02016-02-10 05:40:46 -0800943 } else {
Brian Osmand8a90f92019-01-28 13:41:19 -0500944 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT);
945 SkDrawCommand::flatten(pathEffect, writer, urlDataManager);
946 writer.endObject(); // pathEffect
ethannicholas50a8dd02016-02-10 05:40:46 -0800947 }
948 }
949}
halcanary9d524f22016-03-29 09:03:52 -0700950
Brian Osmand8a90f92019-01-28 13:41:19 -0500951static void apply_font_typeface(const SkFont& font, SkJSONWriter& writer,
ethannicholasf62a8b72016-02-11 10:35:21 -0800952 UrlDataManager& urlDataManager) {
Herb Derby087fad72019-01-22 14:45:16 -0500953 SkTypeface* typeface = font.getTypefaceOrDefault();
ethannicholas50a8dd02016-02-10 05:40:46 -0800954 if (typeface != nullptr) {
Brian Osmand8a90f92019-01-28 13:41:19 -0500955 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE);
ethannicholasf62a8b72016-02-11 10:35:21 -0800956 SkDynamicMemoryWStream buffer;
957 typeface->serialize(&buffer);
958 void* data = sk_malloc_throw(buffer.bytesWritten());
959 buffer.copyTo(data);
Brian Osmand8a90f92019-01-28 13:41:19 -0500960 SkString url = encode_data(data, buffer.bytesWritten(), "application/octet-stream",
961 urlDataManager);
962 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_DATA, url.c_str());
ethannicholasf62a8b72016-02-11 10:35:21 -0800963 sk_free(data);
Brian Osmand8a90f92019-01-28 13:41:19 -0500964 writer.endObject();
ethannicholas50a8dd02016-02-10 05:40:46 -0800965 }
966}
967
Brian Osmand8a90f92019-01-28 13:41:19 -0500968static void apply_flattenable(const char* key, SkFlattenable* flattenable, SkJSONWriter& writer,
969 UrlDataManager& urlDataManager) {
970 if (flattenable != nullptr) {
971 writer.beginObject(key);
972 SkDrawCommand::flatten(flattenable, writer, urlDataManager);
973 writer.endObject();
ethannicholas50a8dd02016-02-10 05:40:46 -0800974 }
975}
976
Brian Osmand8a90f92019-01-28 13:41:19 -0500977void SkDrawCommand::MakeJsonPaint(SkJSONWriter& writer, const SkPaint& paint,
978 UrlDataManager& urlDataManager) {
979 writer.beginObject();
980 store_scalar(writer, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
981 store_scalar(writer, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -0800982 SkPaintDefaults_MiterLimit);
Brian Osmand8a90f92019-01-28 13:41:19 -0500983 store_bool(writer, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
984 store_bool(writer, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -0400985
Brian Osmand8a90f92019-01-28 13:41:19 -0500986 apply_paint_color(paint, writer);
987 apply_paint_style(paint, writer);
988 apply_paint_blend_mode(paint, writer);
989 apply_paint_cap(paint, writer);
990 apply_paint_join(paint, writer);
991 apply_paint_filterquality(paint, writer);
992 apply_paint_patheffect(paint, writer, urlDataManager);
993 apply_paint_maskfilter(paint, writer, urlDataManager);
994 apply_flattenable(SKDEBUGCANVAS_ATTRIBUTE_SHADER, paint.getShader(), writer, urlDataManager);
995 apply_flattenable(SKDEBUGCANVAS_ATTRIBUTE_LOOPER, paint.getLooper(), writer, urlDataManager);
996 apply_flattenable(SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER, paint.getImageFilter(), writer,
997 urlDataManager);
998 apply_flattenable(SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER, paint.getColorFilter(), writer,
999 urlDataManager);
1000 writer.endObject(); // paint
Mike Reed60a0e872019-01-04 09:41:49 -05001001}
1002
Brian Osmand8a90f92019-01-28 13:41:19 -05001003static void MakeJsonFont(const SkFont& font, SkJSONWriter& writer, UrlDataManager& urlDataManager) {
1004 writer.beginObject();
1005 store_bool(writer, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, font.isEmbolden(), false);
1006 store_bool(writer, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, font.isLinearMetrics(), false);
1007 store_bool(writer, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, font.isSubpixel(), false);
1008 store_bool(writer, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, font.isEmbeddedBitmaps(), false);
1009 store_bool(writer, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, font.isForceAutoHinting(), false);
Mike Reed60a0e872019-01-04 09:41:49 -05001010
Brian Osmand8a90f92019-01-28 13:41:19 -05001011 store_scalar(writer, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, font.getSize(),
Mike Reed60a0e872019-01-04 09:41:49 -05001012 SkPaintDefaults_TextSize);
Brian Osmand8a90f92019-01-28 13:41:19 -05001013 store_scalar(writer, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, font.getScaleX(), SK_Scalar1);
1014 store_scalar(writer, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, font.getSkewX(), 0.0f);
1015 apply_font_edging(font, writer);
1016 apply_font_hinting(font, writer);
1017 apply_font_typeface(font, writer, urlDataManager);
1018 writer.endObject(); // font
ethannicholas50a8dd02016-02-10 05:40:46 -08001019}
1020
Brian Osmand8a90f92019-01-28 13:41:19 -05001021void SkDrawCommand::MakeJsonLattice(SkJSONWriter& writer, const SkCanvas::Lattice& lattice) {
1022 writer.beginObject();
1023 writer.appendS32(SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT, lattice.fXCount);
1024 writer.appendS32(SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT, lattice.fYCount);
Stan Ilievac42aeb2017-01-12 16:20:50 -05001025 if (nullptr != lattice.fBounds) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001026 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_BOUNDS);
1027 MakeJsonIRect(writer, *lattice.fBounds);
Stan Ilievac42aeb2017-01-12 16:20:50 -05001028 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001029 writer.beginArray(SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS);
Stan Ilievac42aeb2017-01-12 16:20:50 -05001030 for (int i = 0; i < lattice.fXCount; i++) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001031 writer.appendS32(lattice.fXDivs[i]);
Stan Ilievac42aeb2017-01-12 16:20:50 -05001032 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001033 writer.endArray(); // xdivs
1034 writer.beginArray(SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS);
Stan Ilievac42aeb2017-01-12 16:20:50 -05001035 for (int i = 0; i < lattice.fYCount; i++) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001036 writer.appendS32(lattice.fYDivs[i]);
Stan Ilievac42aeb2017-01-12 16:20:50 -05001037 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001038 writer.endArray(); // ydivs
Stan Ilievca8c0952017-12-11 13:01:58 -05001039 if (nullptr != lattice.fRectTypes) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001040 writer.beginArray(SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS);
Stan Ilievac42aeb2017-01-12 16:20:50 -05001041 int flagCount = 0;
1042 for (int row = 0; row < lattice.fYCount+1; row++) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001043 writer.beginArray();
Stan Ilievac42aeb2017-01-12 16:20:50 -05001044 for (int column = 0; column < lattice.fXCount+1; column++) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001045 writer.appendS32(lattice.fRectTypes[flagCount++]);
Stan Ilievac42aeb2017-01-12 16:20:50 -05001046 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001047 writer.endArray(); // row
Stan Ilievac42aeb2017-01-12 16:20:50 -05001048 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001049 writer.endArray();
Stan Ilievac42aeb2017-01-12 16:20:50 -05001050 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001051 writer.endObject();
Stan Ilievac42aeb2017-01-12 16:20:50 -05001052}
1053
Brian Osmanc25e2692018-03-12 10:57:28 -04001054SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kClear_OpType) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001055 fColor = color;
ethannicholas1446a9a2016-02-10 14:05:02 -08001056}
1057
1058void SkClearCommand::execute(SkCanvas* canvas) const {
1059 canvas->clear(fColor);
1060}
1061
Brian Osmand8a90f92019-01-28 13:41:19 -05001062void SkClearCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1063 INHERITED::toJSON(writer, urlDataManager);
1064 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COLOR);
1065 MakeJsonColor(writer, fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001066}
1067
Mike Reedc1f77742016-12-09 09:00:50 -05001068SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001069 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001070 fPath = path;
1071 fOp = op;
1072 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001073}
1074
fmalita8c89c522014-11-08 16:18:56 -08001075void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001076 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001077}
1078
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001079bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001080 render_path(canvas, fPath);
1081 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001082}
1083
Brian Osmand8a90f92019-01-28 13:41:19 -05001084void SkClipPathCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1085 INHERITED::toJSON(writer, urlDataManager);
1086 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PATH); MakeJsonPath(writer, fPath);
1087 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_REGIONOP, regionop_name(fOp));
1088 writer.appendBool(SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, fDoAA);
ethannicholas50a8dd02016-02-10 05:40:46 -08001089}
1090
Mike Reedc1f77742016-12-09 09:00:50 -05001091SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001092 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001093 fRegion = region;
1094 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001095}
1096
fmalita8c89c522014-11-08 16:18:56 -08001097void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001098 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001099}
1100
Brian Osmand8a90f92019-01-28 13:41:19 -05001101void SkClipRegionCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1102 INHERITED::toJSON(writer, urlDataManager);
1103 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_REGION); MakeJsonRegion(writer, fRegion);
1104 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_REGIONOP, regionop_name(fOp));
ethannicholas50a8dd02016-02-10 05:40:46 -08001105}
1106
Mike Reedc1f77742016-12-09 09:00:50 -05001107SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001108 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001109 fRect = rect;
1110 fOp = op;
1111 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001112}
1113
fmalita8c89c522014-11-08 16:18:56 -08001114void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001115 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001116}
1117
Brian Osmand8a90f92019-01-28 13:41:19 -05001118void SkClipRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1119 INHERITED::toJSON(writer, urlDataManager);
1120 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COORDS); MakeJsonRect(writer, fRect);
1121 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_REGIONOP, regionop_name(fOp));
1122 writer.appendBool(SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001123
1124 SkString desc;
Brian Osmand8a90f92019-01-28 13:41:19 -05001125 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, fRect)->c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -08001126}
1127
Mike Reedc1f77742016-12-09 09:00:50 -05001128SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001129 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001130 fRRect = rrect;
1131 fOp = op;
1132 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001133}
1134
fmalita8c89c522014-11-08 16:18:56 -08001135void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001136 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001137}
1138
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001139bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001140 render_rrect(canvas, fRRect);
1141 return true;
1142}
1143
Brian Osmand8a90f92019-01-28 13:41:19 -05001144void SkClipRRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1145 INHERITED::toJSON(writer, urlDataManager);
1146 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COORDS); make_json_rrect(writer, fRRect);
1147 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_REGIONOP, regionop_name(fOp));
1148 writer.appendBool(SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, fDoAA);
ethannicholas50a8dd02016-02-10 05:40:46 -08001149}
1150
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001151SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001152 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001153 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001154}
1155
fmalita8c89c522014-11-08 16:18:56 -08001156void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001157 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001158}
1159
Brian Osmand8a90f92019-01-28 13:41:19 -05001160void SkConcatCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1161 INHERITED::toJSON(writer, urlDataManager);
1162 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_MATRIX); MakeJsonMatrix(writer, fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001163}
1164
reed97660cc2016-06-28 18:54:19 -07001165////
1166
1167SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1168 sk_sp<SkData> value)
1169 : INHERITED(kDrawAnnotation_OpType)
1170 , fRect(rect)
1171 , fKey(key)
1172 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001173{
robertphillipsfb409232016-06-29 10:28:11 -07001174}
reed97660cc2016-06-28 18:54:19 -07001175
1176void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1177 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1178}
1179
Brian Osmand8a90f92019-01-28 13:41:19 -05001180void SkDrawAnnotationCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1181 INHERITED::toJSON(writer, urlDataManager);
reed97660cc2016-06-28 18:54:19 -07001182
Brian Osmand8a90f92019-01-28 13:41:19 -05001183 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COORDS); MakeJsonRect(writer, fRect);
1184 writer.appendString("key", fKey.c_str());
reed97660cc2016-06-28 18:54:19 -07001185 if (fValue.get()) {
1186 // TODO: dump out the "value"
1187 }
reed67f62fa2016-06-29 11:36:34 -07001188
1189 SkString desc;
1190 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
Brian Osmand8a90f92019-01-28 13:41:19 -05001191 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC, desc.c_str());
reed97660cc2016-06-28 18:54:19 -07001192}
1193
reed97660cc2016-06-28 18:54:19 -07001194////
1195
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001196SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07001197 const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001198 : INHERITED(kDrawBitmap_OpType)
1199 , fBitmap(bitmap)
1200 , fLeft(left)
1201 , fTop(top)
1202 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001203
fmalita8c89c522014-11-08 16:18:56 -08001204void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001205 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001206}
1207
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001208bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001209 render_bitmap(canvas, fBitmap);
1210 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001211}
1212
Brian Osmand8a90f92019-01-28 13:41:19 -05001213void SkDrawBitmapCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1214 INHERITED::toJSON(writer, urlDataManager);
1215 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_BITMAP);
1216 flatten(fBitmap, writer, urlDataManager);
1217 writer.endObject();
1218 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COORDS); MakeJsonPoint(writer, fLeft, fTop);
1219 if (fPaint.isValid()) {
1220 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT);
Mike Reed8d0f8242019-01-28 14:31:18 -05001221 MakeJsonPaint(writer, *fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001222 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001223}
1224
Brian Osman78a76482018-05-18 16:59:13 -04001225SkDrawBitmapLatticeCommand::SkDrawBitmapLatticeCommand(const SkBitmap& bitmap,
1226 const SkCanvas::Lattice& lattice,
1227 const SkRect& dst, const SkPaint* paint)
1228 : INHERITED(kDrawBitmapLattice_OpType)
1229 , fBitmap(bitmap)
1230 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001231 , fDst(dst)
1232 , fPaint(paint) {}
Brian Osman78a76482018-05-18 16:59:13 -04001233
1234void SkDrawBitmapLatticeCommand::execute(SkCanvas* canvas) const {
1235 canvas->drawBitmapLattice(fBitmap, fLattice, fDst, fPaint.getMaybeNull());
1236}
1237
1238bool SkDrawBitmapLatticeCommand::render(SkCanvas* canvas) const {
1239 SkAutoCanvasRestore acr(canvas, true);
1240 canvas->clear(0xFFFFFFFF);
1241
1242 xlate_and_scale_to_bounds(canvas, fDst);
1243
1244 this->execute(canvas);
1245 return true;
1246}
1247
Brian Osmand8a90f92019-01-28 13:41:19 -05001248void SkDrawBitmapLatticeCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1249 INHERITED::toJSON(writer, urlDataManager);
1250 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_BITMAP);
1251 flatten(fBitmap, writer, urlDataManager);
1252 writer.endObject(); // bitmap
1253
1254 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_LATTICE); MakeJsonLattice(writer, fLattice);
1255 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_DST); MakeJsonRect(writer, fDst);
1256 if (fPaint.isValid()) {
1257 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT);
Mike Reed8d0f8242019-01-28 14:31:18 -05001258 MakeJsonPaint(writer, *fPaint, urlDataManager);
Brian Osman78a76482018-05-18 16:59:13 -04001259 }
1260
1261 SkString desc;
Brian Osmand8a90f92019-01-28 13:41:19 -05001262 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, fDst)->c_str());
Brian Osman78a76482018-05-18 16:59:13 -04001263}
1264
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001265SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00001266 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001267 : INHERITED(kDrawBitmapNine_OpType)
1268 , fBitmap(bitmap)
1269 , fCenter(center)
1270 , fDst(dst)
1271 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001272
fmalita8c89c522014-11-08 16:18:56 -08001273void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001274 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001275}
1276
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001277bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08001278 SkRect tmp = SkRect::Make(fCenter);
1279 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001280 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001281}
1282
Brian Osmand8a90f92019-01-28 13:41:19 -05001283void SkDrawBitmapNineCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1284 INHERITED::toJSON(writer, urlDataManager);
1285 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_BITMAP);
1286 flatten(fBitmap, writer, urlDataManager);
1287 writer.endObject(); // bitmap
1288
1289 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_CENTER); MakeJsonIRect(writer, fCenter);
1290 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_DST); MakeJsonRect(writer, fDst);
1291 if (fPaint.isValid()) {
1292 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT);
Mike Reed8d0f8242019-01-28 14:31:18 -05001293 MakeJsonPaint(writer, *fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001294 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001295}
1296
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001297SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00001298 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07001299 SkCanvas::SrcRectConstraint constraint)
Brian Osman8363be12018-05-29 13:38:07 -04001300 : INHERITED(kDrawBitmapRect_OpType)
1301 , fBitmap(bitmap)
1302 , fSrc(src)
1303 , fDst(dst)
1304 , fPaint(paint)
1305 , fConstraint(constraint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001306
fmalita8c89c522014-11-08 16:18:56 -08001307void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001308 canvas->legacy_drawBitmapRect(fBitmap, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
1309 fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001310}
1311
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001312bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001313 render_bitmap(canvas, fBitmap, fSrc.getMaybeNull());
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001314 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001315}
1316
Brian Osmand8a90f92019-01-28 13:41:19 -05001317void SkDrawBitmapRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1318 INHERITED::toJSON(writer, urlDataManager);
1319 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_BITMAP);
1320 flatten(fBitmap, writer, urlDataManager);
1321 writer.endObject(); // bitmap
1322
1323 if (fSrc.isValid()) {
Mike Reed8d0f8242019-01-28 14:31:18 -05001324 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_SRC); MakeJsonRect(writer, *fSrc);
Brian Osmand8a90f92019-01-28 13:41:19 -05001325 }
1326 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_DST); MakeJsonRect(writer, fDst);
1327 if (fPaint.isValid()) {
1328 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT);
Mike Reed8d0f8242019-01-28 14:31:18 -05001329 MakeJsonPaint(writer, *fPaint, urlDataManager);
Brian Osmand8a90f92019-01-28 13:41:19 -05001330 }
1331 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1332 writer.appendBool(SKDEBUGCANVAS_ATTRIBUTE_STRICT, true);
ethannicholas50a8dd02016-02-10 05:40:46 -08001333 }
reed67f62fa2016-06-29 11:36:34 -07001334
1335 SkString desc;
Brian Osmand8a90f92019-01-28 13:41:19 -05001336 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, fDst)->c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -08001337}
1338
fmalita651c9202015-07-22 10:23:01 -07001339SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
1340 const SkPaint* paint)
1341 : INHERITED(kDrawImage_OpType)
1342 , fImage(SkRef(image))
1343 , fLeft(left)
Brian Osman8363be12018-05-29 13:38:07 -04001344 , fTop(top)
1345 , fPaint(paint) {}
fmalita651c9202015-07-22 10:23:01 -07001346
1347void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001348 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07001349}
1350
1351bool SkDrawImageCommand::render(SkCanvas* canvas) const {
1352 SkAutoCanvasRestore acr(canvas, true);
1353 canvas->clear(0xFFFFFFFF);
1354
1355 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
1356 SkIntToScalar(fImage->width()),
1357 SkIntToScalar(fImage->height())));
1358 this->execute(canvas);
1359 return true;
1360}
1361
Brian Osmand8a90f92019-01-28 13:41:19 -05001362void SkDrawImageCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1363 INHERITED::toJSON(writer, urlDataManager);
1364 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_IMAGE);
1365 flatten(*fImage, writer, urlDataManager);
1366 writer.endObject(); // image
msarett0ac1bec2016-08-29 09:15:33 -07001367
Brian Osmand8a90f92019-01-28 13:41:19 -05001368 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COORDS); MakeJsonPoint(writer, fLeft, fTop);
1369 if (fPaint.isValid()) {
1370 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT);
Mike Reed8d0f8242019-01-28 14:31:18 -05001371 MakeJsonPaint(writer, *fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001372 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001373
1374 writer.appendU32(SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID, fImage->uniqueID());
1375 writer.appendS32(SKDEBUGCANVAS_ATTRIBUTE_WIDTH, fImage->width());
1376 writer.appendS32(SKDEBUGCANVAS_ATTRIBUTE_HEIGHT, fImage->height());
1377 switch (fImage->alphaType()) {
1378 case kOpaque_SkAlphaType:
1379 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_ALPHA, SKDEBUGCANVAS_ALPHATYPE_OPAQUE);
1380 break;
1381 case kPremul_SkAlphaType:
1382 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_ALPHA, SKDEBUGCANVAS_ALPHATYPE_PREMUL);
1383 break;
1384 case kUnpremul_SkAlphaType:
1385 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_ALPHA, SKDEBUGCANVAS_ALPHATYPE_UNPREMUL);
1386 break;
1387 default:
1388 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_ALPHA, SKDEBUGCANVAS_ALPHATYPE_UNKNOWN);
1389 break;
1390 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001391}
1392
Stan Ilievac42aeb2017-01-12 16:20:50 -05001393SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
1394 const SkCanvas::Lattice& lattice,
1395 const SkRect& dst, const SkPaint* paint)
1396 : INHERITED(kDrawImageLattice_OpType)
1397 , fImage(SkRef(image))
1398 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001399 , fDst(dst)
1400 , fPaint(paint) {}
Stan Ilievac42aeb2017-01-12 16:20:50 -05001401
1402void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
Brian Osman78a76482018-05-18 16:59:13 -04001403 canvas->drawImageLattice(fImage.get(), fLattice, fDst, fPaint.getMaybeNull());
Stan Ilievac42aeb2017-01-12 16:20:50 -05001404}
1405
1406bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
1407 SkAutoCanvasRestore acr(canvas, true);
1408 canvas->clear(0xFFFFFFFF);
1409
1410 xlate_and_scale_to_bounds(canvas, fDst);
1411
1412 this->execute(canvas);
1413 return true;
1414}
1415
Brian Osmand8a90f92019-01-28 13:41:19 -05001416void SkDrawImageLatticeCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1417 INHERITED::toJSON(writer, urlDataManager);
1418 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_IMAGE);
Mike Reed8d0f8242019-01-28 14:31:18 -05001419 flatten(*fImage, writer, urlDataManager);
Brian Osmand8a90f92019-01-28 13:41:19 -05001420 writer.endObject(); // image
1421
1422 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_LATTICE); MakeJsonLattice(writer, fLattice);
1423 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_DST); MakeJsonRect(writer, fDst);
1424 if (fPaint.isValid()) {
1425 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT);
Mike Reed8d0f8242019-01-28 14:31:18 -05001426 MakeJsonPaint(writer, *fPaint, urlDataManager);
Stan Ilievac42aeb2017-01-12 16:20:50 -05001427 }
1428
1429 SkString desc;
Brian Osmand8a90f92019-01-28 13:41:19 -05001430 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, fDst)->c_str());
Stan Ilievac42aeb2017-01-12 16:20:50 -05001431}
1432
fmalita651c9202015-07-22 10:23:01 -07001433SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
1434 const SkRect& dst, const SkPaint* paint,
1435 SkCanvas::SrcRectConstraint constraint)
1436 : INHERITED(kDrawImageRect_OpType)
1437 , fImage(SkRef(image))
Brian Osman8363be12018-05-29 13:38:07 -04001438 , fSrc(src)
fmalita651c9202015-07-22 10:23:01 -07001439 , fDst(dst)
Brian Osman8363be12018-05-29 13:38:07 -04001440 , fPaint(paint)
1441 , fConstraint(constraint) {}
fmalita651c9202015-07-22 10:23:01 -07001442
1443void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001444 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
1445 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07001446}
1447
1448bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
1449 SkAutoCanvasRestore acr(canvas, true);
1450 canvas->clear(0xFFFFFFFF);
1451
1452 xlate_and_scale_to_bounds(canvas, fDst);
1453
1454 this->execute(canvas);
1455 return true;
1456}
1457
Brian Osmand8a90f92019-01-28 13:41:19 -05001458void SkDrawImageRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1459 INHERITED::toJSON(writer, urlDataManager);
1460 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_IMAGE);
Mike Reed8d0f8242019-01-28 14:31:18 -05001461 flatten(*fImage, writer, urlDataManager);
Brian Osmand8a90f92019-01-28 13:41:19 -05001462 writer.endObject(); // image
1463
1464 if (fSrc.isValid()) {
Mike Reed8d0f8242019-01-28 14:31:18 -05001465 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_SRC); MakeJsonRect(writer, *fSrc);
Brian Osmand8a90f92019-01-28 13:41:19 -05001466 }
1467 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_DST); MakeJsonRect(writer, fDst);
1468 if (fPaint.isValid()) {
1469 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT);
Mike Reed8d0f8242019-01-28 14:31:18 -05001470 MakeJsonPaint(writer, *fPaint, urlDataManager);
Brian Osmand8a90f92019-01-28 13:41:19 -05001471 }
1472 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1473 writer.appendBool(SKDEBUGCANVAS_ATTRIBUTE_STRICT, true);
ethannicholas50a8dd02016-02-10 05:40:46 -08001474 }
reed67f62fa2016-06-29 11:36:34 -07001475
1476 SkString desc;
Brian Osmand8a90f92019-01-28 13:41:19 -05001477 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, fDst)->c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -08001478}
1479
Brian Salomond7065e72018-10-12 11:42:02 -04001480SkDrawImageSetCommand::SkDrawImageSetCommand(const SkCanvas::ImageSetEntry set[], int count,
Brian Salomond003d222018-11-26 13:25:05 -05001481 SkFilterQuality filterQuality, SkBlendMode mode)
Brian Salomond7065e72018-10-12 11:42:02 -04001482 : INHERITED(kDrawImageSet_OpType)
1483 , fSet(count)
1484 , fCount(count)
Brian Salomond7065e72018-10-12 11:42:02 -04001485 , fFilterQuality(filterQuality)
1486 , fMode(mode) {
1487 std::copy_n(set, count, fSet.get());
1488}
1489
1490void SkDrawImageSetCommand::execute(SkCanvas* canvas) const {
Brian Salomond003d222018-11-26 13:25:05 -05001491 canvas->experimental_DrawImageSetV1(fSet.get(), fCount, fFilterQuality, fMode);
Brian Salomond7065e72018-10-12 11:42:02 -04001492}
1493
Brian Osmanc25e2692018-03-12 10:57:28 -04001494SkDrawImageNineCommand::SkDrawImageNineCommand(const SkImage* image, const SkIRect& center,
1495 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001496 : INHERITED(kDrawImageNine_OpType)
1497 , fImage(SkRef(image))
1498 , fCenter(center)
1499 , fDst(dst)
1500 , fPaint(paint) {}
Brian Osmanc25e2692018-03-12 10:57:28 -04001501
1502void SkDrawImageNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001503 canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaint.getMaybeNull());
Brian Osmanc25e2692018-03-12 10:57:28 -04001504}
1505
1506bool SkDrawImageNineCommand::render(SkCanvas* canvas) const {
1507 SkAutoCanvasRestore acr(canvas, true);
1508 canvas->clear(0xFFFFFFFF);
1509
1510 xlate_and_scale_to_bounds(canvas, fDst);
1511
1512 this->execute(canvas);
1513 return true;
1514}
1515
Brian Osmand8a90f92019-01-28 13:41:19 -05001516void SkDrawImageNineCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1517 INHERITED::toJSON(writer, urlDataManager);
1518 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_IMAGE);
Mike Reed8d0f8242019-01-28 14:31:18 -05001519 flatten(*fImage, writer, urlDataManager);
Brian Osmand8a90f92019-01-28 13:41:19 -05001520 writer.endObject(); // image
1521
1522 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_CENTER); MakeJsonIRect(writer, fCenter);
1523 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_DST); MakeJsonRect(writer, fDst);
1524 if (fPaint.isValid()) {
1525 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT);
Mike Reed8d0f8242019-01-28 14:31:18 -05001526 MakeJsonPaint(writer, *fPaint, urlDataManager);
Brian Osmanc25e2692018-03-12 10:57:28 -04001527 }
Brian Osmanc25e2692018-03-12 10:57:28 -04001528}
1529
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001530SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001531 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001532 fOval = oval;
1533 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001534}
1535
fmalita8c89c522014-11-08 16:18:56 -08001536void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001537 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001538}
1539
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001540bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001541 canvas->clear(0xFFFFFFFF);
1542 canvas->save();
1543
1544 xlate_and_scale_to_bounds(canvas, fOval);
1545
1546 SkPaint p;
1547 p.setColor(SK_ColorBLACK);
1548 p.setStyle(SkPaint::kStroke_Style);
1549
1550 canvas->drawOval(fOval, p);
1551 canvas->restore();
1552
1553 return true;
1554}
1555
Brian Osmand8a90f92019-01-28 13:41:19 -05001556void SkDrawOvalCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1557 INHERITED::toJSON(writer, urlDataManager);
1558 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COORDS); MakeJsonRect(writer, fOval);
1559 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT); MakeJsonPaint(writer, fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001560}
1561
bsalomonac3aa242016-08-19 11:25:19 -07001562SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
1563 bool useCenter, const SkPaint& paint)
Brian Osmanc25e2692018-03-12 10:57:28 -04001564 : INHERITED(kDrawArc_OpType) {
bsalomonac3aa242016-08-19 11:25:19 -07001565 fOval = oval;
1566 fStartAngle = startAngle;
1567 fSweepAngle = sweepAngle;
1568 fUseCenter = useCenter;
1569 fPaint = paint;
bsalomonac3aa242016-08-19 11:25:19 -07001570}
1571
1572void SkDrawArcCommand::execute(SkCanvas* canvas) const {
1573 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
1574}
1575
1576bool SkDrawArcCommand::render(SkCanvas* canvas) const {
1577 canvas->clear(0xFFFFFFFF);
1578 canvas->save();
1579
1580 xlate_and_scale_to_bounds(canvas, fOval);
1581
1582 SkPaint p;
1583 p.setColor(SK_ColorBLACK);
1584 p.setStyle(SkPaint::kStroke_Style);
1585
1586 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
1587 canvas->restore();
1588
1589 return true;
1590}
1591
Brian Osmand8a90f92019-01-28 13:41:19 -05001592void SkDrawArcCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1593 INHERITED::toJSON(writer, urlDataManager);
1594 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COORDS); MakeJsonRect(writer, fOval);
1595 writer.appendFloat(SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE, fStartAngle);
1596 writer.appendFloat(SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE, fSweepAngle);
1597 writer.appendBool(SKDEBUGCANVAS_ATTRIBUTE_USECENTER, fUseCenter);
1598 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT); MakeJsonPaint(writer, fPaint, urlDataManager);
bsalomonac3aa242016-08-19 11:25:19 -07001599}
1600
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001601SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001602 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001603 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001604}
1605
fmalita8c89c522014-11-08 16:18:56 -08001606void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001607 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001608}
1609
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001610bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001611 canvas->clear(0xFFFFFFFF);
1612 canvas->drawPaint(fPaint);
1613 return true;
1614}
1615
Brian Osmand8a90f92019-01-28 13:41:19 -05001616void SkDrawPaintCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1617 INHERITED::toJSON(writer, urlDataManager);
1618 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT); MakeJsonPaint(writer, fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001619}
1620
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001621SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001622 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001623 fPath = path;
1624 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001625}
1626
fmalita8c89c522014-11-08 16:18:56 -08001627void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001628 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001629}
1630
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001631bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001632 render_path(canvas, fPath);
1633 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001634}
1635
Brian Osmand8a90f92019-01-28 13:41:19 -05001636void SkDrawPathCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1637 INHERITED::toJSON(writer, urlDataManager);
1638 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PATH); MakeJsonPath(writer, fPath);
1639 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT); MakeJsonPaint(writer, fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001640}
1641
Brian Osmanc25e2692018-03-12 10:57:28 -04001642SkDrawRegionCommand::SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint)
1643 : INHERITED(kDrawRegion_OpType) {
1644 fRegion = region;
1645 fPaint = paint;
Brian Osmanc25e2692018-03-12 10:57:28 -04001646}
1647
1648void SkDrawRegionCommand::execute(SkCanvas* canvas) const {
1649 canvas->drawRegion(fRegion, fPaint);
1650}
1651
1652bool SkDrawRegionCommand::render(SkCanvas* canvas) const {
1653 render_region(canvas, fRegion);
1654 return true;
1655}
1656
Brian Osmand8a90f92019-01-28 13:41:19 -05001657void SkDrawRegionCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1658 INHERITED::toJSON(writer, urlDataManager);
1659 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_REGION); MakeJsonRegion(writer, fRegion);
1660 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT); MakeJsonPaint(writer, fPaint, urlDataManager);
Brian Osmanc25e2692018-03-12 10:57:28 -04001661}
1662
fmalita160ebb22015-04-01 20:58:37 -07001663SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
1664 const SkMatrix* matrix,
1665 const SkPaint* paint)
1666 : INHERITED(kBeginDrawPicture_OpType)
Brian Osman8363be12018-05-29 13:38:07 -04001667 , fPicture(SkRef(picture))
1668 , fMatrix(matrix)
1669 , fPaint(paint) {}
fmalita160ebb22015-04-01 20:58:37 -07001670
1671void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
1672 if (fPaint.isValid()) {
1673 SkRect bounds = fPicture->cullRect();
1674 if (fMatrix.isValid()) {
Mike Reed8d0f8242019-01-28 14:31:18 -05001675 fMatrix->mapRect(&bounds);
fmalita160ebb22015-04-01 20:58:37 -07001676 }
1677 canvas->saveLayer(&bounds, fPaint.get());
1678 }
1679
1680 if (fMatrix.isValid()) {
1681 if (!fPaint.isValid()) {
1682 canvas->save();
1683 }
Mike Reed8d0f8242019-01-28 14:31:18 -05001684 canvas->concat(*fMatrix);
fmalita160ebb22015-04-01 20:58:37 -07001685 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001686}
1687
fmalita160ebb22015-04-01 20:58:37 -07001688bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001689 canvas->clear(0xFFFFFFFF);
1690 canvas->save();
1691
robertphillipsa8d7f0b2014-08-29 08:03:56 -07001692 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001693
robertphillips9b14f262014-06-04 05:40:44 -07001694 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001695
1696 canvas->restore();
1697
1698 return true;
1699}
1700
fmalita160ebb22015-04-01 20:58:37 -07001701SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
1702 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
1703
1704void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
1705 if (fRestore) {
1706 canvas->restore();
1707 }
1708}
1709
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001710SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001711 const SkPoint pts[], const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04001712 : INHERITED(kDrawPoints_OpType)
1713 , fMode(mode)
1714 , fPts(pts, count)
1715 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001716
fmalita8c89c522014-11-08 16:18:56 -08001717void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001718 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001719}
1720
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001721bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001722 canvas->clear(0xFFFFFFFF);
1723 canvas->save();
1724
1725 SkRect bounds;
1726
1727 bounds.setEmpty();
Brian Osman8363be12018-05-29 13:38:07 -04001728 for (int i = 0; i < fPts.count(); ++i) {
Mike Reed185ffe92018-01-08 17:09:54 -05001729 SkRectPriv::GrowToInclude(&bounds, fPts[i]);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001730 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00001731
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001732 xlate_and_scale_to_bounds(canvas, bounds);
1733
1734 SkPaint p;
1735 p.setColor(SK_ColorBLACK);
1736 p.setStyle(SkPaint::kStroke_Style);
1737
Brian Osman8363be12018-05-29 13:38:07 -04001738 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001739 canvas->restore();
1740
1741 return true;
1742}
1743
Brian Osmand8a90f92019-01-28 13:41:19 -05001744void SkDrawPointsCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1745 INHERITED::toJSON(writer, urlDataManager);
1746 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_MODE, pointmode_name(fMode));
1747 writer.beginArray(SKDEBUGCANVAS_ATTRIBUTE_POINTS);
Brian Osman8363be12018-05-29 13:38:07 -04001748 for (int i = 0; i < fPts.count(); i++) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001749 MakeJsonPoint(writer, fPts[i]);
ethannicholas50a8dd02016-02-10 05:40:46 -08001750 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001751 writer.endArray(); // points
1752 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT); MakeJsonPaint(writer, fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001753}
1754
fmalita37283c22016-09-13 10:00:23 -07001755SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07001756 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001757 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07001758 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07001759 , fXPos(x)
1760 , fYPos(y)
Brian Osman255735e2018-04-06 14:51:42 -04001761 , fPaint(paint) {}
fmalitab7425172014-08-26 07:56:44 -07001762
fmalita8c89c522014-11-08 16:18:56 -08001763void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07001764 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1765}
1766
fmalita55773872014-08-29 15:08:20 -07001767bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
1768 canvas->clear(SK_ColorWHITE);
1769 canvas->save();
1770
1771 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
1772 xlate_and_scale_to_bounds(canvas, bounds);
1773
fmalita37283c22016-09-13 10:00:23 -07001774 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07001775
1776 canvas->restore();
1777
1778 return true;
1779}
1780
Brian Osmand8a90f92019-01-28 13:41:19 -05001781void SkDrawTextBlobCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1782 INHERITED::toJSON(writer, urlDataManager);
1783 writer.beginArray(SKDEBUGCANVAS_ATTRIBUTE_RUNS);
ethannicholas50a8dd02016-02-10 05:40:46 -08001784 SkTextBlobRunIterator iter(fBlob.get());
1785 while (!iter.done()) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001786 writer.beginObject(); // run
1787 writer.beginArray(SKDEBUGCANVAS_ATTRIBUTE_GLYPHS);
ethannicholas50a8dd02016-02-10 05:40:46 -08001788 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001789 writer.appendU32(iter.glyphs()[i]);
1790 }
1791 writer.endArray(); // glyphs
1792 if (iter.positioning() != SkTextBlobRunIterator::kDefault_Positioning) {
1793 writer.beginArray(SKDEBUGCANVAS_ATTRIBUTE_POSITIONS);
1794 const SkScalar* iterPositions = iter.pos();
1795 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1796 switch (iter.positioning()) {
Florin Malitaab54e732018-07-27 09:47:15 -04001797 case SkTextBlobRunIterator::kFull_Positioning:
Brian Osmand8a90f92019-01-28 13:41:19 -05001798 MakeJsonPoint(writer, iterPositions[i * 2], iterPositions[i * 2 + 1]);
ethannicholas50a8dd02016-02-10 05:40:46 -08001799 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001800 case SkTextBlobRunIterator::kHorizontal_Positioning:
Brian Osmand8a90f92019-01-28 13:41:19 -05001801 writer.appendFloat(iterPositions[i]);
ethannicholas50a8dd02016-02-10 05:40:46 -08001802 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001803 case SkTextBlobRunIterator::kDefault_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001804 break;
Mike Reed30cf62b2018-12-20 11:18:24 -05001805 case SkTextBlobRunIterator::kRSXform_Positioning:
1806 // TODO_RSXFORM_BLOB
1807 break;
Brian Osmand8a90f92019-01-28 13:41:19 -05001808 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001809 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001810 writer.endArray(); // positions
ethannicholas50a8dd02016-02-10 05:40:46 -08001811 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001812 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_FONT);
1813 MakeJsonFont(iter.font(), writer, urlDataManager);
1814 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COORDS);
1815 MakeJsonPoint(writer, iter.offset());
1816
1817 writer.endObject(); // run
ethannicholas50a8dd02016-02-10 05:40:46 -08001818 iter.next();
1819 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001820 writer.endArray(); // runs
1821 writer.appendFloat(SKDEBUGCANVAS_ATTRIBUTE_X, fXPos);
1822 writer.appendFloat(SKDEBUGCANVAS_ATTRIBUTE_Y, fYPos);
reed6d2c3e72016-07-07 14:10:14 -07001823 SkRect bounds = fBlob->bounds();
Brian Osmand8a90f92019-01-28 13:41:19 -05001824 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COORDS); MakeJsonRect(writer, bounds);
1825 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT); MakeJsonPaint(writer, fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07001826
1827 SkString desc;
1828 // make the bounds local by applying the x,y
1829 bounds.offset(fXPos, fYPos);
Brian Osmand8a90f92019-01-28 13:41:19 -05001830 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, bounds)->c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -08001831}
1832
robertphillips9bafc302015-02-13 11:13:00 -08001833SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04001834 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08001835 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04001836 : INHERITED(kDrawPatch_OpType)
1837 , fBlendMode(bmode)
1838{
robertphillips9bafc302015-02-13 11:13:00 -08001839 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08001840 if (colors != nullptr) {
1841 memcpy(fColors, colors, sizeof(fColors));
1842 fColorsPtr = fColors;
1843 } else {
1844 fColorsPtr = nullptr;
1845 }
1846 if (texCoords != nullptr) {
1847 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
1848 fTexCoordsPtr = fTexCoords;
1849 } else {
1850 fTexCoordsPtr = nullptr;
1851 }
robertphillips9bafc302015-02-13 11:13:00 -08001852 fPaint = paint;
robertphillips9bafc302015-02-13 11:13:00 -08001853}
1854
1855void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04001856 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08001857}
1858
Brian Osmand8a90f92019-01-28 13:41:19 -05001859void SkDrawPatchCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1860 INHERITED::toJSON(writer, urlDataManager);
1861 writer.beginArray(SKDEBUGCANVAS_ATTRIBUTE_CUBICS);
ethannicholas1446a9a2016-02-10 14:05:02 -08001862 for (int i = 0; i < 12; i++) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001863 MakeJsonPoint(writer, fCubics[i]);
ethannicholas1446a9a2016-02-10 14:05:02 -08001864 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001865 writer.endArray(); // cubics
ethannicholas1446a9a2016-02-10 14:05:02 -08001866 if (fColorsPtr != nullptr) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001867 writer.beginArray(SKDEBUGCANVAS_ATTRIBUTE_COLORS);
ethannicholas1446a9a2016-02-10 14:05:02 -08001868 for (int i = 0; i < 4; i++) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001869 MakeJsonColor(writer, fColorsPtr[i]);
ethannicholas1446a9a2016-02-10 14:05:02 -08001870 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001871 writer.endArray(); // colors
ethannicholas1446a9a2016-02-10 14:05:02 -08001872 }
1873 if (fTexCoordsPtr != nullptr) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001874 writer.beginArray(SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS);
ethannicholas1446a9a2016-02-10 14:05:02 -08001875 for (int i = 0; i < 4; i++) {
Brian Osmand8a90f92019-01-28 13:41:19 -05001876 MakeJsonPoint(writer, fTexCoords[i]);
ethannicholas1446a9a2016-02-10 14:05:02 -08001877 }
Brian Osmand8a90f92019-01-28 13:41:19 -05001878 writer.endArray(); // texCoords
ethannicholas1446a9a2016-02-10 14:05:02 -08001879 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001880 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08001881}
1882
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001883SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001884 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001885 fRect = rect;
1886 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001887}
1888
fmalita8c89c522014-11-08 16:18:56 -08001889void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001890 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001891}
1892
Brian Osmand8a90f92019-01-28 13:41:19 -05001893void SkDrawRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1894 INHERITED::toJSON(writer, urlDataManager);
1895 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COORDS); MakeJsonRect(writer, fRect);
1896 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT); MakeJsonPaint(writer, fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07001897
1898 SkString desc;
Brian Osmand8a90f92019-01-28 13:41:19 -05001899 writer.appendString(SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, fRect)->c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -08001900}
1901
Michael Ludwig75451902019-01-23 11:14:29 -05001902SkDrawEdgeAARectCommand::SkDrawEdgeAARectCommand(const SkRect& rect, SkCanvas::QuadAAFlags aa,
1903 SkColor color, SkBlendMode mode)
1904 : INHERITED(kDrawEdgeAARect_OpType) {
1905 fRect = rect;
1906 fAA = aa;
1907 fColor = color;
1908 fMode = mode;
1909}
1910
1911void SkDrawEdgeAARectCommand::execute(SkCanvas* canvas) const {
1912 canvas->experimental_DrawEdgeAARectV1(fRect, fAA, fColor, fMode);
1913}
1914
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001915SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001916 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00001917 fRRect = rrect;
1918 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001919}
1920
fmalita8c89c522014-11-08 16:18:56 -08001921void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00001922 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001923}
1924
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001925bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001926 render_rrect(canvas, fRRect);
1927 return true;
1928}
1929
Brian Osmand8a90f92019-01-28 13:41:19 -05001930void SkDrawRRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1931 INHERITED::toJSON(writer, urlDataManager);
1932 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_COORDS); make_json_rrect(writer, fRRect);
1933 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT); MakeJsonPaint(writer, fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001934}
1935
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00001936SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001937 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001938 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001939 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001940 fOuter = outer;
1941 fInner = inner;
1942 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001943}
1944
fmalita8c89c522014-11-08 16:18:56 -08001945void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001946 canvas->drawDRRect(fOuter, fInner, fPaint);
1947}
1948
1949bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
1950 render_drrect(canvas, fOuter, fInner);
1951 return true;
1952}
1953
Brian Osmand8a90f92019-01-28 13:41:19 -05001954void SkDrawDRRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1955 INHERITED::toJSON(writer, urlDataManager);
1956 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_OUTER); make_json_rrect(writer, fOuter);
1957 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_INNER); make_json_rrect(writer, fInner);
1958 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT); MakeJsonPaint(writer, fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001959}
1960
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04001961SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
1962 : INHERITED(kDrawShadow_OpType) {
1963 fPath = path;
1964 fShadowRec = rec;
1965}
1966
1967void SkDrawShadowCommand::execute(SkCanvas* canvas) const {
1968 canvas->private_draw_shadow_rec(fPath, fShadowRec);
1969}
1970
1971bool SkDrawShadowCommand::render(SkCanvas* canvas) const {
1972 render_shadow(canvas, fPath, fShadowRec);
1973 return true;
1974}
1975
Brian Osmand8a90f92019-01-28 13:41:19 -05001976void SkDrawShadowCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1977 INHERITED::toJSON(writer, urlDataManager);
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04001978
1979 bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
1980 bool transparentOccluder =
1981 SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
1982
Brian Osmand8a90f92019-01-28 13:41:19 -05001983 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PATH); MakeJsonPath(writer, fPath);
1984 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_ZPLANE);
1985 MakeJsonPoint3(writer, fShadowRec.fZPlaneParams);
1986 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION);
1987 MakeJsonPoint3(writer, fShadowRec.fLightPos);
1988 writer.appendFloat(SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS, fShadowRec.fLightRadius);
1989 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR);
1990 MakeJsonColor(writer, fShadowRec.fAmbientColor);
1991 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR);
1992 MakeJsonColor(writer, fShadowRec.fSpotColor);
1993 store_bool(writer, SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
1994 store_bool(writer, SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04001995}
1996
Brian Osmanc7611082018-05-29 14:55:50 -04001997///////////////////////////////////////////////////////////////////////////////////////////////////
1998
1999SkDrawDrawableCommand::SkDrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
2000 : INHERITED(kDrawDrawable_OpType)
2001 , fDrawable(SkRef(drawable))
2002 , fMatrix(matrix) {}
2003
2004void SkDrawDrawableCommand::execute(SkCanvas* canvas) const {
2005 canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
2006}
2007
2008///////////////////////////////////////////////////////////////////////////////////////////////////
2009
Mike Reedfed9cfd2017-03-17 12:09:04 -04002010SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002011 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04002012 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04002013 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04002014 , fBlendMode(bmode)
Brian Osman255735e2018-04-06 14:51:42 -04002015 , fPaint(paint) {}
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002016
fmalita8c89c522014-11-08 16:18:56 -08002017void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04002018 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002019}
2020
Brian Osman616f1cb2018-05-29 11:23:35 -04002021///////////////////////////////////////////////////////////////////////////////////////////////////
2022
2023SkDrawAtlasCommand::SkDrawAtlasCommand(const SkImage* image, const SkRSXform xform[],
2024 const SkRect tex[], const SkColor colors[], int count,
2025 SkBlendMode bmode, const SkRect* cull,
2026 const SkPaint* paint)
2027 : INHERITED(kDrawAtlas_OpType)
2028 , fImage(SkRef(image))
2029 , fXform(xform, count)
2030 , fTex(tex, count)
2031 , fColors(colors, colors ? count : 0)
2032 , fBlendMode(bmode)
2033 , fCull(cull)
2034 , fPaint(paint) {}
2035
2036void SkDrawAtlasCommand::execute(SkCanvas* canvas) const {
2037 canvas->drawAtlas(fImage.get(), fXform.begin(), fTex.begin(),
2038 fColors.isEmpty() ? nullptr : fColors.begin(), fXform.count(), fBlendMode,
2039 fCull.getMaybeNull(), fPaint.getMaybeNull());
2040}
2041
2042///////////////////////////////////////////////////////////////////////////////////////////////////
2043
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002044SkRestoreCommand::SkRestoreCommand()
Brian Osman255735e2018-04-06 14:51:42 -04002045 : INHERITED(kRestore_OpType) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002046
fmalita8c89c522014-11-08 16:18:56 -08002047void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00002048 canvas->restore();
2049}
2050
Florin Malita5f6102d2014-06-30 10:13:28 -04002051SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08002052 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00002053}
2054
fmalita8c89c522014-11-08 16:18:56 -08002055void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04002056 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00002057}
2058
reed4960eee2015-12-18 07:09:18 -08002059SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
Brian Osman8363be12018-05-29 13:38:07 -04002060 : INHERITED(kSaveLayer_OpType)
2061 , fBounds(rec.fBounds)
2062 , fPaint(rec.fPaint)
2063 , fBackdrop(SkSafeRef(rec.fBackdrop))
2064 , fSaveLayerFlags(rec.fSaveLayerFlags) {}
ethannicholas50a8dd02016-02-10 05:40:46 -08002065
fmalita8c89c522014-11-08 16:18:56 -08002066void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04002067 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(),
reed4960eee2015-12-18 07:09:18 -08002068 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00002069}
2070
Brian Osmand8a90f92019-01-28 13:41:19 -05002071void SkSaveLayerCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
2072 INHERITED::toJSON(writer, urlDataManager);
Brian Osman8363be12018-05-29 13:38:07 -04002073 if (fBounds.isValid()) {
Mike Reed8d0f8242019-01-28 14:31:18 -05002074 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_BOUNDS); MakeJsonRect(writer, *fBounds);
ethannicholas50a8dd02016-02-10 05:40:46 -08002075 }
Brian Osman8363be12018-05-29 13:38:07 -04002076 if (fPaint.isValid()) {
Brian Osmand8a90f92019-01-28 13:41:19 -05002077 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_PAINT);
Mike Reed8d0f8242019-01-28 14:31:18 -05002078 MakeJsonPaint(writer, *fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002079 }
2080 if (fBackdrop != nullptr) {
Brian Osmand8a90f92019-01-28 13:41:19 -05002081 writer.beginObject(SKDEBUGCANVAS_ATTRIBUTE_BACKDROP);
2082 flatten(fBackdrop.get(), writer, urlDataManager);
2083 writer.endObject(); // backdrop
ethannicholas50a8dd02016-02-10 05:40:46 -08002084 }
2085 if (fSaveLayerFlags != 0) {
2086 SkDebugf("unsupported: saveLayer flags\n");
2087 SkASSERT(false);
2088 }
ethannicholas50a8dd02016-02-10 05:40:46 -08002089}
2090
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002091SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08002092 : INHERITED(kSetMatrix_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002093 fMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -07002094}
2095
fmalita8c89c522014-11-08 16:18:56 -08002096void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
Brian Osman255735e2018-04-06 14:51:42 -04002097 canvas->setMatrix(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00002098}
2099
Brian Osmand8a90f92019-01-28 13:41:19 -05002100void SkSetMatrixCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
2101 INHERITED::toJSON(writer, urlDataManager);
2102 writer.appendName(SKDEBUGCANVAS_ATTRIBUTE_MATRIX); MakeJsonMatrix(writer, fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08002103}