blob: 743a8d7920263d2a4a68a79328d03b88e06cb4f9 [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
halcanarya73d76a2016-10-17 13:19:02 -070010#include "png.h"
11
Hal Canary95e3c052017-01-11 12:44:43 -050012#include "SkAutoMalloc.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"
Mike Reed80747ef2018-01-23 15:29:32 -050018#include "SkMaskFilterBase.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080019#include "SkPaintDefaults.h"
20#include "SkPathEffect.h"
robertphillips9bafc302015-02-13 11:13:00 -080021#include "SkPicture.h"
Mike Reedfadbfcd2017-12-06 16:09:20 -050022#include "SkReadBuffer.h"
Mike Reed185ffe92018-01-08 17:09:54 -050023#include "SkRectPriv.h"
fmalitab7425172014-08-26 07:56:44 -070024#include "SkTextBlob.h"
fmalitae77f2da2015-12-08 18:59:18 -080025#include "SkTextBlobRunIterator.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080026#include "SkTHash.h"
27#include "SkTypeface.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080028#include "SkWriteBuffer.h"
msaretta5cf4f42016-06-30 10:06:51 -070029#include "picture_utils.h"
Mike Reedebfce6d2016-12-12 10:02:12 -050030#include "SkClipOpPriv.h"
Stan Ilievac42aeb2017-01-12 16:20:50 -050031#include <SkLatticeIter.h>
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -040032#include <SkShadowFlags.h>
ethannicholas50a8dd02016-02-10 05:40:46 -080033
ethannicholas50a8dd02016-02-10 05:40:46 -080034#define SKDEBUGCANVAS_ATTRIBUTE_COMMAND "command"
ethannicholas807dcab2016-02-23 06:53:37 -080035#define SKDEBUGCANVAS_ATTRIBUTE_VISIBLE "visible"
ethannicholas50a8dd02016-02-10 05:40:46 -080036#define SKDEBUGCANVAS_ATTRIBUTE_MATRIX "matrix"
vjiaoblacke5de1302016-07-13 14:05:28 -070037#define SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS "drawDepthTranslation"
ethannicholas50a8dd02016-02-10 05:40:46 -080038#define SKDEBUGCANVAS_ATTRIBUTE_COORDS "coords"
halcanaryf412f092016-08-25 11:10:41 -070039#define SKDEBUGCANVAS_ATTRIBUTE_HINTING "hinting"
ethannicholas50a8dd02016-02-10 05:40:46 -080040#define SKDEBUGCANVAS_ATTRIBUTE_BOUNDS "bounds"
41#define SKDEBUGCANVAS_ATTRIBUTE_PAINT "paint"
42#define SKDEBUGCANVAS_ATTRIBUTE_OUTER "outer"
43#define SKDEBUGCANVAS_ATTRIBUTE_INNER "inner"
44#define SKDEBUGCANVAS_ATTRIBUTE_MODE "mode"
45#define SKDEBUGCANVAS_ATTRIBUTE_POINTS "points"
46#define SKDEBUGCANVAS_ATTRIBUTE_PATH "path"
47#define SKDEBUGCANVAS_ATTRIBUTE_TEXT "text"
48#define SKDEBUGCANVAS_ATTRIBUTE_COLOR "color"
49#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Florin Malita82d80872017-06-06 16:58:40 -040050#define SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE "blendMode"
ethannicholas50a8dd02016-02-10 05:40:46 -080051#define SKDEBUGCANVAS_ATTRIBUTE_STYLE "style"
52#define SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH "strokeWidth"
53#define SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER "strokeMiter"
ethannicholas1446a9a2016-02-10 14:05:02 -080054#define SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN "strokeJoin"
ethannicholas50a8dd02016-02-10 05:40:46 -080055#define SKDEBUGCANVAS_ATTRIBUTE_CAP "cap"
56#define SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS "antiAlias"
ethannicholas1446a9a2016-02-10 14:05:02 -080057#define SKDEBUGCANVAS_ATTRIBUTE_DITHER "dither"
Ben Wagner78f1f5a2017-06-23 14:35:07 -040058#define SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT "fakeBoldText"
59#define SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT "linearText"
60#define SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT "subpixelText"
61#define SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT "devKernText"
62#define SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT "lcdRenderText"
63#define SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT "embeddedBitmapText"
64#define SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING "forceAutoHinting"
65#define SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT "verticalText"
ethannicholas50a8dd02016-02-10 05:40:46 -080066#define SKDEBUGCANVAS_ATTRIBUTE_REGION "region"
67#define SKDEBUGCANVAS_ATTRIBUTE_REGIONOP "op"
68#define SKDEBUGCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle"
69#define SKDEBUGCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion"
70#define SKDEBUGCANVAS_ATTRIBUTE_BLUR "blur"
71#define SKDEBUGCANVAS_ATTRIBUTE_SIGMA "sigma"
72#define SKDEBUGCANVAS_ATTRIBUTE_QUALITY "quality"
73#define SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN "textAlign"
74#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE "textSize"
75#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX"
76#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX"
77#define SKDEBUGCANVAS_ATTRIBUTE_DASHING "dashing"
78#define SKDEBUGCANVAS_ATTRIBUTE_INTERVALS "intervals"
79#define SKDEBUGCANVAS_ATTRIBUTE_PHASE "phase"
80#define SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE "fillType"
81#define SKDEBUGCANVAS_ATTRIBUTE_VERBS "verbs"
82#define SKDEBUGCANVAS_ATTRIBUTE_NAME "name"
ethannicholasf62a8b72016-02-11 10:35:21 -080083#define SKDEBUGCANVAS_ATTRIBUTE_DATA "data"
brianosmanfad98562016-05-04 11:06:28 -070084#define SKDEBUGCANVAS_ATTRIBUTE_VALUES "values"
ethannicholas50a8dd02016-02-10 05:40:46 -080085#define SKDEBUGCANVAS_ATTRIBUTE_SHADER "shader"
86#define SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect"
87#define SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER "maskFilter"
88#define SKDEBUGCANVAS_ATTRIBUTE_XFERMODE "xfermode"
ethannicholas1446a9a2016-02-10 14:05:02 -080089#define SKDEBUGCANVAS_ATTRIBUTE_LOOPER "looper"
ethannicholas50a8dd02016-02-10 05:40:46 -080090#define SKDEBUGCANVAS_ATTRIBUTE_BACKDROP "backdrop"
91#define SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER "colorfilter"
92#define SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter"
93#define SKDEBUGCANVAS_ATTRIBUTE_IMAGE "image"
94#define SKDEBUGCANVAS_ATTRIBUTE_BITMAP "bitmap"
95#define SKDEBUGCANVAS_ATTRIBUTE_SRC "src"
96#define SKDEBUGCANVAS_ATTRIBUTE_DST "dst"
97#define SKDEBUGCANVAS_ATTRIBUTE_CENTER "center"
98#define SKDEBUGCANVAS_ATTRIBUTE_STRICT "strict"
99#define SKDEBUGCANVAS_ATTRIBUTE_DESCRIPTION "description"
100#define SKDEBUGCANVAS_ATTRIBUTE_X "x"
101#define SKDEBUGCANVAS_ATTRIBUTE_Y "y"
102#define SKDEBUGCANVAS_ATTRIBUTE_RUNS "runs"
103#define SKDEBUGCANVAS_ATTRIBUTE_POSITIONS "positions"
104#define SKDEBUGCANVAS_ATTRIBUTE_GLYPHS "glyphs"
105#define SKDEBUGCANVAS_ATTRIBUTE_FONT "font"
106#define SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE "typeface"
ethannicholas1446a9a2016-02-10 14:05:02 -0800107#define SKDEBUGCANVAS_ATTRIBUTE_CUBICS "cubics"
108#define SKDEBUGCANVAS_ATTRIBUTE_COLORS "colors"
109#define SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS "textureCoords"
110#define SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY "filterQuality"
bsalomonac3aa242016-08-19 11:25:19 -0700111#define SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE "startAngle"
112#define SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE "sweepAngle"
113#define SKDEBUGCANVAS_ATTRIBUTE_USECENTER "useCenter"
jcgregorioee0c5552016-06-30 09:18:27 -0700114#define SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC "shortDesc"
msarett0ac1bec2016-08-29 09:15:33 -0700115#define SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID "uniqueID"
116#define SKDEBUGCANVAS_ATTRIBUTE_WIDTH "width"
117#define SKDEBUGCANVAS_ATTRIBUTE_HEIGHT "height"
118#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Stan Ilievac42aeb2017-01-12 16:20:50 -0500119#define SKDEBUGCANVAS_ATTRIBUTE_LATTICE "lattice"
120#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT "xCount"
121#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT "yCount"
122#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS "xDivs"
123#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS "yDivs"
124#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS "flags"
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400125#define SKDEBUGCANVAS_ATTRIBUTE_ZPLANE "zPlane"
126#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION "lightPositions"
127#define SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR "ambientColor"
128#define SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR "spotColor"
129#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS "lightRadius"
reed67f62fa2016-06-29 11:36:34 -0700130
ethannicholas50a8dd02016-02-10 05:40:46 -0800131#define SKDEBUGCANVAS_VERB_MOVE "move"
132#define SKDEBUGCANVAS_VERB_LINE "line"
133#define SKDEBUGCANVAS_VERB_QUAD "quad"
134#define SKDEBUGCANVAS_VERB_CUBIC "cubic"
135#define SKDEBUGCANVAS_VERB_CONIC "conic"
136#define SKDEBUGCANVAS_VERB_CLOSE "close"
137
138#define SKDEBUGCANVAS_STYLE_FILL "fill"
139#define SKDEBUGCANVAS_STYLE_STROKE "stroke"
140#define SKDEBUGCANVAS_STYLE_STROKEANDFILL "strokeAndFill"
141
142#define SKDEBUGCANVAS_POINTMODE_POINTS "points"
143#define SKDEBUGCANVAS_POINTMODE_LINES "lines"
144#define SKDEBUGCANVAS_POINTMODE_POLYGON "polygon"
145
146#define SKDEBUGCANVAS_REGIONOP_DIFFERENCE "difference"
147#define SKDEBUGCANVAS_REGIONOP_INTERSECT "intersect"
148#define SKDEBUGCANVAS_REGIONOP_UNION "union"
149#define SKDEBUGCANVAS_REGIONOP_XOR "xor"
150#define SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE "reverseDifference"
151#define SKDEBUGCANVAS_REGIONOP_REPLACE "replace"
152
153#define SKDEBUGCANVAS_BLURSTYLE_NORMAL "normal"
154#define SKDEBUGCANVAS_BLURSTYLE_SOLID "solid"
155#define SKDEBUGCANVAS_BLURSTYLE_OUTER "outer"
156#define SKDEBUGCANVAS_BLURSTYLE_INNER "inner"
157
158#define SKDEBUGCANVAS_BLURQUALITY_LOW "low"
159#define SKDEBUGCANVAS_BLURQUALITY_HIGH "high"
160
161#define SKDEBUGCANVAS_ALIGN_LEFT "left"
162#define SKDEBUGCANVAS_ALIGN_CENTER "center"
163#define SKDEBUGCANVAS_ALIGN_RIGHT "right"
164
165#define SKDEBUGCANVAS_FILLTYPE_WINDING "winding"
166#define SKDEBUGCANVAS_FILLTYPE_EVENODD "evenOdd"
167#define SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding"
168#define SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd"
169
170#define SKDEBUGCANVAS_CAP_BUTT "butt"
171#define SKDEBUGCANVAS_CAP_ROUND "round"
172#define SKDEBUGCANVAS_CAP_SQUARE "square"
173
ethannicholas1446a9a2016-02-10 14:05:02 -0800174#define SKDEBUGCANVAS_MITER_JOIN "miter"
175#define SKDEBUGCANVAS_ROUND_JOIN "round"
176#define SKDEBUGCANVAS_BEVEL_JOIN "bevel"
177
ethannicholas50a8dd02016-02-10 05:40:46 -0800178#define SKDEBUGCANVAS_COLORTYPE_ARGB4444 "ARGB4444"
179#define SKDEBUGCANVAS_COLORTYPE_RGBA8888 "RGBA8888"
180#define SKDEBUGCANVAS_COLORTYPE_BGRA8888 "BGRA8888"
181#define SKDEBUGCANVAS_COLORTYPE_565 "565"
182#define SKDEBUGCANVAS_COLORTYPE_GRAY8 "Gray8"
183#define SKDEBUGCANVAS_COLORTYPE_INDEX8 "Index8"
184#define SKDEBUGCANVAS_COLORTYPE_ALPHA8 "Alpha8"
185
186#define SKDEBUGCANVAS_ALPHATYPE_OPAQUE "opaque"
187#define SKDEBUGCANVAS_ALPHATYPE_PREMUL "premul"
188#define SKDEBUGCANVAS_ALPHATYPE_UNPREMUL "unpremul"
msarett0ac1bec2016-08-29 09:15:33 -0700189#define SKDEBUGCANVAS_ALPHATYPE_UNKNOWN "unknown"
ethannicholas50a8dd02016-02-10 05:40:46 -0800190
ethannicholas1446a9a2016-02-10 14:05:02 -0800191#define SKDEBUGCANVAS_FILTERQUALITY_NONE "none"
192#define SKDEBUGCANVAS_FILTERQUALITY_LOW "low"
193#define SKDEBUGCANVAS_FILTERQUALITY_MEDIUM "medium"
194#define SKDEBUGCANVAS_FILTERQUALITY_HIGH "high"
195
halcanaryf412f092016-08-25 11:10:41 -0700196#define SKDEBUGCANVAS_HINTING_NONE "none"
197#define SKDEBUGCANVAS_HINTING_SLIGHT "slight"
198#define SKDEBUGCANVAS_HINTING_NORMAL "normal"
199#define SKDEBUGCANVAS_HINTING_FULL "full"
200
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400201#define SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC "transparentOccluder"
202#define SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY "geometricOnly"
203
reed67f62fa2016-06-29 11:36:34 -0700204static SkString* str_append(SkString* str, const SkRect& r) {
205 str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom());
206 return str;
207}
208
robertphillips9bafc302015-02-13 11:13:00 -0800209SkDrawCommand::SkDrawCommand(OpType type)
210 : fOpType(type)
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000211 , fVisible(true) {
212}
213
robertphillips9bafc302015-02-13 11:13:00 -0800214const char* SkDrawCommand::GetCommandString(OpType type) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000215 switch (type) {
fmalita160ebb22015-04-01 20:58:37 -0700216 case kBeginDrawPicture_OpType: return "BeginDrawPicture";
Brian Osmanc25e2692018-03-12 10:57:28 -0400217 case kClear_OpType: return "DrawClear";
robertphillips9bafc302015-02-13 11:13:00 -0800218 case kClipPath_OpType: return "ClipPath";
219 case kClipRegion_OpType: return "ClipRegion";
220 case kClipRect_OpType: return "ClipRect";
221 case kClipRRect_OpType: return "ClipRRect";
robertphillips9bafc302015-02-13 11:13:00 -0800222 case kConcat_OpType: return "Concat";
robertphillipsfb409232016-06-29 10:28:11 -0700223 case kDrawAnnotation_OpType: return "DrawAnnotation";
robertphillips9bafc302015-02-13 11:13:00 -0800224 case kDrawBitmap_OpType: return "DrawBitmap";
Brian Osman78a76482018-05-18 16:59:13 -0400225 case kDrawBitmapLattice_OpType: return "DrawBitmapLattice";
robertphillips9bafc302015-02-13 11:13:00 -0800226 case kDrawBitmapNine_OpType: return "DrawBitmapNine";
227 case kDrawBitmapRect_OpType: return "DrawBitmapRect";
robertphillips9bafc302015-02-13 11:13:00 -0800228 case kDrawDRRect_OpType: return "DrawDRRect";
fmalita651c9202015-07-22 10:23:01 -0700229 case kDrawImage_OpType: return "DrawImage";
Stan Ilievac42aeb2017-01-12 16:20:50 -0500230 case kDrawImageLattice_OpType: return "DrawImageLattice";
Brian Osmanc25e2692018-03-12 10:57:28 -0400231 case kDrawImageNine_OpType: return "DrawImageNine";
fmalita651c9202015-07-22 10:23:01 -0700232 case kDrawImageRect_OpType: return "DrawImageRect";
robertphillips9bafc302015-02-13 11:13:00 -0800233 case kDrawOval_OpType: return "DrawOval";
234 case kDrawPaint_OpType: return "DrawPaint";
235 case kDrawPatch_OpType: return "DrawPatch";
236 case kDrawPath_OpType: return "DrawPath";
Brian Osmanc25e2692018-03-12 10:57:28 -0400237 case kDrawArc_OpType: return "DrawArc";
robertphillips9bafc302015-02-13 11:13:00 -0800238 case kDrawPoints_OpType: return "DrawPoints";
239 case kDrawPosText_OpType: return "DrawPosText";
240 case kDrawPosTextH_OpType: return "DrawPosTextH";
241 case kDrawRect_OpType: return "DrawRect";
242 case kDrawRRect_OpType: return "DrawRRect";
Brian Osmanc25e2692018-03-12 10:57:28 -0400243 case kDrawRegion_OpType: return "DrawRegion";
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400244 case kDrawShadow_OpType: return "DrawShadow";
robertphillips9bafc302015-02-13 11:13:00 -0800245 case kDrawText_OpType: return "DrawText";
246 case kDrawTextBlob_OpType: return "DrawTextBlob";
247 case kDrawTextOnPath_OpType: return "DrawTextOnPath";
reed63f30d92016-07-07 16:32:51 -0700248 case kDrawTextRSXform_OpType: return "DrawTextRSXform";
robertphillips9bafc302015-02-13 11:13:00 -0800249 case kDrawVertices_OpType: return "DrawVertices";
Brian Osman616f1cb2018-05-29 11:23:35 -0400250 case kDrawAtlas_OpType: return "DrawAtlas";
Brian Osmanc7611082018-05-29 14:55:50 -0400251 case kDrawDrawable_OpType: return "DrawDrawable";
fmalita160ebb22015-04-01 20:58:37 -0700252 case kEndDrawPicture_OpType: return "EndDrawPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800253 case kRestore_OpType: return "Restore";
254 case kSave_OpType: return "Save";
255 case kSaveLayer_OpType: return "SaveLayer";
256 case kSetMatrix_OpType: return "SetMatrix";
chudy@google.com902ebe52012-06-29 14:21:22 +0000257 default:
robertphillips9bafc302015-02-13 11:13:00 -0800258 SkDebugf("OpType error 0x%08x\n", type);
chudy@google.com902ebe52012-06-29 14:21:22 +0000259 SkASSERT(0);
260 break;
261 }
262 SkDEBUGFAIL("DrawType UNUSED\n");
halcanary96fcdcc2015-08-27 07:41:13 -0700263 return nullptr;
chudy@google.com902ebe52012-06-29 14:21:22 +0000264}
265
ethannicholasf62a8b72016-02-11 10:35:21 -0800266Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const {
ethannicholas50a8dd02016-02-10 05:40:46 -0800267 Json::Value result;
268 result[SKDEBUGCANVAS_ATTRIBUTE_COMMAND] = this->GetCommandString(fOpType);
ethannicholas807dcab2016-02-23 06:53:37 -0800269 result[SKDEBUGCANVAS_ATTRIBUTE_VISIBLE] = Json::Value(this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800270 return result;
271}
272
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000273namespace {
274
275void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
Mike Reed3661bc92017-02-22 13:21:42 -0500276 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000277
278 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
279
280 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
281 if (bounds.width() > bounds.height()) {
282 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
283 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
284 } else {
285 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
286 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
287 }
288 canvas->translate(-bounds.centerX(), -bounds.centerY());
289}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000290
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000291
292void render_path(SkCanvas* canvas, const SkPath& path) {
293 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000294
295 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700296 if (bounds.isEmpty()) {
297 return;
298 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000299
fmalitab0cd8b72015-10-06 07:24:03 -0700300 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000301 xlate_and_scale_to_bounds(canvas, bounds);
302
303 SkPaint p;
304 p.setColor(SK_ColorBLACK);
305 p.setStyle(SkPaint::kStroke_Style);
306
307 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000308}
309
Brian Osmanc25e2692018-03-12 10:57:28 -0400310void render_region(SkCanvas* canvas, const SkRegion& region) {
311 canvas->clear(0xFFFFFFFF);
312
313 const SkIRect& bounds = region.getBounds();
314 if (bounds.isEmpty()) {
315 return;
316 }
317
318 SkAutoCanvasRestore acr(canvas, true);
Brian Osman99b63402018-03-13 10:19:27 -0400319 xlate_and_scale_to_bounds(canvas, SkRect::Make(bounds));
Brian Osmanc25e2692018-03-12 10:57:28 -0400320
321 SkPaint p;
322 p.setColor(SK_ColorBLACK);
323 p.setStyle(SkPaint::kStroke_Style);
324
325 canvas->drawRegion(region, p);
326}
327
halcanary96fcdcc2015-08-27 07:41:13 -0700328void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
Mike Reed3661bc92017-02-22 13:21:42 -0500329 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000330
331 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
332 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
333
334 if (input.width() > input.height()) {
335 yScale *= input.height() / (float) input.width();
336 } else {
337 xScale *= input.width() / (float) input.height();
338 }
339
340 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
341 xScale * input.width(),
342 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000343
robertphillips96a5cff2015-09-24 06:56:27 -0700344 static const int kNumBlocks = 8;
345
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000346 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700347 SkISize block = {
348 canvas->imageInfo().width()/kNumBlocks,
349 canvas->imageInfo().height()/kNumBlocks
350 };
351 for (int y = 0; y < kNumBlocks; ++y) {
352 for (int x = 0; x < kNumBlocks; ++x) {
353 SkPaint paint;
354 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
355 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
356 SkIntToScalar(y*block.height()),
357 SkIntToScalar(block.width()),
358 SkIntToScalar(block.height()));
359 canvas->drawRect(r, paint);
360 }
361 }
362
reede47829b2015-08-06 10:02:53 -0700363 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000364
bsalomon49f085d2014-09-05 13:34:00 -0700365 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000366 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
367 srcRect->fTop * yScale + SK_Scalar1,
368 srcRect->fRight * xScale + SK_Scalar1,
369 srcRect->fBottom * yScale + SK_Scalar1);
370 SkPaint p;
371 p.setColor(SK_ColorRED);
372 p.setStyle(SkPaint::kStroke_Style);
373
374 canvas->drawRect(r, p);
375 }
376}
377
378void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
379 canvas->clear(0xFFFFFFFF);
380 canvas->save();
381
382 const SkRect& bounds = rrect.getBounds();
383
384 xlate_and_scale_to_bounds(canvas, bounds);
385
386 SkPaint p;
387 p.setColor(SK_ColorBLACK);
388 p.setStyle(SkPaint::kStroke_Style);
389
390 canvas->drawRRect(rrect, p);
391 canvas->restore();
392}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000393
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000394void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
395 canvas->clear(0xFFFFFFFF);
396 canvas->save();
397
398 const SkRect& bounds = outer.getBounds();
399
400 xlate_and_scale_to_bounds(canvas, bounds);
401
402 SkPaint p;
403 p.setColor(SK_ColorBLACK);
404 p.setStyle(SkPaint::kStroke_Style);
405
406 canvas->drawDRRect(outer, inner, p);
407 canvas->restore();
408}
409
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400410void render_shadow(SkCanvas* canvas, const SkPath& path, SkDrawShadowRec rec) {
411 canvas->clear(0xFFFFFFFF);
412
413 const SkRect& bounds = path.getBounds();
414 if (bounds.isEmpty()) {
415 return;
416 }
417
418 SkAutoCanvasRestore acr(canvas, true);
419 xlate_and_scale_to_bounds(canvas, bounds);
420
421 rec.fAmbientColor = SK_ColorBLACK;
422 rec.fSpotColor = SK_ColorBLACK;
423 canvas->private_draw_shadow_rec(path, rec);
424}
425
Florin Malita82d80872017-06-06 16:58:40 -0400426static const char* const gBlendModeMap[] = {
427 "clear",
428 "src",
429 "dst",
430 "srcOver",
431 "dstOver",
432 "srcIn",
433 "dstIn",
434 "srcOut",
435 "dstOut",
436 "srcATop",
437 "dstATop",
438 "xor",
439 "plus",
440 "modulate",
441
442 "screen",
443
444 "overlay",
445 "darken",
446 "lighten",
447 "colorDodge",
448 "colorBurn",
449 "hardLight",
450 "softLight",
451 "difference",
452 "exclusion",
453 "multiply",
454
455 "hue",
456 "saturation",
457 "color",
458 "luminosity",
459};
460
461static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
462 "blendMode mismatch");
463static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
464 "blendMode mismatch");
465
466void apply_paint_blend_mode(const SkPaint& paint, Json::Value* target) {
467 const auto mode = paint.getBlendMode();
468 if (mode != SkBlendMode::kSrcOver) {
469 SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
470 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE] =
471 Json::Value(gBlendModeMap[static_cast<size_t>(mode)]);
472 }
473}
474
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000475};
476
brianosmanfad98562016-05-04 11:06:28 -0700477Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800478 Json::Value result(Json::arrayValue);
479 result.append(Json::Value(SkColorGetA(color)));
480 result.append(Json::Value(SkColorGetR(color)));
481 result.append(Json::Value(SkColorGetG(color)));
482 result.append(Json::Value(SkColorGetB(color)));
483 return result;
484}
485
brianosman97bbf822016-09-25 13:15:58 -0700486Json::Value SkDrawCommand::MakeJsonColor4f(const SkColor4f& color) {
487 Json::Value result(Json::arrayValue);
488 result.append(Json::Value(color.fA));
489 result.append(Json::Value(color.fR));
490 result.append(Json::Value(color.fG));
491 result.append(Json::Value(color.fB));
492 return result;
493}
494
brianosmanfad98562016-05-04 11:06:28 -0700495Json::Value SkDrawCommand::MakeJsonPoint(const SkPoint& point) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800496 Json::Value result(Json::arrayValue);
497 result.append(Json::Value(point.x()));
498 result.append(Json::Value(point.y()));
499 return result;
500}
501
brianosmanfad98562016-05-04 11:06:28 -0700502Json::Value SkDrawCommand::MakeJsonPoint(SkScalar x, SkScalar y) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800503 Json::Value result(Json::arrayValue);
504 result.append(Json::Value(x));
505 result.append(Json::Value(y));
506 return result;
507}
508
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400509Json::Value SkDrawCommand::MakeJsonPoint3(const SkPoint3& point) {
510 Json::Value result(Json::arrayValue);
511 result.append(Json::Value(point.x()));
512 result.append(Json::Value(point.y()));
513 result.append(Json::Value(point.z()));
514 return result;
515}
516
brianosmanfad98562016-05-04 11:06:28 -0700517Json::Value SkDrawCommand::MakeJsonRect(const SkRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800518 Json::Value result(Json::arrayValue);
519 result.append(Json::Value(rect.left()));
520 result.append(Json::Value(rect.top()));
521 result.append(Json::Value(rect.right()));
522 result.append(Json::Value(rect.bottom()));
523 return result;
524}
525
joshualittbd724132016-03-03 11:39:38 -0800526Json::Value SkDrawCommand::MakeJsonIRect(const SkIRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800527 Json::Value result(Json::arrayValue);
528 result.append(Json::Value(rect.left()));
529 result.append(Json::Value(rect.top()));
530 result.append(Json::Value(rect.right()));
531 result.append(Json::Value(rect.bottom()));
532 return result;
533}
534
535static Json::Value make_json_rrect(const SkRRect& rrect) {
536 Json::Value result(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700537 result.append(SkDrawCommand::MakeJsonRect(rrect.rect()));
538 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
539 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperRight_Corner)));
540 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerRight_Corner)));
541 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
ethannicholas50a8dd02016-02-10 05:40:46 -0800542 return result;
543}
544
joshualittbd724132016-03-03 11:39:38 -0800545Json::Value SkDrawCommand::MakeJsonMatrix(const SkMatrix& matrix) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800546 Json::Value result(Json::arrayValue);
547 Json::Value row1(Json::arrayValue);
548 row1.append(Json::Value(matrix[0]));
549 row1.append(Json::Value(matrix[1]));
550 row1.append(Json::Value(matrix[2]));
551 result.append(row1);
552 Json::Value row2(Json::arrayValue);
553 row2.append(Json::Value(matrix[3]));
554 row2.append(Json::Value(matrix[4]));
555 row2.append(Json::Value(matrix[5]));
556 result.append(row2);
557 Json::Value row3(Json::arrayValue);
558 row3.append(Json::Value(matrix[6]));
559 row3.append(Json::Value(matrix[7]));
560 row3.append(Json::Value(matrix[8]));
561 result.append(row3);
562 return result;
563}
ethannicholas1446a9a2016-02-10 14:05:02 -0800564
vjiaoblacke5de1302016-07-13 14:05:28 -0700565Json::Value SkDrawCommand::MakeJsonScalar(SkScalar z) {
566 Json::Value result(z);
567 return result;
568}
569
brianosmanfad98562016-05-04 11:06:28 -0700570Json::Value SkDrawCommand::MakeJsonPath(const SkPath& path) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800571 Json::Value result(Json::objectValue);
572 switch (path.getFillType()) {
573 case SkPath::kWinding_FillType:
574 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_WINDING;
575 break;
576 case SkPath::kEvenOdd_FillType:
577 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_EVENODD;
578 break;
579 case SkPath::kInverseWinding_FillType:
580 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING;
581 break;
582 case SkPath::kInverseEvenOdd_FillType:
583 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
584 break;
halcanary9d524f22016-03-29 09:03:52 -0700585 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800586 Json::Value verbs(Json::arrayValue);
587 SkPath::Iter iter(path, false);
588 SkPoint pts[4];
589 SkPath::Verb verb;
590 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
591 switch (verb) {
592 case SkPath::kLine_Verb: {
593 Json::Value line(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700594 line[SKDEBUGCANVAS_VERB_LINE] = MakeJsonPoint(pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800595 verbs.append(line);
596 break;
597 }
598 case SkPath::kQuad_Verb: {
599 Json::Value quad(Json::objectValue);
600 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700601 coords.append(MakeJsonPoint(pts[1]));
602 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800603 quad[SKDEBUGCANVAS_VERB_QUAD] = coords;
604 verbs.append(quad);
605 break;
606 }
607 case SkPath::kCubic_Verb: {
608 Json::Value cubic(Json::objectValue);
609 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700610 coords.append(MakeJsonPoint(pts[1]));
611 coords.append(MakeJsonPoint(pts[2]));
612 coords.append(MakeJsonPoint(pts[3]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800613 cubic[SKDEBUGCANVAS_VERB_CUBIC] = coords;
614 verbs.append(cubic);
615 break;
616 }
617 case SkPath::kConic_Verb: {
618 Json::Value conic(Json::objectValue);
619 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700620 coords.append(MakeJsonPoint(pts[1]));
621 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800622 coords.append(Json::Value(iter.conicWeight()));
623 conic[SKDEBUGCANVAS_VERB_CONIC] = coords;
624 verbs.append(conic);
625 break;
626 }
627 case SkPath::kMove_Verb: {
628 Json::Value move(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700629 move[SKDEBUGCANVAS_VERB_MOVE] = MakeJsonPoint(pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800630 verbs.append(move);
631 break;
632 }
633 case SkPath::kClose_Verb:
634 verbs.append(Json::Value(SKDEBUGCANVAS_VERB_CLOSE));
635 break;
636 case SkPath::kDone_Verb:
637 break;
638 }
639 }
640 result[SKDEBUGCANVAS_ATTRIBUTE_VERBS] = verbs;
641 return result;
642}
643
brianosmanfad98562016-05-04 11:06:28 -0700644Json::Value SkDrawCommand::MakeJsonRegion(const SkRegion& region) {
Brian Osmanc25e2692018-03-12 10:57:28 -0400645 // TODO: Actually serialize the rectangles, rather than just devolving to path
646 SkPath path;
647 region.getBoundaryPath(&path);
648 return MakeJsonPath(path);
ethannicholas50a8dd02016-02-10 05:40:46 -0800649}
650
Mike Reedc1f77742016-12-09 09:00:50 -0500651static Json::Value make_json_regionop(SkClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800652 switch (op) {
Mike Reedc1f77742016-12-09 09:00:50 -0500653 case kDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800654 return Json::Value(SKDEBUGCANVAS_REGIONOP_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500655 case kIntersect_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800656 return Json::Value(SKDEBUGCANVAS_REGIONOP_INTERSECT);
Mike Reedc1f77742016-12-09 09:00:50 -0500657 case kUnion_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800658 return Json::Value(SKDEBUGCANVAS_REGIONOP_UNION);
Mike Reedc1f77742016-12-09 09:00:50 -0500659 case kXOR_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800660 return Json::Value(SKDEBUGCANVAS_REGIONOP_XOR);
Mike Reedc1f77742016-12-09 09:00:50 -0500661 case kReverseDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800662 return Json::Value(SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500663 case kReplace_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800664 return Json::Value(SKDEBUGCANVAS_REGIONOP_REPLACE);
665 default:
666 SkASSERT(false);
667 return Json::Value("<invalid region op>");
668 };
669}
670
671static Json::Value make_json_pointmode(SkCanvas::PointMode mode) {
672 switch (mode) {
673 case SkCanvas::kPoints_PointMode:
674 return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
675 case SkCanvas::kLines_PointMode:
676 return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
halcanary9d524f22016-03-29 09:03:52 -0700677 case SkCanvas::kPolygon_PointMode:
ethannicholas50a8dd02016-02-10 05:40:46 -0800678 return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
679 default:
680 SkASSERT(false);
681 return Json::Value("<invalid point mode>");
682 };
683}
684
halcanary9d524f22016-03-29 09:03:52 -0700685static void store_scalar(Json::Value* target, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800686 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800687 if (value != defaultValue) {
688 (*target)[key] = Json::Value(value);
689 }
690}
691
ethannicholasbd3dae82016-02-10 12:10:00 -0800692static void store_bool(Json::Value* target, const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800693 if (value != defaultValue) {
694 (*target)[key] = Json::Value(value);
695 }
696}
697
halcanary9d524f22016-03-29 09:03:52 -0700698static void encode_data(const void* bytes, size_t count, const char* contentType,
ethannicholasf62a8b72016-02-11 10:35:21 -0800699 UrlDataManager& urlDataManager, Json::Value* target) {
bungeman38d909e2016-08-02 14:40:46 -0700700 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
701 SkString url = urlDataManager.addData(data.get(), contentType);
ethannicholasf62a8b72016-02-11 10:35:21 -0800702 *target = Json::Value(url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800703}
704
brianosmanfad98562016-05-04 11:06:28 -0700705void SkDrawCommand::flatten(const SkFlattenable* flattenable, Json::Value* target,
706 UrlDataManager& urlDataManager) {
707 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800708 flattenable->flatten(buffer);
709 void* data = sk_malloc_throw(buffer.bytesWritten());
710 buffer.writeToMemory(data);
711 Json::Value jsonData;
712 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, &jsonData);
713 Json::Value jsonFlattenable;
714 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->getTypeName());
715 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
brianosmanfad98562016-05-04 11:06:28 -0700716
717 SkJsonWriteBuffer jsonBuffer(&urlDataManager);
718 flattenable->flatten(jsonBuffer);
719 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_VALUES] = jsonBuffer.getValue();
720
ethannicholasf62a8b72016-02-11 10:35:21 -0800721 (*target) = jsonFlattenable;
722 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800723}
724
ethannicholasf67531f2016-03-21 10:19:39 -0700725static void write_png_callback(png_structp png_ptr, png_bytep data, png_size_t length) {
726 SkWStream* out = (SkWStream*) png_get_io_ptr(png_ptr);
727 out->write(data, length);
728}
729
halcanarya73d76a2016-10-17 13:19:02 -0700730void SkDrawCommand::WritePNG(const uint8_t* rgba, unsigned width, unsigned height,
msaretta5cf4f42016-06-30 10:06:51 -0700731 SkWStream& out, bool isOpaque) {
Ben Wagnera93a14a2017-08-28 10:34:05 -0400732 png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
ethannicholasf67531f2016-03-21 10:19:39 -0700733 SkASSERT(png != nullptr);
734 png_infop info_ptr = png_create_info_struct(png);
735 SkASSERT(info_ptr != nullptr);
736 if (setjmp(png_jmpbuf(png))) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400737 SK_ABORT("png encode error");
ethannicholasf67531f2016-03-21 10:19:39 -0700738 }
Ben Wagnera93a14a2017-08-28 10:34:05 -0400739 png_set_write_fn(png, &out, write_png_callback, nullptr);
msaretta5cf4f42016-06-30 10:06:51 -0700740 int colorType = isOpaque ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGBA;
741 png_set_IHDR(png, info_ptr, width, height, 8, colorType, PNG_INTERLACE_NONE,
ethannicholasf67531f2016-03-21 10:19:39 -0700742 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
743 png_set_compression_level(png, 1);
744 png_bytepp rows = (png_bytepp) sk_malloc_throw(height * sizeof(png_byte*));
msaretta5cf4f42016-06-30 10:06:51 -0700745 png_bytep pixels = (png_bytep) sk_malloc_throw(width * height * 4);
ethannicholasf67531f2016-03-21 10:19:39 -0700746 for (png_size_t y = 0; y < height; ++y) {
halcanarya73d76a2016-10-17 13:19:02 -0700747 const uint8_t* src = rgba + y * width * 4;
msaretta5cf4f42016-06-30 10:06:51 -0700748 rows[y] = pixels + y * width * 4;
ethannicholasf67531f2016-03-21 10:19:39 -0700749 for (png_size_t x = 0; x < width; ++x) {
msaretta5cf4f42016-06-30 10:06:51 -0700750 rows[y][x * 4] = src[x * 4];
751 rows[y][x * 4 + 1] = src[x * 4 + 1];
752 rows[y][x * 4 + 2] = src[x * 4 + 2];
753 rows[y][x * 4 + 3] = src[x * 4 + 3];
ethannicholasf67531f2016-03-21 10:19:39 -0700754 }
755 }
msaretta5cf4f42016-06-30 10:06:51 -0700756 png_write_info(png, info_ptr);
757 if (isOpaque) {
758 png_set_filler(png, 0xFF, PNG_FILLER_AFTER);
759 }
ethannicholasf67531f2016-03-21 10:19:39 -0700760 png_set_filter(png, 0, PNG_NO_FILTERS);
msaretta5cf4f42016-06-30 10:06:51 -0700761 png_write_image(png, &rows[0]);
Ben Wagnera93a14a2017-08-28 10:34:05 -0400762 png_destroy_write_struct(&png, nullptr);
ethannicholasf67531f2016-03-21 10:19:39 -0700763 sk_free(rows);
764 sk_free(pixels);
765}
766
brianosmanfad98562016-05-04 11:06:28 -0700767bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
768 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700769 size_t rowBytes = 4 * image.width();
Hal Canary95e3c052017-01-11 12:44:43 -0500770 SkAutoMalloc buffer(rowBytes * image.height());
halcanary9d524f22016-03-29 09:03:52 -0700771 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700772 kN32_SkColorType, kPremul_SkAlphaType);
773 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
774 SkDebugf("readPixels failed\n");
775 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800776 }
msaretta5cf4f42016-06-30 10:06:51 -0700777
778 SkBitmap bm;
779 bm.installPixels(dstInfo, buffer.get(), rowBytes);
780 sk_sp<SkData> encodedBitmap = sk_tools::encode_bitmap_for_png(bm);
781
ethannicholasf67531f2016-03-21 10:19:39 -0700782 SkDynamicMemoryWStream out;
halcanarya73d76a2016-10-17 13:19:02 -0700783 SkDrawCommand::WritePNG(encodedBitmap->bytes(), image.width(), image.height(),
msaretta5cf4f42016-06-30 10:06:51 -0700784 out, false);
reed42943c82016-09-12 12:01:44 -0700785 sk_sp<SkData> encoded = out.detachAsData();
ethannicholasf62a8b72016-02-11 10:35:21 -0800786 Json::Value jsonData;
787 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
788 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
ethannicholas50a8dd02016-02-10 05:40:46 -0800789 return true;
790}
791
792static const char* color_type_name(SkColorType colorType) {
793 switch (colorType) {
794 case kARGB_4444_SkColorType:
795 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
796 case kRGBA_8888_SkColorType:
797 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
798 case kBGRA_8888_SkColorType:
799 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
800 case kRGB_565_SkColorType:
801 return SKDEBUGCANVAS_COLORTYPE_565;
802 case kGray_8_SkColorType:
803 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
ethannicholas50a8dd02016-02-10 05:40:46 -0800804 case kAlpha_8_SkColorType:
805 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
806 default:
807 SkASSERT(false);
808 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
809 }
810}
811
812static const char* alpha_type_name(SkAlphaType alphaType) {
813 switch (alphaType) {
814 case kOpaque_SkAlphaType:
815 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
816 case kPremul_SkAlphaType:
817 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
818 case kUnpremul_SkAlphaType:
819 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
820 default:
821 SkASSERT(false);
822 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
823 }
824}
825
brianosmanfad98562016-05-04 11:06:28 -0700826bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
827 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700828 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800829 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
830 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800831 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800832 return success;
833}
834
halcanaryf412f092016-08-25 11:10:41 -0700835static void apply_paint_hinting(const SkPaint& paint, Json::Value* target) {
836 SkPaint::Hinting hinting = paint.getHinting();
837 if (hinting != SkPaintDefaults_Hinting) {
838 switch (hinting) {
839 case SkPaint::kNo_Hinting:
840 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
841 break;
842 case SkPaint::kSlight_Hinting:
843 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
844 break;
845 case SkPaint::kNormal_Hinting:
846 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
847 break;
848 case SkPaint::kFull_Hinting:
849 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
850 break;
851 }
852 }
853}
854
ethannicholas50a8dd02016-02-10 05:40:46 -0800855static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
856 SkColor color = paint.getColor();
857 if (color != SK_ColorBLACK) {
858 Json::Value colorValue(Json::arrayValue);
859 colorValue.append(Json::Value(SkColorGetA(color)));
860 colorValue.append(Json::Value(SkColorGetR(color)));
861 colorValue.append(Json::Value(SkColorGetG(color)));
862 colorValue.append(Json::Value(SkColorGetB(color)));
863 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;;
864 }
865}
866
867static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
868 SkPaint::Style style = paint.getStyle();
869 if (style != SkPaint::kFill_Style) {
870 switch (style) {
871 case SkPaint::kStroke_Style: {
872 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
873 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
874 break;
875 }
876 case SkPaint::kStrokeAndFill_Style: {
877 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
878 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
879 break;
880 }
881 default: SkASSERT(false);
882 }
883 }
884}
885
886static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
887 SkPaint::Cap cap = paint.getStrokeCap();
888 if (cap != SkPaint::kDefault_Cap) {
889 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800890 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800891 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
892 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800893 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800894 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
895 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800896 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800897 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
898 break;
ethannicholas50a8dd02016-02-10 05:40:46 -0800899 default: SkASSERT(false);
900 }
901 }
902}
ethannicholas1446a9a2016-02-10 14:05:02 -0800903
904static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
905 SkPaint::Join join = paint.getStrokeJoin();
906 if (join != SkPaint::kDefault_Join) {
907 switch (join) {
908 case SkPaint::kMiter_Join:
909 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
910 SKDEBUGCANVAS_MITER_JOIN);
911 break;
912 case SkPaint::kRound_Join:
913 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
914 SKDEBUGCANVAS_ROUND_JOIN);
915 break;
916 case SkPaint::kBevel_Join:
917 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
918 SKDEBUGCANVAS_BEVEL_JOIN);
919 break;
920 default: SkASSERT(false);
921 }
922 }
923}
924
925static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
926 SkFilterQuality quality = paint.getFilterQuality();
927 switch (quality) {
928 case kNone_SkFilterQuality:
929 break;
930 case kLow_SkFilterQuality:
931 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
932 SKDEBUGCANVAS_FILTERQUALITY_LOW);
933 break;
934 case kMedium_SkFilterQuality:
935 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
936 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
937 break;
938 case kHigh_SkFilterQuality:
939 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
940 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
941 break;
942 }
943}
944
halcanary9d524f22016-03-29 09:03:52 -0700945static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800946 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800947 SkMaskFilter* maskFilter = paint.getMaskFilter();
948 if (maskFilter != nullptr) {
Mike Reed80747ef2018-01-23 15:29:32 -0500949 SkMaskFilterBase::BlurRec blurRec;
950 if (as_MFB(maskFilter)->asABlur(&blurRec)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800951 Json::Value blur(Json::objectValue);
952 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
953 switch (blurRec.fStyle) {
954 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800955 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
956 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -0800957 break;
958 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800959 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
960 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -0800961 break;
962 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800963 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
964 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800965 break;
966 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800967 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
968 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800969 break;
970 default:
971 SkASSERT(false);
972 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800973 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
974 } else {
975 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -0700976 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800977 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
978 }
979 }
980}
981
halcanary9d524f22016-03-29 09:03:52 -0700982static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800983 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800984 SkPathEffect* pathEffect = paint.getPathEffect();
985 if (pathEffect != nullptr) {
986 SkPathEffect::DashInfo dashInfo;
987 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
988 if (dashType == SkPathEffect::kDash_DashType) {
989 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
990 pathEffect->asADash(&dashInfo);
991 Json::Value dashing(Json::objectValue);
992 Json::Value intervals(Json::arrayValue);
993 for (int32_t i = 0; i < dashInfo.fCount; i++) {
994 intervals.append(Json::Value(dashInfo.fIntervals[i]));
995 }
996 sk_free(dashInfo.fIntervals);
997 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
998 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
999 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
1000 } else {
1001 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -07001002 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001003 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
1004 }
1005 }
1006}
halcanary9d524f22016-03-29 09:03:52 -07001007
ethannicholas50a8dd02016-02-10 05:40:46 -08001008static void apply_paint_textalign(const SkPaint& paint, Json::Value* target) {
1009 SkPaint::Align textAlign = paint.getTextAlign();
1010 if (textAlign != SkPaint::kLeft_Align) {
1011 switch (textAlign) {
1012 case SkPaint::kCenter_Align: {
1013 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_CENTER;
1014 break;
1015 }
1016 case SkPaint::kRight_Align: {
1017 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_RIGHT;
1018 break;
1019 }
1020 default: SkASSERT(false);
1021 }
1022 }
1023}
1024
halcanary9d524f22016-03-29 09:03:52 -07001025static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001026 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001027 SkTypeface* typeface = paint.getTypeface();
1028 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -08001029 Json::Value jsonTypeface;
1030 SkDynamicMemoryWStream buffer;
1031 typeface->serialize(&buffer);
1032 void* data = sk_malloc_throw(buffer.bytesWritten());
1033 buffer.copyTo(data);
1034 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -07001035 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001036 &jsonData);
1037 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
1038 sk_free(data);
1039 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -08001040 }
1041}
1042
halcanary9d524f22016-03-29 09:03:52 -07001043static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001044 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001045 SkFlattenable* shader = paint.getShader();
1046 if (shader != nullptr) {
1047 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -07001048 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001049 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
1050 }
1051}
1052
ethannicholasf62a8b72016-02-11 10:35:21 -08001053static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
1054 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001055 SkFlattenable* imageFilter = paint.getImageFilter();
1056 if (imageFilter != nullptr) {
1057 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -07001058 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001059 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
1060 }
1061}
1062
halcanary9d524f22016-03-29 09:03:52 -07001063static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001064 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001065 SkFlattenable* colorFilter = paint.getColorFilter();
1066 if (colorFilter != nullptr) {
1067 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001068 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001069 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1070 }
1071}
1072
halcanary9d524f22016-03-29 09:03:52 -07001073static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001074 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001075 SkFlattenable* looper = paint.getLooper();
1076 if (looper != nullptr) {
1077 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001078 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001079 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1080 }
1081}
1082
brianosmanfad98562016-05-04 11:06:28 -07001083Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001084 Json::Value result(Json::objectValue);
1085 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001086 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001087 SkPaintDefaults_MiterLimit);
1088 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001089 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001090 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, paint.isFakeBoldText(), false);
1091 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, paint.isLinearText(), false);
1092 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, paint.isSubpixelText(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001093 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT, paint.isLCDRenderText(), false);
1094 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, paint.isEmbeddedBitmapText(), false);
1095 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, paint.isAutohinted(), false);
1096 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT, paint.isVerticalText(), false);
1097 //kGenA8FromLCD_Flag
1098
halcanary9d524f22016-03-29 09:03:52 -07001099 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001100 SkPaintDefaults_TextSize);
1101 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
1102 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
halcanaryf412f092016-08-25 11:10:41 -07001103 apply_paint_hinting(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001104 apply_paint_color(paint, &result);
1105 apply_paint_style(paint, &result);
Florin Malita82d80872017-06-06 16:58:40 -04001106 apply_paint_blend_mode(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001107 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001108 apply_paint_join(paint, &result);
1109 apply_paint_filterquality(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001110 apply_paint_textalign(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001111 apply_paint_patheffect(paint, &result, urlDataManager);
1112 apply_paint_maskfilter(paint, &result, urlDataManager);
1113 apply_paint_shader(paint, &result, urlDataManager);
ethannicholasf62a8b72016-02-11 10:35:21 -08001114 apply_paint_looper(paint, &result, urlDataManager);
1115 apply_paint_imagefilter(paint, &result, urlDataManager);
1116 apply_paint_colorfilter(paint, &result, urlDataManager);
1117 apply_paint_typeface(paint, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001118 return result;
1119}
1120
Stan Ilievac42aeb2017-01-12 16:20:50 -05001121Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) {
1122 Json::Value result(Json::objectValue);
1123 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount);
1124 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount);
1125 if (nullptr != lattice.fBounds) {
1126 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds);
1127 }
1128 Json::Value XDivs(Json::arrayValue);
1129 for (int i = 0; i < lattice.fXCount; i++) {
1130 XDivs.append(Json::Value(lattice.fXDivs[i]));
1131 }
1132 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs;
1133 Json::Value YDivs(Json::arrayValue);
1134 for (int i = 0; i < lattice.fYCount; i++) {
1135 YDivs.append(Json::Value(lattice.fYDivs[i]));
1136 }
1137 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs;
Stan Ilievca8c0952017-12-11 13:01:58 -05001138 if (nullptr != lattice.fRectTypes) {
Stan Ilievac42aeb2017-01-12 16:20:50 -05001139 Json::Value flags(Json::arrayValue);
1140 int flagCount = 0;
1141 for (int row = 0; row < lattice.fYCount+1; row++) {
1142 Json::Value flagsRow(Json::arrayValue);
1143 for (int column = 0; column < lattice.fXCount+1; column++) {
Stan Ilievca8c0952017-12-11 13:01:58 -05001144 flagsRow.append(Json::Value(lattice.fRectTypes[flagCount++]));
Stan Ilievac42aeb2017-01-12 16:20:50 -05001145 }
1146 flags.append(flagsRow);
1147 }
1148 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags;
1149 }
1150 return result;
1151}
1152
Brian Osmanc25e2692018-03-12 10:57:28 -04001153SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kClear_OpType) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001154 fColor = color;
ethannicholas1446a9a2016-02-10 14:05:02 -08001155}
1156
1157void SkClearCommand::execute(SkCanvas* canvas) const {
1158 canvas->clear(fColor);
1159}
1160
ethannicholasf62a8b72016-02-11 10:35:21 -08001161Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1162 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001163 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001164 return result;
1165}
1166
Mike Reedc1f77742016-12-09 09:00:50 -05001167SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001168 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001169 fPath = path;
1170 fOp = op;
1171 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001172}
1173
fmalita8c89c522014-11-08 16:18:56 -08001174void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001175 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001176}
1177
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001178bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001179 render_path(canvas, fPath);
1180 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001181}
1182
ethannicholasf62a8b72016-02-11 10:35:21 -08001183Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1184 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001185 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001186 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1187 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1188 return result;
1189}
1190
Mike Reedc1f77742016-12-09 09:00:50 -05001191SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001192 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001193 fRegion = region;
1194 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001195}
1196
fmalita8c89c522014-11-08 16:18:56 -08001197void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001198 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001199}
1200
ethannicholasf62a8b72016-02-11 10:35:21 -08001201Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1202 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001203 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001204 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1205 return result;
1206}
1207
Mike Reedc1f77742016-12-09 09:00:50 -05001208SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001209 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001210 fRect = rect;
1211 fOp = op;
1212 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001213}
1214
fmalita8c89c522014-11-08 16:18:56 -08001215void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001216 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001217}
1218
ethannicholasf62a8b72016-02-11 10:35:21 -08001219Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1220 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001221 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001222 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1223 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001224
1225 SkString desc;
1226 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1227
ethannicholas50a8dd02016-02-10 05:40:46 -08001228 return result;
1229}
1230
Mike Reedc1f77742016-12-09 09:00:50 -05001231SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001232 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001233 fRRect = rrect;
1234 fOp = op;
1235 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001236}
1237
fmalita8c89c522014-11-08 16:18:56 -08001238void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001239 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001240}
1241
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001242bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001243 render_rrect(canvas, fRRect);
1244 return true;
1245}
1246
ethannicholasf62a8b72016-02-11 10:35:21 -08001247Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1248 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001249 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1250 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1251 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1252 return result;
1253}
1254
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001255SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001256 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001257 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001258}
1259
fmalita8c89c522014-11-08 16:18:56 -08001260void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001261 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001262}
1263
ethannicholasf62a8b72016-02-11 10:35:21 -08001264Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1265 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001266 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001267 return result;
1268}
1269
reed97660cc2016-06-28 18:54:19 -07001270////
1271
1272SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1273 sk_sp<SkData> value)
1274 : INHERITED(kDrawAnnotation_OpType)
1275 , fRect(rect)
1276 , fKey(key)
1277 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001278{
robertphillipsfb409232016-06-29 10:28:11 -07001279}
reed97660cc2016-06-28 18:54:19 -07001280
1281void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1282 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1283}
1284
1285Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1286 Json::Value result = INHERITED::toJSON(urlDataManager);
1287
1288 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1289 result["key"] = Json::Value(fKey.c_str());
1290 if (fValue.get()) {
1291 // TODO: dump out the "value"
1292 }
reed67f62fa2016-06-29 11:36:34 -07001293
1294 SkString desc;
1295 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1296 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1297
reed97660cc2016-06-28 18:54:19 -07001298 return result;
1299}
1300
reed97660cc2016-06-28 18:54:19 -07001301////
1302
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001303SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07001304 const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001305 : INHERITED(kDrawBitmap_OpType)
1306 , fBitmap(bitmap)
1307 , fLeft(left)
1308 , fTop(top)
1309 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001310
fmalita8c89c522014-11-08 16:18:56 -08001311void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001312 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001313}
1314
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001315bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001316 render_bitmap(canvas, fBitmap);
1317 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001318}
1319
ethannicholasf62a8b72016-02-11 10:35:21 -08001320Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
1321 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001322 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001323 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001324 Json::Value command(Json::objectValue);
1325 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001326 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
Brian Osman8363be12018-05-29 13:38:07 -04001327 if (fPaint.isValid()) {
1328 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001329 }
1330 }
1331 return result;
1332}
1333
Brian Osman78a76482018-05-18 16:59:13 -04001334SkDrawBitmapLatticeCommand::SkDrawBitmapLatticeCommand(const SkBitmap& bitmap,
1335 const SkCanvas::Lattice& lattice,
1336 const SkRect& dst, const SkPaint* paint)
1337 : INHERITED(kDrawBitmapLattice_OpType)
1338 , fBitmap(bitmap)
1339 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001340 , fDst(dst)
1341 , fPaint(paint) {}
Brian Osman78a76482018-05-18 16:59:13 -04001342
1343void SkDrawBitmapLatticeCommand::execute(SkCanvas* canvas) const {
1344 canvas->drawBitmapLattice(fBitmap, fLattice, fDst, fPaint.getMaybeNull());
1345}
1346
1347bool SkDrawBitmapLatticeCommand::render(SkCanvas* canvas) const {
1348 SkAutoCanvasRestore acr(canvas, true);
1349 canvas->clear(0xFFFFFFFF);
1350
1351 xlate_and_scale_to_bounds(canvas, fDst);
1352
1353 this->execute(canvas);
1354 return true;
1355}
1356
1357Json::Value SkDrawBitmapLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1358 Json::Value result = INHERITED::toJSON(urlDataManager);
1359 Json::Value encoded;
1360 if (flatten(fBitmap, &encoded, urlDataManager)) {
1361 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
1362 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1363 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1364 if (fPaint.isValid()) {
1365 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1366 }
1367 }
1368
1369 SkString desc;
1370 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1371
1372 return result;
1373}
1374
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001375SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00001376 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001377 : INHERITED(kDrawBitmapNine_OpType)
1378 , fBitmap(bitmap)
1379 , fCenter(center)
1380 , fDst(dst)
1381 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001382
fmalita8c89c522014-11-08 16:18:56 -08001383void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001384 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001385}
1386
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001387bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08001388 SkRect tmp = SkRect::Make(fCenter);
1389 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001390 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001391}
1392
ethannicholasf62a8b72016-02-11 10:35:21 -08001393Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1394 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001395 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001396 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001397 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08001398 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07001399 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001400 if (fPaint.isValid()) {
1401 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001402 }
1403 }
1404 return result;
1405}
1406
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001407SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00001408 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07001409 SkCanvas::SrcRectConstraint constraint)
Brian Osman8363be12018-05-29 13:38:07 -04001410 : INHERITED(kDrawBitmapRect_OpType)
1411 , fBitmap(bitmap)
1412 , fSrc(src)
1413 , fDst(dst)
1414 , fPaint(paint)
1415 , fConstraint(constraint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001416
fmalita8c89c522014-11-08 16:18:56 -08001417void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001418 canvas->legacy_drawBitmapRect(fBitmap, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
1419 fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001420}
1421
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001422bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001423 render_bitmap(canvas, fBitmap, fSrc.getMaybeNull());
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001424 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001425}
1426
ethannicholasf62a8b72016-02-11 10:35:21 -08001427Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1428 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001429 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001430 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001431 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
Brian Osman8363be12018-05-29 13:38:07 -04001432 if (fSrc.isValid()) {
1433 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001434 }
brianosmanfad98562016-05-04 11:06:28 -07001435 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001436 if (fPaint.isValid()) {
1437 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001438 }
1439 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1440 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1441 }
1442 }
reed67f62fa2016-06-29 11:36:34 -07001443
1444 SkString desc;
1445 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1446
ethannicholas50a8dd02016-02-10 05:40:46 -08001447 return result;
1448}
1449
fmalita651c9202015-07-22 10:23:01 -07001450SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
1451 const SkPaint* paint)
1452 : INHERITED(kDrawImage_OpType)
1453 , fImage(SkRef(image))
1454 , fLeft(left)
Brian Osman8363be12018-05-29 13:38:07 -04001455 , fTop(top)
1456 , fPaint(paint) {}
fmalita651c9202015-07-22 10:23:01 -07001457
1458void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001459 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07001460}
1461
1462bool SkDrawImageCommand::render(SkCanvas* canvas) const {
1463 SkAutoCanvasRestore acr(canvas, true);
1464 canvas->clear(0xFFFFFFFF);
1465
1466 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
1467 SkIntToScalar(fImage->width()),
1468 SkIntToScalar(fImage->height())));
1469 this->execute(canvas);
1470 return true;
1471}
1472
ethannicholasf62a8b72016-02-11 10:35:21 -08001473Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
1474 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001475 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001476 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001477 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001478 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08001479 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001480 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001481 }
msarett0ac1bec2016-08-29 09:15:33 -07001482
1483 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
1484 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
1485 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
1486 switch (fImage->alphaType()) {
1487 case kOpaque_SkAlphaType:
1488 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
1489 break;
1490 case kPremul_SkAlphaType:
1491 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
1492 break;
1493 case kUnpremul_SkAlphaType:
1494 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
1495 break;
1496 default:
1497 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
1498 break;
1499 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001500 }
1501 return result;
1502}
1503
Stan Ilievac42aeb2017-01-12 16:20:50 -05001504SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
1505 const SkCanvas::Lattice& lattice,
1506 const SkRect& dst, const SkPaint* paint)
1507 : INHERITED(kDrawImageLattice_OpType)
1508 , fImage(SkRef(image))
1509 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001510 , fDst(dst)
1511 , fPaint(paint) {}
Stan Ilievac42aeb2017-01-12 16:20:50 -05001512
1513void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
Brian Osman78a76482018-05-18 16:59:13 -04001514 canvas->drawImageLattice(fImage.get(), fLattice, fDst, fPaint.getMaybeNull());
Stan Ilievac42aeb2017-01-12 16:20:50 -05001515}
1516
1517bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
1518 SkAutoCanvasRestore acr(canvas, true);
1519 canvas->clear(0xFFFFFFFF);
1520
1521 xlate_and_scale_to_bounds(canvas, fDst);
1522
1523 this->execute(canvas);
1524 return true;
1525}
1526
1527Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1528 Json::Value result = INHERITED::toJSON(urlDataManager);
1529 Json::Value encoded;
1530 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001531 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
Stan Ilievac42aeb2017-01-12 16:20:50 -05001532 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1533 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1534 if (fPaint.isValid()) {
1535 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1536 }
1537 }
1538
1539 SkString desc;
1540 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1541
1542 return result;
1543}
1544
fmalita651c9202015-07-22 10:23:01 -07001545SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
1546 const SkRect& dst, const SkPaint* paint,
1547 SkCanvas::SrcRectConstraint constraint)
1548 : INHERITED(kDrawImageRect_OpType)
1549 , fImage(SkRef(image))
Brian Osman8363be12018-05-29 13:38:07 -04001550 , fSrc(src)
fmalita651c9202015-07-22 10:23:01 -07001551 , fDst(dst)
Brian Osman8363be12018-05-29 13:38:07 -04001552 , fPaint(paint)
1553 , fConstraint(constraint) {}
fmalita651c9202015-07-22 10:23:01 -07001554
1555void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001556 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
1557 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07001558}
1559
1560bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
1561 SkAutoCanvasRestore acr(canvas, true);
1562 canvas->clear(0xFFFFFFFF);
1563
1564 xlate_and_scale_to_bounds(canvas, fDst);
1565
1566 this->execute(canvas);
1567 return true;
1568}
1569
ethannicholasf62a8b72016-02-11 10:35:21 -08001570Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1571 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001572 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001573 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001574 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
ethannicholas50a8dd02016-02-10 05:40:46 -08001575 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001576 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001577 }
brianosmanfad98562016-05-04 11:06:28 -07001578 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08001579 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001580 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001581 }
1582 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1583 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1584 }
1585 }
reed67f62fa2016-06-29 11:36:34 -07001586
1587 SkString desc;
1588 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1589
ethannicholas50a8dd02016-02-10 05:40:46 -08001590 return result;
1591}
1592
Brian Osmanc25e2692018-03-12 10:57:28 -04001593SkDrawImageNineCommand::SkDrawImageNineCommand(const SkImage* image, const SkIRect& center,
1594 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001595 : INHERITED(kDrawImageNine_OpType)
1596 , fImage(SkRef(image))
1597 , fCenter(center)
1598 , fDst(dst)
1599 , fPaint(paint) {}
Brian Osmanc25e2692018-03-12 10:57:28 -04001600
1601void SkDrawImageNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001602 canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaint.getMaybeNull());
Brian Osmanc25e2692018-03-12 10:57:28 -04001603}
1604
1605bool SkDrawImageNineCommand::render(SkCanvas* canvas) const {
1606 SkAutoCanvasRestore acr(canvas, true);
1607 canvas->clear(0xFFFFFFFF);
1608
1609 xlate_and_scale_to_bounds(canvas, fDst);
1610
1611 this->execute(canvas);
1612 return true;
1613}
1614
1615Json::Value SkDrawImageNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1616 Json::Value result = INHERITED::toJSON(urlDataManager);
1617 Json::Value encoded;
1618 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
1619 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
1620 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
1621 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001622 if (fPaint.isValid()) {
1623 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
Brian Osmanc25e2692018-03-12 10:57:28 -04001624 }
1625 }
1626 return result;
1627}
1628
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001629SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001630 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001631 fOval = oval;
1632 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001633}
1634
fmalita8c89c522014-11-08 16:18:56 -08001635void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001636 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001637}
1638
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001639bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001640 canvas->clear(0xFFFFFFFF);
1641 canvas->save();
1642
1643 xlate_and_scale_to_bounds(canvas, fOval);
1644
1645 SkPaint p;
1646 p.setColor(SK_ColorBLACK);
1647 p.setStyle(SkPaint::kStroke_Style);
1648
1649 canvas->drawOval(fOval, p);
1650 canvas->restore();
1651
1652 return true;
1653}
1654
ethannicholasf62a8b72016-02-11 10:35:21 -08001655Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
1656 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001657 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1658 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001659 return result;
1660}
1661
bsalomonac3aa242016-08-19 11:25:19 -07001662SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
1663 bool useCenter, const SkPaint& paint)
Brian Osmanc25e2692018-03-12 10:57:28 -04001664 : INHERITED(kDrawArc_OpType) {
bsalomonac3aa242016-08-19 11:25:19 -07001665 fOval = oval;
1666 fStartAngle = startAngle;
1667 fSweepAngle = sweepAngle;
1668 fUseCenter = useCenter;
1669 fPaint = paint;
bsalomonac3aa242016-08-19 11:25:19 -07001670}
1671
1672void SkDrawArcCommand::execute(SkCanvas* canvas) const {
1673 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
1674}
1675
1676bool SkDrawArcCommand::render(SkCanvas* canvas) const {
1677 canvas->clear(0xFFFFFFFF);
1678 canvas->save();
1679
1680 xlate_and_scale_to_bounds(canvas, fOval);
1681
1682 SkPaint p;
1683 p.setColor(SK_ColorBLACK);
1684 p.setStyle(SkPaint::kStroke_Style);
1685
1686 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
1687 canvas->restore();
1688
1689 return true;
1690}
1691
1692Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
1693 Json::Value result = INHERITED::toJSON(urlDataManager);
1694 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1695 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
1696 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
1697 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
1698 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1699 return result;
1700}
1701
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001702SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001703 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001704 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001705}
1706
fmalita8c89c522014-11-08 16:18:56 -08001707void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001708 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001709}
1710
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001711bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001712 canvas->clear(0xFFFFFFFF);
1713 canvas->drawPaint(fPaint);
1714 return true;
1715}
1716
ethannicholasf62a8b72016-02-11 10:35:21 -08001717Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
1718 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001719 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001720 return result;
1721}
1722
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001723SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001724 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001725 fPath = path;
1726 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001727}
1728
fmalita8c89c522014-11-08 16:18:56 -08001729void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001730 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001731}
1732
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001733bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001734 render_path(canvas, fPath);
1735 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001736}
1737
ethannicholasf62a8b72016-02-11 10:35:21 -08001738Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1739 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001740 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
1741 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001742 return result;
1743}
1744
Brian Osmanc25e2692018-03-12 10:57:28 -04001745SkDrawRegionCommand::SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint)
1746 : INHERITED(kDrawRegion_OpType) {
1747 fRegion = region;
1748 fPaint = paint;
Brian Osmanc25e2692018-03-12 10:57:28 -04001749}
1750
1751void SkDrawRegionCommand::execute(SkCanvas* canvas) const {
1752 canvas->drawRegion(fRegion, fPaint);
1753}
1754
1755bool SkDrawRegionCommand::render(SkCanvas* canvas) const {
1756 render_region(canvas, fRegion);
1757 return true;
1758}
1759
1760Json::Value SkDrawRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1761 Json::Value result = INHERITED::toJSON(urlDataManager);
1762 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
1763 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1764 return result;
1765}
1766
fmalita160ebb22015-04-01 20:58:37 -07001767SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
1768 const SkMatrix* matrix,
1769 const SkPaint* paint)
1770 : INHERITED(kBeginDrawPicture_OpType)
Brian Osman8363be12018-05-29 13:38:07 -04001771 , fPicture(SkRef(picture))
1772 , fMatrix(matrix)
1773 , fPaint(paint) {}
fmalita160ebb22015-04-01 20:58:37 -07001774
1775void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
1776 if (fPaint.isValid()) {
1777 SkRect bounds = fPicture->cullRect();
1778 if (fMatrix.isValid()) {
1779 fMatrix.get()->mapRect(&bounds);
1780 }
1781 canvas->saveLayer(&bounds, fPaint.get());
1782 }
1783
1784 if (fMatrix.isValid()) {
1785 if (!fPaint.isValid()) {
1786 canvas->save();
1787 }
1788 canvas->concat(*fMatrix.get());
1789 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001790}
1791
fmalita160ebb22015-04-01 20:58:37 -07001792bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001793 canvas->clear(0xFFFFFFFF);
1794 canvas->save();
1795
robertphillipsa8d7f0b2014-08-29 08:03:56 -07001796 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001797
robertphillips9b14f262014-06-04 05:40:44 -07001798 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001799
1800 canvas->restore();
1801
1802 return true;
1803}
1804
fmalita160ebb22015-04-01 20:58:37 -07001805SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
1806 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
1807
1808void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
1809 if (fRestore) {
1810 canvas->restore();
1811 }
1812}
1813
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001814SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001815 const SkPoint pts[], const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04001816 : INHERITED(kDrawPoints_OpType)
1817 , fMode(mode)
1818 , fPts(pts, count)
1819 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001820
fmalita8c89c522014-11-08 16:18:56 -08001821void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001822 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001823}
1824
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001825bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001826 canvas->clear(0xFFFFFFFF);
1827 canvas->save();
1828
1829 SkRect bounds;
1830
1831 bounds.setEmpty();
Brian Osman8363be12018-05-29 13:38:07 -04001832 for (int i = 0; i < fPts.count(); ++i) {
Mike Reed185ffe92018-01-08 17:09:54 -05001833 SkRectPriv::GrowToInclude(&bounds, fPts[i]);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001834 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00001835
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001836 xlate_and_scale_to_bounds(canvas, bounds);
1837
1838 SkPaint p;
1839 p.setColor(SK_ColorBLACK);
1840 p.setStyle(SkPaint::kStroke_Style);
1841
Brian Osman8363be12018-05-29 13:38:07 -04001842 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001843 canvas->restore();
1844
1845 return true;
1846}
1847
ethannicholasf62a8b72016-02-11 10:35:21 -08001848Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
1849 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001850 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
1851 Json::Value points(Json::arrayValue);
Brian Osman8363be12018-05-29 13:38:07 -04001852 for (int i = 0; i < fPts.count(); i++) {
brianosmanfad98562016-05-04 11:06:28 -07001853 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001854 }
1855 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07001856 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001857 return result;
1858}
1859
Brian Osman65197ff2018-05-29 14:25:39 -04001860static Json::Value make_json_text(sk_sp<SkData> text) {
1861 return Json::Value((const char*)text->data(), (const char*)text->data() + text->size());
chudy@google.com902ebe52012-06-29 14:21:22 +00001862}
1863
Brian Osman65197ff2018-05-29 14:25:39 -04001864SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength,
1865 const SkPoint pos[], const SkPaint& paint)
1866 : INHERITED(kDrawPosText_OpType)
1867 , fText(SkData::MakeWithCopy(text, byteLength))
1868 , fPos(pos, paint.countText(text, byteLength))
1869 , fPaint(paint) {}
1870
fmalita8c89c522014-11-08 16:18:56 -08001871void SkDrawPosTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001872 canvas->drawPosText(fText->data(), fText->size(), fPos.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001873}
1874
ethannicholasf62a8b72016-02-11 10:35:21 -08001875Json::Value SkDrawPosTextCommand::toJSON(UrlDataManager& urlDataManager) const {
1876 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001877 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08001878 Json::Value coords(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001879 size_t numCoords = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001880 for (size_t i = 0; i < numCoords; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001881 coords.append(MakeJsonPoint(fPos[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001882 }
1883 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = coords;
brianosmanfad98562016-05-04 11:06:28 -07001884 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001885 return result;
1886}
1887
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001888SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength,
1889 const SkScalar xpos[], SkScalar constY,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001890 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04001891 : INHERITED(kDrawPosTextH_OpType)
1892 , fText(SkData::MakeWithCopy(text, byteLength))
1893 , fXpos(xpos, paint.countText(text, byteLength))
1894 , fConstY(constY)
1895 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001896
fmalita8c89c522014-11-08 16:18:56 -08001897void SkDrawPosTextHCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001898 canvas->drawPosTextH(fText->data(), fText->size(), fXpos.begin(), fConstY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001899}
1900
bungeman51190df2016-03-09 07:42:54 -08001901Json::Value SkDrawPosTextHCommand::toJSON(UrlDataManager& urlDataManager) const {
1902 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001903 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
bungeman51190df2016-03-09 07:42:54 -08001904 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fConstY);
1905 Json::Value xpos(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001906 size_t numXpos = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001907 for (size_t i = 0; i < numXpos; i++) {
1908 xpos.append(Json::Value(fXpos[i]));
1909 }
1910 result[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = xpos;
brianosmanfad98562016-05-04 11:06:28 -07001911 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
bungeman51190df2016-03-09 07:42:54 -08001912 return result;
1913}
1914
fmalita37283c22016-09-13 10:00:23 -07001915SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07001916 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001917 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07001918 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07001919 , fXPos(x)
1920 , fYPos(y)
Brian Osman255735e2018-04-06 14:51:42 -04001921 , fPaint(paint) {}
fmalitab7425172014-08-26 07:56:44 -07001922
fmalita8c89c522014-11-08 16:18:56 -08001923void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07001924 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1925}
1926
fmalita55773872014-08-29 15:08:20 -07001927bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
1928 canvas->clear(SK_ColorWHITE);
1929 canvas->save();
1930
1931 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
1932 xlate_and_scale_to_bounds(canvas, bounds);
1933
fmalita37283c22016-09-13 10:00:23 -07001934 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07001935
1936 canvas->restore();
1937
1938 return true;
1939}
1940
ethannicholasf62a8b72016-02-11 10:35:21 -08001941Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
1942 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001943 Json::Value runs(Json::arrayValue);
1944 SkTextBlobRunIterator iter(fBlob.get());
1945 while (!iter.done()) {
1946 Json::Value run(Json::objectValue);
1947 Json::Value jsonPositions(Json::arrayValue);
1948 Json::Value jsonGlyphs(Json::arrayValue);
1949 const SkScalar* iterPositions = iter.pos();
1950 const uint16_t* iterGlyphs = iter.glyphs();
1951 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1952 switch (iter.positioning()) {
1953 case SkTextBlob::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07001954 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
1955 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001956 break;
1957 case SkTextBlob::kHorizontal_Positioning:
1958 jsonPositions.append(Json::Value(iterPositions[i]));
1959 break;
1960 case SkTextBlob::kDefault_Positioning:
1961 break;
1962 }
1963 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
1964 }
1965 if (iter.positioning() != SkTextBlob::kDefault_Positioning) {
1966 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
1967 }
1968 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
1969 SkPaint fontPaint;
1970 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07001971 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
1972 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08001973 runs.append(run);
1974 iter.next();
1975 }
reed6d2c3e72016-07-07 14:10:14 -07001976 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08001977 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
1978 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
1979 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07001980 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07001981 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07001982
1983 SkString desc;
1984 // make the bounds local by applying the x,y
1985 bounds.offset(fXPos, fYPos);
1986 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
1987
ethannicholas50a8dd02016-02-10 05:40:46 -08001988 return result;
1989}
1990
robertphillips9bafc302015-02-13 11:13:00 -08001991SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04001992 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08001993 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04001994 : INHERITED(kDrawPatch_OpType)
1995 , fBlendMode(bmode)
1996{
robertphillips9bafc302015-02-13 11:13:00 -08001997 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08001998 if (colors != nullptr) {
1999 memcpy(fColors, colors, sizeof(fColors));
2000 fColorsPtr = fColors;
2001 } else {
2002 fColorsPtr = nullptr;
2003 }
2004 if (texCoords != nullptr) {
2005 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
2006 fTexCoordsPtr = fTexCoords;
2007 } else {
2008 fTexCoordsPtr = nullptr;
2009 }
robertphillips9bafc302015-02-13 11:13:00 -08002010 fPaint = paint;
robertphillips9bafc302015-02-13 11:13:00 -08002011}
2012
2013void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04002014 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08002015}
2016
ethannicholasf62a8b72016-02-11 10:35:21 -08002017Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
2018 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08002019 Json::Value cubics = Json::Value(Json::arrayValue);
2020 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002021 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08002022 }
2023 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
2024 if (fColorsPtr != nullptr) {
2025 Json::Value colors = Json::Value(Json::arrayValue);
2026 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002027 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08002028 }
2029 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
2030 }
2031 if (fTexCoordsPtr != nullptr) {
2032 Json::Value texCoords = Json::Value(Json::arrayValue);
2033 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002034 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08002035 }
2036 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
2037 }
Mike Reed7d954ad2016-10-28 15:42:34 -04002038 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08002039 return result;
2040}
2041
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002042SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002043 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002044 fRect = rect;
2045 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002046}
2047
fmalita8c89c522014-11-08 16:18:56 -08002048void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002049 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002050}
2051
ethannicholasf62a8b72016-02-11 10:35:21 -08002052Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2053 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002054 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
2055 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07002056
2057 SkString desc;
2058 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
2059
ethannicholas50a8dd02016-02-10 05:40:46 -08002060 return result;
2061}
2062
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002063SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002064 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002065 fRRect = rrect;
2066 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00002067}
2068
fmalita8c89c522014-11-08 16:18:56 -08002069void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00002070 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00002071}
2072
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002073bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002074 render_rrect(canvas, fRRect);
2075 return true;
2076}
2077
ethannicholasf62a8b72016-02-11 10:35:21 -08002078Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2079 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002080 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07002081 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002082 return result;
2083}
2084
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00002085SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002086 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002087 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002088 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002089 fOuter = outer;
2090 fInner = inner;
2091 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002092}
2093
fmalita8c89c522014-11-08 16:18:56 -08002094void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002095 canvas->drawDRRect(fOuter, fInner, fPaint);
2096}
2097
2098bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
2099 render_drrect(canvas, fOuter, fInner);
2100 return true;
2101}
2102
ethannicholasf62a8b72016-02-11 10:35:21 -08002103Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2104 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002105 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
2106 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07002107 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002108 return result;
2109}
2110
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04002111SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
2112 : INHERITED(kDrawShadow_OpType) {
2113 fPath = path;
2114 fShadowRec = rec;
2115}
2116
2117void SkDrawShadowCommand::execute(SkCanvas* canvas) const {
2118 canvas->private_draw_shadow_rec(fPath, fShadowRec);
2119}
2120
2121bool SkDrawShadowCommand::render(SkCanvas* canvas) const {
2122 render_shadow(canvas, fPath, fShadowRec);
2123 return true;
2124}
2125
2126Json::Value SkDrawShadowCommand::toJSON(UrlDataManager& urlDataManager) const {
2127 Json::Value result = INHERITED::toJSON(urlDataManager);
2128 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2129
2130 bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
2131 bool transparentOccluder =
2132 SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
2133
2134 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2135 result[SKDEBUGCANVAS_ATTRIBUTE_ZPLANE] = MakeJsonPoint3(fShadowRec.fZPlaneParams);
2136 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION] = MakeJsonPoint3(fShadowRec.fLightPos);
2137 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS] = MakeJsonScalar(fShadowRec.fLightRadius);
2138 result[SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR] = MakeJsonColor(fShadowRec.fAmbientColor);
2139 result[SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR] = MakeJsonColor(fShadowRec.fSpotColor);
2140 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
2141 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
2142 return result;
2143}
2144
Brian Osmanc7611082018-05-29 14:55:50 -04002145///////////////////////////////////////////////////////////////////////////////////////////////////
2146
2147SkDrawDrawableCommand::SkDrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
2148 : INHERITED(kDrawDrawable_OpType)
2149 , fDrawable(SkRef(drawable))
2150 , fMatrix(matrix) {}
2151
2152void SkDrawDrawableCommand::execute(SkCanvas* canvas) const {
2153 canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
2154}
2155
2156///////////////////////////////////////////////////////////////////////////////////////////////////
2157
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002158SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002159 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04002160 : INHERITED(kDrawText_OpType)
2161 , fText(SkData::MakeWithCopy(text, byteLength))
2162 , fX(x)
2163 , fY(y)
2164 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002165
fmalita8c89c522014-11-08 16:18:56 -08002166void SkDrawTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002167 canvas->drawText(fText->data(), fText->size(), fX, fY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002168}
2169
ethannicholasf62a8b72016-02-11 10:35:21 -08002170Json::Value SkDrawTextCommand::toJSON(UrlDataManager& urlDataManager) const {
2171 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002172 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08002173 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07002174 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fX, fY);
2175 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002176 return result;
2177}
2178
reed45561a02016-07-07 12:47:17 -07002179///////////////////////////////////////////////////////////////////////////////////////////////////
2180
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002181SkDrawTextOnPathCommand::SkDrawTextOnPathCommand(const void* text, size_t byteLength,
2182 const SkPath& path, const SkMatrix* matrix,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002183 const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04002184 : INHERITED(kDrawTextOnPath_OpType)
Brian Osman65197ff2018-05-29 14:25:39 -04002185 , fText(SkData::MakeWithCopy(text, byteLength))
2186 , fPath(path)
2187 , fMatrix(matrix)
2188 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002189
fmalita8c89c522014-11-08 16:18:56 -08002190void SkDrawTextOnPathCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002191 canvas->drawTextOnPath(fText->data(), fText->size(), fPath, fMatrix.getMaybeNull(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002192}
2193
ethannicholasf62a8b72016-02-11 10:35:21 -08002194Json::Value SkDrawTextOnPathCommand::toJSON(UrlDataManager& urlDataManager) const {
2195 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002196 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08002197 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07002198 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
Brian Osman8363be12018-05-29 13:38:07 -04002199 if (fMatrix.isValid()) {
2200 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(*fMatrix.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002201 }
brianosmanfad98562016-05-04 11:06:28 -07002202 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002203 return result;
2204}
2205
reed45561a02016-07-07 12:47:17 -07002206///////////////////////////////////////////////////////////////////////////////////////////////////
2207
2208SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength,
2209 const SkRSXform xform[], const SkRect* cull,
2210 const SkPaint& paint)
reed63f30d92016-07-07 16:32:51 -07002211 : INHERITED(kDrawTextRSXform_OpType)
Brian Osman65197ff2018-05-29 14:25:39 -04002212 , fText(SkData::MakeWithCopy(text, byteLength))
2213 , fXform(xform, paint.countText(text, byteLength))
Brian Osman8363be12018-05-29 13:38:07 -04002214 , fCull(cull)
Brian Osman65197ff2018-05-29 14:25:39 -04002215 , fPaint(paint) {}
reed45561a02016-07-07 12:47:17 -07002216
2217void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002218 canvas->drawTextRSXform(fText->data(), fText->size(), fXform.begin(), fCull.getMaybeNull(),
2219 fPaint);
reed45561a02016-07-07 12:47:17 -07002220}
2221
2222Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) const {
2223 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002224 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
reed45561a02016-07-07 12:47:17 -07002225 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
2226 return result;
2227}
2228
reed45561a02016-07-07 12:47:17 -07002229///////////////////////////////////////////////////////////////////////////////////////////////////
2230
Mike Reedfed9cfd2017-03-17 12:09:04 -04002231SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002232 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04002233 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04002234 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04002235 , fBlendMode(bmode)
Brian Osman255735e2018-04-06 14:51:42 -04002236 , fPaint(paint) {}
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002237
fmalita8c89c522014-11-08 16:18:56 -08002238void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04002239 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002240}
2241
Brian Osman616f1cb2018-05-29 11:23:35 -04002242///////////////////////////////////////////////////////////////////////////////////////////////////
2243
2244SkDrawAtlasCommand::SkDrawAtlasCommand(const SkImage* image, const SkRSXform xform[],
2245 const SkRect tex[], const SkColor colors[], int count,
2246 SkBlendMode bmode, const SkRect* cull,
2247 const SkPaint* paint)
2248 : INHERITED(kDrawAtlas_OpType)
2249 , fImage(SkRef(image))
2250 , fXform(xform, count)
2251 , fTex(tex, count)
2252 , fColors(colors, colors ? count : 0)
2253 , fBlendMode(bmode)
2254 , fCull(cull)
2255 , fPaint(paint) {}
2256
2257void SkDrawAtlasCommand::execute(SkCanvas* canvas) const {
2258 canvas->drawAtlas(fImage.get(), fXform.begin(), fTex.begin(),
2259 fColors.isEmpty() ? nullptr : fColors.begin(), fXform.count(), fBlendMode,
2260 fCull.getMaybeNull(), fPaint.getMaybeNull());
2261}
2262
2263///////////////////////////////////////////////////////////////////////////////////////////////////
2264
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002265SkRestoreCommand::SkRestoreCommand()
Brian Osman255735e2018-04-06 14:51:42 -04002266 : INHERITED(kRestore_OpType) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002267
fmalita8c89c522014-11-08 16:18:56 -08002268void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00002269 canvas->restore();
2270}
2271
Florin Malita5f6102d2014-06-30 10:13:28 -04002272SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08002273 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00002274}
2275
fmalita8c89c522014-11-08 16:18:56 -08002276void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04002277 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00002278}
2279
reed4960eee2015-12-18 07:09:18 -08002280SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
Brian Osman8363be12018-05-29 13:38:07 -04002281 : INHERITED(kSaveLayer_OpType)
2282 , fBounds(rec.fBounds)
2283 , fPaint(rec.fPaint)
2284 , fBackdrop(SkSafeRef(rec.fBackdrop))
2285 , fSaveLayerFlags(rec.fSaveLayerFlags) {}
ethannicholas50a8dd02016-02-10 05:40:46 -08002286
fmalita8c89c522014-11-08 16:18:56 -08002287void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04002288 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(),
reed4960eee2015-12-18 07:09:18 -08002289 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00002290}
2291
ethannicholasf62a8b72016-02-11 10:35:21 -08002292Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
2293 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman8363be12018-05-29 13:38:07 -04002294 if (fBounds.isValid()) {
2295 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(*fBounds.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002296 }
Brian Osman8363be12018-05-29 13:38:07 -04002297 if (fPaint.isValid()) {
2298 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002299 }
2300 if (fBackdrop != nullptr) {
2301 Json::Value jsonBackdrop;
Brian Osman8363be12018-05-29 13:38:07 -04002302 flatten(fBackdrop.get(), &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002303 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
2304 }
2305 if (fSaveLayerFlags != 0) {
2306 SkDebugf("unsupported: saveLayer flags\n");
2307 SkASSERT(false);
2308 }
2309 return result;
2310}
2311
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002312SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08002313 : INHERITED(kSetMatrix_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002314 fMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -07002315}
2316
fmalita8c89c522014-11-08 16:18:56 -08002317void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
Brian Osman255735e2018-04-06 14:51:42 -04002318 canvas->setMatrix(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00002319}
2320
ethannicholasf62a8b72016-02-11 10:35:21 -08002321Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
2322 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08002323 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08002324 return result;
2325}