blob: 02caf6c2a7a8348b2ac96027039944c8c90559b4 [file] [log] [blame]
chudy@google.com902ebe52012-06-29 14:21:22 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
chudy@google.com902ebe52012-06-29 14:21:22 +00008#include "SkDrawCommand.h"
joshualitt6b3cf732016-02-17 11:20:26 -08009
Brian Salomond7065e72018-10-12 11:42:02 -040010#include <algorithm>
Hal Canary95e3c052017-01-11 12:44:43 -050011#include "SkAutoMalloc.h"
Brian Salomond7065e72018-10-12 11:42:02 -040012#include "SkClipOpPriv.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080013#include "SkColorFilter.h"
14#include "SkDashPathEffect.h"
Brian Osmanc7611082018-05-29 14:55:50 -040015#include "SkDrawable.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080016#include "SkImageFilter.h"
brianosmanfad98562016-05-04 11:06:28 -070017#include "SkJsonWriteBuffer.h"
Brian Salomond7065e72018-10-12 11:42:02 -040018#include "SkLatticeIter.h"
Mike Reed80747ef2018-01-23 15:29:32 -050019#include "SkMaskFilterBase.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080020#include "SkPaintDefaults.h"
21#include "SkPathEffect.h"
robertphillips9bafc302015-02-13 11:13:00 -080022#include "SkPicture.h"
Brian Osmand9ea8162018-08-08 17:03:39 -040023#include "SkPngEncoder.h"
Mike Reedfadbfcd2017-12-06 16:09:20 -050024#include "SkReadBuffer.h"
Mike Reed185ffe92018-01-08 17:09:54 -050025#include "SkRectPriv.h"
Brian Salomond7065e72018-10-12 11:42:02 -040026#include "SkShadowFlags.h"
Brian Salomon8d5b41b2018-10-12 14:22:49 +000027#include "SkTHash.h"
Brian Salomond7065e72018-10-12 11:42:02 -040028#include "SkTextBlobPriv.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080029#include "SkTypeface.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080030#include "SkWriteBuffer.h"
31
ethannicholas50a8dd02016-02-10 05:40:46 -080032#define SKDEBUGCANVAS_ATTRIBUTE_COMMAND "command"
ethannicholas807dcab2016-02-23 06:53:37 -080033#define SKDEBUGCANVAS_ATTRIBUTE_VISIBLE "visible"
ethannicholas50a8dd02016-02-10 05:40:46 -080034#define SKDEBUGCANVAS_ATTRIBUTE_MATRIX "matrix"
vjiaoblacke5de1302016-07-13 14:05:28 -070035#define SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS "drawDepthTranslation"
ethannicholas50a8dd02016-02-10 05:40:46 -080036#define SKDEBUGCANVAS_ATTRIBUTE_COORDS "coords"
halcanaryf412f092016-08-25 11:10:41 -070037#define SKDEBUGCANVAS_ATTRIBUTE_HINTING "hinting"
ethannicholas50a8dd02016-02-10 05:40:46 -080038#define SKDEBUGCANVAS_ATTRIBUTE_BOUNDS "bounds"
39#define SKDEBUGCANVAS_ATTRIBUTE_PAINT "paint"
40#define SKDEBUGCANVAS_ATTRIBUTE_OUTER "outer"
41#define SKDEBUGCANVAS_ATTRIBUTE_INNER "inner"
42#define SKDEBUGCANVAS_ATTRIBUTE_MODE "mode"
43#define SKDEBUGCANVAS_ATTRIBUTE_POINTS "points"
44#define SKDEBUGCANVAS_ATTRIBUTE_PATH "path"
45#define SKDEBUGCANVAS_ATTRIBUTE_TEXT "text"
46#define SKDEBUGCANVAS_ATTRIBUTE_COLOR "color"
47#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Florin Malita82d80872017-06-06 16:58:40 -040048#define SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE "blendMode"
ethannicholas50a8dd02016-02-10 05:40:46 -080049#define SKDEBUGCANVAS_ATTRIBUTE_STYLE "style"
50#define SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH "strokeWidth"
51#define SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER "strokeMiter"
ethannicholas1446a9a2016-02-10 14:05:02 -080052#define SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN "strokeJoin"
ethannicholas50a8dd02016-02-10 05:40:46 -080053#define SKDEBUGCANVAS_ATTRIBUTE_CAP "cap"
54#define SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS "antiAlias"
ethannicholas1446a9a2016-02-10 14:05:02 -080055#define SKDEBUGCANVAS_ATTRIBUTE_DITHER "dither"
Ben Wagner78f1f5a2017-06-23 14:35:07 -040056#define SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT "fakeBoldText"
57#define SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT "linearText"
58#define SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT "subpixelText"
59#define SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT "devKernText"
60#define SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT "lcdRenderText"
61#define SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT "embeddedBitmapText"
62#define SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING "forceAutoHinting"
ethannicholas50a8dd02016-02-10 05:40:46 -080063#define SKDEBUGCANVAS_ATTRIBUTE_REGION "region"
64#define SKDEBUGCANVAS_ATTRIBUTE_REGIONOP "op"
65#define SKDEBUGCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle"
66#define SKDEBUGCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion"
67#define SKDEBUGCANVAS_ATTRIBUTE_BLUR "blur"
68#define SKDEBUGCANVAS_ATTRIBUTE_SIGMA "sigma"
69#define SKDEBUGCANVAS_ATTRIBUTE_QUALITY "quality"
ethannicholas50a8dd02016-02-10 05:40:46 -080070#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE "textSize"
71#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX"
72#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX"
73#define SKDEBUGCANVAS_ATTRIBUTE_DASHING "dashing"
74#define SKDEBUGCANVAS_ATTRIBUTE_INTERVALS "intervals"
75#define SKDEBUGCANVAS_ATTRIBUTE_PHASE "phase"
76#define SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE "fillType"
77#define SKDEBUGCANVAS_ATTRIBUTE_VERBS "verbs"
78#define SKDEBUGCANVAS_ATTRIBUTE_NAME "name"
ethannicholasf62a8b72016-02-11 10:35:21 -080079#define SKDEBUGCANVAS_ATTRIBUTE_DATA "data"
brianosmanfad98562016-05-04 11:06:28 -070080#define SKDEBUGCANVAS_ATTRIBUTE_VALUES "values"
ethannicholas50a8dd02016-02-10 05:40:46 -080081#define SKDEBUGCANVAS_ATTRIBUTE_SHADER "shader"
82#define SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect"
83#define SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER "maskFilter"
84#define SKDEBUGCANVAS_ATTRIBUTE_XFERMODE "xfermode"
ethannicholas1446a9a2016-02-10 14:05:02 -080085#define SKDEBUGCANVAS_ATTRIBUTE_LOOPER "looper"
ethannicholas50a8dd02016-02-10 05:40:46 -080086#define SKDEBUGCANVAS_ATTRIBUTE_BACKDROP "backdrop"
87#define SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER "colorfilter"
88#define SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter"
89#define SKDEBUGCANVAS_ATTRIBUTE_IMAGE "image"
90#define SKDEBUGCANVAS_ATTRIBUTE_BITMAP "bitmap"
91#define SKDEBUGCANVAS_ATTRIBUTE_SRC "src"
92#define SKDEBUGCANVAS_ATTRIBUTE_DST "dst"
93#define SKDEBUGCANVAS_ATTRIBUTE_CENTER "center"
94#define SKDEBUGCANVAS_ATTRIBUTE_STRICT "strict"
95#define SKDEBUGCANVAS_ATTRIBUTE_DESCRIPTION "description"
96#define SKDEBUGCANVAS_ATTRIBUTE_X "x"
97#define SKDEBUGCANVAS_ATTRIBUTE_Y "y"
98#define SKDEBUGCANVAS_ATTRIBUTE_RUNS "runs"
99#define SKDEBUGCANVAS_ATTRIBUTE_POSITIONS "positions"
100#define SKDEBUGCANVAS_ATTRIBUTE_GLYPHS "glyphs"
101#define SKDEBUGCANVAS_ATTRIBUTE_FONT "font"
102#define SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE "typeface"
ethannicholas1446a9a2016-02-10 14:05:02 -0800103#define SKDEBUGCANVAS_ATTRIBUTE_CUBICS "cubics"
104#define SKDEBUGCANVAS_ATTRIBUTE_COLORS "colors"
105#define SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS "textureCoords"
106#define SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY "filterQuality"
bsalomonac3aa242016-08-19 11:25:19 -0700107#define SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE "startAngle"
108#define SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE "sweepAngle"
109#define SKDEBUGCANVAS_ATTRIBUTE_USECENTER "useCenter"
jcgregorioee0c5552016-06-30 09:18:27 -0700110#define SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC "shortDesc"
msarett0ac1bec2016-08-29 09:15:33 -0700111#define SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID "uniqueID"
112#define SKDEBUGCANVAS_ATTRIBUTE_WIDTH "width"
113#define SKDEBUGCANVAS_ATTRIBUTE_HEIGHT "height"
114#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Stan Ilievac42aeb2017-01-12 16:20:50 -0500115#define SKDEBUGCANVAS_ATTRIBUTE_LATTICE "lattice"
116#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT "xCount"
117#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT "yCount"
118#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS "xDivs"
119#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS "yDivs"
120#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS "flags"
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400121#define SKDEBUGCANVAS_ATTRIBUTE_ZPLANE "zPlane"
122#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION "lightPositions"
123#define SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR "ambientColor"
124#define SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR "spotColor"
125#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS "lightRadius"
reed67f62fa2016-06-29 11:36:34 -0700126
ethannicholas50a8dd02016-02-10 05:40:46 -0800127#define SKDEBUGCANVAS_VERB_MOVE "move"
128#define SKDEBUGCANVAS_VERB_LINE "line"
129#define SKDEBUGCANVAS_VERB_QUAD "quad"
130#define SKDEBUGCANVAS_VERB_CUBIC "cubic"
131#define SKDEBUGCANVAS_VERB_CONIC "conic"
132#define SKDEBUGCANVAS_VERB_CLOSE "close"
133
134#define SKDEBUGCANVAS_STYLE_FILL "fill"
135#define SKDEBUGCANVAS_STYLE_STROKE "stroke"
136#define SKDEBUGCANVAS_STYLE_STROKEANDFILL "strokeAndFill"
137
138#define SKDEBUGCANVAS_POINTMODE_POINTS "points"
139#define SKDEBUGCANVAS_POINTMODE_LINES "lines"
140#define SKDEBUGCANVAS_POINTMODE_POLYGON "polygon"
141
142#define SKDEBUGCANVAS_REGIONOP_DIFFERENCE "difference"
143#define SKDEBUGCANVAS_REGIONOP_INTERSECT "intersect"
144#define SKDEBUGCANVAS_REGIONOP_UNION "union"
145#define SKDEBUGCANVAS_REGIONOP_XOR "xor"
146#define SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE "reverseDifference"
147#define SKDEBUGCANVAS_REGIONOP_REPLACE "replace"
148
149#define SKDEBUGCANVAS_BLURSTYLE_NORMAL "normal"
150#define SKDEBUGCANVAS_BLURSTYLE_SOLID "solid"
151#define SKDEBUGCANVAS_BLURSTYLE_OUTER "outer"
152#define SKDEBUGCANVAS_BLURSTYLE_INNER "inner"
153
154#define SKDEBUGCANVAS_BLURQUALITY_LOW "low"
155#define SKDEBUGCANVAS_BLURQUALITY_HIGH "high"
156
ethannicholas50a8dd02016-02-10 05:40:46 -0800157#define SKDEBUGCANVAS_FILLTYPE_WINDING "winding"
158#define SKDEBUGCANVAS_FILLTYPE_EVENODD "evenOdd"
159#define SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding"
160#define SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd"
161
162#define SKDEBUGCANVAS_CAP_BUTT "butt"
163#define SKDEBUGCANVAS_CAP_ROUND "round"
164#define SKDEBUGCANVAS_CAP_SQUARE "square"
165
ethannicholas1446a9a2016-02-10 14:05:02 -0800166#define SKDEBUGCANVAS_MITER_JOIN "miter"
167#define SKDEBUGCANVAS_ROUND_JOIN "round"
168#define SKDEBUGCANVAS_BEVEL_JOIN "bevel"
169
ethannicholas50a8dd02016-02-10 05:40:46 -0800170#define SKDEBUGCANVAS_COLORTYPE_ARGB4444 "ARGB4444"
171#define SKDEBUGCANVAS_COLORTYPE_RGBA8888 "RGBA8888"
172#define SKDEBUGCANVAS_COLORTYPE_BGRA8888 "BGRA8888"
173#define SKDEBUGCANVAS_COLORTYPE_565 "565"
174#define SKDEBUGCANVAS_COLORTYPE_GRAY8 "Gray8"
175#define SKDEBUGCANVAS_COLORTYPE_INDEX8 "Index8"
176#define SKDEBUGCANVAS_COLORTYPE_ALPHA8 "Alpha8"
177
178#define SKDEBUGCANVAS_ALPHATYPE_OPAQUE "opaque"
179#define SKDEBUGCANVAS_ALPHATYPE_PREMUL "premul"
180#define SKDEBUGCANVAS_ALPHATYPE_UNPREMUL "unpremul"
msarett0ac1bec2016-08-29 09:15:33 -0700181#define SKDEBUGCANVAS_ALPHATYPE_UNKNOWN "unknown"
ethannicholas50a8dd02016-02-10 05:40:46 -0800182
ethannicholas1446a9a2016-02-10 14:05:02 -0800183#define SKDEBUGCANVAS_FILTERQUALITY_NONE "none"
184#define SKDEBUGCANVAS_FILTERQUALITY_LOW "low"
185#define SKDEBUGCANVAS_FILTERQUALITY_MEDIUM "medium"
186#define SKDEBUGCANVAS_FILTERQUALITY_HIGH "high"
187
halcanaryf412f092016-08-25 11:10:41 -0700188#define SKDEBUGCANVAS_HINTING_NONE "none"
189#define SKDEBUGCANVAS_HINTING_SLIGHT "slight"
190#define SKDEBUGCANVAS_HINTING_NORMAL "normal"
191#define SKDEBUGCANVAS_HINTING_FULL "full"
192
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400193#define SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC "transparentOccluder"
194#define SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY "geometricOnly"
195
reed67f62fa2016-06-29 11:36:34 -0700196static SkString* str_append(SkString* str, const SkRect& r) {
197 str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom());
198 return str;
199}
200
robertphillips9bafc302015-02-13 11:13:00 -0800201SkDrawCommand::SkDrawCommand(OpType type)
202 : fOpType(type)
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000203 , fVisible(true) {
204}
205
robertphillips9bafc302015-02-13 11:13:00 -0800206const char* SkDrawCommand::GetCommandString(OpType type) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000207 switch (type) {
fmalita160ebb22015-04-01 20:58:37 -0700208 case kBeginDrawPicture_OpType: return "BeginDrawPicture";
Brian Osmanc25e2692018-03-12 10:57:28 -0400209 case kClear_OpType: return "DrawClear";
robertphillips9bafc302015-02-13 11:13:00 -0800210 case kClipPath_OpType: return "ClipPath";
211 case kClipRegion_OpType: return "ClipRegion";
212 case kClipRect_OpType: return "ClipRect";
213 case kClipRRect_OpType: return "ClipRRect";
robertphillips9bafc302015-02-13 11:13:00 -0800214 case kConcat_OpType: return "Concat";
robertphillipsfb409232016-06-29 10:28:11 -0700215 case kDrawAnnotation_OpType: return "DrawAnnotation";
robertphillips9bafc302015-02-13 11:13:00 -0800216 case kDrawBitmap_OpType: return "DrawBitmap";
Brian Osman78a76482018-05-18 16:59:13 -0400217 case kDrawBitmapLattice_OpType: return "DrawBitmapLattice";
robertphillips9bafc302015-02-13 11:13:00 -0800218 case kDrawBitmapNine_OpType: return "DrawBitmapNine";
219 case kDrawBitmapRect_OpType: return "DrawBitmapRect";
robertphillips9bafc302015-02-13 11:13:00 -0800220 case kDrawDRRect_OpType: return "DrawDRRect";
fmalita651c9202015-07-22 10:23:01 -0700221 case kDrawImage_OpType: return "DrawImage";
Stan Ilievac42aeb2017-01-12 16:20:50 -0500222 case kDrawImageLattice_OpType: return "DrawImageLattice";
Brian Osmanc25e2692018-03-12 10:57:28 -0400223 case kDrawImageNine_OpType: return "DrawImageNine";
fmalita651c9202015-07-22 10:23:01 -0700224 case kDrawImageRect_OpType: return "DrawImageRect";
Brian Salomond7065e72018-10-12 11:42:02 -0400225 case kDrawImageSet_OpType: return "DrawImageSet";
robertphillips9bafc302015-02-13 11:13:00 -0800226 case kDrawOval_OpType: return "DrawOval";
227 case kDrawPaint_OpType: return "DrawPaint";
228 case kDrawPatch_OpType: return "DrawPatch";
229 case kDrawPath_OpType: return "DrawPath";
Brian Osmanc25e2692018-03-12 10:57:28 -0400230 case kDrawArc_OpType: return "DrawArc";
robertphillips9bafc302015-02-13 11:13:00 -0800231 case kDrawPoints_OpType: return "DrawPoints";
232 case kDrawPosText_OpType: return "DrawPosText";
233 case kDrawPosTextH_OpType: return "DrawPosTextH";
234 case kDrawRect_OpType: return "DrawRect";
235 case kDrawRRect_OpType: return "DrawRRect";
Brian Osmanc25e2692018-03-12 10:57:28 -0400236 case kDrawRegion_OpType: return "DrawRegion";
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400237 case kDrawShadow_OpType: return "DrawShadow";
robertphillips9bafc302015-02-13 11:13:00 -0800238 case kDrawText_OpType: return "DrawText";
239 case kDrawTextBlob_OpType: return "DrawTextBlob";
reed63f30d92016-07-07 16:32:51 -0700240 case kDrawTextRSXform_OpType: return "DrawTextRSXform";
robertphillips9bafc302015-02-13 11:13:00 -0800241 case kDrawVertices_OpType: return "DrawVertices";
Brian Osman616f1cb2018-05-29 11:23:35 -0400242 case kDrawAtlas_OpType: return "DrawAtlas";
Brian Osmanc7611082018-05-29 14:55:50 -0400243 case kDrawDrawable_OpType: return "DrawDrawable";
fmalita160ebb22015-04-01 20:58:37 -0700244 case kEndDrawPicture_OpType: return "EndDrawPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800245 case kRestore_OpType: return "Restore";
246 case kSave_OpType: return "Save";
247 case kSaveLayer_OpType: return "SaveLayer";
248 case kSetMatrix_OpType: return "SetMatrix";
chudy@google.com902ebe52012-06-29 14:21:22 +0000249 default:
robertphillips9bafc302015-02-13 11:13:00 -0800250 SkDebugf("OpType error 0x%08x\n", type);
chudy@google.com902ebe52012-06-29 14:21:22 +0000251 SkASSERT(0);
252 break;
253 }
254 SkDEBUGFAIL("DrawType UNUSED\n");
halcanary96fcdcc2015-08-27 07:41:13 -0700255 return nullptr;
chudy@google.com902ebe52012-06-29 14:21:22 +0000256}
257
ethannicholasf62a8b72016-02-11 10:35:21 -0800258Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const {
ethannicholas50a8dd02016-02-10 05:40:46 -0800259 Json::Value result;
260 result[SKDEBUGCANVAS_ATTRIBUTE_COMMAND] = this->GetCommandString(fOpType);
ethannicholas807dcab2016-02-23 06:53:37 -0800261 result[SKDEBUGCANVAS_ATTRIBUTE_VISIBLE] = Json::Value(this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800262 return result;
263}
264
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000265namespace {
266
267void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
Mike Reed3661bc92017-02-22 13:21:42 -0500268 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000269
270 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
271
272 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
273 if (bounds.width() > bounds.height()) {
274 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
275 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
276 } else {
277 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
278 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
279 }
280 canvas->translate(-bounds.centerX(), -bounds.centerY());
281}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000282
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000283
284void render_path(SkCanvas* canvas, const SkPath& path) {
285 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000286
287 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700288 if (bounds.isEmpty()) {
289 return;
290 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000291
fmalitab0cd8b72015-10-06 07:24:03 -0700292 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000293 xlate_and_scale_to_bounds(canvas, bounds);
294
295 SkPaint p;
296 p.setColor(SK_ColorBLACK);
297 p.setStyle(SkPaint::kStroke_Style);
298
299 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000300}
301
Brian Osmanc25e2692018-03-12 10:57:28 -0400302void render_region(SkCanvas* canvas, const SkRegion& region) {
303 canvas->clear(0xFFFFFFFF);
304
305 const SkIRect& bounds = region.getBounds();
306 if (bounds.isEmpty()) {
307 return;
308 }
309
310 SkAutoCanvasRestore acr(canvas, true);
Brian Osman99b63402018-03-13 10:19:27 -0400311 xlate_and_scale_to_bounds(canvas, SkRect::Make(bounds));
Brian Osmanc25e2692018-03-12 10:57:28 -0400312
313 SkPaint p;
314 p.setColor(SK_ColorBLACK);
315 p.setStyle(SkPaint::kStroke_Style);
316
317 canvas->drawRegion(region, p);
318}
319
halcanary96fcdcc2015-08-27 07:41:13 -0700320void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
Mike Reed3661bc92017-02-22 13:21:42 -0500321 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000322
323 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
324 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
325
326 if (input.width() > input.height()) {
327 yScale *= input.height() / (float) input.width();
328 } else {
329 xScale *= input.width() / (float) input.height();
330 }
331
332 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
333 xScale * input.width(),
334 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000335
robertphillips96a5cff2015-09-24 06:56:27 -0700336 static const int kNumBlocks = 8;
337
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000338 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700339 SkISize block = {
340 canvas->imageInfo().width()/kNumBlocks,
341 canvas->imageInfo().height()/kNumBlocks
342 };
343 for (int y = 0; y < kNumBlocks; ++y) {
344 for (int x = 0; x < kNumBlocks; ++x) {
345 SkPaint paint;
346 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
347 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
348 SkIntToScalar(y*block.height()),
349 SkIntToScalar(block.width()),
350 SkIntToScalar(block.height()));
351 canvas->drawRect(r, paint);
352 }
353 }
354
reede47829b2015-08-06 10:02:53 -0700355 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000356
bsalomon49f085d2014-09-05 13:34:00 -0700357 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000358 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
359 srcRect->fTop * yScale + SK_Scalar1,
360 srcRect->fRight * xScale + SK_Scalar1,
361 srcRect->fBottom * yScale + SK_Scalar1);
362 SkPaint p;
363 p.setColor(SK_ColorRED);
364 p.setStyle(SkPaint::kStroke_Style);
365
366 canvas->drawRect(r, p);
367 }
368}
369
370void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
371 canvas->clear(0xFFFFFFFF);
372 canvas->save();
373
374 const SkRect& bounds = rrect.getBounds();
375
376 xlate_and_scale_to_bounds(canvas, bounds);
377
378 SkPaint p;
379 p.setColor(SK_ColorBLACK);
380 p.setStyle(SkPaint::kStroke_Style);
381
382 canvas->drawRRect(rrect, p);
383 canvas->restore();
384}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000385
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000386void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
387 canvas->clear(0xFFFFFFFF);
388 canvas->save();
389
390 const SkRect& bounds = outer.getBounds();
391
392 xlate_and_scale_to_bounds(canvas, bounds);
393
394 SkPaint p;
395 p.setColor(SK_ColorBLACK);
396 p.setStyle(SkPaint::kStroke_Style);
397
398 canvas->drawDRRect(outer, inner, p);
399 canvas->restore();
400}
401
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400402void render_shadow(SkCanvas* canvas, const SkPath& path, SkDrawShadowRec rec) {
403 canvas->clear(0xFFFFFFFF);
404
405 const SkRect& bounds = path.getBounds();
406 if (bounds.isEmpty()) {
407 return;
408 }
409
410 SkAutoCanvasRestore acr(canvas, true);
411 xlate_and_scale_to_bounds(canvas, bounds);
412
413 rec.fAmbientColor = SK_ColorBLACK;
414 rec.fSpotColor = SK_ColorBLACK;
415 canvas->private_draw_shadow_rec(path, rec);
416}
417
Florin Malita82d80872017-06-06 16:58:40 -0400418static const char* const gBlendModeMap[] = {
419 "clear",
420 "src",
421 "dst",
422 "srcOver",
423 "dstOver",
424 "srcIn",
425 "dstIn",
426 "srcOut",
427 "dstOut",
428 "srcATop",
429 "dstATop",
430 "xor",
431 "plus",
432 "modulate",
433
434 "screen",
435
436 "overlay",
437 "darken",
438 "lighten",
439 "colorDodge",
440 "colorBurn",
441 "hardLight",
442 "softLight",
443 "difference",
444 "exclusion",
445 "multiply",
446
447 "hue",
448 "saturation",
449 "color",
450 "luminosity",
451};
452
453static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
454 "blendMode mismatch");
455static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
456 "blendMode mismatch");
457
458void apply_paint_blend_mode(const SkPaint& paint, Json::Value* target) {
459 const auto mode = paint.getBlendMode();
460 if (mode != SkBlendMode::kSrcOver) {
461 SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
462 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE] =
463 Json::Value(gBlendModeMap[static_cast<size_t>(mode)]);
464 }
465}
466
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000467};
468
brianosmanfad98562016-05-04 11:06:28 -0700469Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800470 Json::Value result(Json::arrayValue);
471 result.append(Json::Value(SkColorGetA(color)));
472 result.append(Json::Value(SkColorGetR(color)));
473 result.append(Json::Value(SkColorGetG(color)));
474 result.append(Json::Value(SkColorGetB(color)));
475 return result;
476}
477
brianosman97bbf822016-09-25 13:15:58 -0700478Json::Value SkDrawCommand::MakeJsonColor4f(const SkColor4f& color) {
479 Json::Value result(Json::arrayValue);
480 result.append(Json::Value(color.fA));
481 result.append(Json::Value(color.fR));
482 result.append(Json::Value(color.fG));
483 result.append(Json::Value(color.fB));
484 return result;
485}
486
brianosmanfad98562016-05-04 11:06:28 -0700487Json::Value SkDrawCommand::MakeJsonPoint(const SkPoint& point) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800488 Json::Value result(Json::arrayValue);
489 result.append(Json::Value(point.x()));
490 result.append(Json::Value(point.y()));
491 return result;
492}
493
brianosmanfad98562016-05-04 11:06:28 -0700494Json::Value SkDrawCommand::MakeJsonPoint(SkScalar x, SkScalar y) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800495 Json::Value result(Json::arrayValue);
496 result.append(Json::Value(x));
497 result.append(Json::Value(y));
498 return result;
499}
500
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400501Json::Value SkDrawCommand::MakeJsonPoint3(const SkPoint3& point) {
502 Json::Value result(Json::arrayValue);
503 result.append(Json::Value(point.x()));
504 result.append(Json::Value(point.y()));
505 result.append(Json::Value(point.z()));
506 return result;
507}
508
brianosmanfad98562016-05-04 11:06:28 -0700509Json::Value SkDrawCommand::MakeJsonRect(const SkRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800510 Json::Value result(Json::arrayValue);
511 result.append(Json::Value(rect.left()));
512 result.append(Json::Value(rect.top()));
513 result.append(Json::Value(rect.right()));
514 result.append(Json::Value(rect.bottom()));
515 return result;
516}
517
joshualittbd724132016-03-03 11:39:38 -0800518Json::Value SkDrawCommand::MakeJsonIRect(const SkIRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800519 Json::Value result(Json::arrayValue);
520 result.append(Json::Value(rect.left()));
521 result.append(Json::Value(rect.top()));
522 result.append(Json::Value(rect.right()));
523 result.append(Json::Value(rect.bottom()));
524 return result;
525}
526
527static Json::Value make_json_rrect(const SkRRect& rrect) {
528 Json::Value result(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700529 result.append(SkDrawCommand::MakeJsonRect(rrect.rect()));
530 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
531 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperRight_Corner)));
532 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerRight_Corner)));
533 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
ethannicholas50a8dd02016-02-10 05:40:46 -0800534 return result;
535}
536
joshualittbd724132016-03-03 11:39:38 -0800537Json::Value SkDrawCommand::MakeJsonMatrix(const SkMatrix& matrix) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800538 Json::Value result(Json::arrayValue);
539 Json::Value row1(Json::arrayValue);
540 row1.append(Json::Value(matrix[0]));
541 row1.append(Json::Value(matrix[1]));
542 row1.append(Json::Value(matrix[2]));
543 result.append(row1);
544 Json::Value row2(Json::arrayValue);
545 row2.append(Json::Value(matrix[3]));
546 row2.append(Json::Value(matrix[4]));
547 row2.append(Json::Value(matrix[5]));
548 result.append(row2);
549 Json::Value row3(Json::arrayValue);
550 row3.append(Json::Value(matrix[6]));
551 row3.append(Json::Value(matrix[7]));
552 row3.append(Json::Value(matrix[8]));
553 result.append(row3);
554 return result;
555}
ethannicholas1446a9a2016-02-10 14:05:02 -0800556
vjiaoblacke5de1302016-07-13 14:05:28 -0700557Json::Value SkDrawCommand::MakeJsonScalar(SkScalar z) {
558 Json::Value result(z);
559 return result;
560}
561
brianosmanfad98562016-05-04 11:06:28 -0700562Json::Value SkDrawCommand::MakeJsonPath(const SkPath& path) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800563 Json::Value result(Json::objectValue);
564 switch (path.getFillType()) {
565 case SkPath::kWinding_FillType:
566 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_WINDING;
567 break;
568 case SkPath::kEvenOdd_FillType:
569 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_EVENODD;
570 break;
571 case SkPath::kInverseWinding_FillType:
572 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING;
573 break;
574 case SkPath::kInverseEvenOdd_FillType:
575 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
576 break;
halcanary9d524f22016-03-29 09:03:52 -0700577 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800578 Json::Value verbs(Json::arrayValue);
579 SkPath::Iter iter(path, false);
580 SkPoint pts[4];
581 SkPath::Verb verb;
582 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
583 switch (verb) {
584 case SkPath::kLine_Verb: {
585 Json::Value line(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700586 line[SKDEBUGCANVAS_VERB_LINE] = MakeJsonPoint(pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800587 verbs.append(line);
588 break;
589 }
590 case SkPath::kQuad_Verb: {
591 Json::Value quad(Json::objectValue);
592 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700593 coords.append(MakeJsonPoint(pts[1]));
594 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800595 quad[SKDEBUGCANVAS_VERB_QUAD] = coords;
596 verbs.append(quad);
597 break;
598 }
599 case SkPath::kCubic_Verb: {
600 Json::Value cubic(Json::objectValue);
601 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700602 coords.append(MakeJsonPoint(pts[1]));
603 coords.append(MakeJsonPoint(pts[2]));
604 coords.append(MakeJsonPoint(pts[3]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800605 cubic[SKDEBUGCANVAS_VERB_CUBIC] = coords;
606 verbs.append(cubic);
607 break;
608 }
609 case SkPath::kConic_Verb: {
610 Json::Value conic(Json::objectValue);
611 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700612 coords.append(MakeJsonPoint(pts[1]));
613 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800614 coords.append(Json::Value(iter.conicWeight()));
615 conic[SKDEBUGCANVAS_VERB_CONIC] = coords;
616 verbs.append(conic);
617 break;
618 }
619 case SkPath::kMove_Verb: {
620 Json::Value move(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700621 move[SKDEBUGCANVAS_VERB_MOVE] = MakeJsonPoint(pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800622 verbs.append(move);
623 break;
624 }
625 case SkPath::kClose_Verb:
626 verbs.append(Json::Value(SKDEBUGCANVAS_VERB_CLOSE));
627 break;
628 case SkPath::kDone_Verb:
629 break;
630 }
631 }
632 result[SKDEBUGCANVAS_ATTRIBUTE_VERBS] = verbs;
633 return result;
634}
635
brianosmanfad98562016-05-04 11:06:28 -0700636Json::Value SkDrawCommand::MakeJsonRegion(const SkRegion& region) {
Brian Osmanc25e2692018-03-12 10:57:28 -0400637 // TODO: Actually serialize the rectangles, rather than just devolving to path
638 SkPath path;
639 region.getBoundaryPath(&path);
640 return MakeJsonPath(path);
ethannicholas50a8dd02016-02-10 05:40:46 -0800641}
642
Mike Reedc1f77742016-12-09 09:00:50 -0500643static Json::Value make_json_regionop(SkClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800644 switch (op) {
Mike Reedc1f77742016-12-09 09:00:50 -0500645 case kDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800646 return Json::Value(SKDEBUGCANVAS_REGIONOP_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500647 case kIntersect_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800648 return Json::Value(SKDEBUGCANVAS_REGIONOP_INTERSECT);
Mike Reedc1f77742016-12-09 09:00:50 -0500649 case kUnion_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800650 return Json::Value(SKDEBUGCANVAS_REGIONOP_UNION);
Mike Reedc1f77742016-12-09 09:00:50 -0500651 case kXOR_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800652 return Json::Value(SKDEBUGCANVAS_REGIONOP_XOR);
Mike Reedc1f77742016-12-09 09:00:50 -0500653 case kReverseDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800654 return Json::Value(SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500655 case kReplace_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800656 return Json::Value(SKDEBUGCANVAS_REGIONOP_REPLACE);
657 default:
658 SkASSERT(false);
659 return Json::Value("<invalid region op>");
660 };
661}
662
663static Json::Value make_json_pointmode(SkCanvas::PointMode mode) {
664 switch (mode) {
665 case SkCanvas::kPoints_PointMode:
666 return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
667 case SkCanvas::kLines_PointMode:
668 return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
halcanary9d524f22016-03-29 09:03:52 -0700669 case SkCanvas::kPolygon_PointMode:
ethannicholas50a8dd02016-02-10 05:40:46 -0800670 return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
671 default:
672 SkASSERT(false);
673 return Json::Value("<invalid point mode>");
674 };
675}
676
halcanary9d524f22016-03-29 09:03:52 -0700677static void store_scalar(Json::Value* target, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800678 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800679 if (value != defaultValue) {
680 (*target)[key] = Json::Value(value);
681 }
682}
683
ethannicholasbd3dae82016-02-10 12:10:00 -0800684static void store_bool(Json::Value* target, const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800685 if (value != defaultValue) {
686 (*target)[key] = Json::Value(value);
687 }
688}
689
halcanary9d524f22016-03-29 09:03:52 -0700690static void encode_data(const void* bytes, size_t count, const char* contentType,
ethannicholasf62a8b72016-02-11 10:35:21 -0800691 UrlDataManager& urlDataManager, Json::Value* target) {
bungeman38d909e2016-08-02 14:40:46 -0700692 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
693 SkString url = urlDataManager.addData(data.get(), contentType);
ethannicholasf62a8b72016-02-11 10:35:21 -0800694 *target = Json::Value(url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800695}
696
brianosmanfad98562016-05-04 11:06:28 -0700697void SkDrawCommand::flatten(const SkFlattenable* flattenable, Json::Value* target,
698 UrlDataManager& urlDataManager) {
699 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800700 flattenable->flatten(buffer);
701 void* data = sk_malloc_throw(buffer.bytesWritten());
702 buffer.writeToMemory(data);
703 Json::Value jsonData;
704 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, &jsonData);
705 Json::Value jsonFlattenable;
706 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->getTypeName());
707 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
brianosmanfad98562016-05-04 11:06:28 -0700708
709 SkJsonWriteBuffer jsonBuffer(&urlDataManager);
710 flattenable->flatten(jsonBuffer);
711 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_VALUES] = jsonBuffer.getValue();
712
ethannicholasf62a8b72016-02-11 10:35:21 -0800713 (*target) = jsonFlattenable;
714 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800715}
716
Brian Osmand9ea8162018-08-08 17:03:39 -0400717void SkDrawCommand::WritePNG(SkBitmap bitmap, SkWStream& out) {
718 SkPixmap pm;
719 SkAssertResult(bitmap.peekPixels(&pm));
ethannicholasf67531f2016-03-21 10:19:39 -0700720
Brian Osmand9ea8162018-08-08 17:03:39 -0400721 SkPngEncoder::Options options;
722 options.fZLibLevel = 1;
723 options.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
724 SkPngEncoder::Encode(&out, pm, options);
ethannicholasf67531f2016-03-21 10:19:39 -0700725}
726
brianosmanfad98562016-05-04 11:06:28 -0700727bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
728 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700729 size_t rowBytes = 4 * image.width();
Hal Canary95e3c052017-01-11 12:44:43 -0500730 SkAutoMalloc buffer(rowBytes * image.height());
halcanary9d524f22016-03-29 09:03:52 -0700731 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700732 kN32_SkColorType, kPremul_SkAlphaType);
733 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
734 SkDebugf("readPixels failed\n");
735 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800736 }
msaretta5cf4f42016-06-30 10:06:51 -0700737
738 SkBitmap bm;
739 bm.installPixels(dstInfo, buffer.get(), rowBytes);
msaretta5cf4f42016-06-30 10:06:51 -0700740
ethannicholasf67531f2016-03-21 10:19:39 -0700741 SkDynamicMemoryWStream out;
Brian Osmand9ea8162018-08-08 17:03:39 -0400742 SkDrawCommand::WritePNG(bm, out);
reed42943c82016-09-12 12:01:44 -0700743 sk_sp<SkData> encoded = out.detachAsData();
ethannicholasf62a8b72016-02-11 10:35:21 -0800744 Json::Value jsonData;
745 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
746 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
ethannicholas50a8dd02016-02-10 05:40:46 -0800747 return true;
748}
749
750static const char* color_type_name(SkColorType colorType) {
751 switch (colorType) {
752 case kARGB_4444_SkColorType:
753 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
754 case kRGBA_8888_SkColorType:
755 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
756 case kBGRA_8888_SkColorType:
757 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
758 case kRGB_565_SkColorType:
759 return SKDEBUGCANVAS_COLORTYPE_565;
760 case kGray_8_SkColorType:
761 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
ethannicholas50a8dd02016-02-10 05:40:46 -0800762 case kAlpha_8_SkColorType:
763 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
764 default:
765 SkASSERT(false);
766 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
767 }
768}
769
770static const char* alpha_type_name(SkAlphaType alphaType) {
771 switch (alphaType) {
772 case kOpaque_SkAlphaType:
773 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
774 case kPremul_SkAlphaType:
775 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
776 case kUnpremul_SkAlphaType:
777 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
778 default:
779 SkASSERT(false);
780 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
781 }
782}
783
brianosmanfad98562016-05-04 11:06:28 -0700784bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
785 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700786 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800787 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
788 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800789 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800790 return success;
791}
792
halcanaryf412f092016-08-25 11:10:41 -0700793static void apply_paint_hinting(const SkPaint& paint, Json::Value* target) {
Mike Reed9edbf422018-11-07 19:54:33 -0500794 SkFontHinting hinting = (SkFontHinting)paint.getHinting();
halcanaryf412f092016-08-25 11:10:41 -0700795 if (hinting != SkPaintDefaults_Hinting) {
796 switch (hinting) {
Mike Reed9edbf422018-11-07 19:54:33 -0500797 case kNo_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700798 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
799 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500800 case kSlight_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700801 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
802 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500803 case kNormal_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700804 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
805 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500806 case kFull_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700807 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
808 break;
809 }
810 }
811}
812
ethannicholas50a8dd02016-02-10 05:40:46 -0800813static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
814 SkColor color = paint.getColor();
815 if (color != SK_ColorBLACK) {
816 Json::Value colorValue(Json::arrayValue);
817 colorValue.append(Json::Value(SkColorGetA(color)));
818 colorValue.append(Json::Value(SkColorGetR(color)));
819 colorValue.append(Json::Value(SkColorGetG(color)));
820 colorValue.append(Json::Value(SkColorGetB(color)));
821 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;;
822 }
823}
824
825static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
826 SkPaint::Style style = paint.getStyle();
827 if (style != SkPaint::kFill_Style) {
828 switch (style) {
829 case SkPaint::kStroke_Style: {
830 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
831 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
832 break;
833 }
834 case SkPaint::kStrokeAndFill_Style: {
835 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
836 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
837 break;
838 }
839 default: SkASSERT(false);
840 }
841 }
842}
843
844static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
845 SkPaint::Cap cap = paint.getStrokeCap();
846 if (cap != SkPaint::kDefault_Cap) {
847 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800848 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800849 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
850 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800851 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800852 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
853 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800854 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800855 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
856 break;
ethannicholas50a8dd02016-02-10 05:40:46 -0800857 default: SkASSERT(false);
858 }
859 }
860}
ethannicholas1446a9a2016-02-10 14:05:02 -0800861
862static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
863 SkPaint::Join join = paint.getStrokeJoin();
864 if (join != SkPaint::kDefault_Join) {
865 switch (join) {
866 case SkPaint::kMiter_Join:
867 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
868 SKDEBUGCANVAS_MITER_JOIN);
869 break;
870 case SkPaint::kRound_Join:
871 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
872 SKDEBUGCANVAS_ROUND_JOIN);
873 break;
874 case SkPaint::kBevel_Join:
875 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
876 SKDEBUGCANVAS_BEVEL_JOIN);
877 break;
878 default: SkASSERT(false);
879 }
880 }
881}
882
883static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
884 SkFilterQuality quality = paint.getFilterQuality();
885 switch (quality) {
886 case kNone_SkFilterQuality:
887 break;
888 case kLow_SkFilterQuality:
889 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
890 SKDEBUGCANVAS_FILTERQUALITY_LOW);
891 break;
892 case kMedium_SkFilterQuality:
893 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
894 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
895 break;
896 case kHigh_SkFilterQuality:
897 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
898 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
899 break;
900 }
901}
902
halcanary9d524f22016-03-29 09:03:52 -0700903static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800904 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800905 SkMaskFilter* maskFilter = paint.getMaskFilter();
906 if (maskFilter != nullptr) {
Mike Reed80747ef2018-01-23 15:29:32 -0500907 SkMaskFilterBase::BlurRec blurRec;
908 if (as_MFB(maskFilter)->asABlur(&blurRec)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800909 Json::Value blur(Json::objectValue);
910 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
911 switch (blurRec.fStyle) {
912 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800913 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
914 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -0800915 break;
916 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800917 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
918 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -0800919 break;
920 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800921 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
922 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800923 break;
924 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800925 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
926 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800927 break;
928 default:
929 SkASSERT(false);
930 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800931 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
932 } else {
933 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -0700934 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800935 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
936 }
937 }
938}
939
halcanary9d524f22016-03-29 09:03:52 -0700940static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800941 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800942 SkPathEffect* pathEffect = paint.getPathEffect();
943 if (pathEffect != nullptr) {
944 SkPathEffect::DashInfo dashInfo;
945 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
946 if (dashType == SkPathEffect::kDash_DashType) {
947 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
948 pathEffect->asADash(&dashInfo);
949 Json::Value dashing(Json::objectValue);
950 Json::Value intervals(Json::arrayValue);
951 for (int32_t i = 0; i < dashInfo.fCount; i++) {
952 intervals.append(Json::Value(dashInfo.fIntervals[i]));
953 }
954 sk_free(dashInfo.fIntervals);
955 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
956 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
957 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
958 } else {
959 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -0700960 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800961 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
962 }
963 }
964}
halcanary9d524f22016-03-29 09:03:52 -0700965
halcanary9d524f22016-03-29 09:03:52 -0700966static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800967 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800968 SkTypeface* typeface = paint.getTypeface();
969 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -0800970 Json::Value jsonTypeface;
971 SkDynamicMemoryWStream buffer;
972 typeface->serialize(&buffer);
973 void* data = sk_malloc_throw(buffer.bytesWritten());
974 buffer.copyTo(data);
975 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -0700976 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -0800977 &jsonData);
978 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
979 sk_free(data);
980 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -0800981 }
982}
983
halcanary9d524f22016-03-29 09:03:52 -0700984static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800985 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800986 SkFlattenable* shader = paint.getShader();
987 if (shader != nullptr) {
988 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -0700989 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800990 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
991 }
992}
993
ethannicholasf62a8b72016-02-11 10:35:21 -0800994static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
995 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800996 SkFlattenable* imageFilter = paint.getImageFilter();
997 if (imageFilter != nullptr) {
998 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -0700999 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001000 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
1001 }
1002}
1003
halcanary9d524f22016-03-29 09:03:52 -07001004static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001005 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001006 SkFlattenable* colorFilter = paint.getColorFilter();
1007 if (colorFilter != nullptr) {
1008 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001009 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001010 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1011 }
1012}
1013
halcanary9d524f22016-03-29 09:03:52 -07001014static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001015 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001016 SkFlattenable* looper = paint.getLooper();
1017 if (looper != nullptr) {
1018 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001019 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001020 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1021 }
1022}
1023
brianosmanfad98562016-05-04 11:06:28 -07001024Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001025 Json::Value result(Json::objectValue);
1026 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001027 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001028 SkPaintDefaults_MiterLimit);
1029 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001030 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001031 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, paint.isFakeBoldText(), false);
1032 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, paint.isLinearText(), false);
1033 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, paint.isSubpixelText(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001034 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT, paint.isLCDRenderText(), false);
1035 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, paint.isEmbeddedBitmapText(), false);
1036 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, paint.isAutohinted(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001037 //kGenA8FromLCD_Flag
1038
halcanary9d524f22016-03-29 09:03:52 -07001039 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001040 SkPaintDefaults_TextSize);
1041 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
1042 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
halcanaryf412f092016-08-25 11:10:41 -07001043 apply_paint_hinting(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001044 apply_paint_color(paint, &result);
1045 apply_paint_style(paint, &result);
Florin Malita82d80872017-06-06 16:58:40 -04001046 apply_paint_blend_mode(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001047 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001048 apply_paint_join(paint, &result);
1049 apply_paint_filterquality(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001050 apply_paint_patheffect(paint, &result, urlDataManager);
1051 apply_paint_maskfilter(paint, &result, urlDataManager);
1052 apply_paint_shader(paint, &result, urlDataManager);
ethannicholasf62a8b72016-02-11 10:35:21 -08001053 apply_paint_looper(paint, &result, urlDataManager);
1054 apply_paint_imagefilter(paint, &result, urlDataManager);
1055 apply_paint_colorfilter(paint, &result, urlDataManager);
1056 apply_paint_typeface(paint, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001057 return result;
1058}
1059
Stan Ilievac42aeb2017-01-12 16:20:50 -05001060Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) {
1061 Json::Value result(Json::objectValue);
1062 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount);
1063 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount);
1064 if (nullptr != lattice.fBounds) {
1065 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds);
1066 }
1067 Json::Value XDivs(Json::arrayValue);
1068 for (int i = 0; i < lattice.fXCount; i++) {
1069 XDivs.append(Json::Value(lattice.fXDivs[i]));
1070 }
1071 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs;
1072 Json::Value YDivs(Json::arrayValue);
1073 for (int i = 0; i < lattice.fYCount; i++) {
1074 YDivs.append(Json::Value(lattice.fYDivs[i]));
1075 }
1076 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs;
Stan Ilievca8c0952017-12-11 13:01:58 -05001077 if (nullptr != lattice.fRectTypes) {
Stan Ilievac42aeb2017-01-12 16:20:50 -05001078 Json::Value flags(Json::arrayValue);
1079 int flagCount = 0;
1080 for (int row = 0; row < lattice.fYCount+1; row++) {
1081 Json::Value flagsRow(Json::arrayValue);
1082 for (int column = 0; column < lattice.fXCount+1; column++) {
Stan Ilievca8c0952017-12-11 13:01:58 -05001083 flagsRow.append(Json::Value(lattice.fRectTypes[flagCount++]));
Stan Ilievac42aeb2017-01-12 16:20:50 -05001084 }
1085 flags.append(flagsRow);
1086 }
1087 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags;
1088 }
1089 return result;
1090}
1091
Brian Osmanc25e2692018-03-12 10:57:28 -04001092SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kClear_OpType) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001093 fColor = color;
ethannicholas1446a9a2016-02-10 14:05:02 -08001094}
1095
1096void SkClearCommand::execute(SkCanvas* canvas) const {
1097 canvas->clear(fColor);
1098}
1099
ethannicholasf62a8b72016-02-11 10:35:21 -08001100Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1101 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001102 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001103 return result;
1104}
1105
Mike Reedc1f77742016-12-09 09:00:50 -05001106SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001107 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001108 fPath = path;
1109 fOp = op;
1110 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001111}
1112
fmalita8c89c522014-11-08 16:18:56 -08001113void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001114 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001115}
1116
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001117bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001118 render_path(canvas, fPath);
1119 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001120}
1121
ethannicholasf62a8b72016-02-11 10:35:21 -08001122Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1123 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001124 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001125 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1126 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1127 return result;
1128}
1129
Mike Reedc1f77742016-12-09 09:00:50 -05001130SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001131 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001132 fRegion = region;
1133 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001134}
1135
fmalita8c89c522014-11-08 16:18:56 -08001136void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001137 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001138}
1139
ethannicholasf62a8b72016-02-11 10:35:21 -08001140Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1141 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001142 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001143 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1144 return result;
1145}
1146
Mike Reedc1f77742016-12-09 09:00:50 -05001147SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001148 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001149 fRect = rect;
1150 fOp = op;
1151 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001152}
1153
fmalita8c89c522014-11-08 16:18:56 -08001154void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001155 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001156}
1157
ethannicholasf62a8b72016-02-11 10:35:21 -08001158Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1159 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001160 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001161 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1162 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001163
1164 SkString desc;
1165 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1166
ethannicholas50a8dd02016-02-10 05:40:46 -08001167 return result;
1168}
1169
Mike Reedc1f77742016-12-09 09:00:50 -05001170SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001171 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001172 fRRect = rrect;
1173 fOp = op;
1174 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001175}
1176
fmalita8c89c522014-11-08 16:18:56 -08001177void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001178 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001179}
1180
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001181bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001182 render_rrect(canvas, fRRect);
1183 return true;
1184}
1185
ethannicholasf62a8b72016-02-11 10:35:21 -08001186Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1187 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001188 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1189 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1190 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1191 return result;
1192}
1193
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001194SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001195 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001196 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001197}
1198
fmalita8c89c522014-11-08 16:18:56 -08001199void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001200 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001201}
1202
ethannicholasf62a8b72016-02-11 10:35:21 -08001203Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1204 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001205 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001206 return result;
1207}
1208
reed97660cc2016-06-28 18:54:19 -07001209////
1210
1211SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1212 sk_sp<SkData> value)
1213 : INHERITED(kDrawAnnotation_OpType)
1214 , fRect(rect)
1215 , fKey(key)
1216 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001217{
robertphillipsfb409232016-06-29 10:28:11 -07001218}
reed97660cc2016-06-28 18:54:19 -07001219
1220void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1221 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1222}
1223
1224Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1225 Json::Value result = INHERITED::toJSON(urlDataManager);
1226
1227 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1228 result["key"] = Json::Value(fKey.c_str());
1229 if (fValue.get()) {
1230 // TODO: dump out the "value"
1231 }
reed67f62fa2016-06-29 11:36:34 -07001232
1233 SkString desc;
1234 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1235 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1236
reed97660cc2016-06-28 18:54:19 -07001237 return result;
1238}
1239
reed97660cc2016-06-28 18:54:19 -07001240////
1241
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001242SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07001243 const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001244 : INHERITED(kDrawBitmap_OpType)
1245 , fBitmap(bitmap)
1246 , fLeft(left)
1247 , fTop(top)
1248 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001249
fmalita8c89c522014-11-08 16:18:56 -08001250void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001251 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001252}
1253
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001254bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001255 render_bitmap(canvas, fBitmap);
1256 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001257}
1258
ethannicholasf62a8b72016-02-11 10:35:21 -08001259Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
1260 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001261 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001262 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001263 Json::Value command(Json::objectValue);
1264 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001265 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
Brian Osman8363be12018-05-29 13:38:07 -04001266 if (fPaint.isValid()) {
1267 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001268 }
1269 }
1270 return result;
1271}
1272
Brian Osman78a76482018-05-18 16:59:13 -04001273SkDrawBitmapLatticeCommand::SkDrawBitmapLatticeCommand(const SkBitmap& bitmap,
1274 const SkCanvas::Lattice& lattice,
1275 const SkRect& dst, const SkPaint* paint)
1276 : INHERITED(kDrawBitmapLattice_OpType)
1277 , fBitmap(bitmap)
1278 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001279 , fDst(dst)
1280 , fPaint(paint) {}
Brian Osman78a76482018-05-18 16:59:13 -04001281
1282void SkDrawBitmapLatticeCommand::execute(SkCanvas* canvas) const {
1283 canvas->drawBitmapLattice(fBitmap, fLattice, fDst, fPaint.getMaybeNull());
1284}
1285
1286bool SkDrawBitmapLatticeCommand::render(SkCanvas* canvas) const {
1287 SkAutoCanvasRestore acr(canvas, true);
1288 canvas->clear(0xFFFFFFFF);
1289
1290 xlate_and_scale_to_bounds(canvas, fDst);
1291
1292 this->execute(canvas);
1293 return true;
1294}
1295
1296Json::Value SkDrawBitmapLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1297 Json::Value result = INHERITED::toJSON(urlDataManager);
1298 Json::Value encoded;
1299 if (flatten(fBitmap, &encoded, urlDataManager)) {
1300 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
1301 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1302 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1303 if (fPaint.isValid()) {
1304 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1305 }
1306 }
1307
1308 SkString desc;
1309 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1310
1311 return result;
1312}
1313
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001314SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00001315 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001316 : INHERITED(kDrawBitmapNine_OpType)
1317 , fBitmap(bitmap)
1318 , fCenter(center)
1319 , fDst(dst)
1320 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001321
fmalita8c89c522014-11-08 16:18:56 -08001322void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001323 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001324}
1325
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001326bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08001327 SkRect tmp = SkRect::Make(fCenter);
1328 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001329 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001330}
1331
ethannicholasf62a8b72016-02-11 10:35:21 -08001332Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1333 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001334 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001335 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001336 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08001337 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07001338 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001339 if (fPaint.isValid()) {
1340 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001341 }
1342 }
1343 return result;
1344}
1345
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001346SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00001347 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07001348 SkCanvas::SrcRectConstraint constraint)
Brian Osman8363be12018-05-29 13:38:07 -04001349 : INHERITED(kDrawBitmapRect_OpType)
1350 , fBitmap(bitmap)
1351 , fSrc(src)
1352 , fDst(dst)
1353 , fPaint(paint)
1354 , fConstraint(constraint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001355
fmalita8c89c522014-11-08 16:18:56 -08001356void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001357 canvas->legacy_drawBitmapRect(fBitmap, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
1358 fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001359}
1360
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001361bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001362 render_bitmap(canvas, fBitmap, fSrc.getMaybeNull());
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001363 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001364}
1365
ethannicholasf62a8b72016-02-11 10:35:21 -08001366Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1367 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001368 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001369 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001370 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
Brian Osman8363be12018-05-29 13:38:07 -04001371 if (fSrc.isValid()) {
1372 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001373 }
brianosmanfad98562016-05-04 11:06:28 -07001374 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001375 if (fPaint.isValid()) {
1376 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001377 }
1378 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1379 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1380 }
1381 }
reed67f62fa2016-06-29 11:36:34 -07001382
1383 SkString desc;
1384 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1385
ethannicholas50a8dd02016-02-10 05:40:46 -08001386 return result;
1387}
1388
fmalita651c9202015-07-22 10:23:01 -07001389SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
1390 const SkPaint* paint)
1391 : INHERITED(kDrawImage_OpType)
1392 , fImage(SkRef(image))
1393 , fLeft(left)
Brian Osman8363be12018-05-29 13:38:07 -04001394 , fTop(top)
1395 , fPaint(paint) {}
fmalita651c9202015-07-22 10:23:01 -07001396
1397void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001398 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07001399}
1400
1401bool SkDrawImageCommand::render(SkCanvas* canvas) const {
1402 SkAutoCanvasRestore acr(canvas, true);
1403 canvas->clear(0xFFFFFFFF);
1404
1405 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
1406 SkIntToScalar(fImage->width()),
1407 SkIntToScalar(fImage->height())));
1408 this->execute(canvas);
1409 return true;
1410}
1411
ethannicholasf62a8b72016-02-11 10:35:21 -08001412Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
1413 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001414 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001415 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001416 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001417 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08001418 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001419 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001420 }
msarett0ac1bec2016-08-29 09:15:33 -07001421
1422 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
1423 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
1424 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
1425 switch (fImage->alphaType()) {
1426 case kOpaque_SkAlphaType:
1427 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
1428 break;
1429 case kPremul_SkAlphaType:
1430 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
1431 break;
1432 case kUnpremul_SkAlphaType:
1433 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
1434 break;
1435 default:
1436 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
1437 break;
1438 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001439 }
1440 return result;
1441}
1442
Stan Ilievac42aeb2017-01-12 16:20:50 -05001443SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
1444 const SkCanvas::Lattice& lattice,
1445 const SkRect& dst, const SkPaint* paint)
1446 : INHERITED(kDrawImageLattice_OpType)
1447 , fImage(SkRef(image))
1448 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001449 , fDst(dst)
1450 , fPaint(paint) {}
Stan Ilievac42aeb2017-01-12 16:20:50 -05001451
1452void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
Brian Osman78a76482018-05-18 16:59:13 -04001453 canvas->drawImageLattice(fImage.get(), fLattice, fDst, fPaint.getMaybeNull());
Stan Ilievac42aeb2017-01-12 16:20:50 -05001454}
1455
1456bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
1457 SkAutoCanvasRestore acr(canvas, true);
1458 canvas->clear(0xFFFFFFFF);
1459
1460 xlate_and_scale_to_bounds(canvas, fDst);
1461
1462 this->execute(canvas);
1463 return true;
1464}
1465
1466Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1467 Json::Value result = INHERITED::toJSON(urlDataManager);
1468 Json::Value encoded;
1469 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001470 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
Stan Ilievac42aeb2017-01-12 16:20:50 -05001471 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1472 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1473 if (fPaint.isValid()) {
1474 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1475 }
1476 }
1477
1478 SkString desc;
1479 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1480
1481 return result;
1482}
1483
fmalita651c9202015-07-22 10:23:01 -07001484SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
1485 const SkRect& dst, const SkPaint* paint,
1486 SkCanvas::SrcRectConstraint constraint)
1487 : INHERITED(kDrawImageRect_OpType)
1488 , fImage(SkRef(image))
Brian Osman8363be12018-05-29 13:38:07 -04001489 , fSrc(src)
fmalita651c9202015-07-22 10:23:01 -07001490 , fDst(dst)
Brian Osman8363be12018-05-29 13:38:07 -04001491 , fPaint(paint)
1492 , fConstraint(constraint) {}
fmalita651c9202015-07-22 10:23:01 -07001493
1494void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001495 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
1496 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07001497}
1498
1499bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
1500 SkAutoCanvasRestore acr(canvas, true);
1501 canvas->clear(0xFFFFFFFF);
1502
1503 xlate_and_scale_to_bounds(canvas, fDst);
1504
1505 this->execute(canvas);
1506 return true;
1507}
1508
ethannicholasf62a8b72016-02-11 10:35:21 -08001509Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1510 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001511 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001512 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001513 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
ethannicholas50a8dd02016-02-10 05:40:46 -08001514 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001515 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001516 }
brianosmanfad98562016-05-04 11:06:28 -07001517 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08001518 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001519 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001520 }
1521 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1522 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1523 }
1524 }
reed67f62fa2016-06-29 11:36:34 -07001525
1526 SkString desc;
1527 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1528
ethannicholas50a8dd02016-02-10 05:40:46 -08001529 return result;
1530}
1531
Brian Salomond7065e72018-10-12 11:42:02 -04001532SkDrawImageSetCommand::SkDrawImageSetCommand(const SkCanvas::ImageSetEntry set[], int count,
Brian Salomond003d222018-11-26 13:25:05 -05001533 SkFilterQuality filterQuality, SkBlendMode mode)
Brian Salomond7065e72018-10-12 11:42:02 -04001534 : INHERITED(kDrawImageSet_OpType)
1535 , fSet(count)
1536 , fCount(count)
Brian Salomond7065e72018-10-12 11:42:02 -04001537 , fFilterQuality(filterQuality)
1538 , fMode(mode) {
1539 std::copy_n(set, count, fSet.get());
1540}
1541
1542void SkDrawImageSetCommand::execute(SkCanvas* canvas) const {
Brian Salomond003d222018-11-26 13:25:05 -05001543 canvas->experimental_DrawImageSetV1(fSet.get(), fCount, fFilterQuality, fMode);
Brian Salomond7065e72018-10-12 11:42:02 -04001544}
1545
Brian Osmanc25e2692018-03-12 10:57:28 -04001546SkDrawImageNineCommand::SkDrawImageNineCommand(const SkImage* image, const SkIRect& center,
1547 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001548 : INHERITED(kDrawImageNine_OpType)
1549 , fImage(SkRef(image))
1550 , fCenter(center)
1551 , fDst(dst)
1552 , fPaint(paint) {}
Brian Osmanc25e2692018-03-12 10:57:28 -04001553
1554void SkDrawImageNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001555 canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaint.getMaybeNull());
Brian Osmanc25e2692018-03-12 10:57:28 -04001556}
1557
1558bool SkDrawImageNineCommand::render(SkCanvas* canvas) const {
1559 SkAutoCanvasRestore acr(canvas, true);
1560 canvas->clear(0xFFFFFFFF);
1561
1562 xlate_and_scale_to_bounds(canvas, fDst);
1563
1564 this->execute(canvas);
1565 return true;
1566}
1567
1568Json::Value SkDrawImageNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1569 Json::Value result = INHERITED::toJSON(urlDataManager);
1570 Json::Value encoded;
1571 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
1572 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
1573 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
1574 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001575 if (fPaint.isValid()) {
1576 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
Brian Osmanc25e2692018-03-12 10:57:28 -04001577 }
1578 }
1579 return result;
1580}
1581
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001582SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001583 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001584 fOval = oval;
1585 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001586}
1587
fmalita8c89c522014-11-08 16:18:56 -08001588void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001589 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001590}
1591
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001592bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001593 canvas->clear(0xFFFFFFFF);
1594 canvas->save();
1595
1596 xlate_and_scale_to_bounds(canvas, fOval);
1597
1598 SkPaint p;
1599 p.setColor(SK_ColorBLACK);
1600 p.setStyle(SkPaint::kStroke_Style);
1601
1602 canvas->drawOval(fOval, p);
1603 canvas->restore();
1604
1605 return true;
1606}
1607
ethannicholasf62a8b72016-02-11 10:35:21 -08001608Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
1609 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001610 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1611 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001612 return result;
1613}
1614
bsalomonac3aa242016-08-19 11:25:19 -07001615SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
1616 bool useCenter, const SkPaint& paint)
Brian Osmanc25e2692018-03-12 10:57:28 -04001617 : INHERITED(kDrawArc_OpType) {
bsalomonac3aa242016-08-19 11:25:19 -07001618 fOval = oval;
1619 fStartAngle = startAngle;
1620 fSweepAngle = sweepAngle;
1621 fUseCenter = useCenter;
1622 fPaint = paint;
bsalomonac3aa242016-08-19 11:25:19 -07001623}
1624
1625void SkDrawArcCommand::execute(SkCanvas* canvas) const {
1626 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
1627}
1628
1629bool SkDrawArcCommand::render(SkCanvas* canvas) const {
1630 canvas->clear(0xFFFFFFFF);
1631 canvas->save();
1632
1633 xlate_and_scale_to_bounds(canvas, fOval);
1634
1635 SkPaint p;
1636 p.setColor(SK_ColorBLACK);
1637 p.setStyle(SkPaint::kStroke_Style);
1638
1639 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
1640 canvas->restore();
1641
1642 return true;
1643}
1644
1645Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
1646 Json::Value result = INHERITED::toJSON(urlDataManager);
1647 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1648 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
1649 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
1650 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
1651 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1652 return result;
1653}
1654
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001655SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001656 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001657 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001658}
1659
fmalita8c89c522014-11-08 16:18:56 -08001660void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001661 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001662}
1663
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001664bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001665 canvas->clear(0xFFFFFFFF);
1666 canvas->drawPaint(fPaint);
1667 return true;
1668}
1669
ethannicholasf62a8b72016-02-11 10:35:21 -08001670Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
1671 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001672 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001673 return result;
1674}
1675
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001676SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001677 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001678 fPath = path;
1679 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001680}
1681
fmalita8c89c522014-11-08 16:18:56 -08001682void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001683 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001684}
1685
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001686bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001687 render_path(canvas, fPath);
1688 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001689}
1690
ethannicholasf62a8b72016-02-11 10:35:21 -08001691Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1692 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001693 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
1694 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001695 return result;
1696}
1697
Brian Osmanc25e2692018-03-12 10:57:28 -04001698SkDrawRegionCommand::SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint)
1699 : INHERITED(kDrawRegion_OpType) {
1700 fRegion = region;
1701 fPaint = paint;
Brian Osmanc25e2692018-03-12 10:57:28 -04001702}
1703
1704void SkDrawRegionCommand::execute(SkCanvas* canvas) const {
1705 canvas->drawRegion(fRegion, fPaint);
1706}
1707
1708bool SkDrawRegionCommand::render(SkCanvas* canvas) const {
1709 render_region(canvas, fRegion);
1710 return true;
1711}
1712
1713Json::Value SkDrawRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1714 Json::Value result = INHERITED::toJSON(urlDataManager);
1715 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
1716 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1717 return result;
1718}
1719
fmalita160ebb22015-04-01 20:58:37 -07001720SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
1721 const SkMatrix* matrix,
1722 const SkPaint* paint)
1723 : INHERITED(kBeginDrawPicture_OpType)
Brian Osman8363be12018-05-29 13:38:07 -04001724 , fPicture(SkRef(picture))
1725 , fMatrix(matrix)
1726 , fPaint(paint) {}
fmalita160ebb22015-04-01 20:58:37 -07001727
1728void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
1729 if (fPaint.isValid()) {
1730 SkRect bounds = fPicture->cullRect();
1731 if (fMatrix.isValid()) {
1732 fMatrix.get()->mapRect(&bounds);
1733 }
1734 canvas->saveLayer(&bounds, fPaint.get());
1735 }
1736
1737 if (fMatrix.isValid()) {
1738 if (!fPaint.isValid()) {
1739 canvas->save();
1740 }
1741 canvas->concat(*fMatrix.get());
1742 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001743}
1744
fmalita160ebb22015-04-01 20:58:37 -07001745bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001746 canvas->clear(0xFFFFFFFF);
1747 canvas->save();
1748
robertphillipsa8d7f0b2014-08-29 08:03:56 -07001749 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001750
robertphillips9b14f262014-06-04 05:40:44 -07001751 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001752
1753 canvas->restore();
1754
1755 return true;
1756}
1757
fmalita160ebb22015-04-01 20:58:37 -07001758SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
1759 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
1760
1761void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
1762 if (fRestore) {
1763 canvas->restore();
1764 }
1765}
1766
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001767SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001768 const SkPoint pts[], const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04001769 : INHERITED(kDrawPoints_OpType)
1770 , fMode(mode)
1771 , fPts(pts, count)
1772 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001773
fmalita8c89c522014-11-08 16:18:56 -08001774void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001775 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001776}
1777
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001778bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001779 canvas->clear(0xFFFFFFFF);
1780 canvas->save();
1781
1782 SkRect bounds;
1783
1784 bounds.setEmpty();
Brian Osman8363be12018-05-29 13:38:07 -04001785 for (int i = 0; i < fPts.count(); ++i) {
Mike Reed185ffe92018-01-08 17:09:54 -05001786 SkRectPriv::GrowToInclude(&bounds, fPts[i]);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001787 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00001788
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001789 xlate_and_scale_to_bounds(canvas, bounds);
1790
1791 SkPaint p;
1792 p.setColor(SK_ColorBLACK);
1793 p.setStyle(SkPaint::kStroke_Style);
1794
Brian Osman8363be12018-05-29 13:38:07 -04001795 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001796 canvas->restore();
1797
1798 return true;
1799}
1800
ethannicholasf62a8b72016-02-11 10:35:21 -08001801Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
1802 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001803 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
1804 Json::Value points(Json::arrayValue);
Brian Osman8363be12018-05-29 13:38:07 -04001805 for (int i = 0; i < fPts.count(); i++) {
brianosmanfad98562016-05-04 11:06:28 -07001806 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001807 }
1808 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07001809 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001810 return result;
1811}
1812
Brian Osman65197ff2018-05-29 14:25:39 -04001813static Json::Value make_json_text(sk_sp<SkData> text) {
1814 return Json::Value((const char*)text->data(), (const char*)text->data() + text->size());
chudy@google.com902ebe52012-06-29 14:21:22 +00001815}
1816
Brian Osman65197ff2018-05-29 14:25:39 -04001817SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength,
1818 const SkPoint pos[], const SkPaint& paint)
1819 : INHERITED(kDrawPosText_OpType)
1820 , fText(SkData::MakeWithCopy(text, byteLength))
1821 , fPos(pos, paint.countText(text, byteLength))
1822 , fPaint(paint) {}
1823
fmalita8c89c522014-11-08 16:18:56 -08001824void SkDrawPosTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001825 canvas->drawPosText(fText->data(), fText->size(), fPos.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001826}
1827
ethannicholasf62a8b72016-02-11 10:35:21 -08001828Json::Value SkDrawPosTextCommand::toJSON(UrlDataManager& urlDataManager) const {
1829 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001830 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08001831 Json::Value coords(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001832 size_t numCoords = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001833 for (size_t i = 0; i < numCoords; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001834 coords.append(MakeJsonPoint(fPos[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001835 }
1836 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = coords;
brianosmanfad98562016-05-04 11:06:28 -07001837 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001838 return result;
1839}
1840
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001841SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength,
1842 const SkScalar xpos[], SkScalar constY,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001843 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04001844 : INHERITED(kDrawPosTextH_OpType)
1845 , fText(SkData::MakeWithCopy(text, byteLength))
1846 , fXpos(xpos, paint.countText(text, byteLength))
1847 , fConstY(constY)
1848 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001849
fmalita8c89c522014-11-08 16:18:56 -08001850void SkDrawPosTextHCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001851 canvas->drawPosTextH(fText->data(), fText->size(), fXpos.begin(), fConstY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001852}
1853
bungeman51190df2016-03-09 07:42:54 -08001854Json::Value SkDrawPosTextHCommand::toJSON(UrlDataManager& urlDataManager) const {
1855 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001856 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
bungeman51190df2016-03-09 07:42:54 -08001857 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fConstY);
1858 Json::Value xpos(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001859 size_t numXpos = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001860 for (size_t i = 0; i < numXpos; i++) {
1861 xpos.append(Json::Value(fXpos[i]));
1862 }
1863 result[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = xpos;
brianosmanfad98562016-05-04 11:06:28 -07001864 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
bungeman51190df2016-03-09 07:42:54 -08001865 return result;
1866}
1867
fmalita37283c22016-09-13 10:00:23 -07001868SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07001869 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001870 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07001871 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07001872 , fXPos(x)
1873 , fYPos(y)
Brian Osman255735e2018-04-06 14:51:42 -04001874 , fPaint(paint) {}
fmalitab7425172014-08-26 07:56:44 -07001875
fmalita8c89c522014-11-08 16:18:56 -08001876void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07001877 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1878}
1879
fmalita55773872014-08-29 15:08:20 -07001880bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
1881 canvas->clear(SK_ColorWHITE);
1882 canvas->save();
1883
1884 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
1885 xlate_and_scale_to_bounds(canvas, bounds);
1886
fmalita37283c22016-09-13 10:00:23 -07001887 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07001888
1889 canvas->restore();
1890
1891 return true;
1892}
1893
ethannicholasf62a8b72016-02-11 10:35:21 -08001894Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
1895 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001896 Json::Value runs(Json::arrayValue);
1897 SkTextBlobRunIterator iter(fBlob.get());
1898 while (!iter.done()) {
1899 Json::Value run(Json::objectValue);
1900 Json::Value jsonPositions(Json::arrayValue);
1901 Json::Value jsonGlyphs(Json::arrayValue);
1902 const SkScalar* iterPositions = iter.pos();
1903 const uint16_t* iterGlyphs = iter.glyphs();
1904 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1905 switch (iter.positioning()) {
Florin Malitaab54e732018-07-27 09:47:15 -04001906 case SkTextBlobRunIterator::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07001907 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
1908 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001909 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001910 case SkTextBlobRunIterator::kHorizontal_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001911 jsonPositions.append(Json::Value(iterPositions[i]));
1912 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001913 case SkTextBlobRunIterator::kDefault_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001914 break;
1915 }
1916 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
1917 }
Florin Malitaab54e732018-07-27 09:47:15 -04001918 if (iter.positioning() != SkTextBlobRunIterator::kDefault_Positioning) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001919 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
1920 }
1921 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
1922 SkPaint fontPaint;
1923 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07001924 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
1925 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08001926 runs.append(run);
1927 iter.next();
1928 }
reed6d2c3e72016-07-07 14:10:14 -07001929 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08001930 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
1931 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
1932 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07001933 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07001934 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07001935
1936 SkString desc;
1937 // make the bounds local by applying the x,y
1938 bounds.offset(fXPos, fYPos);
1939 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
1940
ethannicholas50a8dd02016-02-10 05:40:46 -08001941 return result;
1942}
1943
robertphillips9bafc302015-02-13 11:13:00 -08001944SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04001945 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08001946 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04001947 : INHERITED(kDrawPatch_OpType)
1948 , fBlendMode(bmode)
1949{
robertphillips9bafc302015-02-13 11:13:00 -08001950 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08001951 if (colors != nullptr) {
1952 memcpy(fColors, colors, sizeof(fColors));
1953 fColorsPtr = fColors;
1954 } else {
1955 fColorsPtr = nullptr;
1956 }
1957 if (texCoords != nullptr) {
1958 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
1959 fTexCoordsPtr = fTexCoords;
1960 } else {
1961 fTexCoordsPtr = nullptr;
1962 }
robertphillips9bafc302015-02-13 11:13:00 -08001963 fPaint = paint;
robertphillips9bafc302015-02-13 11:13:00 -08001964}
1965
1966void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04001967 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08001968}
1969
ethannicholasf62a8b72016-02-11 10:35:21 -08001970Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
1971 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001972 Json::Value cubics = Json::Value(Json::arrayValue);
1973 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001974 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001975 }
1976 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
1977 if (fColorsPtr != nullptr) {
1978 Json::Value colors = Json::Value(Json::arrayValue);
1979 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001980 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001981 }
1982 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
1983 }
1984 if (fTexCoordsPtr != nullptr) {
1985 Json::Value texCoords = Json::Value(Json::arrayValue);
1986 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001987 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001988 }
1989 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
1990 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001991 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08001992 return result;
1993}
1994
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001995SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001996 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001997 fRect = rect;
1998 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001999}
2000
fmalita8c89c522014-11-08 16:18:56 -08002001void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002002 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002003}
2004
ethannicholasf62a8b72016-02-11 10:35:21 -08002005Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2006 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002007 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
2008 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07002009
2010 SkString desc;
2011 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
2012
ethannicholas50a8dd02016-02-10 05:40:46 -08002013 return result;
2014}
2015
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002016SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002017 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002018 fRRect = rrect;
2019 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00002020}
2021
fmalita8c89c522014-11-08 16:18:56 -08002022void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00002023 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00002024}
2025
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002026bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002027 render_rrect(canvas, fRRect);
2028 return true;
2029}
2030
ethannicholasf62a8b72016-02-11 10:35:21 -08002031Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2032 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002033 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07002034 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002035 return result;
2036}
2037
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00002038SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002039 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002040 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002041 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002042 fOuter = outer;
2043 fInner = inner;
2044 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002045}
2046
fmalita8c89c522014-11-08 16:18:56 -08002047void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002048 canvas->drawDRRect(fOuter, fInner, fPaint);
2049}
2050
2051bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
2052 render_drrect(canvas, fOuter, fInner);
2053 return true;
2054}
2055
ethannicholasf62a8b72016-02-11 10:35:21 -08002056Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2057 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002058 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
2059 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07002060 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002061 return result;
2062}
2063
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04002064SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
2065 : INHERITED(kDrawShadow_OpType) {
2066 fPath = path;
2067 fShadowRec = rec;
2068}
2069
2070void SkDrawShadowCommand::execute(SkCanvas* canvas) const {
2071 canvas->private_draw_shadow_rec(fPath, fShadowRec);
2072}
2073
2074bool SkDrawShadowCommand::render(SkCanvas* canvas) const {
2075 render_shadow(canvas, fPath, fShadowRec);
2076 return true;
2077}
2078
2079Json::Value SkDrawShadowCommand::toJSON(UrlDataManager& urlDataManager) const {
2080 Json::Value result = INHERITED::toJSON(urlDataManager);
2081 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2082
2083 bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
2084 bool transparentOccluder =
2085 SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
2086
2087 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2088 result[SKDEBUGCANVAS_ATTRIBUTE_ZPLANE] = MakeJsonPoint3(fShadowRec.fZPlaneParams);
2089 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION] = MakeJsonPoint3(fShadowRec.fLightPos);
2090 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS] = MakeJsonScalar(fShadowRec.fLightRadius);
2091 result[SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR] = MakeJsonColor(fShadowRec.fAmbientColor);
2092 result[SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR] = MakeJsonColor(fShadowRec.fSpotColor);
2093 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
2094 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
2095 return result;
2096}
2097
Brian Osmanc7611082018-05-29 14:55:50 -04002098///////////////////////////////////////////////////////////////////////////////////////////////////
2099
2100SkDrawDrawableCommand::SkDrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
2101 : INHERITED(kDrawDrawable_OpType)
2102 , fDrawable(SkRef(drawable))
2103 , fMatrix(matrix) {}
2104
2105void SkDrawDrawableCommand::execute(SkCanvas* canvas) const {
2106 canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
2107}
2108
2109///////////////////////////////////////////////////////////////////////////////////////////////////
2110
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002111SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002112 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04002113 : INHERITED(kDrawText_OpType)
2114 , fText(SkData::MakeWithCopy(text, byteLength))
2115 , fX(x)
2116 , fY(y)
2117 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002118
fmalita8c89c522014-11-08 16:18:56 -08002119void SkDrawTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002120 canvas->drawText(fText->data(), fText->size(), fX, fY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002121}
2122
ethannicholasf62a8b72016-02-11 10:35:21 -08002123Json::Value SkDrawTextCommand::toJSON(UrlDataManager& urlDataManager) const {
2124 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002125 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08002126 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07002127 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fX, fY);
2128 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002129 return result;
2130}
2131
reed45561a02016-07-07 12:47:17 -07002132///////////////////////////////////////////////////////////////////////////////////////////////////
2133
reed45561a02016-07-07 12:47:17 -07002134SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength,
2135 const SkRSXform xform[], const SkRect* cull,
2136 const SkPaint& paint)
reed63f30d92016-07-07 16:32:51 -07002137 : INHERITED(kDrawTextRSXform_OpType)
Brian Osman65197ff2018-05-29 14:25:39 -04002138 , fText(SkData::MakeWithCopy(text, byteLength))
2139 , fXform(xform, paint.countText(text, byteLength))
Brian Osman8363be12018-05-29 13:38:07 -04002140 , fCull(cull)
Brian Osman65197ff2018-05-29 14:25:39 -04002141 , fPaint(paint) {}
reed45561a02016-07-07 12:47:17 -07002142
2143void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002144 canvas->drawTextRSXform(fText->data(), fText->size(), fXform.begin(), fCull.getMaybeNull(),
2145 fPaint);
reed45561a02016-07-07 12:47:17 -07002146}
2147
2148Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) const {
2149 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002150 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
reed45561a02016-07-07 12:47:17 -07002151 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
2152 return result;
2153}
2154
reed45561a02016-07-07 12:47:17 -07002155///////////////////////////////////////////////////////////////////////////////////////////////////
2156
Mike Reedfed9cfd2017-03-17 12:09:04 -04002157SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002158 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04002159 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04002160 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04002161 , fBlendMode(bmode)
Brian Osman255735e2018-04-06 14:51:42 -04002162 , fPaint(paint) {}
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002163
fmalita8c89c522014-11-08 16:18:56 -08002164void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04002165 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002166}
2167
Brian Osman616f1cb2018-05-29 11:23:35 -04002168///////////////////////////////////////////////////////////////////////////////////////////////////
2169
2170SkDrawAtlasCommand::SkDrawAtlasCommand(const SkImage* image, const SkRSXform xform[],
2171 const SkRect tex[], const SkColor colors[], int count,
2172 SkBlendMode bmode, const SkRect* cull,
2173 const SkPaint* paint)
2174 : INHERITED(kDrawAtlas_OpType)
2175 , fImage(SkRef(image))
2176 , fXform(xform, count)
2177 , fTex(tex, count)
2178 , fColors(colors, colors ? count : 0)
2179 , fBlendMode(bmode)
2180 , fCull(cull)
2181 , fPaint(paint) {}
2182
2183void SkDrawAtlasCommand::execute(SkCanvas* canvas) const {
2184 canvas->drawAtlas(fImage.get(), fXform.begin(), fTex.begin(),
2185 fColors.isEmpty() ? nullptr : fColors.begin(), fXform.count(), fBlendMode,
2186 fCull.getMaybeNull(), fPaint.getMaybeNull());
2187}
2188
2189///////////////////////////////////////////////////////////////////////////////////////////////////
2190
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002191SkRestoreCommand::SkRestoreCommand()
Brian Osman255735e2018-04-06 14:51:42 -04002192 : INHERITED(kRestore_OpType) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002193
fmalita8c89c522014-11-08 16:18:56 -08002194void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00002195 canvas->restore();
2196}
2197
Florin Malita5f6102d2014-06-30 10:13:28 -04002198SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08002199 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00002200}
2201
fmalita8c89c522014-11-08 16:18:56 -08002202void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04002203 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00002204}
2205
reed4960eee2015-12-18 07:09:18 -08002206SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
Brian Osman8363be12018-05-29 13:38:07 -04002207 : INHERITED(kSaveLayer_OpType)
2208 , fBounds(rec.fBounds)
2209 , fPaint(rec.fPaint)
2210 , fBackdrop(SkSafeRef(rec.fBackdrop))
2211 , fSaveLayerFlags(rec.fSaveLayerFlags) {}
ethannicholas50a8dd02016-02-10 05:40:46 -08002212
fmalita8c89c522014-11-08 16:18:56 -08002213void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04002214 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(),
reed4960eee2015-12-18 07:09:18 -08002215 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00002216}
2217
ethannicholasf62a8b72016-02-11 10:35:21 -08002218Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
2219 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman8363be12018-05-29 13:38:07 -04002220 if (fBounds.isValid()) {
2221 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(*fBounds.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002222 }
Brian Osman8363be12018-05-29 13:38:07 -04002223 if (fPaint.isValid()) {
2224 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002225 }
2226 if (fBackdrop != nullptr) {
2227 Json::Value jsonBackdrop;
Brian Osman8363be12018-05-29 13:38:07 -04002228 flatten(fBackdrop.get(), &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002229 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
2230 }
2231 if (fSaveLayerFlags != 0) {
2232 SkDebugf("unsupported: saveLayer flags\n");
2233 SkASSERT(false);
2234 }
2235 return result;
2236}
2237
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002238SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08002239 : INHERITED(kSetMatrix_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002240 fMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -07002241}
2242
fmalita8c89c522014-11-08 16:18:56 -08002243void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
Brian Osman255735e2018-04-06 14:51:42 -04002244 canvas->setMatrix(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00002245}
2246
ethannicholasf62a8b72016-02-11 10:35:21 -08002247Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
2248 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08002249 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08002250 return result;
2251}