blob: 27b2009bb803a96d748cd9f351aa0edba987b35e [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"
Florin Malitaab54e732018-07-27 09:47:15 -040024#include "SkTextBlobPriv.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080025#include "SkTHash.h"
26#include "SkTypeface.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080027#include "SkWriteBuffer.h"
msaretta5cf4f42016-06-30 10:06:51 -070028#include "picture_utils.h"
Mike Reedebfce6d2016-12-12 10:02:12 -050029#include "SkClipOpPriv.h"
Stan Ilievac42aeb2017-01-12 16:20:50 -050030#include <SkLatticeIter.h>
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -040031#include <SkShadowFlags.h>
ethannicholas50a8dd02016-02-10 05:40:46 -080032
ethannicholas50a8dd02016-02-10 05:40:46 -080033#define SKDEBUGCANVAS_ATTRIBUTE_COMMAND "command"
ethannicholas807dcab2016-02-23 06:53:37 -080034#define SKDEBUGCANVAS_ATTRIBUTE_VISIBLE "visible"
ethannicholas50a8dd02016-02-10 05:40:46 -080035#define SKDEBUGCANVAS_ATTRIBUTE_MATRIX "matrix"
vjiaoblacke5de1302016-07-13 14:05:28 -070036#define SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS "drawDepthTranslation"
ethannicholas50a8dd02016-02-10 05:40:46 -080037#define SKDEBUGCANVAS_ATTRIBUTE_COORDS "coords"
halcanaryf412f092016-08-25 11:10:41 -070038#define SKDEBUGCANVAS_ATTRIBUTE_HINTING "hinting"
ethannicholas50a8dd02016-02-10 05:40:46 -080039#define SKDEBUGCANVAS_ATTRIBUTE_BOUNDS "bounds"
40#define SKDEBUGCANVAS_ATTRIBUTE_PAINT "paint"
41#define SKDEBUGCANVAS_ATTRIBUTE_OUTER "outer"
42#define SKDEBUGCANVAS_ATTRIBUTE_INNER "inner"
43#define SKDEBUGCANVAS_ATTRIBUTE_MODE "mode"
44#define SKDEBUGCANVAS_ATTRIBUTE_POINTS "points"
45#define SKDEBUGCANVAS_ATTRIBUTE_PATH "path"
46#define SKDEBUGCANVAS_ATTRIBUTE_TEXT "text"
47#define SKDEBUGCANVAS_ATTRIBUTE_COLOR "color"
48#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Florin Malita82d80872017-06-06 16:58:40 -040049#define SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE "blendMode"
ethannicholas50a8dd02016-02-10 05:40:46 -080050#define SKDEBUGCANVAS_ATTRIBUTE_STYLE "style"
51#define SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH "strokeWidth"
52#define SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER "strokeMiter"
ethannicholas1446a9a2016-02-10 14:05:02 -080053#define SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN "strokeJoin"
ethannicholas50a8dd02016-02-10 05:40:46 -080054#define SKDEBUGCANVAS_ATTRIBUTE_CAP "cap"
55#define SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS "antiAlias"
ethannicholas1446a9a2016-02-10 14:05:02 -080056#define SKDEBUGCANVAS_ATTRIBUTE_DITHER "dither"
Ben Wagner78f1f5a2017-06-23 14:35:07 -040057#define SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT "fakeBoldText"
58#define SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT "linearText"
59#define SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT "subpixelText"
60#define SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT "devKernText"
61#define SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT "lcdRenderText"
62#define SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT "embeddedBitmapText"
63#define SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING "forceAutoHinting"
64#define SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT "verticalText"
ethannicholas50a8dd02016-02-10 05:40:46 -080065#define SKDEBUGCANVAS_ATTRIBUTE_REGION "region"
66#define SKDEBUGCANVAS_ATTRIBUTE_REGIONOP "op"
67#define SKDEBUGCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle"
68#define SKDEBUGCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion"
69#define SKDEBUGCANVAS_ATTRIBUTE_BLUR "blur"
70#define SKDEBUGCANVAS_ATTRIBUTE_SIGMA "sigma"
71#define SKDEBUGCANVAS_ATTRIBUTE_QUALITY "quality"
72#define SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN "textAlign"
73#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE "textSize"
74#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX"
75#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX"
76#define SKDEBUGCANVAS_ATTRIBUTE_DASHING "dashing"
77#define SKDEBUGCANVAS_ATTRIBUTE_INTERVALS "intervals"
78#define SKDEBUGCANVAS_ATTRIBUTE_PHASE "phase"
79#define SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE "fillType"
80#define SKDEBUGCANVAS_ATTRIBUTE_VERBS "verbs"
81#define SKDEBUGCANVAS_ATTRIBUTE_NAME "name"
ethannicholasf62a8b72016-02-11 10:35:21 -080082#define SKDEBUGCANVAS_ATTRIBUTE_DATA "data"
brianosmanfad98562016-05-04 11:06:28 -070083#define SKDEBUGCANVAS_ATTRIBUTE_VALUES "values"
ethannicholas50a8dd02016-02-10 05:40:46 -080084#define SKDEBUGCANVAS_ATTRIBUTE_SHADER "shader"
85#define SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect"
86#define SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER "maskFilter"
87#define SKDEBUGCANVAS_ATTRIBUTE_XFERMODE "xfermode"
ethannicholas1446a9a2016-02-10 14:05:02 -080088#define SKDEBUGCANVAS_ATTRIBUTE_LOOPER "looper"
ethannicholas50a8dd02016-02-10 05:40:46 -080089#define SKDEBUGCANVAS_ATTRIBUTE_BACKDROP "backdrop"
90#define SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER "colorfilter"
91#define SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter"
92#define SKDEBUGCANVAS_ATTRIBUTE_IMAGE "image"
93#define SKDEBUGCANVAS_ATTRIBUTE_BITMAP "bitmap"
94#define SKDEBUGCANVAS_ATTRIBUTE_SRC "src"
95#define SKDEBUGCANVAS_ATTRIBUTE_DST "dst"
96#define SKDEBUGCANVAS_ATTRIBUTE_CENTER "center"
97#define SKDEBUGCANVAS_ATTRIBUTE_STRICT "strict"
98#define SKDEBUGCANVAS_ATTRIBUTE_DESCRIPTION "description"
99#define SKDEBUGCANVAS_ATTRIBUTE_X "x"
100#define SKDEBUGCANVAS_ATTRIBUTE_Y "y"
101#define SKDEBUGCANVAS_ATTRIBUTE_RUNS "runs"
102#define SKDEBUGCANVAS_ATTRIBUTE_POSITIONS "positions"
103#define SKDEBUGCANVAS_ATTRIBUTE_GLYPHS "glyphs"
104#define SKDEBUGCANVAS_ATTRIBUTE_FONT "font"
105#define SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE "typeface"
ethannicholas1446a9a2016-02-10 14:05:02 -0800106#define SKDEBUGCANVAS_ATTRIBUTE_CUBICS "cubics"
107#define SKDEBUGCANVAS_ATTRIBUTE_COLORS "colors"
108#define SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS "textureCoords"
109#define SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY "filterQuality"
bsalomonac3aa242016-08-19 11:25:19 -0700110#define SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE "startAngle"
111#define SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE "sweepAngle"
112#define SKDEBUGCANVAS_ATTRIBUTE_USECENTER "useCenter"
jcgregorioee0c5552016-06-30 09:18:27 -0700113#define SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC "shortDesc"
msarett0ac1bec2016-08-29 09:15:33 -0700114#define SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID "uniqueID"
115#define SKDEBUGCANVAS_ATTRIBUTE_WIDTH "width"
116#define SKDEBUGCANVAS_ATTRIBUTE_HEIGHT "height"
117#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Stan Ilievac42aeb2017-01-12 16:20:50 -0500118#define SKDEBUGCANVAS_ATTRIBUTE_LATTICE "lattice"
119#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT "xCount"
120#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT "yCount"
121#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS "xDivs"
122#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS "yDivs"
123#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS "flags"
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400124#define SKDEBUGCANVAS_ATTRIBUTE_ZPLANE "zPlane"
125#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION "lightPositions"
126#define SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR "ambientColor"
127#define SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR "spotColor"
128#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS "lightRadius"
reed67f62fa2016-06-29 11:36:34 -0700129
ethannicholas50a8dd02016-02-10 05:40:46 -0800130#define SKDEBUGCANVAS_VERB_MOVE "move"
131#define SKDEBUGCANVAS_VERB_LINE "line"
132#define SKDEBUGCANVAS_VERB_QUAD "quad"
133#define SKDEBUGCANVAS_VERB_CUBIC "cubic"
134#define SKDEBUGCANVAS_VERB_CONIC "conic"
135#define SKDEBUGCANVAS_VERB_CLOSE "close"
136
137#define SKDEBUGCANVAS_STYLE_FILL "fill"
138#define SKDEBUGCANVAS_STYLE_STROKE "stroke"
139#define SKDEBUGCANVAS_STYLE_STROKEANDFILL "strokeAndFill"
140
141#define SKDEBUGCANVAS_POINTMODE_POINTS "points"
142#define SKDEBUGCANVAS_POINTMODE_LINES "lines"
143#define SKDEBUGCANVAS_POINTMODE_POLYGON "polygon"
144
145#define SKDEBUGCANVAS_REGIONOP_DIFFERENCE "difference"
146#define SKDEBUGCANVAS_REGIONOP_INTERSECT "intersect"
147#define SKDEBUGCANVAS_REGIONOP_UNION "union"
148#define SKDEBUGCANVAS_REGIONOP_XOR "xor"
149#define SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE "reverseDifference"
150#define SKDEBUGCANVAS_REGIONOP_REPLACE "replace"
151
152#define SKDEBUGCANVAS_BLURSTYLE_NORMAL "normal"
153#define SKDEBUGCANVAS_BLURSTYLE_SOLID "solid"
154#define SKDEBUGCANVAS_BLURSTYLE_OUTER "outer"
155#define SKDEBUGCANVAS_BLURSTYLE_INNER "inner"
156
157#define SKDEBUGCANVAS_BLURQUALITY_LOW "low"
158#define SKDEBUGCANVAS_BLURQUALITY_HIGH "high"
159
160#define SKDEBUGCANVAS_ALIGN_LEFT "left"
161#define SKDEBUGCANVAS_ALIGN_CENTER "center"
162#define SKDEBUGCANVAS_ALIGN_RIGHT "right"
163
164#define SKDEBUGCANVAS_FILLTYPE_WINDING "winding"
165#define SKDEBUGCANVAS_FILLTYPE_EVENODD "evenOdd"
166#define SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding"
167#define SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd"
168
169#define SKDEBUGCANVAS_CAP_BUTT "butt"
170#define SKDEBUGCANVAS_CAP_ROUND "round"
171#define SKDEBUGCANVAS_CAP_SQUARE "square"
172
ethannicholas1446a9a2016-02-10 14:05:02 -0800173#define SKDEBUGCANVAS_MITER_JOIN "miter"
174#define SKDEBUGCANVAS_ROUND_JOIN "round"
175#define SKDEBUGCANVAS_BEVEL_JOIN "bevel"
176
ethannicholas50a8dd02016-02-10 05:40:46 -0800177#define SKDEBUGCANVAS_COLORTYPE_ARGB4444 "ARGB4444"
178#define SKDEBUGCANVAS_COLORTYPE_RGBA8888 "RGBA8888"
179#define SKDEBUGCANVAS_COLORTYPE_BGRA8888 "BGRA8888"
180#define SKDEBUGCANVAS_COLORTYPE_565 "565"
181#define SKDEBUGCANVAS_COLORTYPE_GRAY8 "Gray8"
182#define SKDEBUGCANVAS_COLORTYPE_INDEX8 "Index8"
183#define SKDEBUGCANVAS_COLORTYPE_ALPHA8 "Alpha8"
184
185#define SKDEBUGCANVAS_ALPHATYPE_OPAQUE "opaque"
186#define SKDEBUGCANVAS_ALPHATYPE_PREMUL "premul"
187#define SKDEBUGCANVAS_ALPHATYPE_UNPREMUL "unpremul"
msarett0ac1bec2016-08-29 09:15:33 -0700188#define SKDEBUGCANVAS_ALPHATYPE_UNKNOWN "unknown"
ethannicholas50a8dd02016-02-10 05:40:46 -0800189
ethannicholas1446a9a2016-02-10 14:05:02 -0800190#define SKDEBUGCANVAS_FILTERQUALITY_NONE "none"
191#define SKDEBUGCANVAS_FILTERQUALITY_LOW "low"
192#define SKDEBUGCANVAS_FILTERQUALITY_MEDIUM "medium"
193#define SKDEBUGCANVAS_FILTERQUALITY_HIGH "high"
194
halcanaryf412f092016-08-25 11:10:41 -0700195#define SKDEBUGCANVAS_HINTING_NONE "none"
196#define SKDEBUGCANVAS_HINTING_SLIGHT "slight"
197#define SKDEBUGCANVAS_HINTING_NORMAL "normal"
198#define SKDEBUGCANVAS_HINTING_FULL "full"
199
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400200#define SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC "transparentOccluder"
201#define SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY "geometricOnly"
202
reed67f62fa2016-06-29 11:36:34 -0700203static SkString* str_append(SkString* str, const SkRect& r) {
204 str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom());
205 return str;
206}
207
robertphillips9bafc302015-02-13 11:13:00 -0800208SkDrawCommand::SkDrawCommand(OpType type)
209 : fOpType(type)
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000210 , fVisible(true) {
211}
212
robertphillips9bafc302015-02-13 11:13:00 -0800213const char* SkDrawCommand::GetCommandString(OpType type) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000214 switch (type) {
fmalita160ebb22015-04-01 20:58:37 -0700215 case kBeginDrawPicture_OpType: return "BeginDrawPicture";
Brian Osmanc25e2692018-03-12 10:57:28 -0400216 case kClear_OpType: return "DrawClear";
robertphillips9bafc302015-02-13 11:13:00 -0800217 case kClipPath_OpType: return "ClipPath";
218 case kClipRegion_OpType: return "ClipRegion";
219 case kClipRect_OpType: return "ClipRect";
220 case kClipRRect_OpType: return "ClipRRect";
robertphillips9bafc302015-02-13 11:13:00 -0800221 case kConcat_OpType: return "Concat";
robertphillipsfb409232016-06-29 10:28:11 -0700222 case kDrawAnnotation_OpType: return "DrawAnnotation";
robertphillips9bafc302015-02-13 11:13:00 -0800223 case kDrawBitmap_OpType: return "DrawBitmap";
Brian Osman78a76482018-05-18 16:59:13 -0400224 case kDrawBitmapLattice_OpType: return "DrawBitmapLattice";
robertphillips9bafc302015-02-13 11:13:00 -0800225 case kDrawBitmapNine_OpType: return "DrawBitmapNine";
226 case kDrawBitmapRect_OpType: return "DrawBitmapRect";
robertphillips9bafc302015-02-13 11:13:00 -0800227 case kDrawDRRect_OpType: return "DrawDRRect";
fmalita651c9202015-07-22 10:23:01 -0700228 case kDrawImage_OpType: return "DrawImage";
Stan Ilievac42aeb2017-01-12 16:20:50 -0500229 case kDrawImageLattice_OpType: return "DrawImageLattice";
Brian Osmanc25e2692018-03-12 10:57:28 -0400230 case kDrawImageNine_OpType: return "DrawImageNine";
fmalita651c9202015-07-22 10:23:01 -0700231 case kDrawImageRect_OpType: return "DrawImageRect";
robertphillips9bafc302015-02-13 11:13:00 -0800232 case kDrawOval_OpType: return "DrawOval";
233 case kDrawPaint_OpType: return "DrawPaint";
234 case kDrawPatch_OpType: return "DrawPatch";
235 case kDrawPath_OpType: return "DrawPath";
Brian Osmanc25e2692018-03-12 10:57:28 -0400236 case kDrawArc_OpType: return "DrawArc";
robertphillips9bafc302015-02-13 11:13:00 -0800237 case kDrawPoints_OpType: return "DrawPoints";
238 case kDrawPosText_OpType: return "DrawPosText";
239 case kDrawPosTextH_OpType: return "DrawPosTextH";
240 case kDrawRect_OpType: return "DrawRect";
241 case kDrawRRect_OpType: return "DrawRRect";
Brian Osmanc25e2692018-03-12 10:57:28 -0400242 case kDrawRegion_OpType: return "DrawRegion";
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400243 case kDrawShadow_OpType: return "DrawShadow";
robertphillips9bafc302015-02-13 11:13:00 -0800244 case kDrawText_OpType: return "DrawText";
245 case kDrawTextBlob_OpType: return "DrawTextBlob";
246 case kDrawTextOnPath_OpType: return "DrawTextOnPath";
reed63f30d92016-07-07 16:32:51 -0700247 case kDrawTextRSXform_OpType: return "DrawTextRSXform";
robertphillips9bafc302015-02-13 11:13:00 -0800248 case kDrawVertices_OpType: return "DrawVertices";
Brian Osman616f1cb2018-05-29 11:23:35 -0400249 case kDrawAtlas_OpType: return "DrawAtlas";
Brian Osmanc7611082018-05-29 14:55:50 -0400250 case kDrawDrawable_OpType: return "DrawDrawable";
fmalita160ebb22015-04-01 20:58:37 -0700251 case kEndDrawPicture_OpType: return "EndDrawPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800252 case kRestore_OpType: return "Restore";
253 case kSave_OpType: return "Save";
254 case kSaveLayer_OpType: return "SaveLayer";
255 case kSetMatrix_OpType: return "SetMatrix";
chudy@google.com902ebe52012-06-29 14:21:22 +0000256 default:
robertphillips9bafc302015-02-13 11:13:00 -0800257 SkDebugf("OpType error 0x%08x\n", type);
chudy@google.com902ebe52012-06-29 14:21:22 +0000258 SkASSERT(0);
259 break;
260 }
261 SkDEBUGFAIL("DrawType UNUSED\n");
halcanary96fcdcc2015-08-27 07:41:13 -0700262 return nullptr;
chudy@google.com902ebe52012-06-29 14:21:22 +0000263}
264
ethannicholasf62a8b72016-02-11 10:35:21 -0800265Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const {
ethannicholas50a8dd02016-02-10 05:40:46 -0800266 Json::Value result;
267 result[SKDEBUGCANVAS_ATTRIBUTE_COMMAND] = this->GetCommandString(fOpType);
ethannicholas807dcab2016-02-23 06:53:37 -0800268 result[SKDEBUGCANVAS_ATTRIBUTE_VISIBLE] = Json::Value(this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800269 return result;
270}
271
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000272namespace {
273
274void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
Mike Reed3661bc92017-02-22 13:21:42 -0500275 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000276
277 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
278
279 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
280 if (bounds.width() > bounds.height()) {
281 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
282 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
283 } else {
284 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
285 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
286 }
287 canvas->translate(-bounds.centerX(), -bounds.centerY());
288}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000289
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000290
291void render_path(SkCanvas* canvas, const SkPath& path) {
292 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000293
294 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700295 if (bounds.isEmpty()) {
296 return;
297 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000298
fmalitab0cd8b72015-10-06 07:24:03 -0700299 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000300 xlate_and_scale_to_bounds(canvas, bounds);
301
302 SkPaint p;
303 p.setColor(SK_ColorBLACK);
304 p.setStyle(SkPaint::kStroke_Style);
305
306 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000307}
308
Brian Osmanc25e2692018-03-12 10:57:28 -0400309void render_region(SkCanvas* canvas, const SkRegion& region) {
310 canvas->clear(0xFFFFFFFF);
311
312 const SkIRect& bounds = region.getBounds();
313 if (bounds.isEmpty()) {
314 return;
315 }
316
317 SkAutoCanvasRestore acr(canvas, true);
Brian Osman99b63402018-03-13 10:19:27 -0400318 xlate_and_scale_to_bounds(canvas, SkRect::Make(bounds));
Brian Osmanc25e2692018-03-12 10:57:28 -0400319
320 SkPaint p;
321 p.setColor(SK_ColorBLACK);
322 p.setStyle(SkPaint::kStroke_Style);
323
324 canvas->drawRegion(region, p);
325}
326
halcanary96fcdcc2015-08-27 07:41:13 -0700327void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
Mike Reed3661bc92017-02-22 13:21:42 -0500328 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000329
330 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
331 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
332
333 if (input.width() > input.height()) {
334 yScale *= input.height() / (float) input.width();
335 } else {
336 xScale *= input.width() / (float) input.height();
337 }
338
339 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
340 xScale * input.width(),
341 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000342
robertphillips96a5cff2015-09-24 06:56:27 -0700343 static const int kNumBlocks = 8;
344
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000345 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700346 SkISize block = {
347 canvas->imageInfo().width()/kNumBlocks,
348 canvas->imageInfo().height()/kNumBlocks
349 };
350 for (int y = 0; y < kNumBlocks; ++y) {
351 for (int x = 0; x < kNumBlocks; ++x) {
352 SkPaint paint;
353 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
354 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
355 SkIntToScalar(y*block.height()),
356 SkIntToScalar(block.width()),
357 SkIntToScalar(block.height()));
358 canvas->drawRect(r, paint);
359 }
360 }
361
reede47829b2015-08-06 10:02:53 -0700362 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000363
bsalomon49f085d2014-09-05 13:34:00 -0700364 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000365 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
366 srcRect->fTop * yScale + SK_Scalar1,
367 srcRect->fRight * xScale + SK_Scalar1,
368 srcRect->fBottom * yScale + SK_Scalar1);
369 SkPaint p;
370 p.setColor(SK_ColorRED);
371 p.setStyle(SkPaint::kStroke_Style);
372
373 canvas->drawRect(r, p);
374 }
375}
376
377void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
378 canvas->clear(0xFFFFFFFF);
379 canvas->save();
380
381 const SkRect& bounds = rrect.getBounds();
382
383 xlate_and_scale_to_bounds(canvas, bounds);
384
385 SkPaint p;
386 p.setColor(SK_ColorBLACK);
387 p.setStyle(SkPaint::kStroke_Style);
388
389 canvas->drawRRect(rrect, p);
390 canvas->restore();
391}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000392
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000393void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
394 canvas->clear(0xFFFFFFFF);
395 canvas->save();
396
397 const SkRect& bounds = outer.getBounds();
398
399 xlate_and_scale_to_bounds(canvas, bounds);
400
401 SkPaint p;
402 p.setColor(SK_ColorBLACK);
403 p.setStyle(SkPaint::kStroke_Style);
404
405 canvas->drawDRRect(outer, inner, p);
406 canvas->restore();
407}
408
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400409void render_shadow(SkCanvas* canvas, const SkPath& path, SkDrawShadowRec rec) {
410 canvas->clear(0xFFFFFFFF);
411
412 const SkRect& bounds = path.getBounds();
413 if (bounds.isEmpty()) {
414 return;
415 }
416
417 SkAutoCanvasRestore acr(canvas, true);
418 xlate_and_scale_to_bounds(canvas, bounds);
419
420 rec.fAmbientColor = SK_ColorBLACK;
421 rec.fSpotColor = SK_ColorBLACK;
422 canvas->private_draw_shadow_rec(path, rec);
423}
424
Florin Malita82d80872017-06-06 16:58:40 -0400425static const char* const gBlendModeMap[] = {
426 "clear",
427 "src",
428 "dst",
429 "srcOver",
430 "dstOver",
431 "srcIn",
432 "dstIn",
433 "srcOut",
434 "dstOut",
435 "srcATop",
436 "dstATop",
437 "xor",
438 "plus",
439 "modulate",
440
441 "screen",
442
443 "overlay",
444 "darken",
445 "lighten",
446 "colorDodge",
447 "colorBurn",
448 "hardLight",
449 "softLight",
450 "difference",
451 "exclusion",
452 "multiply",
453
454 "hue",
455 "saturation",
456 "color",
457 "luminosity",
458};
459
460static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
461 "blendMode mismatch");
462static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
463 "blendMode mismatch");
464
465void apply_paint_blend_mode(const SkPaint& paint, Json::Value* target) {
466 const auto mode = paint.getBlendMode();
467 if (mode != SkBlendMode::kSrcOver) {
468 SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
469 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE] =
470 Json::Value(gBlendModeMap[static_cast<size_t>(mode)]);
471 }
472}
473
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000474};
475
brianosmanfad98562016-05-04 11:06:28 -0700476Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800477 Json::Value result(Json::arrayValue);
478 result.append(Json::Value(SkColorGetA(color)));
479 result.append(Json::Value(SkColorGetR(color)));
480 result.append(Json::Value(SkColorGetG(color)));
481 result.append(Json::Value(SkColorGetB(color)));
482 return result;
483}
484
brianosman97bbf822016-09-25 13:15:58 -0700485Json::Value SkDrawCommand::MakeJsonColor4f(const SkColor4f& color) {
486 Json::Value result(Json::arrayValue);
487 result.append(Json::Value(color.fA));
488 result.append(Json::Value(color.fR));
489 result.append(Json::Value(color.fG));
490 result.append(Json::Value(color.fB));
491 return result;
492}
493
brianosmanfad98562016-05-04 11:06:28 -0700494Json::Value SkDrawCommand::MakeJsonPoint(const SkPoint& point) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800495 Json::Value result(Json::arrayValue);
496 result.append(Json::Value(point.x()));
497 result.append(Json::Value(point.y()));
498 return result;
499}
500
brianosmanfad98562016-05-04 11:06:28 -0700501Json::Value SkDrawCommand::MakeJsonPoint(SkScalar x, SkScalar y) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800502 Json::Value result(Json::arrayValue);
503 result.append(Json::Value(x));
504 result.append(Json::Value(y));
505 return result;
506}
507
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400508Json::Value SkDrawCommand::MakeJsonPoint3(const SkPoint3& point) {
509 Json::Value result(Json::arrayValue);
510 result.append(Json::Value(point.x()));
511 result.append(Json::Value(point.y()));
512 result.append(Json::Value(point.z()));
513 return result;
514}
515
brianosmanfad98562016-05-04 11:06:28 -0700516Json::Value SkDrawCommand::MakeJsonRect(const SkRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800517 Json::Value result(Json::arrayValue);
518 result.append(Json::Value(rect.left()));
519 result.append(Json::Value(rect.top()));
520 result.append(Json::Value(rect.right()));
521 result.append(Json::Value(rect.bottom()));
522 return result;
523}
524
joshualittbd724132016-03-03 11:39:38 -0800525Json::Value SkDrawCommand::MakeJsonIRect(const SkIRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800526 Json::Value result(Json::arrayValue);
527 result.append(Json::Value(rect.left()));
528 result.append(Json::Value(rect.top()));
529 result.append(Json::Value(rect.right()));
530 result.append(Json::Value(rect.bottom()));
531 return result;
532}
533
534static Json::Value make_json_rrect(const SkRRect& rrect) {
535 Json::Value result(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700536 result.append(SkDrawCommand::MakeJsonRect(rrect.rect()));
537 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
538 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperRight_Corner)));
539 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerRight_Corner)));
540 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
ethannicholas50a8dd02016-02-10 05:40:46 -0800541 return result;
542}
543
joshualittbd724132016-03-03 11:39:38 -0800544Json::Value SkDrawCommand::MakeJsonMatrix(const SkMatrix& matrix) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800545 Json::Value result(Json::arrayValue);
546 Json::Value row1(Json::arrayValue);
547 row1.append(Json::Value(matrix[0]));
548 row1.append(Json::Value(matrix[1]));
549 row1.append(Json::Value(matrix[2]));
550 result.append(row1);
551 Json::Value row2(Json::arrayValue);
552 row2.append(Json::Value(matrix[3]));
553 row2.append(Json::Value(matrix[4]));
554 row2.append(Json::Value(matrix[5]));
555 result.append(row2);
556 Json::Value row3(Json::arrayValue);
557 row3.append(Json::Value(matrix[6]));
558 row3.append(Json::Value(matrix[7]));
559 row3.append(Json::Value(matrix[8]));
560 result.append(row3);
561 return result;
562}
ethannicholas1446a9a2016-02-10 14:05:02 -0800563
vjiaoblacke5de1302016-07-13 14:05:28 -0700564Json::Value SkDrawCommand::MakeJsonScalar(SkScalar z) {
565 Json::Value result(z);
566 return result;
567}
568
brianosmanfad98562016-05-04 11:06:28 -0700569Json::Value SkDrawCommand::MakeJsonPath(const SkPath& path) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800570 Json::Value result(Json::objectValue);
571 switch (path.getFillType()) {
572 case SkPath::kWinding_FillType:
573 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_WINDING;
574 break;
575 case SkPath::kEvenOdd_FillType:
576 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_EVENODD;
577 break;
578 case SkPath::kInverseWinding_FillType:
579 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING;
580 break;
581 case SkPath::kInverseEvenOdd_FillType:
582 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
583 break;
halcanary9d524f22016-03-29 09:03:52 -0700584 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800585 Json::Value verbs(Json::arrayValue);
586 SkPath::Iter iter(path, false);
587 SkPoint pts[4];
588 SkPath::Verb verb;
589 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
590 switch (verb) {
591 case SkPath::kLine_Verb: {
592 Json::Value line(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700593 line[SKDEBUGCANVAS_VERB_LINE] = MakeJsonPoint(pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800594 verbs.append(line);
595 break;
596 }
597 case SkPath::kQuad_Verb: {
598 Json::Value quad(Json::objectValue);
599 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700600 coords.append(MakeJsonPoint(pts[1]));
601 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800602 quad[SKDEBUGCANVAS_VERB_QUAD] = coords;
603 verbs.append(quad);
604 break;
605 }
606 case SkPath::kCubic_Verb: {
607 Json::Value cubic(Json::objectValue);
608 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700609 coords.append(MakeJsonPoint(pts[1]));
610 coords.append(MakeJsonPoint(pts[2]));
611 coords.append(MakeJsonPoint(pts[3]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800612 cubic[SKDEBUGCANVAS_VERB_CUBIC] = coords;
613 verbs.append(cubic);
614 break;
615 }
616 case SkPath::kConic_Verb: {
617 Json::Value conic(Json::objectValue);
618 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700619 coords.append(MakeJsonPoint(pts[1]));
620 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800621 coords.append(Json::Value(iter.conicWeight()));
622 conic[SKDEBUGCANVAS_VERB_CONIC] = coords;
623 verbs.append(conic);
624 break;
625 }
626 case SkPath::kMove_Verb: {
627 Json::Value move(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700628 move[SKDEBUGCANVAS_VERB_MOVE] = MakeJsonPoint(pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800629 verbs.append(move);
630 break;
631 }
632 case SkPath::kClose_Verb:
633 verbs.append(Json::Value(SKDEBUGCANVAS_VERB_CLOSE));
634 break;
635 case SkPath::kDone_Verb:
636 break;
637 }
638 }
639 result[SKDEBUGCANVAS_ATTRIBUTE_VERBS] = verbs;
640 return result;
641}
642
brianosmanfad98562016-05-04 11:06:28 -0700643Json::Value SkDrawCommand::MakeJsonRegion(const SkRegion& region) {
Brian Osmanc25e2692018-03-12 10:57:28 -0400644 // TODO: Actually serialize the rectangles, rather than just devolving to path
645 SkPath path;
646 region.getBoundaryPath(&path);
647 return MakeJsonPath(path);
ethannicholas50a8dd02016-02-10 05:40:46 -0800648}
649
Mike Reedc1f77742016-12-09 09:00:50 -0500650static Json::Value make_json_regionop(SkClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800651 switch (op) {
Mike Reedc1f77742016-12-09 09:00:50 -0500652 case kDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800653 return Json::Value(SKDEBUGCANVAS_REGIONOP_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500654 case kIntersect_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800655 return Json::Value(SKDEBUGCANVAS_REGIONOP_INTERSECT);
Mike Reedc1f77742016-12-09 09:00:50 -0500656 case kUnion_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800657 return Json::Value(SKDEBUGCANVAS_REGIONOP_UNION);
Mike Reedc1f77742016-12-09 09:00:50 -0500658 case kXOR_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800659 return Json::Value(SKDEBUGCANVAS_REGIONOP_XOR);
Mike Reedc1f77742016-12-09 09:00:50 -0500660 case kReverseDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800661 return Json::Value(SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500662 case kReplace_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800663 return Json::Value(SKDEBUGCANVAS_REGIONOP_REPLACE);
664 default:
665 SkASSERT(false);
666 return Json::Value("<invalid region op>");
667 };
668}
669
670static Json::Value make_json_pointmode(SkCanvas::PointMode mode) {
671 switch (mode) {
672 case SkCanvas::kPoints_PointMode:
673 return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
674 case SkCanvas::kLines_PointMode:
675 return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
halcanary9d524f22016-03-29 09:03:52 -0700676 case SkCanvas::kPolygon_PointMode:
ethannicholas50a8dd02016-02-10 05:40:46 -0800677 return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
678 default:
679 SkASSERT(false);
680 return Json::Value("<invalid point mode>");
681 };
682}
683
halcanary9d524f22016-03-29 09:03:52 -0700684static void store_scalar(Json::Value* target, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800685 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800686 if (value != defaultValue) {
687 (*target)[key] = Json::Value(value);
688 }
689}
690
ethannicholasbd3dae82016-02-10 12:10:00 -0800691static void store_bool(Json::Value* target, const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800692 if (value != defaultValue) {
693 (*target)[key] = Json::Value(value);
694 }
695}
696
halcanary9d524f22016-03-29 09:03:52 -0700697static void encode_data(const void* bytes, size_t count, const char* contentType,
ethannicholasf62a8b72016-02-11 10:35:21 -0800698 UrlDataManager& urlDataManager, Json::Value* target) {
bungeman38d909e2016-08-02 14:40:46 -0700699 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
700 SkString url = urlDataManager.addData(data.get(), contentType);
ethannicholasf62a8b72016-02-11 10:35:21 -0800701 *target = Json::Value(url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800702}
703
brianosmanfad98562016-05-04 11:06:28 -0700704void SkDrawCommand::flatten(const SkFlattenable* flattenable, Json::Value* target,
705 UrlDataManager& urlDataManager) {
706 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800707 flattenable->flatten(buffer);
708 void* data = sk_malloc_throw(buffer.bytesWritten());
709 buffer.writeToMemory(data);
710 Json::Value jsonData;
711 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, &jsonData);
712 Json::Value jsonFlattenable;
713 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->getTypeName());
714 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
brianosmanfad98562016-05-04 11:06:28 -0700715
716 SkJsonWriteBuffer jsonBuffer(&urlDataManager);
717 flattenable->flatten(jsonBuffer);
718 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_VALUES] = jsonBuffer.getValue();
719
ethannicholasf62a8b72016-02-11 10:35:21 -0800720 (*target) = jsonFlattenable;
721 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800722}
723
ethannicholasf67531f2016-03-21 10:19:39 -0700724static void write_png_callback(png_structp png_ptr, png_bytep data, png_size_t length) {
725 SkWStream* out = (SkWStream*) png_get_io_ptr(png_ptr);
726 out->write(data, length);
727}
728
halcanarya73d76a2016-10-17 13:19:02 -0700729void SkDrawCommand::WritePNG(const uint8_t* rgba, unsigned width, unsigned height,
msaretta5cf4f42016-06-30 10:06:51 -0700730 SkWStream& out, bool isOpaque) {
Ben Wagnera93a14a2017-08-28 10:34:05 -0400731 png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
ethannicholasf67531f2016-03-21 10:19:39 -0700732 SkASSERT(png != nullptr);
733 png_infop info_ptr = png_create_info_struct(png);
734 SkASSERT(info_ptr != nullptr);
735 if (setjmp(png_jmpbuf(png))) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400736 SK_ABORT("png encode error");
ethannicholasf67531f2016-03-21 10:19:39 -0700737 }
Ben Wagnera93a14a2017-08-28 10:34:05 -0400738 png_set_write_fn(png, &out, write_png_callback, nullptr);
msaretta5cf4f42016-06-30 10:06:51 -0700739 int colorType = isOpaque ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGBA;
740 png_set_IHDR(png, info_ptr, width, height, 8, colorType, PNG_INTERLACE_NONE,
ethannicholasf67531f2016-03-21 10:19:39 -0700741 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
742 png_set_compression_level(png, 1);
743 png_bytepp rows = (png_bytepp) sk_malloc_throw(height * sizeof(png_byte*));
msaretta5cf4f42016-06-30 10:06:51 -0700744 png_bytep pixels = (png_bytep) sk_malloc_throw(width * height * 4);
ethannicholasf67531f2016-03-21 10:19:39 -0700745 for (png_size_t y = 0; y < height; ++y) {
halcanarya73d76a2016-10-17 13:19:02 -0700746 const uint8_t* src = rgba + y * width * 4;
msaretta5cf4f42016-06-30 10:06:51 -0700747 rows[y] = pixels + y * width * 4;
ethannicholasf67531f2016-03-21 10:19:39 -0700748 for (png_size_t x = 0; x < width; ++x) {
msaretta5cf4f42016-06-30 10:06:51 -0700749 rows[y][x * 4] = src[x * 4];
750 rows[y][x * 4 + 1] = src[x * 4 + 1];
751 rows[y][x * 4 + 2] = src[x * 4 + 2];
752 rows[y][x * 4 + 3] = src[x * 4 + 3];
ethannicholasf67531f2016-03-21 10:19:39 -0700753 }
754 }
msaretta5cf4f42016-06-30 10:06:51 -0700755 png_write_info(png, info_ptr);
756 if (isOpaque) {
757 png_set_filler(png, 0xFF, PNG_FILLER_AFTER);
758 }
ethannicholasf67531f2016-03-21 10:19:39 -0700759 png_set_filter(png, 0, PNG_NO_FILTERS);
msaretta5cf4f42016-06-30 10:06:51 -0700760 png_write_image(png, &rows[0]);
Ben Wagnera93a14a2017-08-28 10:34:05 -0400761 png_destroy_write_struct(&png, nullptr);
ethannicholasf67531f2016-03-21 10:19:39 -0700762 sk_free(rows);
763 sk_free(pixels);
764}
765
brianosmanfad98562016-05-04 11:06:28 -0700766bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
767 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700768 size_t rowBytes = 4 * image.width();
Hal Canary95e3c052017-01-11 12:44:43 -0500769 SkAutoMalloc buffer(rowBytes * image.height());
halcanary9d524f22016-03-29 09:03:52 -0700770 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700771 kN32_SkColorType, kPremul_SkAlphaType);
772 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
773 SkDebugf("readPixels failed\n");
774 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800775 }
msaretta5cf4f42016-06-30 10:06:51 -0700776
777 SkBitmap bm;
778 bm.installPixels(dstInfo, buffer.get(), rowBytes);
779 sk_sp<SkData> encodedBitmap = sk_tools::encode_bitmap_for_png(bm);
780
ethannicholasf67531f2016-03-21 10:19:39 -0700781 SkDynamicMemoryWStream out;
halcanarya73d76a2016-10-17 13:19:02 -0700782 SkDrawCommand::WritePNG(encodedBitmap->bytes(), image.width(), image.height(),
msaretta5cf4f42016-06-30 10:06:51 -0700783 out, false);
reed42943c82016-09-12 12:01:44 -0700784 sk_sp<SkData> encoded = out.detachAsData();
ethannicholasf62a8b72016-02-11 10:35:21 -0800785 Json::Value jsonData;
786 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
787 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
ethannicholas50a8dd02016-02-10 05:40:46 -0800788 return true;
789}
790
791static const char* color_type_name(SkColorType colorType) {
792 switch (colorType) {
793 case kARGB_4444_SkColorType:
794 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
795 case kRGBA_8888_SkColorType:
796 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
797 case kBGRA_8888_SkColorType:
798 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
799 case kRGB_565_SkColorType:
800 return SKDEBUGCANVAS_COLORTYPE_565;
801 case kGray_8_SkColorType:
802 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
ethannicholas50a8dd02016-02-10 05:40:46 -0800803 case kAlpha_8_SkColorType:
804 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
805 default:
806 SkASSERT(false);
807 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
808 }
809}
810
811static const char* alpha_type_name(SkAlphaType alphaType) {
812 switch (alphaType) {
813 case kOpaque_SkAlphaType:
814 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
815 case kPremul_SkAlphaType:
816 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
817 case kUnpremul_SkAlphaType:
818 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
819 default:
820 SkASSERT(false);
821 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
822 }
823}
824
brianosmanfad98562016-05-04 11:06:28 -0700825bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
826 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700827 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800828 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
829 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800830 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800831 return success;
832}
833
halcanaryf412f092016-08-25 11:10:41 -0700834static void apply_paint_hinting(const SkPaint& paint, Json::Value* target) {
835 SkPaint::Hinting hinting = paint.getHinting();
836 if (hinting != SkPaintDefaults_Hinting) {
837 switch (hinting) {
838 case SkPaint::kNo_Hinting:
839 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
840 break;
841 case SkPaint::kSlight_Hinting:
842 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
843 break;
844 case SkPaint::kNormal_Hinting:
845 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
846 break;
847 case SkPaint::kFull_Hinting:
848 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
849 break;
850 }
851 }
852}
853
ethannicholas50a8dd02016-02-10 05:40:46 -0800854static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
855 SkColor color = paint.getColor();
856 if (color != SK_ColorBLACK) {
857 Json::Value colorValue(Json::arrayValue);
858 colorValue.append(Json::Value(SkColorGetA(color)));
859 colorValue.append(Json::Value(SkColorGetR(color)));
860 colorValue.append(Json::Value(SkColorGetG(color)));
861 colorValue.append(Json::Value(SkColorGetB(color)));
862 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;;
863 }
864}
865
866static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
867 SkPaint::Style style = paint.getStyle();
868 if (style != SkPaint::kFill_Style) {
869 switch (style) {
870 case SkPaint::kStroke_Style: {
871 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
872 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
873 break;
874 }
875 case SkPaint::kStrokeAndFill_Style: {
876 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
877 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
878 break;
879 }
880 default: SkASSERT(false);
881 }
882 }
883}
884
885static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
886 SkPaint::Cap cap = paint.getStrokeCap();
887 if (cap != SkPaint::kDefault_Cap) {
888 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800889 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800890 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
891 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800892 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800893 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
894 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800895 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800896 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
897 break;
ethannicholas50a8dd02016-02-10 05:40:46 -0800898 default: SkASSERT(false);
899 }
900 }
901}
ethannicholas1446a9a2016-02-10 14:05:02 -0800902
903static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
904 SkPaint::Join join = paint.getStrokeJoin();
905 if (join != SkPaint::kDefault_Join) {
906 switch (join) {
907 case SkPaint::kMiter_Join:
908 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
909 SKDEBUGCANVAS_MITER_JOIN);
910 break;
911 case SkPaint::kRound_Join:
912 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
913 SKDEBUGCANVAS_ROUND_JOIN);
914 break;
915 case SkPaint::kBevel_Join:
916 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
917 SKDEBUGCANVAS_BEVEL_JOIN);
918 break;
919 default: SkASSERT(false);
920 }
921 }
922}
923
924static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
925 SkFilterQuality quality = paint.getFilterQuality();
926 switch (quality) {
927 case kNone_SkFilterQuality:
928 break;
929 case kLow_SkFilterQuality:
930 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
931 SKDEBUGCANVAS_FILTERQUALITY_LOW);
932 break;
933 case kMedium_SkFilterQuality:
934 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
935 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
936 break;
937 case kHigh_SkFilterQuality:
938 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
939 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
940 break;
941 }
942}
943
halcanary9d524f22016-03-29 09:03:52 -0700944static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800945 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800946 SkMaskFilter* maskFilter = paint.getMaskFilter();
947 if (maskFilter != nullptr) {
Mike Reed80747ef2018-01-23 15:29:32 -0500948 SkMaskFilterBase::BlurRec blurRec;
949 if (as_MFB(maskFilter)->asABlur(&blurRec)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800950 Json::Value blur(Json::objectValue);
951 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
952 switch (blurRec.fStyle) {
953 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800954 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
955 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -0800956 break;
957 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800958 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
959 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -0800960 break;
961 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800962 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
963 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800964 break;
965 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800966 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
967 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800968 break;
969 default:
970 SkASSERT(false);
971 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800972 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
973 } else {
974 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -0700975 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800976 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
977 }
978 }
979}
980
halcanary9d524f22016-03-29 09:03:52 -0700981static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800982 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800983 SkPathEffect* pathEffect = paint.getPathEffect();
984 if (pathEffect != nullptr) {
985 SkPathEffect::DashInfo dashInfo;
986 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
987 if (dashType == SkPathEffect::kDash_DashType) {
988 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
989 pathEffect->asADash(&dashInfo);
990 Json::Value dashing(Json::objectValue);
991 Json::Value intervals(Json::arrayValue);
992 for (int32_t i = 0; i < dashInfo.fCount; i++) {
993 intervals.append(Json::Value(dashInfo.fIntervals[i]));
994 }
995 sk_free(dashInfo.fIntervals);
996 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
997 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
998 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
999 } else {
1000 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -07001001 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001002 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
1003 }
1004 }
1005}
halcanary9d524f22016-03-29 09:03:52 -07001006
ethannicholas50a8dd02016-02-10 05:40:46 -08001007static void apply_paint_textalign(const SkPaint& paint, Json::Value* target) {
1008 SkPaint::Align textAlign = paint.getTextAlign();
1009 if (textAlign != SkPaint::kLeft_Align) {
1010 switch (textAlign) {
1011 case SkPaint::kCenter_Align: {
1012 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_CENTER;
1013 break;
1014 }
1015 case SkPaint::kRight_Align: {
1016 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_RIGHT;
1017 break;
1018 }
1019 default: SkASSERT(false);
1020 }
1021 }
1022}
1023
halcanary9d524f22016-03-29 09:03:52 -07001024static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001025 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001026 SkTypeface* typeface = paint.getTypeface();
1027 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -08001028 Json::Value jsonTypeface;
1029 SkDynamicMemoryWStream buffer;
1030 typeface->serialize(&buffer);
1031 void* data = sk_malloc_throw(buffer.bytesWritten());
1032 buffer.copyTo(data);
1033 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -07001034 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -08001035 &jsonData);
1036 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
1037 sk_free(data);
1038 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -08001039 }
1040}
1041
halcanary9d524f22016-03-29 09:03:52 -07001042static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001043 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001044 SkFlattenable* shader = paint.getShader();
1045 if (shader != nullptr) {
1046 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -07001047 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001048 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
1049 }
1050}
1051
ethannicholasf62a8b72016-02-11 10:35:21 -08001052static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
1053 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001054 SkFlattenable* imageFilter = paint.getImageFilter();
1055 if (imageFilter != nullptr) {
1056 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -07001057 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001058 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
1059 }
1060}
1061
halcanary9d524f22016-03-29 09:03:52 -07001062static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001063 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001064 SkFlattenable* colorFilter = paint.getColorFilter();
1065 if (colorFilter != nullptr) {
1066 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001067 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001068 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1069 }
1070}
1071
halcanary9d524f22016-03-29 09:03:52 -07001072static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001073 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001074 SkFlattenable* looper = paint.getLooper();
1075 if (looper != nullptr) {
1076 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001077 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001078 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1079 }
1080}
1081
brianosmanfad98562016-05-04 11:06:28 -07001082Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001083 Json::Value result(Json::objectValue);
1084 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001085 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001086 SkPaintDefaults_MiterLimit);
1087 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001088 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001089 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, paint.isFakeBoldText(), false);
1090 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, paint.isLinearText(), false);
1091 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, paint.isSubpixelText(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001092 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT, paint.isLCDRenderText(), false);
1093 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, paint.isEmbeddedBitmapText(), false);
1094 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, paint.isAutohinted(), false);
1095 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT, paint.isVerticalText(), false);
1096 //kGenA8FromLCD_Flag
1097
halcanary9d524f22016-03-29 09:03:52 -07001098 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001099 SkPaintDefaults_TextSize);
1100 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
1101 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
halcanaryf412f092016-08-25 11:10:41 -07001102 apply_paint_hinting(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001103 apply_paint_color(paint, &result);
1104 apply_paint_style(paint, &result);
Florin Malita82d80872017-06-06 16:58:40 -04001105 apply_paint_blend_mode(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001106 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001107 apply_paint_join(paint, &result);
1108 apply_paint_filterquality(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001109 apply_paint_textalign(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001110 apply_paint_patheffect(paint, &result, urlDataManager);
1111 apply_paint_maskfilter(paint, &result, urlDataManager);
1112 apply_paint_shader(paint, &result, urlDataManager);
ethannicholasf62a8b72016-02-11 10:35:21 -08001113 apply_paint_looper(paint, &result, urlDataManager);
1114 apply_paint_imagefilter(paint, &result, urlDataManager);
1115 apply_paint_colorfilter(paint, &result, urlDataManager);
1116 apply_paint_typeface(paint, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001117 return result;
1118}
1119
Stan Ilievac42aeb2017-01-12 16:20:50 -05001120Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) {
1121 Json::Value result(Json::objectValue);
1122 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount);
1123 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount);
1124 if (nullptr != lattice.fBounds) {
1125 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds);
1126 }
1127 Json::Value XDivs(Json::arrayValue);
1128 for (int i = 0; i < lattice.fXCount; i++) {
1129 XDivs.append(Json::Value(lattice.fXDivs[i]));
1130 }
1131 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs;
1132 Json::Value YDivs(Json::arrayValue);
1133 for (int i = 0; i < lattice.fYCount; i++) {
1134 YDivs.append(Json::Value(lattice.fYDivs[i]));
1135 }
1136 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs;
Stan Ilievca8c0952017-12-11 13:01:58 -05001137 if (nullptr != lattice.fRectTypes) {
Stan Ilievac42aeb2017-01-12 16:20:50 -05001138 Json::Value flags(Json::arrayValue);
1139 int flagCount = 0;
1140 for (int row = 0; row < lattice.fYCount+1; row++) {
1141 Json::Value flagsRow(Json::arrayValue);
1142 for (int column = 0; column < lattice.fXCount+1; column++) {
Stan Ilievca8c0952017-12-11 13:01:58 -05001143 flagsRow.append(Json::Value(lattice.fRectTypes[flagCount++]));
Stan Ilievac42aeb2017-01-12 16:20:50 -05001144 }
1145 flags.append(flagsRow);
1146 }
1147 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags;
1148 }
1149 return result;
1150}
1151
Brian Osmanc25e2692018-03-12 10:57:28 -04001152SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kClear_OpType) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001153 fColor = color;
ethannicholas1446a9a2016-02-10 14:05:02 -08001154}
1155
1156void SkClearCommand::execute(SkCanvas* canvas) const {
1157 canvas->clear(fColor);
1158}
1159
ethannicholasf62a8b72016-02-11 10:35:21 -08001160Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1161 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001162 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001163 return result;
1164}
1165
Mike Reedc1f77742016-12-09 09:00:50 -05001166SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001167 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001168 fPath = path;
1169 fOp = op;
1170 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001171}
1172
fmalita8c89c522014-11-08 16:18:56 -08001173void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001174 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001175}
1176
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001177bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001178 render_path(canvas, fPath);
1179 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001180}
1181
ethannicholasf62a8b72016-02-11 10:35:21 -08001182Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1183 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001184 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001185 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1186 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1187 return result;
1188}
1189
Mike Reedc1f77742016-12-09 09:00:50 -05001190SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001191 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001192 fRegion = region;
1193 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001194}
1195
fmalita8c89c522014-11-08 16:18:56 -08001196void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001197 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001198}
1199
ethannicholasf62a8b72016-02-11 10:35:21 -08001200Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1201 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001202 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001203 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1204 return result;
1205}
1206
Mike Reedc1f77742016-12-09 09:00:50 -05001207SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001208 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001209 fRect = rect;
1210 fOp = op;
1211 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001212}
1213
fmalita8c89c522014-11-08 16:18:56 -08001214void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001215 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001216}
1217
ethannicholasf62a8b72016-02-11 10:35:21 -08001218Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1219 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001220 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001221 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1222 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001223
1224 SkString desc;
1225 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1226
ethannicholas50a8dd02016-02-10 05:40:46 -08001227 return result;
1228}
1229
Mike Reedc1f77742016-12-09 09:00:50 -05001230SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001231 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001232 fRRect = rrect;
1233 fOp = op;
1234 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001235}
1236
fmalita8c89c522014-11-08 16:18:56 -08001237void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001238 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001239}
1240
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001241bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001242 render_rrect(canvas, fRRect);
1243 return true;
1244}
1245
ethannicholasf62a8b72016-02-11 10:35:21 -08001246Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1247 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001248 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1249 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1250 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1251 return result;
1252}
1253
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001254SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001255 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001256 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001257}
1258
fmalita8c89c522014-11-08 16:18:56 -08001259void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001260 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001261}
1262
ethannicholasf62a8b72016-02-11 10:35:21 -08001263Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1264 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001265 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001266 return result;
1267}
1268
reed97660cc2016-06-28 18:54:19 -07001269////
1270
1271SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1272 sk_sp<SkData> value)
1273 : INHERITED(kDrawAnnotation_OpType)
1274 , fRect(rect)
1275 , fKey(key)
1276 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001277{
robertphillipsfb409232016-06-29 10:28:11 -07001278}
reed97660cc2016-06-28 18:54:19 -07001279
1280void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1281 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1282}
1283
1284Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1285 Json::Value result = INHERITED::toJSON(urlDataManager);
1286
1287 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1288 result["key"] = Json::Value(fKey.c_str());
1289 if (fValue.get()) {
1290 // TODO: dump out the "value"
1291 }
reed67f62fa2016-06-29 11:36:34 -07001292
1293 SkString desc;
1294 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1295 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1296
reed97660cc2016-06-28 18:54:19 -07001297 return result;
1298}
1299
reed97660cc2016-06-28 18:54:19 -07001300////
1301
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001302SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07001303 const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001304 : INHERITED(kDrawBitmap_OpType)
1305 , fBitmap(bitmap)
1306 , fLeft(left)
1307 , fTop(top)
1308 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001309
fmalita8c89c522014-11-08 16:18:56 -08001310void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001311 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001312}
1313
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001314bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001315 render_bitmap(canvas, fBitmap);
1316 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001317}
1318
ethannicholasf62a8b72016-02-11 10:35:21 -08001319Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
1320 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001321 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001322 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001323 Json::Value command(Json::objectValue);
1324 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001325 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
Brian Osman8363be12018-05-29 13:38:07 -04001326 if (fPaint.isValid()) {
1327 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001328 }
1329 }
1330 return result;
1331}
1332
Brian Osman78a76482018-05-18 16:59:13 -04001333SkDrawBitmapLatticeCommand::SkDrawBitmapLatticeCommand(const SkBitmap& bitmap,
1334 const SkCanvas::Lattice& lattice,
1335 const SkRect& dst, const SkPaint* paint)
1336 : INHERITED(kDrawBitmapLattice_OpType)
1337 , fBitmap(bitmap)
1338 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001339 , fDst(dst)
1340 , fPaint(paint) {}
Brian Osman78a76482018-05-18 16:59:13 -04001341
1342void SkDrawBitmapLatticeCommand::execute(SkCanvas* canvas) const {
1343 canvas->drawBitmapLattice(fBitmap, fLattice, fDst, fPaint.getMaybeNull());
1344}
1345
1346bool SkDrawBitmapLatticeCommand::render(SkCanvas* canvas) const {
1347 SkAutoCanvasRestore acr(canvas, true);
1348 canvas->clear(0xFFFFFFFF);
1349
1350 xlate_and_scale_to_bounds(canvas, fDst);
1351
1352 this->execute(canvas);
1353 return true;
1354}
1355
1356Json::Value SkDrawBitmapLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1357 Json::Value result = INHERITED::toJSON(urlDataManager);
1358 Json::Value encoded;
1359 if (flatten(fBitmap, &encoded, urlDataManager)) {
1360 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
1361 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1362 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1363 if (fPaint.isValid()) {
1364 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1365 }
1366 }
1367
1368 SkString desc;
1369 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1370
1371 return result;
1372}
1373
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001374SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00001375 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001376 : INHERITED(kDrawBitmapNine_OpType)
1377 , fBitmap(bitmap)
1378 , fCenter(center)
1379 , fDst(dst)
1380 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001381
fmalita8c89c522014-11-08 16:18:56 -08001382void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001383 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001384}
1385
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001386bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08001387 SkRect tmp = SkRect::Make(fCenter);
1388 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001389 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001390}
1391
ethannicholasf62a8b72016-02-11 10:35:21 -08001392Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1393 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001394 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001395 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001396 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08001397 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07001398 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001399 if (fPaint.isValid()) {
1400 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001401 }
1402 }
1403 return result;
1404}
1405
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001406SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00001407 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07001408 SkCanvas::SrcRectConstraint constraint)
Brian Osman8363be12018-05-29 13:38:07 -04001409 : INHERITED(kDrawBitmapRect_OpType)
1410 , fBitmap(bitmap)
1411 , fSrc(src)
1412 , fDst(dst)
1413 , fPaint(paint)
1414 , fConstraint(constraint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001415
fmalita8c89c522014-11-08 16:18:56 -08001416void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001417 canvas->legacy_drawBitmapRect(fBitmap, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
1418 fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001419}
1420
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001421bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001422 render_bitmap(canvas, fBitmap, fSrc.getMaybeNull());
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001423 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001424}
1425
ethannicholasf62a8b72016-02-11 10:35:21 -08001426Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1427 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001428 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001429 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001430 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
Brian Osman8363be12018-05-29 13:38:07 -04001431 if (fSrc.isValid()) {
1432 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001433 }
brianosmanfad98562016-05-04 11:06:28 -07001434 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001435 if (fPaint.isValid()) {
1436 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001437 }
1438 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1439 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1440 }
1441 }
reed67f62fa2016-06-29 11:36:34 -07001442
1443 SkString desc;
1444 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1445
ethannicholas50a8dd02016-02-10 05:40:46 -08001446 return result;
1447}
1448
fmalita651c9202015-07-22 10:23:01 -07001449SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
1450 const SkPaint* paint)
1451 : INHERITED(kDrawImage_OpType)
1452 , fImage(SkRef(image))
1453 , fLeft(left)
Brian Osman8363be12018-05-29 13:38:07 -04001454 , fTop(top)
1455 , fPaint(paint) {}
fmalita651c9202015-07-22 10:23:01 -07001456
1457void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001458 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07001459}
1460
1461bool SkDrawImageCommand::render(SkCanvas* canvas) const {
1462 SkAutoCanvasRestore acr(canvas, true);
1463 canvas->clear(0xFFFFFFFF);
1464
1465 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
1466 SkIntToScalar(fImage->width()),
1467 SkIntToScalar(fImage->height())));
1468 this->execute(canvas);
1469 return true;
1470}
1471
ethannicholasf62a8b72016-02-11 10:35:21 -08001472Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
1473 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001474 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001475 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001476 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001477 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08001478 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001479 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001480 }
msarett0ac1bec2016-08-29 09:15:33 -07001481
1482 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
1483 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
1484 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
1485 switch (fImage->alphaType()) {
1486 case kOpaque_SkAlphaType:
1487 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
1488 break;
1489 case kPremul_SkAlphaType:
1490 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
1491 break;
1492 case kUnpremul_SkAlphaType:
1493 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
1494 break;
1495 default:
1496 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
1497 break;
1498 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001499 }
1500 return result;
1501}
1502
Stan Ilievac42aeb2017-01-12 16:20:50 -05001503SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
1504 const SkCanvas::Lattice& lattice,
1505 const SkRect& dst, const SkPaint* paint)
1506 : INHERITED(kDrawImageLattice_OpType)
1507 , fImage(SkRef(image))
1508 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001509 , fDst(dst)
1510 , fPaint(paint) {}
Stan Ilievac42aeb2017-01-12 16:20:50 -05001511
1512void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
Brian Osman78a76482018-05-18 16:59:13 -04001513 canvas->drawImageLattice(fImage.get(), fLattice, fDst, fPaint.getMaybeNull());
Stan Ilievac42aeb2017-01-12 16:20:50 -05001514}
1515
1516bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
1517 SkAutoCanvasRestore acr(canvas, true);
1518 canvas->clear(0xFFFFFFFF);
1519
1520 xlate_and_scale_to_bounds(canvas, fDst);
1521
1522 this->execute(canvas);
1523 return true;
1524}
1525
1526Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1527 Json::Value result = INHERITED::toJSON(urlDataManager);
1528 Json::Value encoded;
1529 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001530 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
Stan Ilievac42aeb2017-01-12 16:20:50 -05001531 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1532 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1533 if (fPaint.isValid()) {
1534 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1535 }
1536 }
1537
1538 SkString desc;
1539 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1540
1541 return result;
1542}
1543
fmalita651c9202015-07-22 10:23:01 -07001544SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
1545 const SkRect& dst, const SkPaint* paint,
1546 SkCanvas::SrcRectConstraint constraint)
1547 : INHERITED(kDrawImageRect_OpType)
1548 , fImage(SkRef(image))
Brian Osman8363be12018-05-29 13:38:07 -04001549 , fSrc(src)
fmalita651c9202015-07-22 10:23:01 -07001550 , fDst(dst)
Brian Osman8363be12018-05-29 13:38:07 -04001551 , fPaint(paint)
1552 , fConstraint(constraint) {}
fmalita651c9202015-07-22 10:23:01 -07001553
1554void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001555 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
1556 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07001557}
1558
1559bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
1560 SkAutoCanvasRestore acr(canvas, true);
1561 canvas->clear(0xFFFFFFFF);
1562
1563 xlate_and_scale_to_bounds(canvas, fDst);
1564
1565 this->execute(canvas);
1566 return true;
1567}
1568
ethannicholasf62a8b72016-02-11 10:35:21 -08001569Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1570 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001571 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001572 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001573 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
ethannicholas50a8dd02016-02-10 05:40:46 -08001574 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001575 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001576 }
brianosmanfad98562016-05-04 11:06:28 -07001577 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08001578 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001579 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001580 }
1581 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1582 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1583 }
1584 }
reed67f62fa2016-06-29 11:36:34 -07001585
1586 SkString desc;
1587 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1588
ethannicholas50a8dd02016-02-10 05:40:46 -08001589 return result;
1590}
1591
Brian Osmanc25e2692018-03-12 10:57:28 -04001592SkDrawImageNineCommand::SkDrawImageNineCommand(const SkImage* image, const SkIRect& center,
1593 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001594 : INHERITED(kDrawImageNine_OpType)
1595 , fImage(SkRef(image))
1596 , fCenter(center)
1597 , fDst(dst)
1598 , fPaint(paint) {}
Brian Osmanc25e2692018-03-12 10:57:28 -04001599
1600void SkDrawImageNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001601 canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaint.getMaybeNull());
Brian Osmanc25e2692018-03-12 10:57:28 -04001602}
1603
1604bool SkDrawImageNineCommand::render(SkCanvas* canvas) const {
1605 SkAutoCanvasRestore acr(canvas, true);
1606 canvas->clear(0xFFFFFFFF);
1607
1608 xlate_and_scale_to_bounds(canvas, fDst);
1609
1610 this->execute(canvas);
1611 return true;
1612}
1613
1614Json::Value SkDrawImageNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1615 Json::Value result = INHERITED::toJSON(urlDataManager);
1616 Json::Value encoded;
1617 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
1618 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
1619 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
1620 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001621 if (fPaint.isValid()) {
1622 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
Brian Osmanc25e2692018-03-12 10:57:28 -04001623 }
1624 }
1625 return result;
1626}
1627
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001628SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001629 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001630 fOval = oval;
1631 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001632}
1633
fmalita8c89c522014-11-08 16:18:56 -08001634void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001635 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001636}
1637
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001638bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001639 canvas->clear(0xFFFFFFFF);
1640 canvas->save();
1641
1642 xlate_and_scale_to_bounds(canvas, fOval);
1643
1644 SkPaint p;
1645 p.setColor(SK_ColorBLACK);
1646 p.setStyle(SkPaint::kStroke_Style);
1647
1648 canvas->drawOval(fOval, p);
1649 canvas->restore();
1650
1651 return true;
1652}
1653
ethannicholasf62a8b72016-02-11 10:35:21 -08001654Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
1655 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001656 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1657 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001658 return result;
1659}
1660
bsalomonac3aa242016-08-19 11:25:19 -07001661SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
1662 bool useCenter, const SkPaint& paint)
Brian Osmanc25e2692018-03-12 10:57:28 -04001663 : INHERITED(kDrawArc_OpType) {
bsalomonac3aa242016-08-19 11:25:19 -07001664 fOval = oval;
1665 fStartAngle = startAngle;
1666 fSweepAngle = sweepAngle;
1667 fUseCenter = useCenter;
1668 fPaint = paint;
bsalomonac3aa242016-08-19 11:25:19 -07001669}
1670
1671void SkDrawArcCommand::execute(SkCanvas* canvas) const {
1672 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
1673}
1674
1675bool SkDrawArcCommand::render(SkCanvas* canvas) const {
1676 canvas->clear(0xFFFFFFFF);
1677 canvas->save();
1678
1679 xlate_and_scale_to_bounds(canvas, fOval);
1680
1681 SkPaint p;
1682 p.setColor(SK_ColorBLACK);
1683 p.setStyle(SkPaint::kStroke_Style);
1684
1685 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
1686 canvas->restore();
1687
1688 return true;
1689}
1690
1691Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
1692 Json::Value result = INHERITED::toJSON(urlDataManager);
1693 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1694 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
1695 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
1696 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
1697 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1698 return result;
1699}
1700
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001701SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001702 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001703 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001704}
1705
fmalita8c89c522014-11-08 16:18:56 -08001706void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001707 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001708}
1709
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001710bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001711 canvas->clear(0xFFFFFFFF);
1712 canvas->drawPaint(fPaint);
1713 return true;
1714}
1715
ethannicholasf62a8b72016-02-11 10:35:21 -08001716Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
1717 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001718 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001719 return result;
1720}
1721
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001722SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001723 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001724 fPath = path;
1725 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001726}
1727
fmalita8c89c522014-11-08 16:18:56 -08001728void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001729 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001730}
1731
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001732bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001733 render_path(canvas, fPath);
1734 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001735}
1736
ethannicholasf62a8b72016-02-11 10:35:21 -08001737Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1738 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001739 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
1740 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001741 return result;
1742}
1743
Brian Osmanc25e2692018-03-12 10:57:28 -04001744SkDrawRegionCommand::SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint)
1745 : INHERITED(kDrawRegion_OpType) {
1746 fRegion = region;
1747 fPaint = paint;
Brian Osmanc25e2692018-03-12 10:57:28 -04001748}
1749
1750void SkDrawRegionCommand::execute(SkCanvas* canvas) const {
1751 canvas->drawRegion(fRegion, fPaint);
1752}
1753
1754bool SkDrawRegionCommand::render(SkCanvas* canvas) const {
1755 render_region(canvas, fRegion);
1756 return true;
1757}
1758
1759Json::Value SkDrawRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1760 Json::Value result = INHERITED::toJSON(urlDataManager);
1761 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
1762 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1763 return result;
1764}
1765
fmalita160ebb22015-04-01 20:58:37 -07001766SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
1767 const SkMatrix* matrix,
1768 const SkPaint* paint)
1769 : INHERITED(kBeginDrawPicture_OpType)
Brian Osman8363be12018-05-29 13:38:07 -04001770 , fPicture(SkRef(picture))
1771 , fMatrix(matrix)
1772 , fPaint(paint) {}
fmalita160ebb22015-04-01 20:58:37 -07001773
1774void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
1775 if (fPaint.isValid()) {
1776 SkRect bounds = fPicture->cullRect();
1777 if (fMatrix.isValid()) {
1778 fMatrix.get()->mapRect(&bounds);
1779 }
1780 canvas->saveLayer(&bounds, fPaint.get());
1781 }
1782
1783 if (fMatrix.isValid()) {
1784 if (!fPaint.isValid()) {
1785 canvas->save();
1786 }
1787 canvas->concat(*fMatrix.get());
1788 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001789}
1790
fmalita160ebb22015-04-01 20:58:37 -07001791bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001792 canvas->clear(0xFFFFFFFF);
1793 canvas->save();
1794
robertphillipsa8d7f0b2014-08-29 08:03:56 -07001795 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001796
robertphillips9b14f262014-06-04 05:40:44 -07001797 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001798
1799 canvas->restore();
1800
1801 return true;
1802}
1803
fmalita160ebb22015-04-01 20:58:37 -07001804SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
1805 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
1806
1807void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
1808 if (fRestore) {
1809 canvas->restore();
1810 }
1811}
1812
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001813SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001814 const SkPoint pts[], const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04001815 : INHERITED(kDrawPoints_OpType)
1816 , fMode(mode)
1817 , fPts(pts, count)
1818 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001819
fmalita8c89c522014-11-08 16:18:56 -08001820void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001821 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001822}
1823
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001824bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001825 canvas->clear(0xFFFFFFFF);
1826 canvas->save();
1827
1828 SkRect bounds;
1829
1830 bounds.setEmpty();
Brian Osman8363be12018-05-29 13:38:07 -04001831 for (int i = 0; i < fPts.count(); ++i) {
Mike Reed185ffe92018-01-08 17:09:54 -05001832 SkRectPriv::GrowToInclude(&bounds, fPts[i]);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001833 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00001834
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001835 xlate_and_scale_to_bounds(canvas, bounds);
1836
1837 SkPaint p;
1838 p.setColor(SK_ColorBLACK);
1839 p.setStyle(SkPaint::kStroke_Style);
1840
Brian Osman8363be12018-05-29 13:38:07 -04001841 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001842 canvas->restore();
1843
1844 return true;
1845}
1846
ethannicholasf62a8b72016-02-11 10:35:21 -08001847Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
1848 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001849 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
1850 Json::Value points(Json::arrayValue);
Brian Osman8363be12018-05-29 13:38:07 -04001851 for (int i = 0; i < fPts.count(); i++) {
brianosmanfad98562016-05-04 11:06:28 -07001852 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001853 }
1854 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07001855 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001856 return result;
1857}
1858
Brian Osman65197ff2018-05-29 14:25:39 -04001859static Json::Value make_json_text(sk_sp<SkData> text) {
1860 return Json::Value((const char*)text->data(), (const char*)text->data() + text->size());
chudy@google.com902ebe52012-06-29 14:21:22 +00001861}
1862
Brian Osman65197ff2018-05-29 14:25:39 -04001863SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength,
1864 const SkPoint pos[], const SkPaint& paint)
1865 : INHERITED(kDrawPosText_OpType)
1866 , fText(SkData::MakeWithCopy(text, byteLength))
1867 , fPos(pos, paint.countText(text, byteLength))
1868 , fPaint(paint) {}
1869
fmalita8c89c522014-11-08 16:18:56 -08001870void SkDrawPosTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001871 canvas->drawPosText(fText->data(), fText->size(), fPos.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001872}
1873
ethannicholasf62a8b72016-02-11 10:35:21 -08001874Json::Value SkDrawPosTextCommand::toJSON(UrlDataManager& urlDataManager) const {
1875 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001876 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08001877 Json::Value coords(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001878 size_t numCoords = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001879 for (size_t i = 0; i < numCoords; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001880 coords.append(MakeJsonPoint(fPos[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001881 }
1882 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = coords;
brianosmanfad98562016-05-04 11:06:28 -07001883 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001884 return result;
1885}
1886
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001887SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength,
1888 const SkScalar xpos[], SkScalar constY,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001889 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04001890 : INHERITED(kDrawPosTextH_OpType)
1891 , fText(SkData::MakeWithCopy(text, byteLength))
1892 , fXpos(xpos, paint.countText(text, byteLength))
1893 , fConstY(constY)
1894 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001895
fmalita8c89c522014-11-08 16:18:56 -08001896void SkDrawPosTextHCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001897 canvas->drawPosTextH(fText->data(), fText->size(), fXpos.begin(), fConstY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001898}
1899
bungeman51190df2016-03-09 07:42:54 -08001900Json::Value SkDrawPosTextHCommand::toJSON(UrlDataManager& urlDataManager) const {
1901 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001902 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
bungeman51190df2016-03-09 07:42:54 -08001903 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fConstY);
1904 Json::Value xpos(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001905 size_t numXpos = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001906 for (size_t i = 0; i < numXpos; i++) {
1907 xpos.append(Json::Value(fXpos[i]));
1908 }
1909 result[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = xpos;
brianosmanfad98562016-05-04 11:06:28 -07001910 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
bungeman51190df2016-03-09 07:42:54 -08001911 return result;
1912}
1913
fmalita37283c22016-09-13 10:00:23 -07001914SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07001915 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001916 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07001917 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07001918 , fXPos(x)
1919 , fYPos(y)
Brian Osman255735e2018-04-06 14:51:42 -04001920 , fPaint(paint) {}
fmalitab7425172014-08-26 07:56:44 -07001921
fmalita8c89c522014-11-08 16:18:56 -08001922void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07001923 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1924}
1925
fmalita55773872014-08-29 15:08:20 -07001926bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
1927 canvas->clear(SK_ColorWHITE);
1928 canvas->save();
1929
1930 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
1931 xlate_and_scale_to_bounds(canvas, bounds);
1932
fmalita37283c22016-09-13 10:00:23 -07001933 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07001934
1935 canvas->restore();
1936
1937 return true;
1938}
1939
ethannicholasf62a8b72016-02-11 10:35:21 -08001940Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
1941 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001942 Json::Value runs(Json::arrayValue);
1943 SkTextBlobRunIterator iter(fBlob.get());
1944 while (!iter.done()) {
1945 Json::Value run(Json::objectValue);
1946 Json::Value jsonPositions(Json::arrayValue);
1947 Json::Value jsonGlyphs(Json::arrayValue);
1948 const SkScalar* iterPositions = iter.pos();
1949 const uint16_t* iterGlyphs = iter.glyphs();
1950 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1951 switch (iter.positioning()) {
Florin Malitaab54e732018-07-27 09:47:15 -04001952 case SkTextBlobRunIterator::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07001953 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
1954 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001955 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001956 case SkTextBlobRunIterator::kHorizontal_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001957 jsonPositions.append(Json::Value(iterPositions[i]));
1958 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001959 case SkTextBlobRunIterator::kDefault_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001960 break;
1961 }
1962 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
1963 }
Florin Malitaab54e732018-07-27 09:47:15 -04001964 if (iter.positioning() != SkTextBlobRunIterator::kDefault_Positioning) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001965 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
1966 }
1967 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
1968 SkPaint fontPaint;
1969 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07001970 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
1971 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08001972 runs.append(run);
1973 iter.next();
1974 }
reed6d2c3e72016-07-07 14:10:14 -07001975 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08001976 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
1977 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
1978 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07001979 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07001980 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07001981
1982 SkString desc;
1983 // make the bounds local by applying the x,y
1984 bounds.offset(fXPos, fYPos);
1985 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
1986
ethannicholas50a8dd02016-02-10 05:40:46 -08001987 return result;
1988}
1989
robertphillips9bafc302015-02-13 11:13:00 -08001990SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04001991 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08001992 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04001993 : INHERITED(kDrawPatch_OpType)
1994 , fBlendMode(bmode)
1995{
robertphillips9bafc302015-02-13 11:13:00 -08001996 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08001997 if (colors != nullptr) {
1998 memcpy(fColors, colors, sizeof(fColors));
1999 fColorsPtr = fColors;
2000 } else {
2001 fColorsPtr = nullptr;
2002 }
2003 if (texCoords != nullptr) {
2004 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
2005 fTexCoordsPtr = fTexCoords;
2006 } else {
2007 fTexCoordsPtr = nullptr;
2008 }
robertphillips9bafc302015-02-13 11:13:00 -08002009 fPaint = paint;
robertphillips9bafc302015-02-13 11:13:00 -08002010}
2011
2012void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04002013 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08002014}
2015
ethannicholasf62a8b72016-02-11 10:35:21 -08002016Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
2017 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08002018 Json::Value cubics = Json::Value(Json::arrayValue);
2019 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002020 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08002021 }
2022 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
2023 if (fColorsPtr != nullptr) {
2024 Json::Value colors = Json::Value(Json::arrayValue);
2025 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002026 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08002027 }
2028 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
2029 }
2030 if (fTexCoordsPtr != nullptr) {
2031 Json::Value texCoords = Json::Value(Json::arrayValue);
2032 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07002033 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08002034 }
2035 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
2036 }
Mike Reed7d954ad2016-10-28 15:42:34 -04002037 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08002038 return result;
2039}
2040
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002041SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002042 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002043 fRect = rect;
2044 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002045}
2046
fmalita8c89c522014-11-08 16:18:56 -08002047void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002048 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002049}
2050
ethannicholasf62a8b72016-02-11 10:35:21 -08002051Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2052 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002053 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
2054 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07002055
2056 SkString desc;
2057 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
2058
ethannicholas50a8dd02016-02-10 05:40:46 -08002059 return result;
2060}
2061
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002062SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002063 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002064 fRRect = rrect;
2065 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00002066}
2067
fmalita8c89c522014-11-08 16:18:56 -08002068void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00002069 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00002070}
2071
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002072bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002073 render_rrect(canvas, fRRect);
2074 return true;
2075}
2076
ethannicholasf62a8b72016-02-11 10:35:21 -08002077Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2078 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002079 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07002080 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002081 return result;
2082}
2083
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00002084SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002085 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002086 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002087 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002088 fOuter = outer;
2089 fInner = inner;
2090 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002091}
2092
fmalita8c89c522014-11-08 16:18:56 -08002093void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002094 canvas->drawDRRect(fOuter, fInner, fPaint);
2095}
2096
2097bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
2098 render_drrect(canvas, fOuter, fInner);
2099 return true;
2100}
2101
ethannicholasf62a8b72016-02-11 10:35:21 -08002102Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2103 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002104 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
2105 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07002106 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002107 return result;
2108}
2109
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04002110SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
2111 : INHERITED(kDrawShadow_OpType) {
2112 fPath = path;
2113 fShadowRec = rec;
2114}
2115
2116void SkDrawShadowCommand::execute(SkCanvas* canvas) const {
2117 canvas->private_draw_shadow_rec(fPath, fShadowRec);
2118}
2119
2120bool SkDrawShadowCommand::render(SkCanvas* canvas) const {
2121 render_shadow(canvas, fPath, fShadowRec);
2122 return true;
2123}
2124
2125Json::Value SkDrawShadowCommand::toJSON(UrlDataManager& urlDataManager) const {
2126 Json::Value result = INHERITED::toJSON(urlDataManager);
2127 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2128
2129 bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
2130 bool transparentOccluder =
2131 SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
2132
2133 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2134 result[SKDEBUGCANVAS_ATTRIBUTE_ZPLANE] = MakeJsonPoint3(fShadowRec.fZPlaneParams);
2135 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION] = MakeJsonPoint3(fShadowRec.fLightPos);
2136 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS] = MakeJsonScalar(fShadowRec.fLightRadius);
2137 result[SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR] = MakeJsonColor(fShadowRec.fAmbientColor);
2138 result[SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR] = MakeJsonColor(fShadowRec.fSpotColor);
2139 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
2140 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
2141 return result;
2142}
2143
Brian Osmanc7611082018-05-29 14:55:50 -04002144///////////////////////////////////////////////////////////////////////////////////////////////////
2145
2146SkDrawDrawableCommand::SkDrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
2147 : INHERITED(kDrawDrawable_OpType)
2148 , fDrawable(SkRef(drawable))
2149 , fMatrix(matrix) {}
2150
2151void SkDrawDrawableCommand::execute(SkCanvas* canvas) const {
2152 canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
2153}
2154
2155///////////////////////////////////////////////////////////////////////////////////////////////////
2156
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002157SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002158 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04002159 : INHERITED(kDrawText_OpType)
2160 , fText(SkData::MakeWithCopy(text, byteLength))
2161 , fX(x)
2162 , fY(y)
2163 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002164
fmalita8c89c522014-11-08 16:18:56 -08002165void SkDrawTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002166 canvas->drawText(fText->data(), fText->size(), fX, fY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002167}
2168
ethannicholasf62a8b72016-02-11 10:35:21 -08002169Json::Value SkDrawTextCommand::toJSON(UrlDataManager& urlDataManager) const {
2170 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002171 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08002172 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07002173 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fX, fY);
2174 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002175 return result;
2176}
2177
reed45561a02016-07-07 12:47:17 -07002178///////////////////////////////////////////////////////////////////////////////////////////////////
2179
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002180SkDrawTextOnPathCommand::SkDrawTextOnPathCommand(const void* text, size_t byteLength,
2181 const SkPath& path, const SkMatrix* matrix,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002182 const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04002183 : INHERITED(kDrawTextOnPath_OpType)
Brian Osman65197ff2018-05-29 14:25:39 -04002184 , fText(SkData::MakeWithCopy(text, byteLength))
2185 , fPath(path)
2186 , fMatrix(matrix)
2187 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002188
fmalita8c89c522014-11-08 16:18:56 -08002189void SkDrawTextOnPathCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002190 canvas->drawTextOnPath(fText->data(), fText->size(), fPath, fMatrix.getMaybeNull(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002191}
2192
ethannicholasf62a8b72016-02-11 10:35:21 -08002193Json::Value SkDrawTextOnPathCommand::toJSON(UrlDataManager& urlDataManager) const {
2194 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002195 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08002196 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07002197 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
Brian Osman8363be12018-05-29 13:38:07 -04002198 if (fMatrix.isValid()) {
2199 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(*fMatrix.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002200 }
brianosmanfad98562016-05-04 11:06:28 -07002201 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002202 return result;
2203}
2204
reed45561a02016-07-07 12:47:17 -07002205///////////////////////////////////////////////////////////////////////////////////////////////////
2206
2207SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength,
2208 const SkRSXform xform[], const SkRect* cull,
2209 const SkPaint& paint)
reed63f30d92016-07-07 16:32:51 -07002210 : INHERITED(kDrawTextRSXform_OpType)
Brian Osman65197ff2018-05-29 14:25:39 -04002211 , fText(SkData::MakeWithCopy(text, byteLength))
2212 , fXform(xform, paint.countText(text, byteLength))
Brian Osman8363be12018-05-29 13:38:07 -04002213 , fCull(cull)
Brian Osman65197ff2018-05-29 14:25:39 -04002214 , fPaint(paint) {}
reed45561a02016-07-07 12:47:17 -07002215
2216void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002217 canvas->drawTextRSXform(fText->data(), fText->size(), fXform.begin(), fCull.getMaybeNull(),
2218 fPaint);
reed45561a02016-07-07 12:47:17 -07002219}
2220
2221Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) const {
2222 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002223 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
reed45561a02016-07-07 12:47:17 -07002224 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
2225 return result;
2226}
2227
reed45561a02016-07-07 12:47:17 -07002228///////////////////////////////////////////////////////////////////////////////////////////////////
2229
Mike Reedfed9cfd2017-03-17 12:09:04 -04002230SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002231 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04002232 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04002233 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04002234 , fBlendMode(bmode)
Brian Osman255735e2018-04-06 14:51:42 -04002235 , fPaint(paint) {}
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002236
fmalita8c89c522014-11-08 16:18:56 -08002237void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04002238 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002239}
2240
Brian Osman616f1cb2018-05-29 11:23:35 -04002241///////////////////////////////////////////////////////////////////////////////////////////////////
2242
2243SkDrawAtlasCommand::SkDrawAtlasCommand(const SkImage* image, const SkRSXform xform[],
2244 const SkRect tex[], const SkColor colors[], int count,
2245 SkBlendMode bmode, const SkRect* cull,
2246 const SkPaint* paint)
2247 : INHERITED(kDrawAtlas_OpType)
2248 , fImage(SkRef(image))
2249 , fXform(xform, count)
2250 , fTex(tex, count)
2251 , fColors(colors, colors ? count : 0)
2252 , fBlendMode(bmode)
2253 , fCull(cull)
2254 , fPaint(paint) {}
2255
2256void SkDrawAtlasCommand::execute(SkCanvas* canvas) const {
2257 canvas->drawAtlas(fImage.get(), fXform.begin(), fTex.begin(),
2258 fColors.isEmpty() ? nullptr : fColors.begin(), fXform.count(), fBlendMode,
2259 fCull.getMaybeNull(), fPaint.getMaybeNull());
2260}
2261
2262///////////////////////////////////////////////////////////////////////////////////////////////////
2263
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002264SkRestoreCommand::SkRestoreCommand()
Brian Osman255735e2018-04-06 14:51:42 -04002265 : INHERITED(kRestore_OpType) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002266
fmalita8c89c522014-11-08 16:18:56 -08002267void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00002268 canvas->restore();
2269}
2270
Florin Malita5f6102d2014-06-30 10:13:28 -04002271SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08002272 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00002273}
2274
fmalita8c89c522014-11-08 16:18:56 -08002275void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04002276 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00002277}
2278
reed4960eee2015-12-18 07:09:18 -08002279SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
Brian Osman8363be12018-05-29 13:38:07 -04002280 : INHERITED(kSaveLayer_OpType)
2281 , fBounds(rec.fBounds)
2282 , fPaint(rec.fPaint)
2283 , fBackdrop(SkSafeRef(rec.fBackdrop))
2284 , fSaveLayerFlags(rec.fSaveLayerFlags) {}
ethannicholas50a8dd02016-02-10 05:40:46 -08002285
fmalita8c89c522014-11-08 16:18:56 -08002286void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04002287 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(),
reed4960eee2015-12-18 07:09:18 -08002288 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00002289}
2290
ethannicholasf62a8b72016-02-11 10:35:21 -08002291Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
2292 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman8363be12018-05-29 13:38:07 -04002293 if (fBounds.isValid()) {
2294 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(*fBounds.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002295 }
Brian Osman8363be12018-05-29 13:38:07 -04002296 if (fPaint.isValid()) {
2297 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002298 }
2299 if (fBackdrop != nullptr) {
2300 Json::Value jsonBackdrop;
Brian Osman8363be12018-05-29 13:38:07 -04002301 flatten(fBackdrop.get(), &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002302 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
2303 }
2304 if (fSaveLayerFlags != 0) {
2305 SkDebugf("unsupported: saveLayer flags\n");
2306 SkASSERT(false);
2307 }
2308 return result;
2309}
2310
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002311SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08002312 : INHERITED(kSetMatrix_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002313 fMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -07002314}
2315
fmalita8c89c522014-11-08 16:18:56 -08002316void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
Brian Osman255735e2018-04-06 14:51:42 -04002317 canvas->setMatrix(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00002318}
2319
ethannicholasf62a8b72016-02-11 10:35:21 -08002320Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
2321 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08002322 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08002323 return result;
2324}