blob: d1114f8e7469a5d4e2bd6fcd3c3cbadf39dacbb1 [file] [log] [blame]
chudy@google.com902ebe52012-06-29 14:21:22 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
chudy@google.com902ebe52012-06-29 14:21:22 +00008#include "SkDrawCommand.h"
joshualitt6b3cf732016-02-17 11:20:26 -08009
Brian Salomond7065e72018-10-12 11:42:02 -040010#include <algorithm>
Hal Canary95e3c052017-01-11 12:44:43 -050011#include "SkAutoMalloc.h"
Brian Salomond7065e72018-10-12 11:42:02 -040012#include "SkClipOpPriv.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080013#include "SkColorFilter.h"
14#include "SkDashPathEffect.h"
Brian Osmanc7611082018-05-29 14:55:50 -040015#include "SkDrawable.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080016#include "SkImageFilter.h"
brianosmanfad98562016-05-04 11:06:28 -070017#include "SkJsonWriteBuffer.h"
Brian Salomond7065e72018-10-12 11:42:02 -040018#include "SkLatticeIter.h"
Mike Reed80747ef2018-01-23 15:29:32 -050019#include "SkMaskFilterBase.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080020#include "SkPaintDefaults.h"
21#include "SkPathEffect.h"
robertphillips9bafc302015-02-13 11:13:00 -080022#include "SkPicture.h"
Brian Osmand9ea8162018-08-08 17:03:39 -040023#include "SkPngEncoder.h"
Mike Reedfadbfcd2017-12-06 16:09:20 -050024#include "SkReadBuffer.h"
Mike Reed185ffe92018-01-08 17:09:54 -050025#include "SkRectPriv.h"
Brian Salomond7065e72018-10-12 11:42:02 -040026#include "SkShadowFlags.h"
Brian Salomon8d5b41b2018-10-12 14:22:49 +000027#include "SkTHash.h"
Brian Salomond7065e72018-10-12 11:42:02 -040028#include "SkTextBlobPriv.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080029#include "SkTypeface.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080030#include "SkWriteBuffer.h"
31
ethannicholas50a8dd02016-02-10 05:40:46 -080032#define SKDEBUGCANVAS_ATTRIBUTE_COMMAND "command"
ethannicholas807dcab2016-02-23 06:53:37 -080033#define SKDEBUGCANVAS_ATTRIBUTE_VISIBLE "visible"
ethannicholas50a8dd02016-02-10 05:40:46 -080034#define SKDEBUGCANVAS_ATTRIBUTE_MATRIX "matrix"
vjiaoblacke5de1302016-07-13 14:05:28 -070035#define SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS "drawDepthTranslation"
ethannicholas50a8dd02016-02-10 05:40:46 -080036#define SKDEBUGCANVAS_ATTRIBUTE_COORDS "coords"
halcanaryf412f092016-08-25 11:10:41 -070037#define SKDEBUGCANVAS_ATTRIBUTE_HINTING "hinting"
ethannicholas50a8dd02016-02-10 05:40:46 -080038#define SKDEBUGCANVAS_ATTRIBUTE_BOUNDS "bounds"
39#define SKDEBUGCANVAS_ATTRIBUTE_PAINT "paint"
40#define SKDEBUGCANVAS_ATTRIBUTE_OUTER "outer"
41#define SKDEBUGCANVAS_ATTRIBUTE_INNER "inner"
42#define SKDEBUGCANVAS_ATTRIBUTE_MODE "mode"
43#define SKDEBUGCANVAS_ATTRIBUTE_POINTS "points"
44#define SKDEBUGCANVAS_ATTRIBUTE_PATH "path"
45#define SKDEBUGCANVAS_ATTRIBUTE_TEXT "text"
46#define SKDEBUGCANVAS_ATTRIBUTE_COLOR "color"
47#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Florin Malita82d80872017-06-06 16:58:40 -040048#define SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE "blendMode"
ethannicholas50a8dd02016-02-10 05:40:46 -080049#define SKDEBUGCANVAS_ATTRIBUTE_STYLE "style"
50#define SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH "strokeWidth"
51#define SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER "strokeMiter"
ethannicholas1446a9a2016-02-10 14:05:02 -080052#define SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN "strokeJoin"
ethannicholas50a8dd02016-02-10 05:40:46 -080053#define SKDEBUGCANVAS_ATTRIBUTE_CAP "cap"
54#define SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS "antiAlias"
ethannicholas1446a9a2016-02-10 14:05:02 -080055#define SKDEBUGCANVAS_ATTRIBUTE_DITHER "dither"
Ben Wagner78f1f5a2017-06-23 14:35:07 -040056#define SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT "fakeBoldText"
57#define SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT "linearText"
58#define SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT "subpixelText"
59#define SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT "devKernText"
60#define SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT "lcdRenderText"
61#define SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT "embeddedBitmapText"
62#define SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING "forceAutoHinting"
ethannicholas50a8dd02016-02-10 05:40:46 -080063#define SKDEBUGCANVAS_ATTRIBUTE_REGION "region"
64#define SKDEBUGCANVAS_ATTRIBUTE_REGIONOP "op"
65#define SKDEBUGCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle"
66#define SKDEBUGCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion"
67#define SKDEBUGCANVAS_ATTRIBUTE_BLUR "blur"
68#define SKDEBUGCANVAS_ATTRIBUTE_SIGMA "sigma"
69#define SKDEBUGCANVAS_ATTRIBUTE_QUALITY "quality"
ethannicholas50a8dd02016-02-10 05:40:46 -080070#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE "textSize"
71#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX"
72#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX"
73#define SKDEBUGCANVAS_ATTRIBUTE_DASHING "dashing"
74#define SKDEBUGCANVAS_ATTRIBUTE_INTERVALS "intervals"
75#define SKDEBUGCANVAS_ATTRIBUTE_PHASE "phase"
76#define SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE "fillType"
77#define SKDEBUGCANVAS_ATTRIBUTE_VERBS "verbs"
78#define SKDEBUGCANVAS_ATTRIBUTE_NAME "name"
ethannicholasf62a8b72016-02-11 10:35:21 -080079#define SKDEBUGCANVAS_ATTRIBUTE_DATA "data"
brianosmanfad98562016-05-04 11:06:28 -070080#define SKDEBUGCANVAS_ATTRIBUTE_VALUES "values"
ethannicholas50a8dd02016-02-10 05:40:46 -080081#define SKDEBUGCANVAS_ATTRIBUTE_SHADER "shader"
82#define SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect"
83#define SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER "maskFilter"
84#define SKDEBUGCANVAS_ATTRIBUTE_XFERMODE "xfermode"
ethannicholas1446a9a2016-02-10 14:05:02 -080085#define SKDEBUGCANVAS_ATTRIBUTE_LOOPER "looper"
ethannicholas50a8dd02016-02-10 05:40:46 -080086#define SKDEBUGCANVAS_ATTRIBUTE_BACKDROP "backdrop"
87#define SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER "colorfilter"
88#define SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter"
89#define SKDEBUGCANVAS_ATTRIBUTE_IMAGE "image"
90#define SKDEBUGCANVAS_ATTRIBUTE_BITMAP "bitmap"
91#define SKDEBUGCANVAS_ATTRIBUTE_SRC "src"
92#define SKDEBUGCANVAS_ATTRIBUTE_DST "dst"
93#define SKDEBUGCANVAS_ATTRIBUTE_CENTER "center"
94#define SKDEBUGCANVAS_ATTRIBUTE_STRICT "strict"
95#define SKDEBUGCANVAS_ATTRIBUTE_DESCRIPTION "description"
96#define SKDEBUGCANVAS_ATTRIBUTE_X "x"
97#define SKDEBUGCANVAS_ATTRIBUTE_Y "y"
98#define SKDEBUGCANVAS_ATTRIBUTE_RUNS "runs"
99#define SKDEBUGCANVAS_ATTRIBUTE_POSITIONS "positions"
100#define SKDEBUGCANVAS_ATTRIBUTE_GLYPHS "glyphs"
101#define SKDEBUGCANVAS_ATTRIBUTE_FONT "font"
102#define SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE "typeface"
ethannicholas1446a9a2016-02-10 14:05:02 -0800103#define SKDEBUGCANVAS_ATTRIBUTE_CUBICS "cubics"
104#define SKDEBUGCANVAS_ATTRIBUTE_COLORS "colors"
105#define SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS "textureCoords"
106#define SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY "filterQuality"
bsalomonac3aa242016-08-19 11:25:19 -0700107#define SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE "startAngle"
108#define SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE "sweepAngle"
109#define SKDEBUGCANVAS_ATTRIBUTE_USECENTER "useCenter"
jcgregorioee0c5552016-06-30 09:18:27 -0700110#define SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC "shortDesc"
msarett0ac1bec2016-08-29 09:15:33 -0700111#define SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID "uniqueID"
112#define SKDEBUGCANVAS_ATTRIBUTE_WIDTH "width"
113#define SKDEBUGCANVAS_ATTRIBUTE_HEIGHT "height"
114#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Stan Ilievac42aeb2017-01-12 16:20:50 -0500115#define SKDEBUGCANVAS_ATTRIBUTE_LATTICE "lattice"
116#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT "xCount"
117#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT "yCount"
118#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS "xDivs"
119#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS "yDivs"
120#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS "flags"
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400121#define SKDEBUGCANVAS_ATTRIBUTE_ZPLANE "zPlane"
122#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION "lightPositions"
123#define SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR "ambientColor"
124#define SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR "spotColor"
125#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS "lightRadius"
reed67f62fa2016-06-29 11:36:34 -0700126
ethannicholas50a8dd02016-02-10 05:40:46 -0800127#define SKDEBUGCANVAS_VERB_MOVE "move"
128#define SKDEBUGCANVAS_VERB_LINE "line"
129#define SKDEBUGCANVAS_VERB_QUAD "quad"
130#define SKDEBUGCANVAS_VERB_CUBIC "cubic"
131#define SKDEBUGCANVAS_VERB_CONIC "conic"
132#define SKDEBUGCANVAS_VERB_CLOSE "close"
133
134#define SKDEBUGCANVAS_STYLE_FILL "fill"
135#define SKDEBUGCANVAS_STYLE_STROKE "stroke"
136#define SKDEBUGCANVAS_STYLE_STROKEANDFILL "strokeAndFill"
137
138#define SKDEBUGCANVAS_POINTMODE_POINTS "points"
139#define SKDEBUGCANVAS_POINTMODE_LINES "lines"
140#define SKDEBUGCANVAS_POINTMODE_POLYGON "polygon"
141
142#define SKDEBUGCANVAS_REGIONOP_DIFFERENCE "difference"
143#define SKDEBUGCANVAS_REGIONOP_INTERSECT "intersect"
144#define SKDEBUGCANVAS_REGIONOP_UNION "union"
145#define SKDEBUGCANVAS_REGIONOP_XOR "xor"
146#define SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE "reverseDifference"
147#define SKDEBUGCANVAS_REGIONOP_REPLACE "replace"
148
149#define SKDEBUGCANVAS_BLURSTYLE_NORMAL "normal"
150#define SKDEBUGCANVAS_BLURSTYLE_SOLID "solid"
151#define SKDEBUGCANVAS_BLURSTYLE_OUTER "outer"
152#define SKDEBUGCANVAS_BLURSTYLE_INNER "inner"
153
154#define SKDEBUGCANVAS_BLURQUALITY_LOW "low"
155#define SKDEBUGCANVAS_BLURQUALITY_HIGH "high"
156
ethannicholas50a8dd02016-02-10 05:40:46 -0800157#define SKDEBUGCANVAS_FILLTYPE_WINDING "winding"
158#define SKDEBUGCANVAS_FILLTYPE_EVENODD "evenOdd"
159#define SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding"
160#define SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd"
161
162#define SKDEBUGCANVAS_CAP_BUTT "butt"
163#define SKDEBUGCANVAS_CAP_ROUND "round"
164#define SKDEBUGCANVAS_CAP_SQUARE "square"
165
ethannicholas1446a9a2016-02-10 14:05:02 -0800166#define SKDEBUGCANVAS_MITER_JOIN "miter"
167#define SKDEBUGCANVAS_ROUND_JOIN "round"
168#define SKDEBUGCANVAS_BEVEL_JOIN "bevel"
169
ethannicholas50a8dd02016-02-10 05:40:46 -0800170#define SKDEBUGCANVAS_COLORTYPE_ARGB4444 "ARGB4444"
171#define SKDEBUGCANVAS_COLORTYPE_RGBA8888 "RGBA8888"
172#define SKDEBUGCANVAS_COLORTYPE_BGRA8888 "BGRA8888"
173#define SKDEBUGCANVAS_COLORTYPE_565 "565"
174#define SKDEBUGCANVAS_COLORTYPE_GRAY8 "Gray8"
175#define SKDEBUGCANVAS_COLORTYPE_INDEX8 "Index8"
176#define SKDEBUGCANVAS_COLORTYPE_ALPHA8 "Alpha8"
177
178#define SKDEBUGCANVAS_ALPHATYPE_OPAQUE "opaque"
179#define SKDEBUGCANVAS_ALPHATYPE_PREMUL "premul"
180#define SKDEBUGCANVAS_ALPHATYPE_UNPREMUL "unpremul"
msarett0ac1bec2016-08-29 09:15:33 -0700181#define SKDEBUGCANVAS_ALPHATYPE_UNKNOWN "unknown"
ethannicholas50a8dd02016-02-10 05:40:46 -0800182
ethannicholas1446a9a2016-02-10 14:05:02 -0800183#define SKDEBUGCANVAS_FILTERQUALITY_NONE "none"
184#define SKDEBUGCANVAS_FILTERQUALITY_LOW "low"
185#define SKDEBUGCANVAS_FILTERQUALITY_MEDIUM "medium"
186#define SKDEBUGCANVAS_FILTERQUALITY_HIGH "high"
187
halcanaryf412f092016-08-25 11:10:41 -0700188#define SKDEBUGCANVAS_HINTING_NONE "none"
189#define SKDEBUGCANVAS_HINTING_SLIGHT "slight"
190#define SKDEBUGCANVAS_HINTING_NORMAL "normal"
191#define SKDEBUGCANVAS_HINTING_FULL "full"
192
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400193#define SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC "transparentOccluder"
194#define SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY "geometricOnly"
195
reed67f62fa2016-06-29 11:36:34 -0700196static SkString* str_append(SkString* str, const SkRect& r) {
197 str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom());
198 return str;
199}
200
robertphillips9bafc302015-02-13 11:13:00 -0800201SkDrawCommand::SkDrawCommand(OpType type)
202 : fOpType(type)
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000203 , fVisible(true) {
204}
205
robertphillips9bafc302015-02-13 11:13:00 -0800206const char* SkDrawCommand::GetCommandString(OpType type) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000207 switch (type) {
fmalita160ebb22015-04-01 20:58:37 -0700208 case kBeginDrawPicture_OpType: return "BeginDrawPicture";
Brian Osmanc25e2692018-03-12 10:57:28 -0400209 case kClear_OpType: return "DrawClear";
robertphillips9bafc302015-02-13 11:13:00 -0800210 case kClipPath_OpType: return "ClipPath";
211 case kClipRegion_OpType: return "ClipRegion";
212 case kClipRect_OpType: return "ClipRect";
213 case kClipRRect_OpType: return "ClipRRect";
robertphillips9bafc302015-02-13 11:13:00 -0800214 case kConcat_OpType: return "Concat";
robertphillipsfb409232016-06-29 10:28:11 -0700215 case kDrawAnnotation_OpType: return "DrawAnnotation";
robertphillips9bafc302015-02-13 11:13:00 -0800216 case kDrawBitmap_OpType: return "DrawBitmap";
Brian Osman78a76482018-05-18 16:59:13 -0400217 case kDrawBitmapLattice_OpType: return "DrawBitmapLattice";
robertphillips9bafc302015-02-13 11:13:00 -0800218 case kDrawBitmapNine_OpType: return "DrawBitmapNine";
219 case kDrawBitmapRect_OpType: return "DrawBitmapRect";
robertphillips9bafc302015-02-13 11:13:00 -0800220 case kDrawDRRect_OpType: return "DrawDRRect";
fmalita651c9202015-07-22 10:23:01 -0700221 case kDrawImage_OpType: return "DrawImage";
Stan Ilievac42aeb2017-01-12 16:20:50 -0500222 case kDrawImageLattice_OpType: return "DrawImageLattice";
Brian Osmanc25e2692018-03-12 10:57:28 -0400223 case kDrawImageNine_OpType: return "DrawImageNine";
fmalita651c9202015-07-22 10:23:01 -0700224 case kDrawImageRect_OpType: return "DrawImageRect";
Brian Salomond7065e72018-10-12 11:42:02 -0400225 case kDrawImageSet_OpType: return "DrawImageSet";
robertphillips9bafc302015-02-13 11:13:00 -0800226 case kDrawOval_OpType: return "DrawOval";
227 case kDrawPaint_OpType: return "DrawPaint";
228 case kDrawPatch_OpType: return "DrawPatch";
229 case kDrawPath_OpType: return "DrawPath";
Brian Osmanc25e2692018-03-12 10:57:28 -0400230 case kDrawArc_OpType: return "DrawArc";
robertphillips9bafc302015-02-13 11:13:00 -0800231 case kDrawPoints_OpType: return "DrawPoints";
robertphillips9bafc302015-02-13 11:13:00 -0800232 case kDrawRect_OpType: return "DrawRect";
233 case kDrawRRect_OpType: return "DrawRRect";
Brian Osmanc25e2692018-03-12 10:57:28 -0400234 case kDrawRegion_OpType: return "DrawRegion";
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400235 case kDrawShadow_OpType: return "DrawShadow";
robertphillips9bafc302015-02-13 11:13:00 -0800236 case kDrawTextBlob_OpType: return "DrawTextBlob";
robertphillips9bafc302015-02-13 11:13:00 -0800237 case kDrawVertices_OpType: return "DrawVertices";
Brian Osman616f1cb2018-05-29 11:23:35 -0400238 case kDrawAtlas_OpType: return "DrawAtlas";
Brian Osmanc7611082018-05-29 14:55:50 -0400239 case kDrawDrawable_OpType: return "DrawDrawable";
fmalita160ebb22015-04-01 20:58:37 -0700240 case kEndDrawPicture_OpType: return "EndDrawPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800241 case kRestore_OpType: return "Restore";
242 case kSave_OpType: return "Save";
243 case kSaveLayer_OpType: return "SaveLayer";
244 case kSetMatrix_OpType: return "SetMatrix";
chudy@google.com902ebe52012-06-29 14:21:22 +0000245 default:
robertphillips9bafc302015-02-13 11:13:00 -0800246 SkDebugf("OpType error 0x%08x\n", type);
chudy@google.com902ebe52012-06-29 14:21:22 +0000247 SkASSERT(0);
248 break;
249 }
250 SkDEBUGFAIL("DrawType UNUSED\n");
halcanary96fcdcc2015-08-27 07:41:13 -0700251 return nullptr;
chudy@google.com902ebe52012-06-29 14:21:22 +0000252}
253
ethannicholasf62a8b72016-02-11 10:35:21 -0800254Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const {
ethannicholas50a8dd02016-02-10 05:40:46 -0800255 Json::Value result;
256 result[SKDEBUGCANVAS_ATTRIBUTE_COMMAND] = this->GetCommandString(fOpType);
ethannicholas807dcab2016-02-23 06:53:37 -0800257 result[SKDEBUGCANVAS_ATTRIBUTE_VISIBLE] = Json::Value(this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800258 return result;
259}
260
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000261namespace {
262
263void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
Mike Reed3661bc92017-02-22 13:21:42 -0500264 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000265
266 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
267
268 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
269 if (bounds.width() > bounds.height()) {
270 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
271 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
272 } else {
273 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
274 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
275 }
276 canvas->translate(-bounds.centerX(), -bounds.centerY());
277}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000278
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000279
280void render_path(SkCanvas* canvas, const SkPath& path) {
281 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000282
283 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700284 if (bounds.isEmpty()) {
285 return;
286 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000287
fmalitab0cd8b72015-10-06 07:24:03 -0700288 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000289 xlate_and_scale_to_bounds(canvas, bounds);
290
291 SkPaint p;
292 p.setColor(SK_ColorBLACK);
293 p.setStyle(SkPaint::kStroke_Style);
294
295 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000296}
297
Brian Osmanc25e2692018-03-12 10:57:28 -0400298void render_region(SkCanvas* canvas, const SkRegion& region) {
299 canvas->clear(0xFFFFFFFF);
300
301 const SkIRect& bounds = region.getBounds();
302 if (bounds.isEmpty()) {
303 return;
304 }
305
306 SkAutoCanvasRestore acr(canvas, true);
Brian Osman99b63402018-03-13 10:19:27 -0400307 xlate_and_scale_to_bounds(canvas, SkRect::Make(bounds));
Brian Osmanc25e2692018-03-12 10:57:28 -0400308
309 SkPaint p;
310 p.setColor(SK_ColorBLACK);
311 p.setStyle(SkPaint::kStroke_Style);
312
313 canvas->drawRegion(region, p);
314}
315
halcanary96fcdcc2015-08-27 07:41:13 -0700316void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
Mike Reed3661bc92017-02-22 13:21:42 -0500317 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000318
319 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
320 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
321
322 if (input.width() > input.height()) {
323 yScale *= input.height() / (float) input.width();
324 } else {
325 xScale *= input.width() / (float) input.height();
326 }
327
328 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
329 xScale * input.width(),
330 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000331
robertphillips96a5cff2015-09-24 06:56:27 -0700332 static const int kNumBlocks = 8;
333
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000334 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700335 SkISize block = {
336 canvas->imageInfo().width()/kNumBlocks,
337 canvas->imageInfo().height()/kNumBlocks
338 };
339 for (int y = 0; y < kNumBlocks; ++y) {
340 for (int x = 0; x < kNumBlocks; ++x) {
341 SkPaint paint;
342 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
343 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
344 SkIntToScalar(y*block.height()),
345 SkIntToScalar(block.width()),
346 SkIntToScalar(block.height()));
347 canvas->drawRect(r, paint);
348 }
349 }
350
reede47829b2015-08-06 10:02:53 -0700351 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000352
bsalomon49f085d2014-09-05 13:34:00 -0700353 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000354 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
355 srcRect->fTop * yScale + SK_Scalar1,
356 srcRect->fRight * xScale + SK_Scalar1,
357 srcRect->fBottom * yScale + SK_Scalar1);
358 SkPaint p;
359 p.setColor(SK_ColorRED);
360 p.setStyle(SkPaint::kStroke_Style);
361
362 canvas->drawRect(r, p);
363 }
364}
365
366void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
367 canvas->clear(0xFFFFFFFF);
368 canvas->save();
369
370 const SkRect& bounds = rrect.getBounds();
371
372 xlate_and_scale_to_bounds(canvas, bounds);
373
374 SkPaint p;
375 p.setColor(SK_ColorBLACK);
376 p.setStyle(SkPaint::kStroke_Style);
377
378 canvas->drawRRect(rrect, p);
379 canvas->restore();
380}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000381
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000382void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
383 canvas->clear(0xFFFFFFFF);
384 canvas->save();
385
386 const SkRect& bounds = outer.getBounds();
387
388 xlate_and_scale_to_bounds(canvas, bounds);
389
390 SkPaint p;
391 p.setColor(SK_ColorBLACK);
392 p.setStyle(SkPaint::kStroke_Style);
393
394 canvas->drawDRRect(outer, inner, p);
395 canvas->restore();
396}
397
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400398void render_shadow(SkCanvas* canvas, const SkPath& path, SkDrawShadowRec rec) {
399 canvas->clear(0xFFFFFFFF);
400
401 const SkRect& bounds = path.getBounds();
402 if (bounds.isEmpty()) {
403 return;
404 }
405
406 SkAutoCanvasRestore acr(canvas, true);
407 xlate_and_scale_to_bounds(canvas, bounds);
408
409 rec.fAmbientColor = SK_ColorBLACK;
410 rec.fSpotColor = SK_ColorBLACK;
411 canvas->private_draw_shadow_rec(path, rec);
412}
413
Florin Malita82d80872017-06-06 16:58:40 -0400414static const char* const gBlendModeMap[] = {
415 "clear",
416 "src",
417 "dst",
418 "srcOver",
419 "dstOver",
420 "srcIn",
421 "dstIn",
422 "srcOut",
423 "dstOut",
424 "srcATop",
425 "dstATop",
426 "xor",
427 "plus",
428 "modulate",
429
430 "screen",
431
432 "overlay",
433 "darken",
434 "lighten",
435 "colorDodge",
436 "colorBurn",
437 "hardLight",
438 "softLight",
439 "difference",
440 "exclusion",
441 "multiply",
442
443 "hue",
444 "saturation",
445 "color",
446 "luminosity",
447};
448
449static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
450 "blendMode mismatch");
451static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
452 "blendMode mismatch");
453
454void apply_paint_blend_mode(const SkPaint& paint, Json::Value* target) {
455 const auto mode = paint.getBlendMode();
456 if (mode != SkBlendMode::kSrcOver) {
457 SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
458 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE] =
459 Json::Value(gBlendModeMap[static_cast<size_t>(mode)]);
460 }
461}
462
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000463};
464
brianosmanfad98562016-05-04 11:06:28 -0700465Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800466 Json::Value result(Json::arrayValue);
467 result.append(Json::Value(SkColorGetA(color)));
468 result.append(Json::Value(SkColorGetR(color)));
469 result.append(Json::Value(SkColorGetG(color)));
470 result.append(Json::Value(SkColorGetB(color)));
471 return result;
472}
473
brianosman97bbf822016-09-25 13:15:58 -0700474Json::Value SkDrawCommand::MakeJsonColor4f(const SkColor4f& color) {
475 Json::Value result(Json::arrayValue);
476 result.append(Json::Value(color.fA));
477 result.append(Json::Value(color.fR));
478 result.append(Json::Value(color.fG));
479 result.append(Json::Value(color.fB));
480 return result;
481}
482
brianosmanfad98562016-05-04 11:06:28 -0700483Json::Value SkDrawCommand::MakeJsonPoint(const SkPoint& point) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800484 Json::Value result(Json::arrayValue);
485 result.append(Json::Value(point.x()));
486 result.append(Json::Value(point.y()));
487 return result;
488}
489
brianosmanfad98562016-05-04 11:06:28 -0700490Json::Value SkDrawCommand::MakeJsonPoint(SkScalar x, SkScalar y) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800491 Json::Value result(Json::arrayValue);
492 result.append(Json::Value(x));
493 result.append(Json::Value(y));
494 return result;
495}
496
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400497Json::Value SkDrawCommand::MakeJsonPoint3(const SkPoint3& point) {
498 Json::Value result(Json::arrayValue);
499 result.append(Json::Value(point.x()));
500 result.append(Json::Value(point.y()));
501 result.append(Json::Value(point.z()));
502 return result;
503}
504
brianosmanfad98562016-05-04 11:06:28 -0700505Json::Value SkDrawCommand::MakeJsonRect(const SkRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800506 Json::Value result(Json::arrayValue);
507 result.append(Json::Value(rect.left()));
508 result.append(Json::Value(rect.top()));
509 result.append(Json::Value(rect.right()));
510 result.append(Json::Value(rect.bottom()));
511 return result;
512}
513
joshualittbd724132016-03-03 11:39:38 -0800514Json::Value SkDrawCommand::MakeJsonIRect(const SkIRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800515 Json::Value result(Json::arrayValue);
516 result.append(Json::Value(rect.left()));
517 result.append(Json::Value(rect.top()));
518 result.append(Json::Value(rect.right()));
519 result.append(Json::Value(rect.bottom()));
520 return result;
521}
522
523static Json::Value make_json_rrect(const SkRRect& rrect) {
524 Json::Value result(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700525 result.append(SkDrawCommand::MakeJsonRect(rrect.rect()));
526 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
527 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperRight_Corner)));
528 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerRight_Corner)));
529 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
ethannicholas50a8dd02016-02-10 05:40:46 -0800530 return result;
531}
532
joshualittbd724132016-03-03 11:39:38 -0800533Json::Value SkDrawCommand::MakeJsonMatrix(const SkMatrix& matrix) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800534 Json::Value result(Json::arrayValue);
535 Json::Value row1(Json::arrayValue);
536 row1.append(Json::Value(matrix[0]));
537 row1.append(Json::Value(matrix[1]));
538 row1.append(Json::Value(matrix[2]));
539 result.append(row1);
540 Json::Value row2(Json::arrayValue);
541 row2.append(Json::Value(matrix[3]));
542 row2.append(Json::Value(matrix[4]));
543 row2.append(Json::Value(matrix[5]));
544 result.append(row2);
545 Json::Value row3(Json::arrayValue);
546 row3.append(Json::Value(matrix[6]));
547 row3.append(Json::Value(matrix[7]));
548 row3.append(Json::Value(matrix[8]));
549 result.append(row3);
550 return result;
551}
ethannicholas1446a9a2016-02-10 14:05:02 -0800552
vjiaoblacke5de1302016-07-13 14:05:28 -0700553Json::Value SkDrawCommand::MakeJsonScalar(SkScalar z) {
554 Json::Value result(z);
555 return result;
556}
557
brianosmanfad98562016-05-04 11:06:28 -0700558Json::Value SkDrawCommand::MakeJsonPath(const SkPath& path) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800559 Json::Value result(Json::objectValue);
560 switch (path.getFillType()) {
561 case SkPath::kWinding_FillType:
562 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_WINDING;
563 break;
564 case SkPath::kEvenOdd_FillType:
565 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_EVENODD;
566 break;
567 case SkPath::kInverseWinding_FillType:
568 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING;
569 break;
570 case SkPath::kInverseEvenOdd_FillType:
571 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
572 break;
halcanary9d524f22016-03-29 09:03:52 -0700573 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800574 Json::Value verbs(Json::arrayValue);
575 SkPath::Iter iter(path, false);
576 SkPoint pts[4];
577 SkPath::Verb verb;
578 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
579 switch (verb) {
580 case SkPath::kLine_Verb: {
581 Json::Value line(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700582 line[SKDEBUGCANVAS_VERB_LINE] = MakeJsonPoint(pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800583 verbs.append(line);
584 break;
585 }
586 case SkPath::kQuad_Verb: {
587 Json::Value quad(Json::objectValue);
588 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700589 coords.append(MakeJsonPoint(pts[1]));
590 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800591 quad[SKDEBUGCANVAS_VERB_QUAD] = coords;
592 verbs.append(quad);
593 break;
594 }
595 case SkPath::kCubic_Verb: {
596 Json::Value cubic(Json::objectValue);
597 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700598 coords.append(MakeJsonPoint(pts[1]));
599 coords.append(MakeJsonPoint(pts[2]));
600 coords.append(MakeJsonPoint(pts[3]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800601 cubic[SKDEBUGCANVAS_VERB_CUBIC] = coords;
602 verbs.append(cubic);
603 break;
604 }
605 case SkPath::kConic_Verb: {
606 Json::Value conic(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]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800610 coords.append(Json::Value(iter.conicWeight()));
611 conic[SKDEBUGCANVAS_VERB_CONIC] = coords;
612 verbs.append(conic);
613 break;
614 }
615 case SkPath::kMove_Verb: {
616 Json::Value move(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700617 move[SKDEBUGCANVAS_VERB_MOVE] = MakeJsonPoint(pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800618 verbs.append(move);
619 break;
620 }
621 case SkPath::kClose_Verb:
622 verbs.append(Json::Value(SKDEBUGCANVAS_VERB_CLOSE));
623 break;
624 case SkPath::kDone_Verb:
625 break;
626 }
627 }
628 result[SKDEBUGCANVAS_ATTRIBUTE_VERBS] = verbs;
629 return result;
630}
631
brianosmanfad98562016-05-04 11:06:28 -0700632Json::Value SkDrawCommand::MakeJsonRegion(const SkRegion& region) {
Brian Osmanc25e2692018-03-12 10:57:28 -0400633 // TODO: Actually serialize the rectangles, rather than just devolving to path
634 SkPath path;
635 region.getBoundaryPath(&path);
636 return MakeJsonPath(path);
ethannicholas50a8dd02016-02-10 05:40:46 -0800637}
638
Mike Reedc1f77742016-12-09 09:00:50 -0500639static Json::Value make_json_regionop(SkClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800640 switch (op) {
Mike Reedc1f77742016-12-09 09:00:50 -0500641 case kDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800642 return Json::Value(SKDEBUGCANVAS_REGIONOP_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500643 case kIntersect_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800644 return Json::Value(SKDEBUGCANVAS_REGIONOP_INTERSECT);
Mike Reedc1f77742016-12-09 09:00:50 -0500645 case kUnion_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800646 return Json::Value(SKDEBUGCANVAS_REGIONOP_UNION);
Mike Reedc1f77742016-12-09 09:00:50 -0500647 case kXOR_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800648 return Json::Value(SKDEBUGCANVAS_REGIONOP_XOR);
Mike Reedc1f77742016-12-09 09:00:50 -0500649 case kReverseDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800650 return Json::Value(SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500651 case kReplace_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800652 return Json::Value(SKDEBUGCANVAS_REGIONOP_REPLACE);
653 default:
654 SkASSERT(false);
655 return Json::Value("<invalid region op>");
Brian Salomon23356442018-11-30 15:33:19 -0500656 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800657}
658
659static Json::Value make_json_pointmode(SkCanvas::PointMode mode) {
660 switch (mode) {
661 case SkCanvas::kPoints_PointMode:
662 return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
663 case SkCanvas::kLines_PointMode:
664 return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
halcanary9d524f22016-03-29 09:03:52 -0700665 case SkCanvas::kPolygon_PointMode:
ethannicholas50a8dd02016-02-10 05:40:46 -0800666 return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
667 default:
668 SkASSERT(false);
669 return Json::Value("<invalid point mode>");
Brian Salomon23356442018-11-30 15:33:19 -0500670 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800671}
672
halcanary9d524f22016-03-29 09:03:52 -0700673static void store_scalar(Json::Value* target, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800674 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800675 if (value != defaultValue) {
676 (*target)[key] = Json::Value(value);
677 }
678}
679
ethannicholasbd3dae82016-02-10 12:10:00 -0800680static void store_bool(Json::Value* target, const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800681 if (value != defaultValue) {
682 (*target)[key] = Json::Value(value);
683 }
684}
685
halcanary9d524f22016-03-29 09:03:52 -0700686static void encode_data(const void* bytes, size_t count, const char* contentType,
ethannicholasf62a8b72016-02-11 10:35:21 -0800687 UrlDataManager& urlDataManager, Json::Value* target) {
bungeman38d909e2016-08-02 14:40:46 -0700688 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
689 SkString url = urlDataManager.addData(data.get(), contentType);
ethannicholasf62a8b72016-02-11 10:35:21 -0800690 *target = Json::Value(url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800691}
692
brianosmanfad98562016-05-04 11:06:28 -0700693void SkDrawCommand::flatten(const SkFlattenable* flattenable, Json::Value* target,
694 UrlDataManager& urlDataManager) {
695 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800696 flattenable->flatten(buffer);
697 void* data = sk_malloc_throw(buffer.bytesWritten());
698 buffer.writeToMemory(data);
699 Json::Value jsonData;
700 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, &jsonData);
701 Json::Value jsonFlattenable;
702 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->getTypeName());
703 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
brianosmanfad98562016-05-04 11:06:28 -0700704
705 SkJsonWriteBuffer jsonBuffer(&urlDataManager);
706 flattenable->flatten(jsonBuffer);
707 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_VALUES] = jsonBuffer.getValue();
708
ethannicholasf62a8b72016-02-11 10:35:21 -0800709 (*target) = jsonFlattenable;
710 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800711}
712
Brian Osmand9ea8162018-08-08 17:03:39 -0400713void SkDrawCommand::WritePNG(SkBitmap bitmap, SkWStream& out) {
714 SkPixmap pm;
715 SkAssertResult(bitmap.peekPixels(&pm));
ethannicholasf67531f2016-03-21 10:19:39 -0700716
Brian Osmand9ea8162018-08-08 17:03:39 -0400717 SkPngEncoder::Options options;
718 options.fZLibLevel = 1;
719 options.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
720 SkPngEncoder::Encode(&out, pm, options);
ethannicholasf67531f2016-03-21 10:19:39 -0700721}
722
brianosmanfad98562016-05-04 11:06:28 -0700723bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
724 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700725 size_t rowBytes = 4 * image.width();
Hal Canary95e3c052017-01-11 12:44:43 -0500726 SkAutoMalloc buffer(rowBytes * image.height());
halcanary9d524f22016-03-29 09:03:52 -0700727 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700728 kN32_SkColorType, kPremul_SkAlphaType);
729 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
730 SkDebugf("readPixels failed\n");
731 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800732 }
msaretta5cf4f42016-06-30 10:06:51 -0700733
734 SkBitmap bm;
735 bm.installPixels(dstInfo, buffer.get(), rowBytes);
msaretta5cf4f42016-06-30 10:06:51 -0700736
ethannicholasf67531f2016-03-21 10:19:39 -0700737 SkDynamicMemoryWStream out;
Brian Osmand9ea8162018-08-08 17:03:39 -0400738 SkDrawCommand::WritePNG(bm, out);
reed42943c82016-09-12 12:01:44 -0700739 sk_sp<SkData> encoded = out.detachAsData();
ethannicholasf62a8b72016-02-11 10:35:21 -0800740 Json::Value jsonData;
741 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
742 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
ethannicholas50a8dd02016-02-10 05:40:46 -0800743 return true;
744}
745
746static const char* color_type_name(SkColorType colorType) {
747 switch (colorType) {
748 case kARGB_4444_SkColorType:
749 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
750 case kRGBA_8888_SkColorType:
751 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
752 case kBGRA_8888_SkColorType:
753 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
754 case kRGB_565_SkColorType:
755 return SKDEBUGCANVAS_COLORTYPE_565;
756 case kGray_8_SkColorType:
757 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
ethannicholas50a8dd02016-02-10 05:40:46 -0800758 case kAlpha_8_SkColorType:
759 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
760 default:
761 SkASSERT(false);
762 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
763 }
764}
765
766static const char* alpha_type_name(SkAlphaType alphaType) {
767 switch (alphaType) {
768 case kOpaque_SkAlphaType:
769 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
770 case kPremul_SkAlphaType:
771 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
772 case kUnpremul_SkAlphaType:
773 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
774 default:
775 SkASSERT(false);
776 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
777 }
778}
779
brianosmanfad98562016-05-04 11:06:28 -0700780bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
781 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700782 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800783 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
784 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800785 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800786 return success;
787}
788
halcanaryf412f092016-08-25 11:10:41 -0700789static void apply_paint_hinting(const SkPaint& paint, Json::Value* target) {
Mike Reed9edbf422018-11-07 19:54:33 -0500790 SkFontHinting hinting = (SkFontHinting)paint.getHinting();
halcanaryf412f092016-08-25 11:10:41 -0700791 if (hinting != SkPaintDefaults_Hinting) {
792 switch (hinting) {
Mike Reed9edbf422018-11-07 19:54:33 -0500793 case kNo_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700794 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
795 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500796 case kSlight_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700797 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
798 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500799 case kNormal_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700800 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
801 break;
Mike Reed9edbf422018-11-07 19:54:33 -0500802 case kFull_SkFontHinting:
halcanaryf412f092016-08-25 11:10:41 -0700803 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
804 break;
805 }
806 }
807}
808
ethannicholas50a8dd02016-02-10 05:40:46 -0800809static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
810 SkColor color = paint.getColor();
811 if (color != SK_ColorBLACK) {
812 Json::Value colorValue(Json::arrayValue);
813 colorValue.append(Json::Value(SkColorGetA(color)));
814 colorValue.append(Json::Value(SkColorGetR(color)));
815 colorValue.append(Json::Value(SkColorGetG(color)));
816 colorValue.append(Json::Value(SkColorGetB(color)));
Brian Salomon23356442018-11-30 15:33:19 -0500817 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;
ethannicholas50a8dd02016-02-10 05:40:46 -0800818 }
819}
820
821static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
822 SkPaint::Style style = paint.getStyle();
823 if (style != SkPaint::kFill_Style) {
824 switch (style) {
825 case SkPaint::kStroke_Style: {
826 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
827 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
828 break;
829 }
830 case SkPaint::kStrokeAndFill_Style: {
831 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
832 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
833 break;
834 }
835 default: SkASSERT(false);
836 }
837 }
838}
839
840static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
841 SkPaint::Cap cap = paint.getStrokeCap();
842 if (cap != SkPaint::kDefault_Cap) {
843 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800844 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800845 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
846 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800847 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800848 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
849 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800850 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800851 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
852 break;
ethannicholas50a8dd02016-02-10 05:40:46 -0800853 default: SkASSERT(false);
854 }
855 }
856}
ethannicholas1446a9a2016-02-10 14:05:02 -0800857
858static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
859 SkPaint::Join join = paint.getStrokeJoin();
860 if (join != SkPaint::kDefault_Join) {
861 switch (join) {
862 case SkPaint::kMiter_Join:
863 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
864 SKDEBUGCANVAS_MITER_JOIN);
865 break;
866 case SkPaint::kRound_Join:
867 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
868 SKDEBUGCANVAS_ROUND_JOIN);
869 break;
870 case SkPaint::kBevel_Join:
871 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
872 SKDEBUGCANVAS_BEVEL_JOIN);
873 break;
874 default: SkASSERT(false);
875 }
876 }
877}
878
879static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
880 SkFilterQuality quality = paint.getFilterQuality();
881 switch (quality) {
882 case kNone_SkFilterQuality:
883 break;
884 case kLow_SkFilterQuality:
885 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
886 SKDEBUGCANVAS_FILTERQUALITY_LOW);
887 break;
888 case kMedium_SkFilterQuality:
889 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
890 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
891 break;
892 case kHigh_SkFilterQuality:
893 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
894 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
895 break;
896 }
897}
898
halcanary9d524f22016-03-29 09:03:52 -0700899static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800900 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800901 SkMaskFilter* maskFilter = paint.getMaskFilter();
902 if (maskFilter != nullptr) {
Mike Reed80747ef2018-01-23 15:29:32 -0500903 SkMaskFilterBase::BlurRec blurRec;
904 if (as_MFB(maskFilter)->asABlur(&blurRec)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800905 Json::Value blur(Json::objectValue);
906 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
907 switch (blurRec.fStyle) {
908 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800909 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
910 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -0800911 break;
912 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800913 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
914 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -0800915 break;
916 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800917 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
918 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800919 break;
920 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800921 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
922 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800923 break;
924 default:
925 SkASSERT(false);
926 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800927 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
928 } else {
929 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -0700930 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800931 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
932 }
933 }
934}
935
halcanary9d524f22016-03-29 09:03:52 -0700936static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800937 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800938 SkPathEffect* pathEffect = paint.getPathEffect();
939 if (pathEffect != nullptr) {
940 SkPathEffect::DashInfo dashInfo;
941 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
942 if (dashType == SkPathEffect::kDash_DashType) {
943 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
944 pathEffect->asADash(&dashInfo);
945 Json::Value dashing(Json::objectValue);
946 Json::Value intervals(Json::arrayValue);
947 for (int32_t i = 0; i < dashInfo.fCount; i++) {
948 intervals.append(Json::Value(dashInfo.fIntervals[i]));
949 }
950 sk_free(dashInfo.fIntervals);
951 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
952 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
953 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
954 } else {
955 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -0700956 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800957 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
958 }
959 }
960}
halcanary9d524f22016-03-29 09:03:52 -0700961
halcanary9d524f22016-03-29 09:03:52 -0700962static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800963 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800964 SkTypeface* typeface = paint.getTypeface();
965 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -0800966 Json::Value jsonTypeface;
967 SkDynamicMemoryWStream buffer;
968 typeface->serialize(&buffer);
969 void* data = sk_malloc_throw(buffer.bytesWritten());
970 buffer.copyTo(data);
971 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -0700972 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -0800973 &jsonData);
974 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
975 sk_free(data);
976 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -0800977 }
978}
979
halcanary9d524f22016-03-29 09:03:52 -0700980static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800981 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800982 SkFlattenable* shader = paint.getShader();
983 if (shader != nullptr) {
984 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -0700985 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800986 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
987 }
988}
989
ethannicholasf62a8b72016-02-11 10:35:21 -0800990static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
991 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800992 SkFlattenable* imageFilter = paint.getImageFilter();
993 if (imageFilter != nullptr) {
994 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -0700995 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800996 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
997 }
998}
999
halcanary9d524f22016-03-29 09:03:52 -07001000static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001001 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001002 SkFlattenable* colorFilter = paint.getColorFilter();
1003 if (colorFilter != nullptr) {
1004 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001005 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001006 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1007 }
1008}
1009
halcanary9d524f22016-03-29 09:03:52 -07001010static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001011 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001012 SkFlattenable* looper = paint.getLooper();
1013 if (looper != nullptr) {
1014 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001015 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001016 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1017 }
1018}
1019
brianosmanfad98562016-05-04 11:06:28 -07001020Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001021 Json::Value result(Json::objectValue);
1022 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001023 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001024 SkPaintDefaults_MiterLimit);
1025 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001026 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001027 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, paint.isFakeBoldText(), false);
1028 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, paint.isLinearText(), false);
1029 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, paint.isSubpixelText(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001030 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT, paint.isLCDRenderText(), false);
1031 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, paint.isEmbeddedBitmapText(), false);
1032 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, paint.isAutohinted(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001033 //kGenA8FromLCD_Flag
1034
halcanary9d524f22016-03-29 09:03:52 -07001035 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001036 SkPaintDefaults_TextSize);
1037 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
1038 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
halcanaryf412f092016-08-25 11:10:41 -07001039 apply_paint_hinting(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001040 apply_paint_color(paint, &result);
1041 apply_paint_style(paint, &result);
Florin Malita82d80872017-06-06 16:58:40 -04001042 apply_paint_blend_mode(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001043 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001044 apply_paint_join(paint, &result);
1045 apply_paint_filterquality(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001046 apply_paint_patheffect(paint, &result, urlDataManager);
1047 apply_paint_maskfilter(paint, &result, urlDataManager);
1048 apply_paint_shader(paint, &result, urlDataManager);
ethannicholasf62a8b72016-02-11 10:35:21 -08001049 apply_paint_looper(paint, &result, urlDataManager);
1050 apply_paint_imagefilter(paint, &result, urlDataManager);
1051 apply_paint_colorfilter(paint, &result, urlDataManager);
1052 apply_paint_typeface(paint, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001053 return result;
1054}
1055
Stan Ilievac42aeb2017-01-12 16:20:50 -05001056Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) {
1057 Json::Value result(Json::objectValue);
1058 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount);
1059 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount);
1060 if (nullptr != lattice.fBounds) {
1061 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds);
1062 }
1063 Json::Value XDivs(Json::arrayValue);
1064 for (int i = 0; i < lattice.fXCount; i++) {
1065 XDivs.append(Json::Value(lattice.fXDivs[i]));
1066 }
1067 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs;
1068 Json::Value YDivs(Json::arrayValue);
1069 for (int i = 0; i < lattice.fYCount; i++) {
1070 YDivs.append(Json::Value(lattice.fYDivs[i]));
1071 }
1072 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs;
Stan Ilievca8c0952017-12-11 13:01:58 -05001073 if (nullptr != lattice.fRectTypes) {
Stan Ilievac42aeb2017-01-12 16:20:50 -05001074 Json::Value flags(Json::arrayValue);
1075 int flagCount = 0;
1076 for (int row = 0; row < lattice.fYCount+1; row++) {
1077 Json::Value flagsRow(Json::arrayValue);
1078 for (int column = 0; column < lattice.fXCount+1; column++) {
Stan Ilievca8c0952017-12-11 13:01:58 -05001079 flagsRow.append(Json::Value(lattice.fRectTypes[flagCount++]));
Stan Ilievac42aeb2017-01-12 16:20:50 -05001080 }
1081 flags.append(flagsRow);
1082 }
1083 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags;
1084 }
1085 return result;
1086}
1087
Brian Osmanc25e2692018-03-12 10:57:28 -04001088SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kClear_OpType) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001089 fColor = color;
ethannicholas1446a9a2016-02-10 14:05:02 -08001090}
1091
1092void SkClearCommand::execute(SkCanvas* canvas) const {
1093 canvas->clear(fColor);
1094}
1095
ethannicholasf62a8b72016-02-11 10:35:21 -08001096Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1097 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001098 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001099 return result;
1100}
1101
Mike Reedc1f77742016-12-09 09:00:50 -05001102SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001103 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001104 fPath = path;
1105 fOp = op;
1106 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001107}
1108
fmalita8c89c522014-11-08 16:18:56 -08001109void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001110 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001111}
1112
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001113bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001114 render_path(canvas, fPath);
1115 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001116}
1117
ethannicholasf62a8b72016-02-11 10:35:21 -08001118Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1119 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001120 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001121 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1122 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1123 return result;
1124}
1125
Mike Reedc1f77742016-12-09 09:00:50 -05001126SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001127 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001128 fRegion = region;
1129 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001130}
1131
fmalita8c89c522014-11-08 16:18:56 -08001132void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001133 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001134}
1135
ethannicholasf62a8b72016-02-11 10:35:21 -08001136Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1137 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001138 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001139 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1140 return result;
1141}
1142
Mike Reedc1f77742016-12-09 09:00:50 -05001143SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001144 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001145 fRect = rect;
1146 fOp = op;
1147 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001148}
1149
fmalita8c89c522014-11-08 16:18:56 -08001150void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001151 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001152}
1153
ethannicholasf62a8b72016-02-11 10:35:21 -08001154Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1155 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001156 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001157 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1158 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001159
1160 SkString desc;
1161 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1162
ethannicholas50a8dd02016-02-10 05:40:46 -08001163 return result;
1164}
1165
Mike Reedc1f77742016-12-09 09:00:50 -05001166SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001167 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001168 fRRect = rrect;
1169 fOp = op;
1170 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001171}
1172
fmalita8c89c522014-11-08 16:18:56 -08001173void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001174 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001175}
1176
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001177bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001178 render_rrect(canvas, fRRect);
1179 return true;
1180}
1181
ethannicholasf62a8b72016-02-11 10:35:21 -08001182Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1183 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001184 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1185 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1186 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1187 return result;
1188}
1189
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001190SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001191 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001192 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001193}
1194
fmalita8c89c522014-11-08 16:18:56 -08001195void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001196 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001197}
1198
ethannicholasf62a8b72016-02-11 10:35:21 -08001199Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1200 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001201 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001202 return result;
1203}
1204
reed97660cc2016-06-28 18:54:19 -07001205////
1206
1207SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1208 sk_sp<SkData> value)
1209 : INHERITED(kDrawAnnotation_OpType)
1210 , fRect(rect)
1211 , fKey(key)
1212 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001213{
robertphillipsfb409232016-06-29 10:28:11 -07001214}
reed97660cc2016-06-28 18:54:19 -07001215
1216void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1217 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1218}
1219
1220Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1221 Json::Value result = INHERITED::toJSON(urlDataManager);
1222
1223 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1224 result["key"] = Json::Value(fKey.c_str());
1225 if (fValue.get()) {
1226 // TODO: dump out the "value"
1227 }
reed67f62fa2016-06-29 11:36:34 -07001228
1229 SkString desc;
1230 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1231 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1232
reed97660cc2016-06-28 18:54:19 -07001233 return result;
1234}
1235
reed97660cc2016-06-28 18:54:19 -07001236////
1237
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001238SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07001239 const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001240 : INHERITED(kDrawBitmap_OpType)
1241 , fBitmap(bitmap)
1242 , fLeft(left)
1243 , fTop(top)
1244 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001245
fmalita8c89c522014-11-08 16:18:56 -08001246void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001247 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001248}
1249
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001250bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001251 render_bitmap(canvas, fBitmap);
1252 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001253}
1254
ethannicholasf62a8b72016-02-11 10:35:21 -08001255Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
1256 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001257 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001258 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001259 Json::Value command(Json::objectValue);
1260 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001261 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
Brian Osman8363be12018-05-29 13:38:07 -04001262 if (fPaint.isValid()) {
1263 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001264 }
1265 }
1266 return result;
1267}
1268
Brian Osman78a76482018-05-18 16:59:13 -04001269SkDrawBitmapLatticeCommand::SkDrawBitmapLatticeCommand(const SkBitmap& bitmap,
1270 const SkCanvas::Lattice& lattice,
1271 const SkRect& dst, const SkPaint* paint)
1272 : INHERITED(kDrawBitmapLattice_OpType)
1273 , fBitmap(bitmap)
1274 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001275 , fDst(dst)
1276 , fPaint(paint) {}
Brian Osman78a76482018-05-18 16:59:13 -04001277
1278void SkDrawBitmapLatticeCommand::execute(SkCanvas* canvas) const {
1279 canvas->drawBitmapLattice(fBitmap, fLattice, fDst, fPaint.getMaybeNull());
1280}
1281
1282bool SkDrawBitmapLatticeCommand::render(SkCanvas* canvas) const {
1283 SkAutoCanvasRestore acr(canvas, true);
1284 canvas->clear(0xFFFFFFFF);
1285
1286 xlate_and_scale_to_bounds(canvas, fDst);
1287
1288 this->execute(canvas);
1289 return true;
1290}
1291
1292Json::Value SkDrawBitmapLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1293 Json::Value result = INHERITED::toJSON(urlDataManager);
1294 Json::Value encoded;
1295 if (flatten(fBitmap, &encoded, urlDataManager)) {
1296 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
1297 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1298 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1299 if (fPaint.isValid()) {
1300 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1301 }
1302 }
1303
1304 SkString desc;
1305 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1306
1307 return result;
1308}
1309
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001310SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00001311 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001312 : INHERITED(kDrawBitmapNine_OpType)
1313 , fBitmap(bitmap)
1314 , fCenter(center)
1315 , fDst(dst)
1316 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001317
fmalita8c89c522014-11-08 16:18:56 -08001318void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001319 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001320}
1321
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001322bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08001323 SkRect tmp = SkRect::Make(fCenter);
1324 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001325 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001326}
1327
ethannicholasf62a8b72016-02-11 10:35:21 -08001328Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1329 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001330 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001331 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001332 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08001333 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07001334 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001335 if (fPaint.isValid()) {
1336 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001337 }
1338 }
1339 return result;
1340}
1341
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001342SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00001343 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07001344 SkCanvas::SrcRectConstraint constraint)
Brian Osman8363be12018-05-29 13:38:07 -04001345 : INHERITED(kDrawBitmapRect_OpType)
1346 , fBitmap(bitmap)
1347 , fSrc(src)
1348 , fDst(dst)
1349 , fPaint(paint)
1350 , fConstraint(constraint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001351
fmalita8c89c522014-11-08 16:18:56 -08001352void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001353 canvas->legacy_drawBitmapRect(fBitmap, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
1354 fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001355}
1356
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001357bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001358 render_bitmap(canvas, fBitmap, fSrc.getMaybeNull());
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001359 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001360}
1361
ethannicholasf62a8b72016-02-11 10:35:21 -08001362Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1363 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001364 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001365 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001366 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
Brian Osman8363be12018-05-29 13:38:07 -04001367 if (fSrc.isValid()) {
1368 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001369 }
brianosmanfad98562016-05-04 11:06:28 -07001370 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001371 if (fPaint.isValid()) {
1372 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001373 }
1374 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1375 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1376 }
1377 }
reed67f62fa2016-06-29 11:36:34 -07001378
1379 SkString desc;
1380 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1381
ethannicholas50a8dd02016-02-10 05:40:46 -08001382 return result;
1383}
1384
fmalita651c9202015-07-22 10:23:01 -07001385SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
1386 const SkPaint* paint)
1387 : INHERITED(kDrawImage_OpType)
1388 , fImage(SkRef(image))
1389 , fLeft(left)
Brian Osman8363be12018-05-29 13:38:07 -04001390 , fTop(top)
1391 , fPaint(paint) {}
fmalita651c9202015-07-22 10:23:01 -07001392
1393void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001394 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07001395}
1396
1397bool SkDrawImageCommand::render(SkCanvas* canvas) const {
1398 SkAutoCanvasRestore acr(canvas, true);
1399 canvas->clear(0xFFFFFFFF);
1400
1401 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
1402 SkIntToScalar(fImage->width()),
1403 SkIntToScalar(fImage->height())));
1404 this->execute(canvas);
1405 return true;
1406}
1407
ethannicholasf62a8b72016-02-11 10:35:21 -08001408Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
1409 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001410 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001411 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001412 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001413 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08001414 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001415 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001416 }
msarett0ac1bec2016-08-29 09:15:33 -07001417
1418 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
1419 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
1420 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
1421 switch (fImage->alphaType()) {
1422 case kOpaque_SkAlphaType:
1423 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
1424 break;
1425 case kPremul_SkAlphaType:
1426 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
1427 break;
1428 case kUnpremul_SkAlphaType:
1429 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
1430 break;
1431 default:
1432 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
1433 break;
1434 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001435 }
1436 return result;
1437}
1438
Stan Ilievac42aeb2017-01-12 16:20:50 -05001439SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
1440 const SkCanvas::Lattice& lattice,
1441 const SkRect& dst, const SkPaint* paint)
1442 : INHERITED(kDrawImageLattice_OpType)
1443 , fImage(SkRef(image))
1444 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001445 , fDst(dst)
1446 , fPaint(paint) {}
Stan Ilievac42aeb2017-01-12 16:20:50 -05001447
1448void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
Brian Osman78a76482018-05-18 16:59:13 -04001449 canvas->drawImageLattice(fImage.get(), fLattice, fDst, fPaint.getMaybeNull());
Stan Ilievac42aeb2017-01-12 16:20:50 -05001450}
1451
1452bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
1453 SkAutoCanvasRestore acr(canvas, true);
1454 canvas->clear(0xFFFFFFFF);
1455
1456 xlate_and_scale_to_bounds(canvas, fDst);
1457
1458 this->execute(canvas);
1459 return true;
1460}
1461
1462Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1463 Json::Value result = INHERITED::toJSON(urlDataManager);
1464 Json::Value encoded;
1465 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001466 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
Stan Ilievac42aeb2017-01-12 16:20:50 -05001467 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1468 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1469 if (fPaint.isValid()) {
1470 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1471 }
1472 }
1473
1474 SkString desc;
1475 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1476
1477 return result;
1478}
1479
fmalita651c9202015-07-22 10:23:01 -07001480SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
1481 const SkRect& dst, const SkPaint* paint,
1482 SkCanvas::SrcRectConstraint constraint)
1483 : INHERITED(kDrawImageRect_OpType)
1484 , fImage(SkRef(image))
Brian Osman8363be12018-05-29 13:38:07 -04001485 , fSrc(src)
fmalita651c9202015-07-22 10:23:01 -07001486 , fDst(dst)
Brian Osman8363be12018-05-29 13:38:07 -04001487 , fPaint(paint)
1488 , fConstraint(constraint) {}
fmalita651c9202015-07-22 10:23:01 -07001489
1490void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001491 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
1492 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07001493}
1494
1495bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
1496 SkAutoCanvasRestore acr(canvas, true);
1497 canvas->clear(0xFFFFFFFF);
1498
1499 xlate_and_scale_to_bounds(canvas, fDst);
1500
1501 this->execute(canvas);
1502 return true;
1503}
1504
ethannicholasf62a8b72016-02-11 10:35:21 -08001505Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1506 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001507 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001508 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001509 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
ethannicholas50a8dd02016-02-10 05:40:46 -08001510 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001511 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001512 }
brianosmanfad98562016-05-04 11:06:28 -07001513 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08001514 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001515 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001516 }
1517 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1518 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1519 }
1520 }
reed67f62fa2016-06-29 11:36:34 -07001521
1522 SkString desc;
1523 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1524
ethannicholas50a8dd02016-02-10 05:40:46 -08001525 return result;
1526}
1527
Brian Salomond7065e72018-10-12 11:42:02 -04001528SkDrawImageSetCommand::SkDrawImageSetCommand(const SkCanvas::ImageSetEntry set[], int count,
Brian Salomond003d222018-11-26 13:25:05 -05001529 SkFilterQuality filterQuality, SkBlendMode mode)
Brian Salomond7065e72018-10-12 11:42:02 -04001530 : INHERITED(kDrawImageSet_OpType)
1531 , fSet(count)
1532 , fCount(count)
Brian Salomond7065e72018-10-12 11:42:02 -04001533 , fFilterQuality(filterQuality)
1534 , fMode(mode) {
1535 std::copy_n(set, count, fSet.get());
1536}
1537
1538void SkDrawImageSetCommand::execute(SkCanvas* canvas) const {
Brian Salomond003d222018-11-26 13:25:05 -05001539 canvas->experimental_DrawImageSetV1(fSet.get(), fCount, fFilterQuality, fMode);
Brian Salomond7065e72018-10-12 11:42:02 -04001540}
1541
Brian Osmanc25e2692018-03-12 10:57:28 -04001542SkDrawImageNineCommand::SkDrawImageNineCommand(const SkImage* image, const SkIRect& center,
1543 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001544 : INHERITED(kDrawImageNine_OpType)
1545 , fImage(SkRef(image))
1546 , fCenter(center)
1547 , fDst(dst)
1548 , fPaint(paint) {}
Brian Osmanc25e2692018-03-12 10:57:28 -04001549
1550void SkDrawImageNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001551 canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaint.getMaybeNull());
Brian Osmanc25e2692018-03-12 10:57:28 -04001552}
1553
1554bool SkDrawImageNineCommand::render(SkCanvas* canvas) const {
1555 SkAutoCanvasRestore acr(canvas, true);
1556 canvas->clear(0xFFFFFFFF);
1557
1558 xlate_and_scale_to_bounds(canvas, fDst);
1559
1560 this->execute(canvas);
1561 return true;
1562}
1563
1564Json::Value SkDrawImageNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1565 Json::Value result = INHERITED::toJSON(urlDataManager);
1566 Json::Value encoded;
1567 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
1568 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
1569 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
1570 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001571 if (fPaint.isValid()) {
1572 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
Brian Osmanc25e2692018-03-12 10:57:28 -04001573 }
1574 }
1575 return result;
1576}
1577
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001578SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001579 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001580 fOval = oval;
1581 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001582}
1583
fmalita8c89c522014-11-08 16:18:56 -08001584void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001585 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001586}
1587
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001588bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001589 canvas->clear(0xFFFFFFFF);
1590 canvas->save();
1591
1592 xlate_and_scale_to_bounds(canvas, fOval);
1593
1594 SkPaint p;
1595 p.setColor(SK_ColorBLACK);
1596 p.setStyle(SkPaint::kStroke_Style);
1597
1598 canvas->drawOval(fOval, p);
1599 canvas->restore();
1600
1601 return true;
1602}
1603
ethannicholasf62a8b72016-02-11 10:35:21 -08001604Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
1605 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001606 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1607 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001608 return result;
1609}
1610
bsalomonac3aa242016-08-19 11:25:19 -07001611SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
1612 bool useCenter, const SkPaint& paint)
Brian Osmanc25e2692018-03-12 10:57:28 -04001613 : INHERITED(kDrawArc_OpType) {
bsalomonac3aa242016-08-19 11:25:19 -07001614 fOval = oval;
1615 fStartAngle = startAngle;
1616 fSweepAngle = sweepAngle;
1617 fUseCenter = useCenter;
1618 fPaint = paint;
bsalomonac3aa242016-08-19 11:25:19 -07001619}
1620
1621void SkDrawArcCommand::execute(SkCanvas* canvas) const {
1622 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
1623}
1624
1625bool SkDrawArcCommand::render(SkCanvas* canvas) const {
1626 canvas->clear(0xFFFFFFFF);
1627 canvas->save();
1628
1629 xlate_and_scale_to_bounds(canvas, fOval);
1630
1631 SkPaint p;
1632 p.setColor(SK_ColorBLACK);
1633 p.setStyle(SkPaint::kStroke_Style);
1634
1635 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
1636 canvas->restore();
1637
1638 return true;
1639}
1640
1641Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
1642 Json::Value result = INHERITED::toJSON(urlDataManager);
1643 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1644 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
1645 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
1646 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
1647 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1648 return result;
1649}
1650
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001651SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001652 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001653 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001654}
1655
fmalita8c89c522014-11-08 16:18:56 -08001656void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001657 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001658}
1659
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001660bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001661 canvas->clear(0xFFFFFFFF);
1662 canvas->drawPaint(fPaint);
1663 return true;
1664}
1665
ethannicholasf62a8b72016-02-11 10:35:21 -08001666Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
1667 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001668 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001669 return result;
1670}
1671
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001672SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001673 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001674 fPath = path;
1675 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001676}
1677
fmalita8c89c522014-11-08 16:18:56 -08001678void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001679 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001680}
1681
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001682bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001683 render_path(canvas, fPath);
1684 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001685}
1686
ethannicholasf62a8b72016-02-11 10:35:21 -08001687Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1688 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001689 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
1690 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001691 return result;
1692}
1693
Brian Osmanc25e2692018-03-12 10:57:28 -04001694SkDrawRegionCommand::SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint)
1695 : INHERITED(kDrawRegion_OpType) {
1696 fRegion = region;
1697 fPaint = paint;
Brian Osmanc25e2692018-03-12 10:57:28 -04001698}
1699
1700void SkDrawRegionCommand::execute(SkCanvas* canvas) const {
1701 canvas->drawRegion(fRegion, fPaint);
1702}
1703
1704bool SkDrawRegionCommand::render(SkCanvas* canvas) const {
1705 render_region(canvas, fRegion);
1706 return true;
1707}
1708
1709Json::Value SkDrawRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1710 Json::Value result = INHERITED::toJSON(urlDataManager);
1711 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
1712 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1713 return result;
1714}
1715
fmalita160ebb22015-04-01 20:58:37 -07001716SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
1717 const SkMatrix* matrix,
1718 const SkPaint* paint)
1719 : INHERITED(kBeginDrawPicture_OpType)
Brian Osman8363be12018-05-29 13:38:07 -04001720 , fPicture(SkRef(picture))
1721 , fMatrix(matrix)
1722 , fPaint(paint) {}
fmalita160ebb22015-04-01 20:58:37 -07001723
1724void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
1725 if (fPaint.isValid()) {
1726 SkRect bounds = fPicture->cullRect();
1727 if (fMatrix.isValid()) {
1728 fMatrix.get()->mapRect(&bounds);
1729 }
1730 canvas->saveLayer(&bounds, fPaint.get());
1731 }
1732
1733 if (fMatrix.isValid()) {
1734 if (!fPaint.isValid()) {
1735 canvas->save();
1736 }
1737 canvas->concat(*fMatrix.get());
1738 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001739}
1740
fmalita160ebb22015-04-01 20:58:37 -07001741bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001742 canvas->clear(0xFFFFFFFF);
1743 canvas->save();
1744
robertphillipsa8d7f0b2014-08-29 08:03:56 -07001745 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001746
robertphillips9b14f262014-06-04 05:40:44 -07001747 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001748
1749 canvas->restore();
1750
1751 return true;
1752}
1753
fmalita160ebb22015-04-01 20:58:37 -07001754SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
1755 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
1756
1757void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
1758 if (fRestore) {
1759 canvas->restore();
1760 }
1761}
1762
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001763SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001764 const SkPoint pts[], const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04001765 : INHERITED(kDrawPoints_OpType)
1766 , fMode(mode)
1767 , fPts(pts, count)
1768 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001769
fmalita8c89c522014-11-08 16:18:56 -08001770void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001771 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001772}
1773
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001774bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001775 canvas->clear(0xFFFFFFFF);
1776 canvas->save();
1777
1778 SkRect bounds;
1779
1780 bounds.setEmpty();
Brian Osman8363be12018-05-29 13:38:07 -04001781 for (int i = 0; i < fPts.count(); ++i) {
Mike Reed185ffe92018-01-08 17:09:54 -05001782 SkRectPriv::GrowToInclude(&bounds, fPts[i]);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001783 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00001784
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001785 xlate_and_scale_to_bounds(canvas, bounds);
1786
1787 SkPaint p;
1788 p.setColor(SK_ColorBLACK);
1789 p.setStyle(SkPaint::kStroke_Style);
1790
Brian Osman8363be12018-05-29 13:38:07 -04001791 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001792 canvas->restore();
1793
1794 return true;
1795}
1796
ethannicholasf62a8b72016-02-11 10:35:21 -08001797Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
1798 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001799 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
1800 Json::Value points(Json::arrayValue);
Brian Osman8363be12018-05-29 13:38:07 -04001801 for (int i = 0; i < fPts.count(); i++) {
brianosmanfad98562016-05-04 11:06:28 -07001802 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001803 }
1804 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07001805 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001806 return result;
1807}
1808
fmalita37283c22016-09-13 10:00:23 -07001809SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07001810 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001811 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07001812 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07001813 , fXPos(x)
1814 , fYPos(y)
Brian Osman255735e2018-04-06 14:51:42 -04001815 , fPaint(paint) {}
fmalitab7425172014-08-26 07:56:44 -07001816
fmalita8c89c522014-11-08 16:18:56 -08001817void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07001818 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1819}
1820
fmalita55773872014-08-29 15:08:20 -07001821bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
1822 canvas->clear(SK_ColorWHITE);
1823 canvas->save();
1824
1825 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
1826 xlate_and_scale_to_bounds(canvas, bounds);
1827
fmalita37283c22016-09-13 10:00:23 -07001828 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07001829
1830 canvas->restore();
1831
1832 return true;
1833}
1834
ethannicholasf62a8b72016-02-11 10:35:21 -08001835Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
1836 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001837 Json::Value runs(Json::arrayValue);
1838 SkTextBlobRunIterator iter(fBlob.get());
1839 while (!iter.done()) {
1840 Json::Value run(Json::objectValue);
1841 Json::Value jsonPositions(Json::arrayValue);
1842 Json::Value jsonGlyphs(Json::arrayValue);
1843 const SkScalar* iterPositions = iter.pos();
1844 const uint16_t* iterGlyphs = iter.glyphs();
1845 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1846 switch (iter.positioning()) {
Florin Malitaab54e732018-07-27 09:47:15 -04001847 case SkTextBlobRunIterator::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07001848 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
1849 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001850 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001851 case SkTextBlobRunIterator::kHorizontal_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001852 jsonPositions.append(Json::Value(iterPositions[i]));
1853 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001854 case SkTextBlobRunIterator::kDefault_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001855 break;
Mike Reed30cf62b2018-12-20 11:18:24 -05001856 case SkTextBlobRunIterator::kRSXform_Positioning:
1857 // TODO_RSXFORM_BLOB
1858 break;
ethannicholas50a8dd02016-02-10 05:40:46 -08001859 }
1860 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
1861 }
Florin Malitaab54e732018-07-27 09:47:15 -04001862 if (iter.positioning() != SkTextBlobRunIterator::kDefault_Positioning) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001863 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
1864 }
1865 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
1866 SkPaint fontPaint;
1867 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07001868 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
1869 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08001870 runs.append(run);
1871 iter.next();
1872 }
reed6d2c3e72016-07-07 14:10:14 -07001873 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08001874 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
1875 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
1876 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07001877 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07001878 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07001879
1880 SkString desc;
1881 // make the bounds local by applying the x,y
1882 bounds.offset(fXPos, fYPos);
1883 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
1884
ethannicholas50a8dd02016-02-10 05:40:46 -08001885 return result;
1886}
1887
robertphillips9bafc302015-02-13 11:13:00 -08001888SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04001889 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08001890 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04001891 : INHERITED(kDrawPatch_OpType)
1892 , fBlendMode(bmode)
1893{
robertphillips9bafc302015-02-13 11:13:00 -08001894 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08001895 if (colors != nullptr) {
1896 memcpy(fColors, colors, sizeof(fColors));
1897 fColorsPtr = fColors;
1898 } else {
1899 fColorsPtr = nullptr;
1900 }
1901 if (texCoords != nullptr) {
1902 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
1903 fTexCoordsPtr = fTexCoords;
1904 } else {
1905 fTexCoordsPtr = nullptr;
1906 }
robertphillips9bafc302015-02-13 11:13:00 -08001907 fPaint = paint;
robertphillips9bafc302015-02-13 11:13:00 -08001908}
1909
1910void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04001911 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08001912}
1913
ethannicholasf62a8b72016-02-11 10:35:21 -08001914Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
1915 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001916 Json::Value cubics = Json::Value(Json::arrayValue);
1917 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001918 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001919 }
1920 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
1921 if (fColorsPtr != nullptr) {
1922 Json::Value colors = Json::Value(Json::arrayValue);
1923 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001924 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001925 }
1926 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
1927 }
1928 if (fTexCoordsPtr != nullptr) {
1929 Json::Value texCoords = Json::Value(Json::arrayValue);
1930 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001931 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001932 }
1933 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
1934 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001935 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08001936 return result;
1937}
1938
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001939SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001940 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001941 fRect = rect;
1942 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001943}
1944
fmalita8c89c522014-11-08 16:18:56 -08001945void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001946 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001947}
1948
ethannicholasf62a8b72016-02-11 10:35:21 -08001949Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1950 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001951 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1952 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07001953
1954 SkString desc;
1955 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1956
ethannicholas50a8dd02016-02-10 05:40:46 -08001957 return result;
1958}
1959
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001960SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001961 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00001962 fRRect = rrect;
1963 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001964}
1965
fmalita8c89c522014-11-08 16:18:56 -08001966void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00001967 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001968}
1969
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001970bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001971 render_rrect(canvas, fRRect);
1972 return true;
1973}
1974
ethannicholasf62a8b72016-02-11 10:35:21 -08001975Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1976 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001977 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07001978 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001979 return result;
1980}
1981
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00001982SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001983 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001984 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001985 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001986 fOuter = outer;
1987 fInner = inner;
1988 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001989}
1990
fmalita8c89c522014-11-08 16:18:56 -08001991void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00001992 canvas->drawDRRect(fOuter, fInner, fPaint);
1993}
1994
1995bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
1996 render_drrect(canvas, fOuter, fInner);
1997 return true;
1998}
1999
ethannicholasf62a8b72016-02-11 10:35:21 -08002000Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2001 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002002 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
2003 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07002004 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002005 return result;
2006}
2007
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04002008SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
2009 : INHERITED(kDrawShadow_OpType) {
2010 fPath = path;
2011 fShadowRec = rec;
2012}
2013
2014void SkDrawShadowCommand::execute(SkCanvas* canvas) const {
2015 canvas->private_draw_shadow_rec(fPath, fShadowRec);
2016}
2017
2018bool SkDrawShadowCommand::render(SkCanvas* canvas) const {
2019 render_shadow(canvas, fPath, fShadowRec);
2020 return true;
2021}
2022
2023Json::Value SkDrawShadowCommand::toJSON(UrlDataManager& urlDataManager) const {
2024 Json::Value result = INHERITED::toJSON(urlDataManager);
2025 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2026
2027 bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
2028 bool transparentOccluder =
2029 SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
2030
2031 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2032 result[SKDEBUGCANVAS_ATTRIBUTE_ZPLANE] = MakeJsonPoint3(fShadowRec.fZPlaneParams);
2033 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION] = MakeJsonPoint3(fShadowRec.fLightPos);
2034 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS] = MakeJsonScalar(fShadowRec.fLightRadius);
2035 result[SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR] = MakeJsonColor(fShadowRec.fAmbientColor);
2036 result[SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR] = MakeJsonColor(fShadowRec.fSpotColor);
2037 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
2038 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
2039 return result;
2040}
2041
Brian Osmanc7611082018-05-29 14:55:50 -04002042///////////////////////////////////////////////////////////////////////////////////////////////////
2043
2044SkDrawDrawableCommand::SkDrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
2045 : INHERITED(kDrawDrawable_OpType)
2046 , fDrawable(SkRef(drawable))
2047 , fMatrix(matrix) {}
2048
2049void SkDrawDrawableCommand::execute(SkCanvas* canvas) const {
2050 canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
2051}
2052
2053///////////////////////////////////////////////////////////////////////////////////////////////////
2054
Mike Reedfed9cfd2017-03-17 12:09:04 -04002055SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002056 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04002057 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04002058 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04002059 , fBlendMode(bmode)
Brian Osman255735e2018-04-06 14:51:42 -04002060 , fPaint(paint) {}
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002061
fmalita8c89c522014-11-08 16:18:56 -08002062void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04002063 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002064}
2065
Brian Osman616f1cb2018-05-29 11:23:35 -04002066///////////////////////////////////////////////////////////////////////////////////////////////////
2067
2068SkDrawAtlasCommand::SkDrawAtlasCommand(const SkImage* image, const SkRSXform xform[],
2069 const SkRect tex[], const SkColor colors[], int count,
2070 SkBlendMode bmode, const SkRect* cull,
2071 const SkPaint* paint)
2072 : INHERITED(kDrawAtlas_OpType)
2073 , fImage(SkRef(image))
2074 , fXform(xform, count)
2075 , fTex(tex, count)
2076 , fColors(colors, colors ? count : 0)
2077 , fBlendMode(bmode)
2078 , fCull(cull)
2079 , fPaint(paint) {}
2080
2081void SkDrawAtlasCommand::execute(SkCanvas* canvas) const {
2082 canvas->drawAtlas(fImage.get(), fXform.begin(), fTex.begin(),
2083 fColors.isEmpty() ? nullptr : fColors.begin(), fXform.count(), fBlendMode,
2084 fCull.getMaybeNull(), fPaint.getMaybeNull());
2085}
2086
2087///////////////////////////////////////////////////////////////////////////////////////////////////
2088
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002089SkRestoreCommand::SkRestoreCommand()
Brian Osman255735e2018-04-06 14:51:42 -04002090 : INHERITED(kRestore_OpType) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002091
fmalita8c89c522014-11-08 16:18:56 -08002092void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00002093 canvas->restore();
2094}
2095
Florin Malita5f6102d2014-06-30 10:13:28 -04002096SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08002097 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00002098}
2099
fmalita8c89c522014-11-08 16:18:56 -08002100void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04002101 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00002102}
2103
reed4960eee2015-12-18 07:09:18 -08002104SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
Brian Osman8363be12018-05-29 13:38:07 -04002105 : INHERITED(kSaveLayer_OpType)
2106 , fBounds(rec.fBounds)
2107 , fPaint(rec.fPaint)
2108 , fBackdrop(SkSafeRef(rec.fBackdrop))
2109 , fSaveLayerFlags(rec.fSaveLayerFlags) {}
ethannicholas50a8dd02016-02-10 05:40:46 -08002110
fmalita8c89c522014-11-08 16:18:56 -08002111void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04002112 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(),
reed4960eee2015-12-18 07:09:18 -08002113 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00002114}
2115
ethannicholasf62a8b72016-02-11 10:35:21 -08002116Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
2117 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman8363be12018-05-29 13:38:07 -04002118 if (fBounds.isValid()) {
2119 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(*fBounds.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002120 }
Brian Osman8363be12018-05-29 13:38:07 -04002121 if (fPaint.isValid()) {
2122 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002123 }
2124 if (fBackdrop != nullptr) {
2125 Json::Value jsonBackdrop;
Brian Osman8363be12018-05-29 13:38:07 -04002126 flatten(fBackdrop.get(), &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002127 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
2128 }
2129 if (fSaveLayerFlags != 0) {
2130 SkDebugf("unsupported: saveLayer flags\n");
2131 SkASSERT(false);
2132 }
2133 return result;
2134}
2135
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002136SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08002137 : INHERITED(kSetMatrix_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002138 fMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -07002139}
2140
fmalita8c89c522014-11-08 16:18:56 -08002141void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
Brian Osman255735e2018-04-06 14:51:42 -04002142 canvas->setMatrix(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00002143}
2144
ethannicholasf62a8b72016-02-11 10:35:21 -08002145Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
2146 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08002147 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08002148 return result;
2149}