blob: 299a9168c0e33f07d206ccc0d43fceaff43d6745 [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
Hal Canary95e3c052017-01-11 12:44:43 -050010#include "SkAutoMalloc.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080011#include "SkColorFilter.h"
12#include "SkDashPathEffect.h"
Brian Osmanc7611082018-05-29 14:55:50 -040013#include "SkDrawable.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080014#include "SkImageFilter.h"
brianosmanfad98562016-05-04 11:06:28 -070015#include "SkJsonWriteBuffer.h"
Mike Reed80747ef2018-01-23 15:29:32 -050016#include "SkMaskFilterBase.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080017#include "SkPaintDefaults.h"
18#include "SkPathEffect.h"
robertphillips9bafc302015-02-13 11:13:00 -080019#include "SkPicture.h"
Brian Osmand9ea8162018-08-08 17:03:39 -040020#include "SkPngEncoder.h"
Mike Reedfadbfcd2017-12-06 16:09:20 -050021#include "SkReadBuffer.h"
Mike Reed185ffe92018-01-08 17:09:54 -050022#include "SkRectPriv.h"
Florin Malitaab54e732018-07-27 09:47:15 -040023#include "SkTextBlobPriv.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080024#include "SkTHash.h"
25#include "SkTypeface.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080026#include "SkWriteBuffer.h"
msaretta5cf4f42016-06-30 10:06:51 -070027#include "picture_utils.h"
Mike Reedebfce6d2016-12-12 10:02:12 -050028#include "SkClipOpPriv.h"
Stan Ilievac42aeb2017-01-12 16:20:50 -050029#include <SkLatticeIter.h>
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -040030#include <SkShadowFlags.h>
ethannicholas50a8dd02016-02-10 05:40:46 -080031
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"
63#define SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT "verticalText"
ethannicholas50a8dd02016-02-10 05:40:46 -080064#define SKDEBUGCANVAS_ATTRIBUTE_REGION "region"
65#define SKDEBUGCANVAS_ATTRIBUTE_REGIONOP "op"
66#define SKDEBUGCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle"
67#define SKDEBUGCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion"
68#define SKDEBUGCANVAS_ATTRIBUTE_BLUR "blur"
69#define SKDEBUGCANVAS_ATTRIBUTE_SIGMA "sigma"
70#define SKDEBUGCANVAS_ATTRIBUTE_QUALITY "quality"
71#define SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN "textAlign"
72#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE "textSize"
73#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX"
74#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX"
75#define SKDEBUGCANVAS_ATTRIBUTE_DASHING "dashing"
76#define SKDEBUGCANVAS_ATTRIBUTE_INTERVALS "intervals"
77#define SKDEBUGCANVAS_ATTRIBUTE_PHASE "phase"
78#define SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE "fillType"
79#define SKDEBUGCANVAS_ATTRIBUTE_VERBS "verbs"
80#define SKDEBUGCANVAS_ATTRIBUTE_NAME "name"
ethannicholasf62a8b72016-02-11 10:35:21 -080081#define SKDEBUGCANVAS_ATTRIBUTE_DATA "data"
brianosmanfad98562016-05-04 11:06:28 -070082#define SKDEBUGCANVAS_ATTRIBUTE_VALUES "values"
ethannicholas50a8dd02016-02-10 05:40:46 -080083#define SKDEBUGCANVAS_ATTRIBUTE_SHADER "shader"
84#define SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect"
85#define SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER "maskFilter"
86#define SKDEBUGCANVAS_ATTRIBUTE_XFERMODE "xfermode"
ethannicholas1446a9a2016-02-10 14:05:02 -080087#define SKDEBUGCANVAS_ATTRIBUTE_LOOPER "looper"
ethannicholas50a8dd02016-02-10 05:40:46 -080088#define SKDEBUGCANVAS_ATTRIBUTE_BACKDROP "backdrop"
89#define SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER "colorfilter"
90#define SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter"
91#define SKDEBUGCANVAS_ATTRIBUTE_IMAGE "image"
92#define SKDEBUGCANVAS_ATTRIBUTE_BITMAP "bitmap"
93#define SKDEBUGCANVAS_ATTRIBUTE_SRC "src"
94#define SKDEBUGCANVAS_ATTRIBUTE_DST "dst"
95#define SKDEBUGCANVAS_ATTRIBUTE_CENTER "center"
96#define SKDEBUGCANVAS_ATTRIBUTE_STRICT "strict"
97#define SKDEBUGCANVAS_ATTRIBUTE_DESCRIPTION "description"
98#define SKDEBUGCANVAS_ATTRIBUTE_X "x"
99#define SKDEBUGCANVAS_ATTRIBUTE_Y "y"
100#define SKDEBUGCANVAS_ATTRIBUTE_RUNS "runs"
101#define SKDEBUGCANVAS_ATTRIBUTE_POSITIONS "positions"
102#define SKDEBUGCANVAS_ATTRIBUTE_GLYPHS "glyphs"
103#define SKDEBUGCANVAS_ATTRIBUTE_FONT "font"
104#define SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE "typeface"
ethannicholas1446a9a2016-02-10 14:05:02 -0800105#define SKDEBUGCANVAS_ATTRIBUTE_CUBICS "cubics"
106#define SKDEBUGCANVAS_ATTRIBUTE_COLORS "colors"
107#define SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS "textureCoords"
108#define SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY "filterQuality"
bsalomonac3aa242016-08-19 11:25:19 -0700109#define SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE "startAngle"
110#define SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE "sweepAngle"
111#define SKDEBUGCANVAS_ATTRIBUTE_USECENTER "useCenter"
jcgregorioee0c5552016-06-30 09:18:27 -0700112#define SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC "shortDesc"
msarett0ac1bec2016-08-29 09:15:33 -0700113#define SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID "uniqueID"
114#define SKDEBUGCANVAS_ATTRIBUTE_WIDTH "width"
115#define SKDEBUGCANVAS_ATTRIBUTE_HEIGHT "height"
116#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Stan Ilievac42aeb2017-01-12 16:20:50 -0500117#define SKDEBUGCANVAS_ATTRIBUTE_LATTICE "lattice"
118#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT "xCount"
119#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT "yCount"
120#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS "xDivs"
121#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS "yDivs"
122#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS "flags"
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400123#define SKDEBUGCANVAS_ATTRIBUTE_ZPLANE "zPlane"
124#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION "lightPositions"
125#define SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR "ambientColor"
126#define SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR "spotColor"
127#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS "lightRadius"
reed67f62fa2016-06-29 11:36:34 -0700128
ethannicholas50a8dd02016-02-10 05:40:46 -0800129#define SKDEBUGCANVAS_VERB_MOVE "move"
130#define SKDEBUGCANVAS_VERB_LINE "line"
131#define SKDEBUGCANVAS_VERB_QUAD "quad"
132#define SKDEBUGCANVAS_VERB_CUBIC "cubic"
133#define SKDEBUGCANVAS_VERB_CONIC "conic"
134#define SKDEBUGCANVAS_VERB_CLOSE "close"
135
136#define SKDEBUGCANVAS_STYLE_FILL "fill"
137#define SKDEBUGCANVAS_STYLE_STROKE "stroke"
138#define SKDEBUGCANVAS_STYLE_STROKEANDFILL "strokeAndFill"
139
140#define SKDEBUGCANVAS_POINTMODE_POINTS "points"
141#define SKDEBUGCANVAS_POINTMODE_LINES "lines"
142#define SKDEBUGCANVAS_POINTMODE_POLYGON "polygon"
143
144#define SKDEBUGCANVAS_REGIONOP_DIFFERENCE "difference"
145#define SKDEBUGCANVAS_REGIONOP_INTERSECT "intersect"
146#define SKDEBUGCANVAS_REGIONOP_UNION "union"
147#define SKDEBUGCANVAS_REGIONOP_XOR "xor"
148#define SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE "reverseDifference"
149#define SKDEBUGCANVAS_REGIONOP_REPLACE "replace"
150
151#define SKDEBUGCANVAS_BLURSTYLE_NORMAL "normal"
152#define SKDEBUGCANVAS_BLURSTYLE_SOLID "solid"
153#define SKDEBUGCANVAS_BLURSTYLE_OUTER "outer"
154#define SKDEBUGCANVAS_BLURSTYLE_INNER "inner"
155
156#define SKDEBUGCANVAS_BLURQUALITY_LOW "low"
157#define SKDEBUGCANVAS_BLURQUALITY_HIGH "high"
158
159#define SKDEBUGCANVAS_ALIGN_LEFT "left"
160#define SKDEBUGCANVAS_ALIGN_CENTER "center"
161#define SKDEBUGCANVAS_ALIGN_RIGHT "right"
162
163#define SKDEBUGCANVAS_FILLTYPE_WINDING "winding"
164#define SKDEBUGCANVAS_FILLTYPE_EVENODD "evenOdd"
165#define SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding"
166#define SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd"
167
168#define SKDEBUGCANVAS_CAP_BUTT "butt"
169#define SKDEBUGCANVAS_CAP_ROUND "round"
170#define SKDEBUGCANVAS_CAP_SQUARE "square"
171
ethannicholas1446a9a2016-02-10 14:05:02 -0800172#define SKDEBUGCANVAS_MITER_JOIN "miter"
173#define SKDEBUGCANVAS_ROUND_JOIN "round"
174#define SKDEBUGCANVAS_BEVEL_JOIN "bevel"
175
ethannicholas50a8dd02016-02-10 05:40:46 -0800176#define SKDEBUGCANVAS_COLORTYPE_ARGB4444 "ARGB4444"
177#define SKDEBUGCANVAS_COLORTYPE_RGBA8888 "RGBA8888"
178#define SKDEBUGCANVAS_COLORTYPE_BGRA8888 "BGRA8888"
179#define SKDEBUGCANVAS_COLORTYPE_565 "565"
180#define SKDEBUGCANVAS_COLORTYPE_GRAY8 "Gray8"
181#define SKDEBUGCANVAS_COLORTYPE_INDEX8 "Index8"
182#define SKDEBUGCANVAS_COLORTYPE_ALPHA8 "Alpha8"
183
184#define SKDEBUGCANVAS_ALPHATYPE_OPAQUE "opaque"
185#define SKDEBUGCANVAS_ALPHATYPE_PREMUL "premul"
186#define SKDEBUGCANVAS_ALPHATYPE_UNPREMUL "unpremul"
msarett0ac1bec2016-08-29 09:15:33 -0700187#define SKDEBUGCANVAS_ALPHATYPE_UNKNOWN "unknown"
ethannicholas50a8dd02016-02-10 05:40:46 -0800188
ethannicholas1446a9a2016-02-10 14:05:02 -0800189#define SKDEBUGCANVAS_FILTERQUALITY_NONE "none"
190#define SKDEBUGCANVAS_FILTERQUALITY_LOW "low"
191#define SKDEBUGCANVAS_FILTERQUALITY_MEDIUM "medium"
192#define SKDEBUGCANVAS_FILTERQUALITY_HIGH "high"
193
halcanaryf412f092016-08-25 11:10:41 -0700194#define SKDEBUGCANVAS_HINTING_NONE "none"
195#define SKDEBUGCANVAS_HINTING_SLIGHT "slight"
196#define SKDEBUGCANVAS_HINTING_NORMAL "normal"
197#define SKDEBUGCANVAS_HINTING_FULL "full"
198
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400199#define SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC "transparentOccluder"
200#define SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY "geometricOnly"
201
reed67f62fa2016-06-29 11:36:34 -0700202static SkString* str_append(SkString* str, const SkRect& r) {
203 str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom());
204 return str;
205}
206
robertphillips9bafc302015-02-13 11:13:00 -0800207SkDrawCommand::SkDrawCommand(OpType type)
208 : fOpType(type)
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000209 , fVisible(true) {
210}
211
robertphillips9bafc302015-02-13 11:13:00 -0800212const char* SkDrawCommand::GetCommandString(OpType type) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000213 switch (type) {
fmalita160ebb22015-04-01 20:58:37 -0700214 case kBeginDrawPicture_OpType: return "BeginDrawPicture";
Brian Osmanc25e2692018-03-12 10:57:28 -0400215 case kClear_OpType: return "DrawClear";
robertphillips9bafc302015-02-13 11:13:00 -0800216 case kClipPath_OpType: return "ClipPath";
217 case kClipRegion_OpType: return "ClipRegion";
218 case kClipRect_OpType: return "ClipRect";
219 case kClipRRect_OpType: return "ClipRRect";
robertphillips9bafc302015-02-13 11:13:00 -0800220 case kConcat_OpType: return "Concat";
robertphillipsfb409232016-06-29 10:28:11 -0700221 case kDrawAnnotation_OpType: return "DrawAnnotation";
robertphillips9bafc302015-02-13 11:13:00 -0800222 case kDrawBitmap_OpType: return "DrawBitmap";
Brian Osman78a76482018-05-18 16:59:13 -0400223 case kDrawBitmapLattice_OpType: return "DrawBitmapLattice";
robertphillips9bafc302015-02-13 11:13:00 -0800224 case kDrawBitmapNine_OpType: return "DrawBitmapNine";
225 case kDrawBitmapRect_OpType: return "DrawBitmapRect";
robertphillips9bafc302015-02-13 11:13:00 -0800226 case kDrawDRRect_OpType: return "DrawDRRect";
fmalita651c9202015-07-22 10:23:01 -0700227 case kDrawImage_OpType: return "DrawImage";
Stan Ilievac42aeb2017-01-12 16:20:50 -0500228 case kDrawImageLattice_OpType: return "DrawImageLattice";
Brian Osmanc25e2692018-03-12 10:57:28 -0400229 case kDrawImageNine_OpType: return "DrawImageNine";
fmalita651c9202015-07-22 10:23:01 -0700230 case kDrawImageRect_OpType: return "DrawImageRect";
robertphillips9bafc302015-02-13 11:13:00 -0800231 case kDrawOval_OpType: return "DrawOval";
232 case kDrawPaint_OpType: return "DrawPaint";
233 case kDrawPatch_OpType: return "DrawPatch";
234 case kDrawPath_OpType: return "DrawPath";
Brian Osmanc25e2692018-03-12 10:57:28 -0400235 case kDrawArc_OpType: return "DrawArc";
robertphillips9bafc302015-02-13 11:13:00 -0800236 case kDrawPoints_OpType: return "DrawPoints";
237 case kDrawPosText_OpType: return "DrawPosText";
238 case kDrawPosTextH_OpType: return "DrawPosTextH";
239 case kDrawRect_OpType: return "DrawRect";
240 case kDrawRRect_OpType: return "DrawRRect";
Brian Osmanc25e2692018-03-12 10:57:28 -0400241 case kDrawRegion_OpType: return "DrawRegion";
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400242 case kDrawShadow_OpType: return "DrawShadow";
robertphillips9bafc302015-02-13 11:13:00 -0800243 case kDrawText_OpType: return "DrawText";
244 case kDrawTextBlob_OpType: return "DrawTextBlob";
245 case kDrawTextOnPath_OpType: return "DrawTextOnPath";
reed63f30d92016-07-07 16:32:51 -0700246 case kDrawTextRSXform_OpType: return "DrawTextRSXform";
robertphillips9bafc302015-02-13 11:13:00 -0800247 case kDrawVertices_OpType: return "DrawVertices";
Brian Osman616f1cb2018-05-29 11:23:35 -0400248 case kDrawAtlas_OpType: return "DrawAtlas";
Brian Osmanc7611082018-05-29 14:55:50 -0400249 case kDrawDrawable_OpType: return "DrawDrawable";
fmalita160ebb22015-04-01 20:58:37 -0700250 case kEndDrawPicture_OpType: return "EndDrawPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800251 case kRestore_OpType: return "Restore";
252 case kSave_OpType: return "Save";
253 case kSaveLayer_OpType: return "SaveLayer";
254 case kSetMatrix_OpType: return "SetMatrix";
chudy@google.com902ebe52012-06-29 14:21:22 +0000255 default:
robertphillips9bafc302015-02-13 11:13:00 -0800256 SkDebugf("OpType error 0x%08x\n", type);
chudy@google.com902ebe52012-06-29 14:21:22 +0000257 SkASSERT(0);
258 break;
259 }
260 SkDEBUGFAIL("DrawType UNUSED\n");
halcanary96fcdcc2015-08-27 07:41:13 -0700261 return nullptr;
chudy@google.com902ebe52012-06-29 14:21:22 +0000262}
263
ethannicholasf62a8b72016-02-11 10:35:21 -0800264Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const {
ethannicholas50a8dd02016-02-10 05:40:46 -0800265 Json::Value result;
266 result[SKDEBUGCANVAS_ATTRIBUTE_COMMAND] = this->GetCommandString(fOpType);
ethannicholas807dcab2016-02-23 06:53:37 -0800267 result[SKDEBUGCANVAS_ATTRIBUTE_VISIBLE] = Json::Value(this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800268 return result;
269}
270
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000271namespace {
272
273void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
Mike Reed3661bc92017-02-22 13:21:42 -0500274 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000275
276 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
277
278 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
279 if (bounds.width() > bounds.height()) {
280 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
281 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
282 } else {
283 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
284 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
285 }
286 canvas->translate(-bounds.centerX(), -bounds.centerY());
287}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000288
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000289
290void render_path(SkCanvas* canvas, const SkPath& path) {
291 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000292
293 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700294 if (bounds.isEmpty()) {
295 return;
296 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000297
fmalitab0cd8b72015-10-06 07:24:03 -0700298 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000299 xlate_and_scale_to_bounds(canvas, bounds);
300
301 SkPaint p;
302 p.setColor(SK_ColorBLACK);
303 p.setStyle(SkPaint::kStroke_Style);
304
305 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000306}
307
Brian Osmanc25e2692018-03-12 10:57:28 -0400308void render_region(SkCanvas* canvas, const SkRegion& region) {
309 canvas->clear(0xFFFFFFFF);
310
311 const SkIRect& bounds = region.getBounds();
312 if (bounds.isEmpty()) {
313 return;
314 }
315
316 SkAutoCanvasRestore acr(canvas, true);
Brian Osman99b63402018-03-13 10:19:27 -0400317 xlate_and_scale_to_bounds(canvas, SkRect::Make(bounds));
Brian Osmanc25e2692018-03-12 10:57:28 -0400318
319 SkPaint p;
320 p.setColor(SK_ColorBLACK);
321 p.setStyle(SkPaint::kStroke_Style);
322
323 canvas->drawRegion(region, p);
324}
325
halcanary96fcdcc2015-08-27 07:41:13 -0700326void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
Mike Reed3661bc92017-02-22 13:21:42 -0500327 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000328
329 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
330 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
331
332 if (input.width() > input.height()) {
333 yScale *= input.height() / (float) input.width();
334 } else {
335 xScale *= input.width() / (float) input.height();
336 }
337
338 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
339 xScale * input.width(),
340 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000341
robertphillips96a5cff2015-09-24 06:56:27 -0700342 static const int kNumBlocks = 8;
343
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000344 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700345 SkISize block = {
346 canvas->imageInfo().width()/kNumBlocks,
347 canvas->imageInfo().height()/kNumBlocks
348 };
349 for (int y = 0; y < kNumBlocks; ++y) {
350 for (int x = 0; x < kNumBlocks; ++x) {
351 SkPaint paint;
352 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
353 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
354 SkIntToScalar(y*block.height()),
355 SkIntToScalar(block.width()),
356 SkIntToScalar(block.height()));
357 canvas->drawRect(r, paint);
358 }
359 }
360
reede47829b2015-08-06 10:02:53 -0700361 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000362
bsalomon49f085d2014-09-05 13:34:00 -0700363 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000364 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
365 srcRect->fTop * yScale + SK_Scalar1,
366 srcRect->fRight * xScale + SK_Scalar1,
367 srcRect->fBottom * yScale + SK_Scalar1);
368 SkPaint p;
369 p.setColor(SK_ColorRED);
370 p.setStyle(SkPaint::kStroke_Style);
371
372 canvas->drawRect(r, p);
373 }
374}
375
376void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
377 canvas->clear(0xFFFFFFFF);
378 canvas->save();
379
380 const SkRect& bounds = rrect.getBounds();
381
382 xlate_and_scale_to_bounds(canvas, bounds);
383
384 SkPaint p;
385 p.setColor(SK_ColorBLACK);
386 p.setStyle(SkPaint::kStroke_Style);
387
388 canvas->drawRRect(rrect, p);
389 canvas->restore();
390}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000391
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000392void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
393 canvas->clear(0xFFFFFFFF);
394 canvas->save();
395
396 const SkRect& bounds = outer.getBounds();
397
398 xlate_and_scale_to_bounds(canvas, bounds);
399
400 SkPaint p;
401 p.setColor(SK_ColorBLACK);
402 p.setStyle(SkPaint::kStroke_Style);
403
404 canvas->drawDRRect(outer, inner, p);
405 canvas->restore();
406}
407
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400408void render_shadow(SkCanvas* canvas, const SkPath& path, SkDrawShadowRec rec) {
409 canvas->clear(0xFFFFFFFF);
410
411 const SkRect& bounds = path.getBounds();
412 if (bounds.isEmpty()) {
413 return;
414 }
415
416 SkAutoCanvasRestore acr(canvas, true);
417 xlate_and_scale_to_bounds(canvas, bounds);
418
419 rec.fAmbientColor = SK_ColorBLACK;
420 rec.fSpotColor = SK_ColorBLACK;
421 canvas->private_draw_shadow_rec(path, rec);
422}
423
Florin Malita82d80872017-06-06 16:58:40 -0400424static const char* const gBlendModeMap[] = {
425 "clear",
426 "src",
427 "dst",
428 "srcOver",
429 "dstOver",
430 "srcIn",
431 "dstIn",
432 "srcOut",
433 "dstOut",
434 "srcATop",
435 "dstATop",
436 "xor",
437 "plus",
438 "modulate",
439
440 "screen",
441
442 "overlay",
443 "darken",
444 "lighten",
445 "colorDodge",
446 "colorBurn",
447 "hardLight",
448 "softLight",
449 "difference",
450 "exclusion",
451 "multiply",
452
453 "hue",
454 "saturation",
455 "color",
456 "luminosity",
457};
458
459static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
460 "blendMode mismatch");
461static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
462 "blendMode mismatch");
463
464void apply_paint_blend_mode(const SkPaint& paint, Json::Value* target) {
465 const auto mode = paint.getBlendMode();
466 if (mode != SkBlendMode::kSrcOver) {
467 SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
468 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE] =
469 Json::Value(gBlendModeMap[static_cast<size_t>(mode)]);
470 }
471}
472
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000473};
474
brianosmanfad98562016-05-04 11:06:28 -0700475Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800476 Json::Value result(Json::arrayValue);
477 result.append(Json::Value(SkColorGetA(color)));
478 result.append(Json::Value(SkColorGetR(color)));
479 result.append(Json::Value(SkColorGetG(color)));
480 result.append(Json::Value(SkColorGetB(color)));
481 return result;
482}
483
brianosman97bbf822016-09-25 13:15:58 -0700484Json::Value SkDrawCommand::MakeJsonColor4f(const SkColor4f& color) {
485 Json::Value result(Json::arrayValue);
486 result.append(Json::Value(color.fA));
487 result.append(Json::Value(color.fR));
488 result.append(Json::Value(color.fG));
489 result.append(Json::Value(color.fB));
490 return result;
491}
492
brianosmanfad98562016-05-04 11:06:28 -0700493Json::Value SkDrawCommand::MakeJsonPoint(const SkPoint& point) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800494 Json::Value result(Json::arrayValue);
495 result.append(Json::Value(point.x()));
496 result.append(Json::Value(point.y()));
497 return result;
498}
499
brianosmanfad98562016-05-04 11:06:28 -0700500Json::Value SkDrawCommand::MakeJsonPoint(SkScalar x, SkScalar y) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800501 Json::Value result(Json::arrayValue);
502 result.append(Json::Value(x));
503 result.append(Json::Value(y));
504 return result;
505}
506
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400507Json::Value SkDrawCommand::MakeJsonPoint3(const SkPoint3& point) {
508 Json::Value result(Json::arrayValue);
509 result.append(Json::Value(point.x()));
510 result.append(Json::Value(point.y()));
511 result.append(Json::Value(point.z()));
512 return result;
513}
514
brianosmanfad98562016-05-04 11:06:28 -0700515Json::Value SkDrawCommand::MakeJsonRect(const SkRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800516 Json::Value result(Json::arrayValue);
517 result.append(Json::Value(rect.left()));
518 result.append(Json::Value(rect.top()));
519 result.append(Json::Value(rect.right()));
520 result.append(Json::Value(rect.bottom()));
521 return result;
522}
523
joshualittbd724132016-03-03 11:39:38 -0800524Json::Value SkDrawCommand::MakeJsonIRect(const SkIRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800525 Json::Value result(Json::arrayValue);
526 result.append(Json::Value(rect.left()));
527 result.append(Json::Value(rect.top()));
528 result.append(Json::Value(rect.right()));
529 result.append(Json::Value(rect.bottom()));
530 return result;
531}
532
533static Json::Value make_json_rrect(const SkRRect& rrect) {
534 Json::Value result(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700535 result.append(SkDrawCommand::MakeJsonRect(rrect.rect()));
536 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
537 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperRight_Corner)));
538 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerRight_Corner)));
539 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
ethannicholas50a8dd02016-02-10 05:40:46 -0800540 return result;
541}
542
joshualittbd724132016-03-03 11:39:38 -0800543Json::Value SkDrawCommand::MakeJsonMatrix(const SkMatrix& matrix) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800544 Json::Value result(Json::arrayValue);
545 Json::Value row1(Json::arrayValue);
546 row1.append(Json::Value(matrix[0]));
547 row1.append(Json::Value(matrix[1]));
548 row1.append(Json::Value(matrix[2]));
549 result.append(row1);
550 Json::Value row2(Json::arrayValue);
551 row2.append(Json::Value(matrix[3]));
552 row2.append(Json::Value(matrix[4]));
553 row2.append(Json::Value(matrix[5]));
554 result.append(row2);
555 Json::Value row3(Json::arrayValue);
556 row3.append(Json::Value(matrix[6]));
557 row3.append(Json::Value(matrix[7]));
558 row3.append(Json::Value(matrix[8]));
559 result.append(row3);
560 return result;
561}
ethannicholas1446a9a2016-02-10 14:05:02 -0800562
vjiaoblacke5de1302016-07-13 14:05:28 -0700563Json::Value SkDrawCommand::MakeJsonScalar(SkScalar z) {
564 Json::Value result(z);
565 return result;
566}
567
brianosmanfad98562016-05-04 11:06:28 -0700568Json::Value SkDrawCommand::MakeJsonPath(const SkPath& path) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800569 Json::Value result(Json::objectValue);
570 switch (path.getFillType()) {
571 case SkPath::kWinding_FillType:
572 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_WINDING;
573 break;
574 case SkPath::kEvenOdd_FillType:
575 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_EVENODD;
576 break;
577 case SkPath::kInverseWinding_FillType:
578 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING;
579 break;
580 case SkPath::kInverseEvenOdd_FillType:
581 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
582 break;
halcanary9d524f22016-03-29 09:03:52 -0700583 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800584 Json::Value verbs(Json::arrayValue);
585 SkPath::Iter iter(path, false);
586 SkPoint pts[4];
587 SkPath::Verb verb;
588 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
589 switch (verb) {
590 case SkPath::kLine_Verb: {
591 Json::Value line(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700592 line[SKDEBUGCANVAS_VERB_LINE] = MakeJsonPoint(pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800593 verbs.append(line);
594 break;
595 }
596 case SkPath::kQuad_Verb: {
597 Json::Value quad(Json::objectValue);
598 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700599 coords.append(MakeJsonPoint(pts[1]));
600 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800601 quad[SKDEBUGCANVAS_VERB_QUAD] = coords;
602 verbs.append(quad);
603 break;
604 }
605 case SkPath::kCubic_Verb: {
606 Json::Value cubic(Json::objectValue);
607 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700608 coords.append(MakeJsonPoint(pts[1]));
609 coords.append(MakeJsonPoint(pts[2]));
610 coords.append(MakeJsonPoint(pts[3]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800611 cubic[SKDEBUGCANVAS_VERB_CUBIC] = coords;
612 verbs.append(cubic);
613 break;
614 }
615 case SkPath::kConic_Verb: {
616 Json::Value conic(Json::objectValue);
617 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700618 coords.append(MakeJsonPoint(pts[1]));
619 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800620 coords.append(Json::Value(iter.conicWeight()));
621 conic[SKDEBUGCANVAS_VERB_CONIC] = coords;
622 verbs.append(conic);
623 break;
624 }
625 case SkPath::kMove_Verb: {
626 Json::Value move(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700627 move[SKDEBUGCANVAS_VERB_MOVE] = MakeJsonPoint(pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800628 verbs.append(move);
629 break;
630 }
631 case SkPath::kClose_Verb:
632 verbs.append(Json::Value(SKDEBUGCANVAS_VERB_CLOSE));
633 break;
634 case SkPath::kDone_Verb:
635 break;
636 }
637 }
638 result[SKDEBUGCANVAS_ATTRIBUTE_VERBS] = verbs;
639 return result;
640}
641
brianosmanfad98562016-05-04 11:06:28 -0700642Json::Value SkDrawCommand::MakeJsonRegion(const SkRegion& region) {
Brian Osmanc25e2692018-03-12 10:57:28 -0400643 // TODO: Actually serialize the rectangles, rather than just devolving to path
644 SkPath path;
645 region.getBoundaryPath(&path);
646 return MakeJsonPath(path);
ethannicholas50a8dd02016-02-10 05:40:46 -0800647}
648
Mike Reedc1f77742016-12-09 09:00:50 -0500649static Json::Value make_json_regionop(SkClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800650 switch (op) {
Mike Reedc1f77742016-12-09 09:00:50 -0500651 case kDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800652 return Json::Value(SKDEBUGCANVAS_REGIONOP_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500653 case kIntersect_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800654 return Json::Value(SKDEBUGCANVAS_REGIONOP_INTERSECT);
Mike Reedc1f77742016-12-09 09:00:50 -0500655 case kUnion_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800656 return Json::Value(SKDEBUGCANVAS_REGIONOP_UNION);
Mike Reedc1f77742016-12-09 09:00:50 -0500657 case kXOR_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800658 return Json::Value(SKDEBUGCANVAS_REGIONOP_XOR);
Mike Reedc1f77742016-12-09 09:00:50 -0500659 case kReverseDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800660 return Json::Value(SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500661 case kReplace_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800662 return Json::Value(SKDEBUGCANVAS_REGIONOP_REPLACE);
663 default:
664 SkASSERT(false);
665 return Json::Value("<invalid region op>");
666 };
667}
668
669static Json::Value make_json_pointmode(SkCanvas::PointMode mode) {
670 switch (mode) {
671 case SkCanvas::kPoints_PointMode:
672 return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
673 case SkCanvas::kLines_PointMode:
674 return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
halcanary9d524f22016-03-29 09:03:52 -0700675 case SkCanvas::kPolygon_PointMode:
ethannicholas50a8dd02016-02-10 05:40:46 -0800676 return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
677 default:
678 SkASSERT(false);
679 return Json::Value("<invalid point mode>");
680 };
681}
682
halcanary9d524f22016-03-29 09:03:52 -0700683static void store_scalar(Json::Value* target, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800684 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800685 if (value != defaultValue) {
686 (*target)[key] = Json::Value(value);
687 }
688}
689
ethannicholasbd3dae82016-02-10 12:10:00 -0800690static void store_bool(Json::Value* target, const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800691 if (value != defaultValue) {
692 (*target)[key] = Json::Value(value);
693 }
694}
695
halcanary9d524f22016-03-29 09:03:52 -0700696static void encode_data(const void* bytes, size_t count, const char* contentType,
ethannicholasf62a8b72016-02-11 10:35:21 -0800697 UrlDataManager& urlDataManager, Json::Value* target) {
bungeman38d909e2016-08-02 14:40:46 -0700698 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
699 SkString url = urlDataManager.addData(data.get(), contentType);
ethannicholasf62a8b72016-02-11 10:35:21 -0800700 *target = Json::Value(url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800701}
702
brianosmanfad98562016-05-04 11:06:28 -0700703void SkDrawCommand::flatten(const SkFlattenable* flattenable, Json::Value* target,
704 UrlDataManager& urlDataManager) {
705 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800706 flattenable->flatten(buffer);
707 void* data = sk_malloc_throw(buffer.bytesWritten());
708 buffer.writeToMemory(data);
709 Json::Value jsonData;
710 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, &jsonData);
711 Json::Value jsonFlattenable;
712 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->getTypeName());
713 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
brianosmanfad98562016-05-04 11:06:28 -0700714
715 SkJsonWriteBuffer jsonBuffer(&urlDataManager);
716 flattenable->flatten(jsonBuffer);
717 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_VALUES] = jsonBuffer.getValue();
718
ethannicholasf62a8b72016-02-11 10:35:21 -0800719 (*target) = jsonFlattenable;
720 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800721}
722
Brian Osmand9ea8162018-08-08 17:03:39 -0400723void SkDrawCommand::WritePNG(SkBitmap bitmap, SkWStream& out) {
724 SkPixmap pm;
725 SkAssertResult(bitmap.peekPixels(&pm));
ethannicholasf67531f2016-03-21 10:19:39 -0700726
Brian Osmand9ea8162018-08-08 17:03:39 -0400727 SkPngEncoder::Options options;
728 options.fZLibLevel = 1;
729 options.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
730 SkPngEncoder::Encode(&out, pm, options);
ethannicholasf67531f2016-03-21 10:19:39 -0700731}
732
brianosmanfad98562016-05-04 11:06:28 -0700733bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
734 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700735 size_t rowBytes = 4 * image.width();
Hal Canary95e3c052017-01-11 12:44:43 -0500736 SkAutoMalloc buffer(rowBytes * image.height());
halcanary9d524f22016-03-29 09:03:52 -0700737 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700738 kN32_SkColorType, kPremul_SkAlphaType);
739 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
740 SkDebugf("readPixels failed\n");
741 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800742 }
msaretta5cf4f42016-06-30 10:06:51 -0700743
744 SkBitmap bm;
745 bm.installPixels(dstInfo, buffer.get(), rowBytes);
msaretta5cf4f42016-06-30 10:06:51 -0700746
ethannicholasf67531f2016-03-21 10:19:39 -0700747 SkDynamicMemoryWStream out;
Brian Osmand9ea8162018-08-08 17:03:39 -0400748 SkDrawCommand::WritePNG(bm, out);
reed42943c82016-09-12 12:01:44 -0700749 sk_sp<SkData> encoded = out.detachAsData();
ethannicholasf62a8b72016-02-11 10:35:21 -0800750 Json::Value jsonData;
751 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
752 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
ethannicholas50a8dd02016-02-10 05:40:46 -0800753 return true;
754}
755
756static const char* color_type_name(SkColorType colorType) {
757 switch (colorType) {
758 case kARGB_4444_SkColorType:
759 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
760 case kRGBA_8888_SkColorType:
761 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
762 case kBGRA_8888_SkColorType:
763 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
764 case kRGB_565_SkColorType:
765 return SKDEBUGCANVAS_COLORTYPE_565;
766 case kGray_8_SkColorType:
767 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
ethannicholas50a8dd02016-02-10 05:40:46 -0800768 case kAlpha_8_SkColorType:
769 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
770 default:
771 SkASSERT(false);
772 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
773 }
774}
775
776static const char* alpha_type_name(SkAlphaType alphaType) {
777 switch (alphaType) {
778 case kOpaque_SkAlphaType:
779 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
780 case kPremul_SkAlphaType:
781 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
782 case kUnpremul_SkAlphaType:
783 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
784 default:
785 SkASSERT(false);
786 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
787 }
788}
789
brianosmanfad98562016-05-04 11:06:28 -0700790bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
791 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700792 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800793 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
794 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800795 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800796 return success;
797}
798
halcanaryf412f092016-08-25 11:10:41 -0700799static void apply_paint_hinting(const SkPaint& paint, Json::Value* target) {
800 SkPaint::Hinting hinting = paint.getHinting();
801 if (hinting != SkPaintDefaults_Hinting) {
802 switch (hinting) {
803 case SkPaint::kNo_Hinting:
804 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
805 break;
806 case SkPaint::kSlight_Hinting:
807 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
808 break;
809 case SkPaint::kNormal_Hinting:
810 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
811 break;
812 case SkPaint::kFull_Hinting:
813 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
814 break;
815 }
816 }
817}
818
ethannicholas50a8dd02016-02-10 05:40:46 -0800819static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
820 SkColor color = paint.getColor();
821 if (color != SK_ColorBLACK) {
822 Json::Value colorValue(Json::arrayValue);
823 colorValue.append(Json::Value(SkColorGetA(color)));
824 colorValue.append(Json::Value(SkColorGetR(color)));
825 colorValue.append(Json::Value(SkColorGetG(color)));
826 colorValue.append(Json::Value(SkColorGetB(color)));
827 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;;
828 }
829}
830
831static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
832 SkPaint::Style style = paint.getStyle();
833 if (style != SkPaint::kFill_Style) {
834 switch (style) {
835 case SkPaint::kStroke_Style: {
836 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
837 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
838 break;
839 }
840 case SkPaint::kStrokeAndFill_Style: {
841 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
842 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
843 break;
844 }
845 default: SkASSERT(false);
846 }
847 }
848}
849
850static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
851 SkPaint::Cap cap = paint.getStrokeCap();
852 if (cap != SkPaint::kDefault_Cap) {
853 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800854 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800855 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
856 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800857 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800858 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
859 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800860 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800861 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
862 break;
ethannicholas50a8dd02016-02-10 05:40:46 -0800863 default: SkASSERT(false);
864 }
865 }
866}
ethannicholas1446a9a2016-02-10 14:05:02 -0800867
868static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
869 SkPaint::Join join = paint.getStrokeJoin();
870 if (join != SkPaint::kDefault_Join) {
871 switch (join) {
872 case SkPaint::kMiter_Join:
873 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
874 SKDEBUGCANVAS_MITER_JOIN);
875 break;
876 case SkPaint::kRound_Join:
877 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
878 SKDEBUGCANVAS_ROUND_JOIN);
879 break;
880 case SkPaint::kBevel_Join:
881 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
882 SKDEBUGCANVAS_BEVEL_JOIN);
883 break;
884 default: SkASSERT(false);
885 }
886 }
887}
888
889static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
890 SkFilterQuality quality = paint.getFilterQuality();
891 switch (quality) {
892 case kNone_SkFilterQuality:
893 break;
894 case kLow_SkFilterQuality:
895 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
896 SKDEBUGCANVAS_FILTERQUALITY_LOW);
897 break;
898 case kMedium_SkFilterQuality:
899 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
900 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
901 break;
902 case kHigh_SkFilterQuality:
903 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
904 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
905 break;
906 }
907}
908
halcanary9d524f22016-03-29 09:03:52 -0700909static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800910 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800911 SkMaskFilter* maskFilter = paint.getMaskFilter();
912 if (maskFilter != nullptr) {
Mike Reed80747ef2018-01-23 15:29:32 -0500913 SkMaskFilterBase::BlurRec blurRec;
914 if (as_MFB(maskFilter)->asABlur(&blurRec)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800915 Json::Value blur(Json::objectValue);
916 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
917 switch (blurRec.fStyle) {
918 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800919 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
920 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -0800921 break;
922 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800923 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
924 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -0800925 break;
926 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800927 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
928 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800929 break;
930 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800931 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
932 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800933 break;
934 default:
935 SkASSERT(false);
936 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800937 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
938 } else {
939 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -0700940 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800941 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
942 }
943 }
944}
945
halcanary9d524f22016-03-29 09:03:52 -0700946static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800947 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800948 SkPathEffect* pathEffect = paint.getPathEffect();
949 if (pathEffect != nullptr) {
950 SkPathEffect::DashInfo dashInfo;
951 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
952 if (dashType == SkPathEffect::kDash_DashType) {
953 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
954 pathEffect->asADash(&dashInfo);
955 Json::Value dashing(Json::objectValue);
956 Json::Value intervals(Json::arrayValue);
957 for (int32_t i = 0; i < dashInfo.fCount; i++) {
958 intervals.append(Json::Value(dashInfo.fIntervals[i]));
959 }
960 sk_free(dashInfo.fIntervals);
961 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
962 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
963 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
964 } else {
965 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -0700966 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800967 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
968 }
969 }
970}
halcanary9d524f22016-03-29 09:03:52 -0700971
ethannicholas50a8dd02016-02-10 05:40:46 -0800972static void apply_paint_textalign(const SkPaint& paint, Json::Value* target) {
973 SkPaint::Align textAlign = paint.getTextAlign();
974 if (textAlign != SkPaint::kLeft_Align) {
975 switch (textAlign) {
976 case SkPaint::kCenter_Align: {
977 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_CENTER;
978 break;
979 }
980 case SkPaint::kRight_Align: {
981 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_RIGHT;
982 break;
983 }
984 default: SkASSERT(false);
985 }
986 }
987}
988
halcanary9d524f22016-03-29 09:03:52 -0700989static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800990 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800991 SkTypeface* typeface = paint.getTypeface();
992 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -0800993 Json::Value jsonTypeface;
994 SkDynamicMemoryWStream buffer;
995 typeface->serialize(&buffer);
996 void* data = sk_malloc_throw(buffer.bytesWritten());
997 buffer.copyTo(data);
998 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -0700999 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001000 &jsonData);
1001 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
1002 sk_free(data);
1003 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -08001004 }
1005}
1006
halcanary9d524f22016-03-29 09:03:52 -07001007static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001008 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001009 SkFlattenable* shader = paint.getShader();
1010 if (shader != nullptr) {
1011 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -07001012 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001013 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
1014 }
1015}
1016
ethannicholasf62a8b72016-02-11 10:35:21 -08001017static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
1018 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001019 SkFlattenable* imageFilter = paint.getImageFilter();
1020 if (imageFilter != nullptr) {
1021 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -07001022 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001023 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
1024 }
1025}
1026
halcanary9d524f22016-03-29 09:03:52 -07001027static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001028 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001029 SkFlattenable* colorFilter = paint.getColorFilter();
1030 if (colorFilter != nullptr) {
1031 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001032 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001033 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1034 }
1035}
1036
halcanary9d524f22016-03-29 09:03:52 -07001037static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001038 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001039 SkFlattenable* looper = paint.getLooper();
1040 if (looper != nullptr) {
1041 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001042 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001043 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1044 }
1045}
1046
brianosmanfad98562016-05-04 11:06:28 -07001047Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001048 Json::Value result(Json::objectValue);
1049 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001050 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001051 SkPaintDefaults_MiterLimit);
1052 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001053 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001054 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, paint.isFakeBoldText(), false);
1055 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, paint.isLinearText(), false);
1056 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, paint.isSubpixelText(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001057 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT, paint.isLCDRenderText(), false);
1058 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, paint.isEmbeddedBitmapText(), false);
1059 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, paint.isAutohinted(), false);
1060 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT, paint.isVerticalText(), false);
1061 //kGenA8FromLCD_Flag
1062
halcanary9d524f22016-03-29 09:03:52 -07001063 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001064 SkPaintDefaults_TextSize);
1065 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
1066 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
halcanaryf412f092016-08-25 11:10:41 -07001067 apply_paint_hinting(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001068 apply_paint_color(paint, &result);
1069 apply_paint_style(paint, &result);
Florin Malita82d80872017-06-06 16:58:40 -04001070 apply_paint_blend_mode(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001071 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001072 apply_paint_join(paint, &result);
1073 apply_paint_filterquality(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001074 apply_paint_textalign(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001075 apply_paint_patheffect(paint, &result, urlDataManager);
1076 apply_paint_maskfilter(paint, &result, urlDataManager);
1077 apply_paint_shader(paint, &result, urlDataManager);
ethannicholasf62a8b72016-02-11 10:35:21 -08001078 apply_paint_looper(paint, &result, urlDataManager);
1079 apply_paint_imagefilter(paint, &result, urlDataManager);
1080 apply_paint_colorfilter(paint, &result, urlDataManager);
1081 apply_paint_typeface(paint, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001082 return result;
1083}
1084
Stan Ilievac42aeb2017-01-12 16:20:50 -05001085Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) {
1086 Json::Value result(Json::objectValue);
1087 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount);
1088 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount);
1089 if (nullptr != lattice.fBounds) {
1090 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds);
1091 }
1092 Json::Value XDivs(Json::arrayValue);
1093 for (int i = 0; i < lattice.fXCount; i++) {
1094 XDivs.append(Json::Value(lattice.fXDivs[i]));
1095 }
1096 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs;
1097 Json::Value YDivs(Json::arrayValue);
1098 for (int i = 0; i < lattice.fYCount; i++) {
1099 YDivs.append(Json::Value(lattice.fYDivs[i]));
1100 }
1101 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs;
Stan Ilievca8c0952017-12-11 13:01:58 -05001102 if (nullptr != lattice.fRectTypes) {
Stan Ilievac42aeb2017-01-12 16:20:50 -05001103 Json::Value flags(Json::arrayValue);
1104 int flagCount = 0;
1105 for (int row = 0; row < lattice.fYCount+1; row++) {
1106 Json::Value flagsRow(Json::arrayValue);
1107 for (int column = 0; column < lattice.fXCount+1; column++) {
Stan Ilievca8c0952017-12-11 13:01:58 -05001108 flagsRow.append(Json::Value(lattice.fRectTypes[flagCount++]));
Stan Ilievac42aeb2017-01-12 16:20:50 -05001109 }
1110 flags.append(flagsRow);
1111 }
1112 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags;
1113 }
1114 return result;
1115}
1116
Brian Osmanc25e2692018-03-12 10:57:28 -04001117SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kClear_OpType) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001118 fColor = color;
ethannicholas1446a9a2016-02-10 14:05:02 -08001119}
1120
1121void SkClearCommand::execute(SkCanvas* canvas) const {
1122 canvas->clear(fColor);
1123}
1124
ethannicholasf62a8b72016-02-11 10:35:21 -08001125Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1126 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001127 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001128 return result;
1129}
1130
Mike Reedc1f77742016-12-09 09:00:50 -05001131SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001132 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001133 fPath = path;
1134 fOp = op;
1135 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001136}
1137
fmalita8c89c522014-11-08 16:18:56 -08001138void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001139 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001140}
1141
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001142bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001143 render_path(canvas, fPath);
1144 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001145}
1146
ethannicholasf62a8b72016-02-11 10:35:21 -08001147Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1148 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001149 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001150 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1151 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1152 return result;
1153}
1154
Mike Reedc1f77742016-12-09 09:00:50 -05001155SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001156 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001157 fRegion = region;
1158 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001159}
1160
fmalita8c89c522014-11-08 16:18:56 -08001161void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001162 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001163}
1164
ethannicholasf62a8b72016-02-11 10:35:21 -08001165Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1166 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001167 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001168 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1169 return result;
1170}
1171
Mike Reedc1f77742016-12-09 09:00:50 -05001172SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001173 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001174 fRect = rect;
1175 fOp = op;
1176 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001177}
1178
fmalita8c89c522014-11-08 16:18:56 -08001179void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001180 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001181}
1182
ethannicholasf62a8b72016-02-11 10:35:21 -08001183Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1184 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001185 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001186 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1187 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001188
1189 SkString desc;
1190 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1191
ethannicholas50a8dd02016-02-10 05:40:46 -08001192 return result;
1193}
1194
Mike Reedc1f77742016-12-09 09:00:50 -05001195SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001196 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001197 fRRect = rrect;
1198 fOp = op;
1199 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001200}
1201
fmalita8c89c522014-11-08 16:18:56 -08001202void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001203 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001204}
1205
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001206bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001207 render_rrect(canvas, fRRect);
1208 return true;
1209}
1210
ethannicholasf62a8b72016-02-11 10:35:21 -08001211Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1212 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001213 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1214 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1215 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1216 return result;
1217}
1218
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001219SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001220 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001221 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001222}
1223
fmalita8c89c522014-11-08 16:18:56 -08001224void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001225 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001226}
1227
ethannicholasf62a8b72016-02-11 10:35:21 -08001228Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1229 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001230 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001231 return result;
1232}
1233
reed97660cc2016-06-28 18:54:19 -07001234////
1235
1236SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1237 sk_sp<SkData> value)
1238 : INHERITED(kDrawAnnotation_OpType)
1239 , fRect(rect)
1240 , fKey(key)
1241 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001242{
robertphillipsfb409232016-06-29 10:28:11 -07001243}
reed97660cc2016-06-28 18:54:19 -07001244
1245void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1246 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1247}
1248
1249Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1250 Json::Value result = INHERITED::toJSON(urlDataManager);
1251
1252 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1253 result["key"] = Json::Value(fKey.c_str());
1254 if (fValue.get()) {
1255 // TODO: dump out the "value"
1256 }
reed67f62fa2016-06-29 11:36:34 -07001257
1258 SkString desc;
1259 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1260 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1261
reed97660cc2016-06-28 18:54:19 -07001262 return result;
1263}
1264
reed97660cc2016-06-28 18:54:19 -07001265////
1266
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001267SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07001268 const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001269 : INHERITED(kDrawBitmap_OpType)
1270 , fBitmap(bitmap)
1271 , fLeft(left)
1272 , fTop(top)
1273 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001274
fmalita8c89c522014-11-08 16:18:56 -08001275void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001276 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001277}
1278
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001279bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001280 render_bitmap(canvas, fBitmap);
1281 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001282}
1283
ethannicholasf62a8b72016-02-11 10:35:21 -08001284Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
1285 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001286 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001287 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001288 Json::Value command(Json::objectValue);
1289 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001290 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
Brian Osman8363be12018-05-29 13:38:07 -04001291 if (fPaint.isValid()) {
1292 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001293 }
1294 }
1295 return result;
1296}
1297
Brian Osman78a76482018-05-18 16:59:13 -04001298SkDrawBitmapLatticeCommand::SkDrawBitmapLatticeCommand(const SkBitmap& bitmap,
1299 const SkCanvas::Lattice& lattice,
1300 const SkRect& dst, const SkPaint* paint)
1301 : INHERITED(kDrawBitmapLattice_OpType)
1302 , fBitmap(bitmap)
1303 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001304 , fDst(dst)
1305 , fPaint(paint) {}
Brian Osman78a76482018-05-18 16:59:13 -04001306
1307void SkDrawBitmapLatticeCommand::execute(SkCanvas* canvas) const {
1308 canvas->drawBitmapLattice(fBitmap, fLattice, fDst, fPaint.getMaybeNull());
1309}
1310
1311bool SkDrawBitmapLatticeCommand::render(SkCanvas* canvas) const {
1312 SkAutoCanvasRestore acr(canvas, true);
1313 canvas->clear(0xFFFFFFFF);
1314
1315 xlate_and_scale_to_bounds(canvas, fDst);
1316
1317 this->execute(canvas);
1318 return true;
1319}
1320
1321Json::Value SkDrawBitmapLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1322 Json::Value result = INHERITED::toJSON(urlDataManager);
1323 Json::Value encoded;
1324 if (flatten(fBitmap, &encoded, urlDataManager)) {
1325 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
1326 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1327 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1328 if (fPaint.isValid()) {
1329 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1330 }
1331 }
1332
1333 SkString desc;
1334 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1335
1336 return result;
1337}
1338
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001339SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00001340 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001341 : INHERITED(kDrawBitmapNine_OpType)
1342 , fBitmap(bitmap)
1343 , fCenter(center)
1344 , fDst(dst)
1345 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001346
fmalita8c89c522014-11-08 16:18:56 -08001347void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001348 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001349}
1350
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001351bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08001352 SkRect tmp = SkRect::Make(fCenter);
1353 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001354 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001355}
1356
ethannicholasf62a8b72016-02-11 10:35:21 -08001357Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1358 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001359 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001360 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001361 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08001362 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07001363 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001364 if (fPaint.isValid()) {
1365 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001366 }
1367 }
1368 return result;
1369}
1370
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001371SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00001372 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07001373 SkCanvas::SrcRectConstraint constraint)
Brian Osman8363be12018-05-29 13:38:07 -04001374 : INHERITED(kDrawBitmapRect_OpType)
1375 , fBitmap(bitmap)
1376 , fSrc(src)
1377 , fDst(dst)
1378 , fPaint(paint)
1379 , fConstraint(constraint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001380
fmalita8c89c522014-11-08 16:18:56 -08001381void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001382 canvas->legacy_drawBitmapRect(fBitmap, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
1383 fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001384}
1385
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001386bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001387 render_bitmap(canvas, fBitmap, fSrc.getMaybeNull());
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001388 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001389}
1390
ethannicholasf62a8b72016-02-11 10:35:21 -08001391Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1392 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001393 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001394 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001395 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
Brian Osman8363be12018-05-29 13:38:07 -04001396 if (fSrc.isValid()) {
1397 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001398 }
brianosmanfad98562016-05-04 11:06:28 -07001399 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001400 if (fPaint.isValid()) {
1401 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001402 }
1403 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1404 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1405 }
1406 }
reed67f62fa2016-06-29 11:36:34 -07001407
1408 SkString desc;
1409 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1410
ethannicholas50a8dd02016-02-10 05:40:46 -08001411 return result;
1412}
1413
fmalita651c9202015-07-22 10:23:01 -07001414SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
1415 const SkPaint* paint)
1416 : INHERITED(kDrawImage_OpType)
1417 , fImage(SkRef(image))
1418 , fLeft(left)
Brian Osman8363be12018-05-29 13:38:07 -04001419 , fTop(top)
1420 , fPaint(paint) {}
fmalita651c9202015-07-22 10:23:01 -07001421
1422void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001423 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07001424}
1425
1426bool SkDrawImageCommand::render(SkCanvas* canvas) const {
1427 SkAutoCanvasRestore acr(canvas, true);
1428 canvas->clear(0xFFFFFFFF);
1429
1430 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
1431 SkIntToScalar(fImage->width()),
1432 SkIntToScalar(fImage->height())));
1433 this->execute(canvas);
1434 return true;
1435}
1436
ethannicholasf62a8b72016-02-11 10:35:21 -08001437Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
1438 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001439 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001440 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001441 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001442 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08001443 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001444 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001445 }
msarett0ac1bec2016-08-29 09:15:33 -07001446
1447 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
1448 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
1449 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
1450 switch (fImage->alphaType()) {
1451 case kOpaque_SkAlphaType:
1452 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
1453 break;
1454 case kPremul_SkAlphaType:
1455 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
1456 break;
1457 case kUnpremul_SkAlphaType:
1458 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
1459 break;
1460 default:
1461 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
1462 break;
1463 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001464 }
1465 return result;
1466}
1467
Stan Ilievac42aeb2017-01-12 16:20:50 -05001468SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
1469 const SkCanvas::Lattice& lattice,
1470 const SkRect& dst, const SkPaint* paint)
1471 : INHERITED(kDrawImageLattice_OpType)
1472 , fImage(SkRef(image))
1473 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001474 , fDst(dst)
1475 , fPaint(paint) {}
Stan Ilievac42aeb2017-01-12 16:20:50 -05001476
1477void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
Brian Osman78a76482018-05-18 16:59:13 -04001478 canvas->drawImageLattice(fImage.get(), fLattice, fDst, fPaint.getMaybeNull());
Stan Ilievac42aeb2017-01-12 16:20:50 -05001479}
1480
1481bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
1482 SkAutoCanvasRestore acr(canvas, true);
1483 canvas->clear(0xFFFFFFFF);
1484
1485 xlate_and_scale_to_bounds(canvas, fDst);
1486
1487 this->execute(canvas);
1488 return true;
1489}
1490
1491Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1492 Json::Value result = INHERITED::toJSON(urlDataManager);
1493 Json::Value encoded;
1494 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001495 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
Stan Ilievac42aeb2017-01-12 16:20:50 -05001496 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1497 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1498 if (fPaint.isValid()) {
1499 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1500 }
1501 }
1502
1503 SkString desc;
1504 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1505
1506 return result;
1507}
1508
fmalita651c9202015-07-22 10:23:01 -07001509SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
1510 const SkRect& dst, const SkPaint* paint,
1511 SkCanvas::SrcRectConstraint constraint)
1512 : INHERITED(kDrawImageRect_OpType)
1513 , fImage(SkRef(image))
Brian Osman8363be12018-05-29 13:38:07 -04001514 , fSrc(src)
fmalita651c9202015-07-22 10:23:01 -07001515 , fDst(dst)
Brian Osman8363be12018-05-29 13:38:07 -04001516 , fPaint(paint)
1517 , fConstraint(constraint) {}
fmalita651c9202015-07-22 10:23:01 -07001518
1519void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001520 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
1521 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07001522}
1523
1524bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
1525 SkAutoCanvasRestore acr(canvas, true);
1526 canvas->clear(0xFFFFFFFF);
1527
1528 xlate_and_scale_to_bounds(canvas, fDst);
1529
1530 this->execute(canvas);
1531 return true;
1532}
1533
ethannicholasf62a8b72016-02-11 10:35:21 -08001534Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1535 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001536 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001537 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001538 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
ethannicholas50a8dd02016-02-10 05:40:46 -08001539 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001540 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001541 }
brianosmanfad98562016-05-04 11:06:28 -07001542 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08001543 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001544 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001545 }
1546 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1547 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1548 }
1549 }
reed67f62fa2016-06-29 11:36:34 -07001550
1551 SkString desc;
1552 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1553
ethannicholas50a8dd02016-02-10 05:40:46 -08001554 return result;
1555}
1556
Brian Osmanc25e2692018-03-12 10:57:28 -04001557SkDrawImageNineCommand::SkDrawImageNineCommand(const SkImage* image, const SkIRect& center,
1558 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001559 : INHERITED(kDrawImageNine_OpType)
1560 , fImage(SkRef(image))
1561 , fCenter(center)
1562 , fDst(dst)
1563 , fPaint(paint) {}
Brian Osmanc25e2692018-03-12 10:57:28 -04001564
1565void SkDrawImageNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001566 canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaint.getMaybeNull());
Brian Osmanc25e2692018-03-12 10:57:28 -04001567}
1568
1569bool SkDrawImageNineCommand::render(SkCanvas* canvas) const {
1570 SkAutoCanvasRestore acr(canvas, true);
1571 canvas->clear(0xFFFFFFFF);
1572
1573 xlate_and_scale_to_bounds(canvas, fDst);
1574
1575 this->execute(canvas);
1576 return true;
1577}
1578
1579Json::Value SkDrawImageNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1580 Json::Value result = INHERITED::toJSON(urlDataManager);
1581 Json::Value encoded;
1582 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
1583 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
1584 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
1585 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001586 if (fPaint.isValid()) {
1587 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
Brian Osmanc25e2692018-03-12 10:57:28 -04001588 }
1589 }
1590 return result;
1591}
1592
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001593SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001594 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001595 fOval = oval;
1596 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001597}
1598
fmalita8c89c522014-11-08 16:18:56 -08001599void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001600 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001601}
1602
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001603bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001604 canvas->clear(0xFFFFFFFF);
1605 canvas->save();
1606
1607 xlate_and_scale_to_bounds(canvas, fOval);
1608
1609 SkPaint p;
1610 p.setColor(SK_ColorBLACK);
1611 p.setStyle(SkPaint::kStroke_Style);
1612
1613 canvas->drawOval(fOval, p);
1614 canvas->restore();
1615
1616 return true;
1617}
1618
ethannicholasf62a8b72016-02-11 10:35:21 -08001619Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
1620 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001621 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1622 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001623 return result;
1624}
1625
bsalomonac3aa242016-08-19 11:25:19 -07001626SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
1627 bool useCenter, const SkPaint& paint)
Brian Osmanc25e2692018-03-12 10:57:28 -04001628 : INHERITED(kDrawArc_OpType) {
bsalomonac3aa242016-08-19 11:25:19 -07001629 fOval = oval;
1630 fStartAngle = startAngle;
1631 fSweepAngle = sweepAngle;
1632 fUseCenter = useCenter;
1633 fPaint = paint;
bsalomonac3aa242016-08-19 11:25:19 -07001634}
1635
1636void SkDrawArcCommand::execute(SkCanvas* canvas) const {
1637 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
1638}
1639
1640bool SkDrawArcCommand::render(SkCanvas* canvas) const {
1641 canvas->clear(0xFFFFFFFF);
1642 canvas->save();
1643
1644 xlate_and_scale_to_bounds(canvas, fOval);
1645
1646 SkPaint p;
1647 p.setColor(SK_ColorBLACK);
1648 p.setStyle(SkPaint::kStroke_Style);
1649
1650 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
1651 canvas->restore();
1652
1653 return true;
1654}
1655
1656Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
1657 Json::Value result = INHERITED::toJSON(urlDataManager);
1658 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1659 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
1660 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
1661 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
1662 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1663 return result;
1664}
1665
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001666SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001667 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001668 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001669}
1670
fmalita8c89c522014-11-08 16:18:56 -08001671void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001672 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001673}
1674
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001675bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001676 canvas->clear(0xFFFFFFFF);
1677 canvas->drawPaint(fPaint);
1678 return true;
1679}
1680
ethannicholasf62a8b72016-02-11 10:35:21 -08001681Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
1682 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001683 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001684 return result;
1685}
1686
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001687SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001688 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001689 fPath = path;
1690 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001691}
1692
fmalita8c89c522014-11-08 16:18:56 -08001693void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001694 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001695}
1696
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001697bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001698 render_path(canvas, fPath);
1699 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001700}
1701
ethannicholasf62a8b72016-02-11 10:35:21 -08001702Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1703 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001704 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
1705 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001706 return result;
1707}
1708
Brian Osmanc25e2692018-03-12 10:57:28 -04001709SkDrawRegionCommand::SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint)
1710 : INHERITED(kDrawRegion_OpType) {
1711 fRegion = region;
1712 fPaint = paint;
Brian Osmanc25e2692018-03-12 10:57:28 -04001713}
1714
1715void SkDrawRegionCommand::execute(SkCanvas* canvas) const {
1716 canvas->drawRegion(fRegion, fPaint);
1717}
1718
1719bool SkDrawRegionCommand::render(SkCanvas* canvas) const {
1720 render_region(canvas, fRegion);
1721 return true;
1722}
1723
1724Json::Value SkDrawRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1725 Json::Value result = INHERITED::toJSON(urlDataManager);
1726 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
1727 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1728 return result;
1729}
1730
fmalita160ebb22015-04-01 20:58:37 -07001731SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
1732 const SkMatrix* matrix,
1733 const SkPaint* paint)
1734 : INHERITED(kBeginDrawPicture_OpType)
Brian Osman8363be12018-05-29 13:38:07 -04001735 , fPicture(SkRef(picture))
1736 , fMatrix(matrix)
1737 , fPaint(paint) {}
fmalita160ebb22015-04-01 20:58:37 -07001738
1739void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
1740 if (fPaint.isValid()) {
1741 SkRect bounds = fPicture->cullRect();
1742 if (fMatrix.isValid()) {
1743 fMatrix.get()->mapRect(&bounds);
1744 }
1745 canvas->saveLayer(&bounds, fPaint.get());
1746 }
1747
1748 if (fMatrix.isValid()) {
1749 if (!fPaint.isValid()) {
1750 canvas->save();
1751 }
1752 canvas->concat(*fMatrix.get());
1753 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001754}
1755
fmalita160ebb22015-04-01 20:58:37 -07001756bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001757 canvas->clear(0xFFFFFFFF);
1758 canvas->save();
1759
robertphillipsa8d7f0b2014-08-29 08:03:56 -07001760 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001761
robertphillips9b14f262014-06-04 05:40:44 -07001762 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001763
1764 canvas->restore();
1765
1766 return true;
1767}
1768
fmalita160ebb22015-04-01 20:58:37 -07001769SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
1770 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
1771
1772void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
1773 if (fRestore) {
1774 canvas->restore();
1775 }
1776}
1777
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001778SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001779 const SkPoint pts[], const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04001780 : INHERITED(kDrawPoints_OpType)
1781 , fMode(mode)
1782 , fPts(pts, count)
1783 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001784
fmalita8c89c522014-11-08 16:18:56 -08001785void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001786 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001787}
1788
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001789bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001790 canvas->clear(0xFFFFFFFF);
1791 canvas->save();
1792
1793 SkRect bounds;
1794
1795 bounds.setEmpty();
Brian Osman8363be12018-05-29 13:38:07 -04001796 for (int i = 0; i < fPts.count(); ++i) {
Mike Reed185ffe92018-01-08 17:09:54 -05001797 SkRectPriv::GrowToInclude(&bounds, fPts[i]);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001798 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00001799
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001800 xlate_and_scale_to_bounds(canvas, bounds);
1801
1802 SkPaint p;
1803 p.setColor(SK_ColorBLACK);
1804 p.setStyle(SkPaint::kStroke_Style);
1805
Brian Osman8363be12018-05-29 13:38:07 -04001806 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001807 canvas->restore();
1808
1809 return true;
1810}
1811
ethannicholasf62a8b72016-02-11 10:35:21 -08001812Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
1813 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001814 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
1815 Json::Value points(Json::arrayValue);
Brian Osman8363be12018-05-29 13:38:07 -04001816 for (int i = 0; i < fPts.count(); i++) {
brianosmanfad98562016-05-04 11:06:28 -07001817 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001818 }
1819 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07001820 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001821 return result;
1822}
1823
Brian Osman65197ff2018-05-29 14:25:39 -04001824static Json::Value make_json_text(sk_sp<SkData> text) {
1825 return Json::Value((const char*)text->data(), (const char*)text->data() + text->size());
chudy@google.com902ebe52012-06-29 14:21:22 +00001826}
1827
Brian Osman65197ff2018-05-29 14:25:39 -04001828SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength,
1829 const SkPoint pos[], const SkPaint& paint)
1830 : INHERITED(kDrawPosText_OpType)
1831 , fText(SkData::MakeWithCopy(text, byteLength))
1832 , fPos(pos, paint.countText(text, byteLength))
1833 , fPaint(paint) {}
1834
fmalita8c89c522014-11-08 16:18:56 -08001835void SkDrawPosTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001836 canvas->drawPosText(fText->data(), fText->size(), fPos.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001837}
1838
ethannicholasf62a8b72016-02-11 10:35:21 -08001839Json::Value SkDrawPosTextCommand::toJSON(UrlDataManager& urlDataManager) const {
1840 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001841 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08001842 Json::Value coords(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001843 size_t numCoords = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001844 for (size_t i = 0; i < numCoords; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001845 coords.append(MakeJsonPoint(fPos[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001846 }
1847 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = coords;
brianosmanfad98562016-05-04 11:06:28 -07001848 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001849 return result;
1850}
1851
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001852SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength,
1853 const SkScalar xpos[], SkScalar constY,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001854 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04001855 : INHERITED(kDrawPosTextH_OpType)
1856 , fText(SkData::MakeWithCopy(text, byteLength))
1857 , fXpos(xpos, paint.countText(text, byteLength))
1858 , fConstY(constY)
1859 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001860
fmalita8c89c522014-11-08 16:18:56 -08001861void SkDrawPosTextHCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001862 canvas->drawPosTextH(fText->data(), fText->size(), fXpos.begin(), fConstY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001863}
1864
bungeman51190df2016-03-09 07:42:54 -08001865Json::Value SkDrawPosTextHCommand::toJSON(UrlDataManager& urlDataManager) const {
1866 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001867 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
bungeman51190df2016-03-09 07:42:54 -08001868 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fConstY);
1869 Json::Value xpos(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001870 size_t numXpos = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001871 for (size_t i = 0; i < numXpos; i++) {
1872 xpos.append(Json::Value(fXpos[i]));
1873 }
1874 result[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = xpos;
brianosmanfad98562016-05-04 11:06:28 -07001875 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
bungeman51190df2016-03-09 07:42:54 -08001876 return result;
1877}
1878
fmalita37283c22016-09-13 10:00:23 -07001879SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07001880 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001881 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07001882 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07001883 , fXPos(x)
1884 , fYPos(y)
Brian Osman255735e2018-04-06 14:51:42 -04001885 , fPaint(paint) {}
fmalitab7425172014-08-26 07:56:44 -07001886
fmalita8c89c522014-11-08 16:18:56 -08001887void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07001888 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1889}
1890
fmalita55773872014-08-29 15:08:20 -07001891bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
1892 canvas->clear(SK_ColorWHITE);
1893 canvas->save();
1894
1895 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
1896 xlate_and_scale_to_bounds(canvas, bounds);
1897
fmalita37283c22016-09-13 10:00:23 -07001898 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07001899
1900 canvas->restore();
1901
1902 return true;
1903}
1904
ethannicholasf62a8b72016-02-11 10:35:21 -08001905Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
1906 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001907 Json::Value runs(Json::arrayValue);
1908 SkTextBlobRunIterator iter(fBlob.get());
1909 while (!iter.done()) {
1910 Json::Value run(Json::objectValue);
1911 Json::Value jsonPositions(Json::arrayValue);
1912 Json::Value jsonGlyphs(Json::arrayValue);
1913 const SkScalar* iterPositions = iter.pos();
1914 const uint16_t* iterGlyphs = iter.glyphs();
1915 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1916 switch (iter.positioning()) {
Florin Malitaab54e732018-07-27 09:47:15 -04001917 case SkTextBlobRunIterator::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07001918 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
1919 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001920 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001921 case SkTextBlobRunIterator::kHorizontal_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001922 jsonPositions.append(Json::Value(iterPositions[i]));
1923 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001924 case SkTextBlobRunIterator::kDefault_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001925 break;
1926 }
1927 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
1928 }
Florin Malitaab54e732018-07-27 09:47:15 -04001929 if (iter.positioning() != SkTextBlobRunIterator::kDefault_Positioning) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001930 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
1931 }
1932 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
1933 SkPaint fontPaint;
1934 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07001935 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
1936 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08001937 runs.append(run);
1938 iter.next();
1939 }
reed6d2c3e72016-07-07 14:10:14 -07001940 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08001941 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
1942 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
1943 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07001944 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07001945 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07001946
1947 SkString desc;
1948 // make the bounds local by applying the x,y
1949 bounds.offset(fXPos, fYPos);
1950 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
1951
ethannicholas50a8dd02016-02-10 05:40:46 -08001952 return result;
1953}
1954
robertphillips9bafc302015-02-13 11:13:00 -08001955SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04001956 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08001957 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04001958 : INHERITED(kDrawPatch_OpType)
1959 , fBlendMode(bmode)
1960{
robertphillips9bafc302015-02-13 11:13:00 -08001961 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08001962 if (colors != nullptr) {
1963 memcpy(fColors, colors, sizeof(fColors));
1964 fColorsPtr = fColors;
1965 } else {
1966 fColorsPtr = nullptr;
1967 }
1968 if (texCoords != nullptr) {
1969 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
1970 fTexCoordsPtr = fTexCoords;
1971 } else {
1972 fTexCoordsPtr = nullptr;
1973 }
robertphillips9bafc302015-02-13 11:13:00 -08001974 fPaint = paint;
robertphillips9bafc302015-02-13 11:13:00 -08001975}
1976
1977void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04001978 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08001979}
1980
ethannicholasf62a8b72016-02-11 10:35:21 -08001981Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
1982 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001983 Json::Value cubics = Json::Value(Json::arrayValue);
1984 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001985 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001986 }
1987 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
1988 if (fColorsPtr != nullptr) {
1989 Json::Value colors = Json::Value(Json::arrayValue);
1990 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001991 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001992 }
1993 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
1994 }
1995 if (fTexCoordsPtr != nullptr) {
1996 Json::Value texCoords = Json::Value(Json::arrayValue);
1997 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001998 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001999 }
2000 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
2001 }
Mike Reed7d954ad2016-10-28 15:42:34 -04002002 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08002003 return result;
2004}
2005
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002006SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002007 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002008 fRect = rect;
2009 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002010}
2011
fmalita8c89c522014-11-08 16:18:56 -08002012void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002013 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002014}
2015
ethannicholasf62a8b72016-02-11 10:35:21 -08002016Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2017 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002018 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
2019 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07002020
2021 SkString desc;
2022 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
2023
ethannicholas50a8dd02016-02-10 05:40:46 -08002024 return result;
2025}
2026
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002027SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002028 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002029 fRRect = rrect;
2030 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00002031}
2032
fmalita8c89c522014-11-08 16:18:56 -08002033void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00002034 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00002035}
2036
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002037bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002038 render_rrect(canvas, fRRect);
2039 return true;
2040}
2041
ethannicholasf62a8b72016-02-11 10:35:21 -08002042Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2043 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002044 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07002045 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002046 return result;
2047}
2048
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00002049SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002050 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002051 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002052 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002053 fOuter = outer;
2054 fInner = inner;
2055 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002056}
2057
fmalita8c89c522014-11-08 16:18:56 -08002058void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002059 canvas->drawDRRect(fOuter, fInner, fPaint);
2060}
2061
2062bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
2063 render_drrect(canvas, fOuter, fInner);
2064 return true;
2065}
2066
ethannicholasf62a8b72016-02-11 10:35:21 -08002067Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2068 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002069 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
2070 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07002071 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002072 return result;
2073}
2074
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04002075SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
2076 : INHERITED(kDrawShadow_OpType) {
2077 fPath = path;
2078 fShadowRec = rec;
2079}
2080
2081void SkDrawShadowCommand::execute(SkCanvas* canvas) const {
2082 canvas->private_draw_shadow_rec(fPath, fShadowRec);
2083}
2084
2085bool SkDrawShadowCommand::render(SkCanvas* canvas) const {
2086 render_shadow(canvas, fPath, fShadowRec);
2087 return true;
2088}
2089
2090Json::Value SkDrawShadowCommand::toJSON(UrlDataManager& urlDataManager) const {
2091 Json::Value result = INHERITED::toJSON(urlDataManager);
2092 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2093
2094 bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
2095 bool transparentOccluder =
2096 SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
2097
2098 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2099 result[SKDEBUGCANVAS_ATTRIBUTE_ZPLANE] = MakeJsonPoint3(fShadowRec.fZPlaneParams);
2100 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION] = MakeJsonPoint3(fShadowRec.fLightPos);
2101 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS] = MakeJsonScalar(fShadowRec.fLightRadius);
2102 result[SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR] = MakeJsonColor(fShadowRec.fAmbientColor);
2103 result[SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR] = MakeJsonColor(fShadowRec.fSpotColor);
2104 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
2105 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
2106 return result;
2107}
2108
Brian Osmanc7611082018-05-29 14:55:50 -04002109///////////////////////////////////////////////////////////////////////////////////////////////////
2110
2111SkDrawDrawableCommand::SkDrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
2112 : INHERITED(kDrawDrawable_OpType)
2113 , fDrawable(SkRef(drawable))
2114 , fMatrix(matrix) {}
2115
2116void SkDrawDrawableCommand::execute(SkCanvas* canvas) const {
2117 canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
2118}
2119
2120///////////////////////////////////////////////////////////////////////////////////////////////////
2121
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002122SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002123 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04002124 : INHERITED(kDrawText_OpType)
2125 , fText(SkData::MakeWithCopy(text, byteLength))
2126 , fX(x)
2127 , fY(y)
2128 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002129
fmalita8c89c522014-11-08 16:18:56 -08002130void SkDrawTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002131 canvas->drawText(fText->data(), fText->size(), fX, fY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002132}
2133
ethannicholasf62a8b72016-02-11 10:35:21 -08002134Json::Value SkDrawTextCommand::toJSON(UrlDataManager& urlDataManager) const {
2135 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002136 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08002137 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07002138 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fX, fY);
2139 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002140 return result;
2141}
2142
reed45561a02016-07-07 12:47:17 -07002143///////////////////////////////////////////////////////////////////////////////////////////////////
2144
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002145SkDrawTextOnPathCommand::SkDrawTextOnPathCommand(const void* text, size_t byteLength,
2146 const SkPath& path, const SkMatrix* matrix,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002147 const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04002148 : INHERITED(kDrawTextOnPath_OpType)
Brian Osman65197ff2018-05-29 14:25:39 -04002149 , fText(SkData::MakeWithCopy(text, byteLength))
2150 , fPath(path)
2151 , fMatrix(matrix)
2152 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002153
fmalita8c89c522014-11-08 16:18:56 -08002154void SkDrawTextOnPathCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002155 canvas->drawTextOnPath(fText->data(), fText->size(), fPath, fMatrix.getMaybeNull(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002156}
2157
ethannicholasf62a8b72016-02-11 10:35:21 -08002158Json::Value SkDrawTextOnPathCommand::toJSON(UrlDataManager& urlDataManager) const {
2159 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002160 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08002161 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07002162 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
Brian Osman8363be12018-05-29 13:38:07 -04002163 if (fMatrix.isValid()) {
2164 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(*fMatrix.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002165 }
brianosmanfad98562016-05-04 11:06:28 -07002166 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002167 return result;
2168}
2169
reed45561a02016-07-07 12:47:17 -07002170///////////////////////////////////////////////////////////////////////////////////////////////////
2171
2172SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength,
2173 const SkRSXform xform[], const SkRect* cull,
2174 const SkPaint& paint)
reed63f30d92016-07-07 16:32:51 -07002175 : INHERITED(kDrawTextRSXform_OpType)
Brian Osman65197ff2018-05-29 14:25:39 -04002176 , fText(SkData::MakeWithCopy(text, byteLength))
2177 , fXform(xform, paint.countText(text, byteLength))
Brian Osman8363be12018-05-29 13:38:07 -04002178 , fCull(cull)
Brian Osman65197ff2018-05-29 14:25:39 -04002179 , fPaint(paint) {}
reed45561a02016-07-07 12:47:17 -07002180
2181void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002182 canvas->drawTextRSXform(fText->data(), fText->size(), fXform.begin(), fCull.getMaybeNull(),
2183 fPaint);
reed45561a02016-07-07 12:47:17 -07002184}
2185
2186Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) const {
2187 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002188 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
reed45561a02016-07-07 12:47:17 -07002189 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
2190 return result;
2191}
2192
reed45561a02016-07-07 12:47:17 -07002193///////////////////////////////////////////////////////////////////////////////////////////////////
2194
Mike Reedfed9cfd2017-03-17 12:09:04 -04002195SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002196 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04002197 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04002198 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04002199 , fBlendMode(bmode)
Brian Osman255735e2018-04-06 14:51:42 -04002200 , fPaint(paint) {}
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002201
fmalita8c89c522014-11-08 16:18:56 -08002202void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04002203 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002204}
2205
Brian Osman616f1cb2018-05-29 11:23:35 -04002206///////////////////////////////////////////////////////////////////////////////////////////////////
2207
2208SkDrawAtlasCommand::SkDrawAtlasCommand(const SkImage* image, const SkRSXform xform[],
2209 const SkRect tex[], const SkColor colors[], int count,
2210 SkBlendMode bmode, const SkRect* cull,
2211 const SkPaint* paint)
2212 : INHERITED(kDrawAtlas_OpType)
2213 , fImage(SkRef(image))
2214 , fXform(xform, count)
2215 , fTex(tex, count)
2216 , fColors(colors, colors ? count : 0)
2217 , fBlendMode(bmode)
2218 , fCull(cull)
2219 , fPaint(paint) {}
2220
2221void SkDrawAtlasCommand::execute(SkCanvas* canvas) const {
2222 canvas->drawAtlas(fImage.get(), fXform.begin(), fTex.begin(),
2223 fColors.isEmpty() ? nullptr : fColors.begin(), fXform.count(), fBlendMode,
2224 fCull.getMaybeNull(), fPaint.getMaybeNull());
2225}
2226
2227///////////////////////////////////////////////////////////////////////////////////////////////////
2228
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002229SkRestoreCommand::SkRestoreCommand()
Brian Osman255735e2018-04-06 14:51:42 -04002230 : INHERITED(kRestore_OpType) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002231
fmalita8c89c522014-11-08 16:18:56 -08002232void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00002233 canvas->restore();
2234}
2235
Florin Malita5f6102d2014-06-30 10:13:28 -04002236SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08002237 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00002238}
2239
fmalita8c89c522014-11-08 16:18:56 -08002240void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04002241 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00002242}
2243
reed4960eee2015-12-18 07:09:18 -08002244SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
Brian Osman8363be12018-05-29 13:38:07 -04002245 : INHERITED(kSaveLayer_OpType)
2246 , fBounds(rec.fBounds)
2247 , fPaint(rec.fPaint)
2248 , fBackdrop(SkSafeRef(rec.fBackdrop))
2249 , fSaveLayerFlags(rec.fSaveLayerFlags) {}
ethannicholas50a8dd02016-02-10 05:40:46 -08002250
fmalita8c89c522014-11-08 16:18:56 -08002251void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04002252 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(),
reed4960eee2015-12-18 07:09:18 -08002253 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00002254}
2255
ethannicholasf62a8b72016-02-11 10:35:21 -08002256Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
2257 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman8363be12018-05-29 13:38:07 -04002258 if (fBounds.isValid()) {
2259 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(*fBounds.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002260 }
Brian Osman8363be12018-05-29 13:38:07 -04002261 if (fPaint.isValid()) {
2262 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002263 }
2264 if (fBackdrop != nullptr) {
2265 Json::Value jsonBackdrop;
Brian Osman8363be12018-05-29 13:38:07 -04002266 flatten(fBackdrop.get(), &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002267 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
2268 }
2269 if (fSaveLayerFlags != 0) {
2270 SkDebugf("unsupported: saveLayer flags\n");
2271 SkASSERT(false);
2272 }
2273 return result;
2274}
2275
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002276SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08002277 : INHERITED(kSetMatrix_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002278 fMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -07002279}
2280
fmalita8c89c522014-11-08 16:18:56 -08002281void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
Brian Osman255735e2018-04-06 14:51:42 -04002282 canvas->setMatrix(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00002283}
2284
ethannicholasf62a8b72016-02-11 10:35:21 -08002285Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
2286 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08002287 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08002288 return result;
2289}