blob: 27b34efba7320454bf61a6bef5c8cd9d96d1db0d [file] [log] [blame]
chudy@google.com902ebe52012-06-29 14:21:22 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
chudy@google.com902ebe52012-06-29 14:21:22 +00008#include "SkDrawCommand.h"
joshualitt6b3cf732016-02-17 11:20:26 -08009
Hal Canary95e3c052017-01-11 12:44:43 -050010#include "SkAutoMalloc.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080011#include "SkColorFilter.h"
12#include "SkDashPathEffect.h"
Brian Osmanc7611082018-05-29 14:55:50 -040013#include "SkDrawable.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080014#include "SkImageFilter.h"
brianosmanfad98562016-05-04 11:06:28 -070015#include "SkJsonWriteBuffer.h"
Mike Reed80747ef2018-01-23 15:29:32 -050016#include "SkMaskFilterBase.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080017#include "SkPaintDefaults.h"
18#include "SkPathEffect.h"
robertphillips9bafc302015-02-13 11:13:00 -080019#include "SkPicture.h"
Brian Osmand9ea8162018-08-08 17:03:39 -040020#include "SkPngEncoder.h"
Mike Reedfadbfcd2017-12-06 16:09:20 -050021#include "SkReadBuffer.h"
Mike Reed185ffe92018-01-08 17:09:54 -050022#include "SkRectPriv.h"
Brian Salomon0a0304c2018-10-11 10:16:33 -040023#include "SkTextBlobPriv.h"
Brian Salomon8d5b41b2018-10-12 14:22:49 +000024#include "SkTHash.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080025#include "SkTypeface.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080026#include "SkWriteBuffer.h"
Brian Salomon8d5b41b2018-10-12 14:22:49 +000027#include "SkClipOpPriv.h"
28#include <SkLatticeIter.h>
29#include <SkShadowFlags.h>
ethannicholas50a8dd02016-02-10 05:40:46 -080030
ethannicholas50a8dd02016-02-10 05:40:46 -080031#define SKDEBUGCANVAS_ATTRIBUTE_COMMAND "command"
ethannicholas807dcab2016-02-23 06:53:37 -080032#define SKDEBUGCANVAS_ATTRIBUTE_VISIBLE "visible"
ethannicholas50a8dd02016-02-10 05:40:46 -080033#define SKDEBUGCANVAS_ATTRIBUTE_MATRIX "matrix"
vjiaoblacke5de1302016-07-13 14:05:28 -070034#define SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS "drawDepthTranslation"
ethannicholas50a8dd02016-02-10 05:40:46 -080035#define SKDEBUGCANVAS_ATTRIBUTE_COORDS "coords"
halcanaryf412f092016-08-25 11:10:41 -070036#define SKDEBUGCANVAS_ATTRIBUTE_HINTING "hinting"
ethannicholas50a8dd02016-02-10 05:40:46 -080037#define SKDEBUGCANVAS_ATTRIBUTE_BOUNDS "bounds"
38#define SKDEBUGCANVAS_ATTRIBUTE_PAINT "paint"
39#define SKDEBUGCANVAS_ATTRIBUTE_OUTER "outer"
40#define SKDEBUGCANVAS_ATTRIBUTE_INNER "inner"
41#define SKDEBUGCANVAS_ATTRIBUTE_MODE "mode"
42#define SKDEBUGCANVAS_ATTRIBUTE_POINTS "points"
43#define SKDEBUGCANVAS_ATTRIBUTE_PATH "path"
44#define SKDEBUGCANVAS_ATTRIBUTE_TEXT "text"
45#define SKDEBUGCANVAS_ATTRIBUTE_COLOR "color"
46#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Florin Malita82d80872017-06-06 16:58:40 -040047#define SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE "blendMode"
ethannicholas50a8dd02016-02-10 05:40:46 -080048#define SKDEBUGCANVAS_ATTRIBUTE_STYLE "style"
49#define SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH "strokeWidth"
50#define SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER "strokeMiter"
ethannicholas1446a9a2016-02-10 14:05:02 -080051#define SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN "strokeJoin"
ethannicholas50a8dd02016-02-10 05:40:46 -080052#define SKDEBUGCANVAS_ATTRIBUTE_CAP "cap"
53#define SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS "antiAlias"
ethannicholas1446a9a2016-02-10 14:05:02 -080054#define SKDEBUGCANVAS_ATTRIBUTE_DITHER "dither"
Ben Wagner78f1f5a2017-06-23 14:35:07 -040055#define SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT "fakeBoldText"
56#define SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT "linearText"
57#define SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT "subpixelText"
58#define SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT "devKernText"
59#define SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT "lcdRenderText"
60#define SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT "embeddedBitmapText"
61#define SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING "forceAutoHinting"
62#define SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT "verticalText"
ethannicholas50a8dd02016-02-10 05:40:46 -080063#define SKDEBUGCANVAS_ATTRIBUTE_REGION "region"
64#define SKDEBUGCANVAS_ATTRIBUTE_REGIONOP "op"
65#define SKDEBUGCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle"
66#define SKDEBUGCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion"
67#define SKDEBUGCANVAS_ATTRIBUTE_BLUR "blur"
68#define SKDEBUGCANVAS_ATTRIBUTE_SIGMA "sigma"
69#define SKDEBUGCANVAS_ATTRIBUTE_QUALITY "quality"
70#define SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN "textAlign"
71#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE "textSize"
72#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX"
73#define SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX"
74#define SKDEBUGCANVAS_ATTRIBUTE_DASHING "dashing"
75#define SKDEBUGCANVAS_ATTRIBUTE_INTERVALS "intervals"
76#define SKDEBUGCANVAS_ATTRIBUTE_PHASE "phase"
77#define SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE "fillType"
78#define SKDEBUGCANVAS_ATTRIBUTE_VERBS "verbs"
79#define SKDEBUGCANVAS_ATTRIBUTE_NAME "name"
ethannicholasf62a8b72016-02-11 10:35:21 -080080#define SKDEBUGCANVAS_ATTRIBUTE_DATA "data"
brianosmanfad98562016-05-04 11:06:28 -070081#define SKDEBUGCANVAS_ATTRIBUTE_VALUES "values"
ethannicholas50a8dd02016-02-10 05:40:46 -080082#define SKDEBUGCANVAS_ATTRIBUTE_SHADER "shader"
83#define SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect"
84#define SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER "maskFilter"
85#define SKDEBUGCANVAS_ATTRIBUTE_XFERMODE "xfermode"
ethannicholas1446a9a2016-02-10 14:05:02 -080086#define SKDEBUGCANVAS_ATTRIBUTE_LOOPER "looper"
ethannicholas50a8dd02016-02-10 05:40:46 -080087#define SKDEBUGCANVAS_ATTRIBUTE_BACKDROP "backdrop"
88#define SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER "colorfilter"
89#define SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter"
90#define SKDEBUGCANVAS_ATTRIBUTE_IMAGE "image"
91#define SKDEBUGCANVAS_ATTRIBUTE_BITMAP "bitmap"
92#define SKDEBUGCANVAS_ATTRIBUTE_SRC "src"
93#define SKDEBUGCANVAS_ATTRIBUTE_DST "dst"
94#define SKDEBUGCANVAS_ATTRIBUTE_CENTER "center"
95#define SKDEBUGCANVAS_ATTRIBUTE_STRICT "strict"
96#define SKDEBUGCANVAS_ATTRIBUTE_DESCRIPTION "description"
97#define SKDEBUGCANVAS_ATTRIBUTE_X "x"
98#define SKDEBUGCANVAS_ATTRIBUTE_Y "y"
99#define SKDEBUGCANVAS_ATTRIBUTE_RUNS "runs"
100#define SKDEBUGCANVAS_ATTRIBUTE_POSITIONS "positions"
101#define SKDEBUGCANVAS_ATTRIBUTE_GLYPHS "glyphs"
102#define SKDEBUGCANVAS_ATTRIBUTE_FONT "font"
103#define SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE "typeface"
ethannicholas1446a9a2016-02-10 14:05:02 -0800104#define SKDEBUGCANVAS_ATTRIBUTE_CUBICS "cubics"
105#define SKDEBUGCANVAS_ATTRIBUTE_COLORS "colors"
106#define SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS "textureCoords"
107#define SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY "filterQuality"
bsalomonac3aa242016-08-19 11:25:19 -0700108#define SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE "startAngle"
109#define SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE "sweepAngle"
110#define SKDEBUGCANVAS_ATTRIBUTE_USECENTER "useCenter"
jcgregorioee0c5552016-06-30 09:18:27 -0700111#define SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC "shortDesc"
msarett0ac1bec2016-08-29 09:15:33 -0700112#define SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID "uniqueID"
113#define SKDEBUGCANVAS_ATTRIBUTE_WIDTH "width"
114#define SKDEBUGCANVAS_ATTRIBUTE_HEIGHT "height"
115#define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
Stan Ilievac42aeb2017-01-12 16:20:50 -0500116#define SKDEBUGCANVAS_ATTRIBUTE_LATTICE "lattice"
117#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT "xCount"
118#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT "yCount"
119#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS "xDivs"
120#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS "yDivs"
121#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS "flags"
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400122#define SKDEBUGCANVAS_ATTRIBUTE_ZPLANE "zPlane"
123#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION "lightPositions"
124#define SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR "ambientColor"
125#define SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR "spotColor"
126#define SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS "lightRadius"
reed67f62fa2016-06-29 11:36:34 -0700127
ethannicholas50a8dd02016-02-10 05:40:46 -0800128#define SKDEBUGCANVAS_VERB_MOVE "move"
129#define SKDEBUGCANVAS_VERB_LINE "line"
130#define SKDEBUGCANVAS_VERB_QUAD "quad"
131#define SKDEBUGCANVAS_VERB_CUBIC "cubic"
132#define SKDEBUGCANVAS_VERB_CONIC "conic"
133#define SKDEBUGCANVAS_VERB_CLOSE "close"
134
135#define SKDEBUGCANVAS_STYLE_FILL "fill"
136#define SKDEBUGCANVAS_STYLE_STROKE "stroke"
137#define SKDEBUGCANVAS_STYLE_STROKEANDFILL "strokeAndFill"
138
139#define SKDEBUGCANVAS_POINTMODE_POINTS "points"
140#define SKDEBUGCANVAS_POINTMODE_LINES "lines"
141#define SKDEBUGCANVAS_POINTMODE_POLYGON "polygon"
142
143#define SKDEBUGCANVAS_REGIONOP_DIFFERENCE "difference"
144#define SKDEBUGCANVAS_REGIONOP_INTERSECT "intersect"
145#define SKDEBUGCANVAS_REGIONOP_UNION "union"
146#define SKDEBUGCANVAS_REGIONOP_XOR "xor"
147#define SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE "reverseDifference"
148#define SKDEBUGCANVAS_REGIONOP_REPLACE "replace"
149
150#define SKDEBUGCANVAS_BLURSTYLE_NORMAL "normal"
151#define SKDEBUGCANVAS_BLURSTYLE_SOLID "solid"
152#define SKDEBUGCANVAS_BLURSTYLE_OUTER "outer"
153#define SKDEBUGCANVAS_BLURSTYLE_INNER "inner"
154
155#define SKDEBUGCANVAS_BLURQUALITY_LOW "low"
156#define SKDEBUGCANVAS_BLURQUALITY_HIGH "high"
157
158#define SKDEBUGCANVAS_ALIGN_LEFT "left"
159#define SKDEBUGCANVAS_ALIGN_CENTER "center"
160#define SKDEBUGCANVAS_ALIGN_RIGHT "right"
161
162#define SKDEBUGCANVAS_FILLTYPE_WINDING "winding"
163#define SKDEBUGCANVAS_FILLTYPE_EVENODD "evenOdd"
164#define SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding"
165#define SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd"
166
167#define SKDEBUGCANVAS_CAP_BUTT "butt"
168#define SKDEBUGCANVAS_CAP_ROUND "round"
169#define SKDEBUGCANVAS_CAP_SQUARE "square"
170
ethannicholas1446a9a2016-02-10 14:05:02 -0800171#define SKDEBUGCANVAS_MITER_JOIN "miter"
172#define SKDEBUGCANVAS_ROUND_JOIN "round"
173#define SKDEBUGCANVAS_BEVEL_JOIN "bevel"
174
ethannicholas50a8dd02016-02-10 05:40:46 -0800175#define SKDEBUGCANVAS_COLORTYPE_ARGB4444 "ARGB4444"
176#define SKDEBUGCANVAS_COLORTYPE_RGBA8888 "RGBA8888"
177#define SKDEBUGCANVAS_COLORTYPE_BGRA8888 "BGRA8888"
178#define SKDEBUGCANVAS_COLORTYPE_565 "565"
179#define SKDEBUGCANVAS_COLORTYPE_GRAY8 "Gray8"
180#define SKDEBUGCANVAS_COLORTYPE_INDEX8 "Index8"
181#define SKDEBUGCANVAS_COLORTYPE_ALPHA8 "Alpha8"
182
183#define SKDEBUGCANVAS_ALPHATYPE_OPAQUE "opaque"
184#define SKDEBUGCANVAS_ALPHATYPE_PREMUL "premul"
185#define SKDEBUGCANVAS_ALPHATYPE_UNPREMUL "unpremul"
msarett0ac1bec2016-08-29 09:15:33 -0700186#define SKDEBUGCANVAS_ALPHATYPE_UNKNOWN "unknown"
ethannicholas50a8dd02016-02-10 05:40:46 -0800187
ethannicholas1446a9a2016-02-10 14:05:02 -0800188#define SKDEBUGCANVAS_FILTERQUALITY_NONE "none"
189#define SKDEBUGCANVAS_FILTERQUALITY_LOW "low"
190#define SKDEBUGCANVAS_FILTERQUALITY_MEDIUM "medium"
191#define SKDEBUGCANVAS_FILTERQUALITY_HIGH "high"
192
halcanaryf412f092016-08-25 11:10:41 -0700193#define SKDEBUGCANVAS_HINTING_NONE "none"
194#define SKDEBUGCANVAS_HINTING_SLIGHT "slight"
195#define SKDEBUGCANVAS_HINTING_NORMAL "normal"
196#define SKDEBUGCANVAS_HINTING_FULL "full"
197
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400198#define SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC "transparentOccluder"
199#define SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY "geometricOnly"
200
reed67f62fa2016-06-29 11:36:34 -0700201static SkString* str_append(SkString* str, const SkRect& r) {
202 str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom());
203 return str;
204}
205
robertphillips9bafc302015-02-13 11:13:00 -0800206SkDrawCommand::SkDrawCommand(OpType type)
207 : fOpType(type)
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000208 , fVisible(true) {
209}
210
robertphillips9bafc302015-02-13 11:13:00 -0800211const char* SkDrawCommand::GetCommandString(OpType type) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000212 switch (type) {
fmalita160ebb22015-04-01 20:58:37 -0700213 case kBeginDrawPicture_OpType: return "BeginDrawPicture";
Brian Osmanc25e2692018-03-12 10:57:28 -0400214 case kClear_OpType: return "DrawClear";
robertphillips9bafc302015-02-13 11:13:00 -0800215 case kClipPath_OpType: return "ClipPath";
216 case kClipRegion_OpType: return "ClipRegion";
217 case kClipRect_OpType: return "ClipRect";
218 case kClipRRect_OpType: return "ClipRRect";
robertphillips9bafc302015-02-13 11:13:00 -0800219 case kConcat_OpType: return "Concat";
robertphillipsfb409232016-06-29 10:28:11 -0700220 case kDrawAnnotation_OpType: return "DrawAnnotation";
robertphillips9bafc302015-02-13 11:13:00 -0800221 case kDrawBitmap_OpType: return "DrawBitmap";
Brian Osman78a76482018-05-18 16:59:13 -0400222 case kDrawBitmapLattice_OpType: return "DrawBitmapLattice";
robertphillips9bafc302015-02-13 11:13:00 -0800223 case kDrawBitmapNine_OpType: return "DrawBitmapNine";
224 case kDrawBitmapRect_OpType: return "DrawBitmapRect";
robertphillips9bafc302015-02-13 11:13:00 -0800225 case kDrawDRRect_OpType: return "DrawDRRect";
fmalita651c9202015-07-22 10:23:01 -0700226 case kDrawImage_OpType: return "DrawImage";
Stan Ilievac42aeb2017-01-12 16:20:50 -0500227 case kDrawImageLattice_OpType: return "DrawImageLattice";
Brian Osmanc25e2692018-03-12 10:57:28 -0400228 case kDrawImageNine_OpType: return "DrawImageNine";
fmalita651c9202015-07-22 10:23:01 -0700229 case kDrawImageRect_OpType: return "DrawImageRect";
robertphillips9bafc302015-02-13 11:13:00 -0800230 case kDrawOval_OpType: return "DrawOval";
231 case kDrawPaint_OpType: return "DrawPaint";
232 case kDrawPatch_OpType: return "DrawPatch";
233 case kDrawPath_OpType: return "DrawPath";
Brian Osmanc25e2692018-03-12 10:57:28 -0400234 case kDrawArc_OpType: return "DrawArc";
robertphillips9bafc302015-02-13 11:13:00 -0800235 case kDrawPoints_OpType: return "DrawPoints";
236 case kDrawPosText_OpType: return "DrawPosText";
237 case kDrawPosTextH_OpType: return "DrawPosTextH";
238 case kDrawRect_OpType: return "DrawRect";
239 case kDrawRRect_OpType: return "DrawRRect";
Brian Osmanc25e2692018-03-12 10:57:28 -0400240 case kDrawRegion_OpType: return "DrawRegion";
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400241 case kDrawShadow_OpType: return "DrawShadow";
robertphillips9bafc302015-02-13 11:13:00 -0800242 case kDrawText_OpType: return "DrawText";
243 case kDrawTextBlob_OpType: return "DrawTextBlob";
reed63f30d92016-07-07 16:32:51 -0700244 case kDrawTextRSXform_OpType: return "DrawTextRSXform";
robertphillips9bafc302015-02-13 11:13:00 -0800245 case kDrawVertices_OpType: return "DrawVertices";
Brian Osman616f1cb2018-05-29 11:23:35 -0400246 case kDrawAtlas_OpType: return "DrawAtlas";
Brian Osmanc7611082018-05-29 14:55:50 -0400247 case kDrawDrawable_OpType: return "DrawDrawable";
fmalita160ebb22015-04-01 20:58:37 -0700248 case kEndDrawPicture_OpType: return "EndDrawPicture";
robertphillips9bafc302015-02-13 11:13:00 -0800249 case kRestore_OpType: return "Restore";
250 case kSave_OpType: return "Save";
251 case kSaveLayer_OpType: return "SaveLayer";
252 case kSetMatrix_OpType: return "SetMatrix";
chudy@google.com902ebe52012-06-29 14:21:22 +0000253 default:
robertphillips9bafc302015-02-13 11:13:00 -0800254 SkDebugf("OpType error 0x%08x\n", type);
chudy@google.com902ebe52012-06-29 14:21:22 +0000255 SkASSERT(0);
256 break;
257 }
258 SkDEBUGFAIL("DrawType UNUSED\n");
halcanary96fcdcc2015-08-27 07:41:13 -0700259 return nullptr;
chudy@google.com902ebe52012-06-29 14:21:22 +0000260}
261
ethannicholasf62a8b72016-02-11 10:35:21 -0800262Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const {
ethannicholas50a8dd02016-02-10 05:40:46 -0800263 Json::Value result;
264 result[SKDEBUGCANVAS_ATTRIBUTE_COMMAND] = this->GetCommandString(fOpType);
ethannicholas807dcab2016-02-23 06:53:37 -0800265 result[SKDEBUGCANVAS_ATTRIBUTE_VISIBLE] = Json::Value(this->isVisible());
ethannicholas50a8dd02016-02-10 05:40:46 -0800266 return result;
267}
268
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000269namespace {
270
271void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
Mike Reed3661bc92017-02-22 13:21:42 -0500272 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000273
274 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
275
276 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
277 if (bounds.width() > bounds.height()) {
278 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
279 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
280 } else {
281 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
282 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
283 }
284 canvas->translate(-bounds.centerX(), -bounds.centerY());
285}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000286
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000287
288void render_path(SkCanvas* canvas, const SkPath& path) {
289 canvas->clear(0xFFFFFFFF);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000290
291 const SkRect& bounds = path.getBounds();
fmalitab0cd8b72015-10-06 07:24:03 -0700292 if (bounds.isEmpty()) {
293 return;
294 }
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000295
fmalitab0cd8b72015-10-06 07:24:03 -0700296 SkAutoCanvasRestore acr(canvas, true);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000297 xlate_and_scale_to_bounds(canvas, bounds);
298
299 SkPaint p;
300 p.setColor(SK_ColorBLACK);
301 p.setStyle(SkPaint::kStroke_Style);
302
303 canvas->drawPath(path, p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000304}
305
Brian Osmanc25e2692018-03-12 10:57:28 -0400306void render_region(SkCanvas* canvas, const SkRegion& region) {
307 canvas->clear(0xFFFFFFFF);
308
309 const SkIRect& bounds = region.getBounds();
310 if (bounds.isEmpty()) {
311 return;
312 }
313
314 SkAutoCanvasRestore acr(canvas, true);
Brian Osman99b63402018-03-13 10:19:27 -0400315 xlate_and_scale_to_bounds(canvas, SkRect::Make(bounds));
Brian Osmanc25e2692018-03-12 10:57:28 -0400316
317 SkPaint p;
318 p.setColor(SK_ColorBLACK);
319 p.setStyle(SkPaint::kStroke_Style);
320
321 canvas->drawRegion(region, p);
322}
323
halcanary96fcdcc2015-08-27 07:41:13 -0700324void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = nullptr) {
Mike Reed3661bc92017-02-22 13:21:42 -0500325 const SkISize& size = canvas->getBaseLayerSize();
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000326
327 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
328 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
329
330 if (input.width() > input.height()) {
331 yScale *= input.height() / (float) input.width();
332 } else {
333 xScale *= input.width() / (float) input.height();
334 }
335
336 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
337 xScale * input.width(),
338 yScale * input.height());
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000339
robertphillips96a5cff2015-09-24 06:56:27 -0700340 static const int kNumBlocks = 8;
341
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000342 canvas->clear(0xFFFFFFFF);
robertphillips96a5cff2015-09-24 06:56:27 -0700343 SkISize block = {
344 canvas->imageInfo().width()/kNumBlocks,
345 canvas->imageInfo().height()/kNumBlocks
346 };
347 for (int y = 0; y < kNumBlocks; ++y) {
348 for (int x = 0; x < kNumBlocks; ++x) {
349 SkPaint paint;
350 paint.setColor((x+y)%2 ? SK_ColorLTGRAY : SK_ColorDKGRAY);
351 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x*block.width()),
352 SkIntToScalar(y*block.height()),
353 SkIntToScalar(block.width()),
354 SkIntToScalar(block.height()));
355 canvas->drawRect(r, paint);
356 }
357 }
358
reede47829b2015-08-06 10:02:53 -0700359 canvas->drawBitmapRect(input, dst, nullptr);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000360
bsalomon49f085d2014-09-05 13:34:00 -0700361 if (srcRect) {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000362 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
363 srcRect->fTop * yScale + SK_Scalar1,
364 srcRect->fRight * xScale + SK_Scalar1,
365 srcRect->fBottom * yScale + SK_Scalar1);
366 SkPaint p;
367 p.setColor(SK_ColorRED);
368 p.setStyle(SkPaint::kStroke_Style);
369
370 canvas->drawRect(r, p);
371 }
372}
373
374void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
375 canvas->clear(0xFFFFFFFF);
376 canvas->save();
377
378 const SkRect& bounds = rrect.getBounds();
379
380 xlate_and_scale_to_bounds(canvas, bounds);
381
382 SkPaint p;
383 p.setColor(SK_ColorBLACK);
384 p.setStyle(SkPaint::kStroke_Style);
385
386 canvas->drawRRect(rrect, p);
387 canvas->restore();
388}
skia.committer@gmail.coma0090832013-06-07 07:01:06 +0000389
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000390void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
391 canvas->clear(0xFFFFFFFF);
392 canvas->save();
393
394 const SkRect& bounds = outer.getBounds();
395
396 xlate_and_scale_to_bounds(canvas, bounds);
397
398 SkPaint p;
399 p.setColor(SK_ColorBLACK);
400 p.setStyle(SkPaint::kStroke_Style);
401
402 canvas->drawDRRect(outer, inner, p);
403 canvas->restore();
404}
405
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400406void render_shadow(SkCanvas* canvas, const SkPath& path, SkDrawShadowRec rec) {
407 canvas->clear(0xFFFFFFFF);
408
409 const SkRect& bounds = path.getBounds();
410 if (bounds.isEmpty()) {
411 return;
412 }
413
414 SkAutoCanvasRestore acr(canvas, true);
415 xlate_and_scale_to_bounds(canvas, bounds);
416
417 rec.fAmbientColor = SK_ColorBLACK;
418 rec.fSpotColor = SK_ColorBLACK;
419 canvas->private_draw_shadow_rec(path, rec);
420}
421
Florin Malita82d80872017-06-06 16:58:40 -0400422static const char* const gBlendModeMap[] = {
423 "clear",
424 "src",
425 "dst",
426 "srcOver",
427 "dstOver",
428 "srcIn",
429 "dstIn",
430 "srcOut",
431 "dstOut",
432 "srcATop",
433 "dstATop",
434 "xor",
435 "plus",
436 "modulate",
437
438 "screen",
439
440 "overlay",
441 "darken",
442 "lighten",
443 "colorDodge",
444 "colorBurn",
445 "hardLight",
446 "softLight",
447 "difference",
448 "exclusion",
449 "multiply",
450
451 "hue",
452 "saturation",
453 "color",
454 "luminosity",
455};
456
457static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
458 "blendMode mismatch");
459static_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
460 "blendMode mismatch");
461
462void apply_paint_blend_mode(const SkPaint& paint, Json::Value* target) {
463 const auto mode = paint.getBlendMode();
464 if (mode != SkBlendMode::kSrcOver) {
465 SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
466 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE] =
467 Json::Value(gBlendModeMap[static_cast<size_t>(mode)]);
468 }
469}
470
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000471};
472
brianosmanfad98562016-05-04 11:06:28 -0700473Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800474 Json::Value result(Json::arrayValue);
475 result.append(Json::Value(SkColorGetA(color)));
476 result.append(Json::Value(SkColorGetR(color)));
477 result.append(Json::Value(SkColorGetG(color)));
478 result.append(Json::Value(SkColorGetB(color)));
479 return result;
480}
481
brianosman97bbf822016-09-25 13:15:58 -0700482Json::Value SkDrawCommand::MakeJsonColor4f(const SkColor4f& color) {
483 Json::Value result(Json::arrayValue);
484 result.append(Json::Value(color.fA));
485 result.append(Json::Value(color.fR));
486 result.append(Json::Value(color.fG));
487 result.append(Json::Value(color.fB));
488 return result;
489}
490
brianosmanfad98562016-05-04 11:06:28 -0700491Json::Value SkDrawCommand::MakeJsonPoint(const SkPoint& point) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800492 Json::Value result(Json::arrayValue);
493 result.append(Json::Value(point.x()));
494 result.append(Json::Value(point.y()));
495 return result;
496}
497
brianosmanfad98562016-05-04 11:06:28 -0700498Json::Value SkDrawCommand::MakeJsonPoint(SkScalar x, SkScalar y) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800499 Json::Value result(Json::arrayValue);
500 result.append(Json::Value(x));
501 result.append(Json::Value(y));
502 return result;
503}
504
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400505Json::Value SkDrawCommand::MakeJsonPoint3(const SkPoint3& point) {
506 Json::Value result(Json::arrayValue);
507 result.append(Json::Value(point.x()));
508 result.append(Json::Value(point.y()));
509 result.append(Json::Value(point.z()));
510 return result;
511}
512
brianosmanfad98562016-05-04 11:06:28 -0700513Json::Value SkDrawCommand::MakeJsonRect(const SkRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800514 Json::Value result(Json::arrayValue);
515 result.append(Json::Value(rect.left()));
516 result.append(Json::Value(rect.top()));
517 result.append(Json::Value(rect.right()));
518 result.append(Json::Value(rect.bottom()));
519 return result;
520}
521
joshualittbd724132016-03-03 11:39:38 -0800522Json::Value SkDrawCommand::MakeJsonIRect(const SkIRect& rect) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800523 Json::Value result(Json::arrayValue);
524 result.append(Json::Value(rect.left()));
525 result.append(Json::Value(rect.top()));
526 result.append(Json::Value(rect.right()));
527 result.append(Json::Value(rect.bottom()));
528 return result;
529}
530
531static Json::Value make_json_rrect(const SkRRect& rrect) {
532 Json::Value result(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700533 result.append(SkDrawCommand::MakeJsonRect(rrect.rect()));
534 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperLeft_Corner)));
535 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kUpperRight_Corner)));
536 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerRight_Corner)));
537 result.append(SkDrawCommand::MakeJsonPoint(rrect.radii(SkRRect::kLowerLeft_Corner)));
ethannicholas50a8dd02016-02-10 05:40:46 -0800538 return result;
539}
540
joshualittbd724132016-03-03 11:39:38 -0800541Json::Value SkDrawCommand::MakeJsonMatrix(const SkMatrix& matrix) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800542 Json::Value result(Json::arrayValue);
543 Json::Value row1(Json::arrayValue);
544 row1.append(Json::Value(matrix[0]));
545 row1.append(Json::Value(matrix[1]));
546 row1.append(Json::Value(matrix[2]));
547 result.append(row1);
548 Json::Value row2(Json::arrayValue);
549 row2.append(Json::Value(matrix[3]));
550 row2.append(Json::Value(matrix[4]));
551 row2.append(Json::Value(matrix[5]));
552 result.append(row2);
553 Json::Value row3(Json::arrayValue);
554 row3.append(Json::Value(matrix[6]));
555 row3.append(Json::Value(matrix[7]));
556 row3.append(Json::Value(matrix[8]));
557 result.append(row3);
558 return result;
559}
ethannicholas1446a9a2016-02-10 14:05:02 -0800560
vjiaoblacke5de1302016-07-13 14:05:28 -0700561Json::Value SkDrawCommand::MakeJsonScalar(SkScalar z) {
562 Json::Value result(z);
563 return result;
564}
565
brianosmanfad98562016-05-04 11:06:28 -0700566Json::Value SkDrawCommand::MakeJsonPath(const SkPath& path) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800567 Json::Value result(Json::objectValue);
568 switch (path.getFillType()) {
569 case SkPath::kWinding_FillType:
570 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_WINDING;
571 break;
572 case SkPath::kEvenOdd_FillType:
573 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_EVENODD;
574 break;
575 case SkPath::kInverseWinding_FillType:
576 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING;
577 break;
578 case SkPath::kInverseEvenOdd_FillType:
579 result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
580 break;
halcanary9d524f22016-03-29 09:03:52 -0700581 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800582 Json::Value verbs(Json::arrayValue);
583 SkPath::Iter iter(path, false);
584 SkPoint pts[4];
585 SkPath::Verb verb;
586 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
587 switch (verb) {
588 case SkPath::kLine_Verb: {
589 Json::Value line(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700590 line[SKDEBUGCANVAS_VERB_LINE] = MakeJsonPoint(pts[1]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800591 verbs.append(line);
592 break;
593 }
594 case SkPath::kQuad_Verb: {
595 Json::Value quad(Json::objectValue);
596 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700597 coords.append(MakeJsonPoint(pts[1]));
598 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800599 quad[SKDEBUGCANVAS_VERB_QUAD] = coords;
600 verbs.append(quad);
601 break;
602 }
603 case SkPath::kCubic_Verb: {
604 Json::Value cubic(Json::objectValue);
605 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700606 coords.append(MakeJsonPoint(pts[1]));
607 coords.append(MakeJsonPoint(pts[2]));
608 coords.append(MakeJsonPoint(pts[3]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800609 cubic[SKDEBUGCANVAS_VERB_CUBIC] = coords;
610 verbs.append(cubic);
611 break;
612 }
613 case SkPath::kConic_Verb: {
614 Json::Value conic(Json::objectValue);
615 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -0700616 coords.append(MakeJsonPoint(pts[1]));
617 coords.append(MakeJsonPoint(pts[2]));
ethannicholas50a8dd02016-02-10 05:40:46 -0800618 coords.append(Json::Value(iter.conicWeight()));
619 conic[SKDEBUGCANVAS_VERB_CONIC] = coords;
620 verbs.append(conic);
621 break;
622 }
623 case SkPath::kMove_Verb: {
624 Json::Value move(Json::objectValue);
brianosmanfad98562016-05-04 11:06:28 -0700625 move[SKDEBUGCANVAS_VERB_MOVE] = MakeJsonPoint(pts[0]);
ethannicholas50a8dd02016-02-10 05:40:46 -0800626 verbs.append(move);
627 break;
628 }
629 case SkPath::kClose_Verb:
630 verbs.append(Json::Value(SKDEBUGCANVAS_VERB_CLOSE));
631 break;
632 case SkPath::kDone_Verb:
633 break;
634 }
635 }
636 result[SKDEBUGCANVAS_ATTRIBUTE_VERBS] = verbs;
637 return result;
638}
639
brianosmanfad98562016-05-04 11:06:28 -0700640Json::Value SkDrawCommand::MakeJsonRegion(const SkRegion& region) {
Brian Osmanc25e2692018-03-12 10:57:28 -0400641 // TODO: Actually serialize the rectangles, rather than just devolving to path
642 SkPath path;
643 region.getBoundaryPath(&path);
644 return MakeJsonPath(path);
ethannicholas50a8dd02016-02-10 05:40:46 -0800645}
646
Mike Reedc1f77742016-12-09 09:00:50 -0500647static Json::Value make_json_regionop(SkClipOp op) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800648 switch (op) {
Mike Reedc1f77742016-12-09 09:00:50 -0500649 case kDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800650 return Json::Value(SKDEBUGCANVAS_REGIONOP_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500651 case kIntersect_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800652 return Json::Value(SKDEBUGCANVAS_REGIONOP_INTERSECT);
Mike Reedc1f77742016-12-09 09:00:50 -0500653 case kUnion_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800654 return Json::Value(SKDEBUGCANVAS_REGIONOP_UNION);
Mike Reedc1f77742016-12-09 09:00:50 -0500655 case kXOR_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800656 return Json::Value(SKDEBUGCANVAS_REGIONOP_XOR);
Mike Reedc1f77742016-12-09 09:00:50 -0500657 case kReverseDifference_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800658 return Json::Value(SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE);
Mike Reedc1f77742016-12-09 09:00:50 -0500659 case kReplace_SkClipOp:
ethannicholas50a8dd02016-02-10 05:40:46 -0800660 return Json::Value(SKDEBUGCANVAS_REGIONOP_REPLACE);
661 default:
662 SkASSERT(false);
663 return Json::Value("<invalid region op>");
664 };
665}
666
667static Json::Value make_json_pointmode(SkCanvas::PointMode mode) {
668 switch (mode) {
669 case SkCanvas::kPoints_PointMode:
670 return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
671 case SkCanvas::kLines_PointMode:
672 return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
halcanary9d524f22016-03-29 09:03:52 -0700673 case SkCanvas::kPolygon_PointMode:
ethannicholas50a8dd02016-02-10 05:40:46 -0800674 return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
675 default:
676 SkASSERT(false);
677 return Json::Value("<invalid point mode>");
678 };
679}
680
halcanary9d524f22016-03-29 09:03:52 -0700681static void store_scalar(Json::Value* target, const char* key, SkScalar value,
ethannicholasbd3dae82016-02-10 12:10:00 -0800682 SkScalar defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800683 if (value != defaultValue) {
684 (*target)[key] = Json::Value(value);
685 }
686}
687
ethannicholasbd3dae82016-02-10 12:10:00 -0800688static void store_bool(Json::Value* target, const char* key, bool value, bool defaultValue) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800689 if (value != defaultValue) {
690 (*target)[key] = Json::Value(value);
691 }
692}
693
halcanary9d524f22016-03-29 09:03:52 -0700694static void encode_data(const void* bytes, size_t count, const char* contentType,
ethannicholasf62a8b72016-02-11 10:35:21 -0800695 UrlDataManager& urlDataManager, Json::Value* target) {
bungeman38d909e2016-08-02 14:40:46 -0700696 sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
697 SkString url = urlDataManager.addData(data.get(), contentType);
ethannicholasf62a8b72016-02-11 10:35:21 -0800698 *target = Json::Value(url.c_str());
ethannicholas50a8dd02016-02-10 05:40:46 -0800699}
700
brianosmanfad98562016-05-04 11:06:28 -0700701void SkDrawCommand::flatten(const SkFlattenable* flattenable, Json::Value* target,
702 UrlDataManager& urlDataManager) {
703 SkBinaryWriteBuffer buffer;
ethannicholasf62a8b72016-02-11 10:35:21 -0800704 flattenable->flatten(buffer);
705 void* data = sk_malloc_throw(buffer.bytesWritten());
706 buffer.writeToMemory(data);
707 Json::Value jsonData;
708 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, &jsonData);
709 Json::Value jsonFlattenable;
710 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME] = Json::Value(flattenable->getTypeName());
711 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
brianosmanfad98562016-05-04 11:06:28 -0700712
713 SkJsonWriteBuffer jsonBuffer(&urlDataManager);
714 flattenable->flatten(jsonBuffer);
715 jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_VALUES] = jsonBuffer.getValue();
716
ethannicholasf62a8b72016-02-11 10:35:21 -0800717 (*target) = jsonFlattenable;
718 sk_free(data);
ethannicholas50a8dd02016-02-10 05:40:46 -0800719}
720
Brian Osmand9ea8162018-08-08 17:03:39 -0400721void SkDrawCommand::WritePNG(SkBitmap bitmap, SkWStream& out) {
722 SkPixmap pm;
723 SkAssertResult(bitmap.peekPixels(&pm));
ethannicholasf67531f2016-03-21 10:19:39 -0700724
Brian Osmand9ea8162018-08-08 17:03:39 -0400725 SkPngEncoder::Options options;
726 options.fZLibLevel = 1;
727 options.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
728 SkPngEncoder::Encode(&out, pm, options);
ethannicholasf67531f2016-03-21 10:19:39 -0700729}
730
brianosmanfad98562016-05-04 11:06:28 -0700731bool SkDrawCommand::flatten(const SkImage& image, Json::Value* target,
732 UrlDataManager& urlDataManager) {
ethannicholasf67531f2016-03-21 10:19:39 -0700733 size_t rowBytes = 4 * image.width();
Hal Canary95e3c052017-01-11 12:44:43 -0500734 SkAutoMalloc buffer(rowBytes * image.height());
halcanary9d524f22016-03-29 09:03:52 -0700735 SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
ethannicholasf67531f2016-03-21 10:19:39 -0700736 kN32_SkColorType, kPremul_SkAlphaType);
737 if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
738 SkDebugf("readPixels failed\n");
739 return false;
ethannicholas50a8dd02016-02-10 05:40:46 -0800740 }
msaretta5cf4f42016-06-30 10:06:51 -0700741
742 SkBitmap bm;
743 bm.installPixels(dstInfo, buffer.get(), rowBytes);
msaretta5cf4f42016-06-30 10:06:51 -0700744
ethannicholasf67531f2016-03-21 10:19:39 -0700745 SkDynamicMemoryWStream out;
Brian Osmand9ea8162018-08-08 17:03:39 -0400746 SkDrawCommand::WritePNG(bm, out);
reed42943c82016-09-12 12:01:44 -0700747 sk_sp<SkData> encoded = out.detachAsData();
ethannicholasf62a8b72016-02-11 10:35:21 -0800748 Json::Value jsonData;
749 encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager, &jsonData);
750 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
ethannicholas50a8dd02016-02-10 05:40:46 -0800751 return true;
752}
753
754static const char* color_type_name(SkColorType colorType) {
755 switch (colorType) {
756 case kARGB_4444_SkColorType:
757 return SKDEBUGCANVAS_COLORTYPE_ARGB4444;
758 case kRGBA_8888_SkColorType:
759 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
760 case kBGRA_8888_SkColorType:
761 return SKDEBUGCANVAS_COLORTYPE_BGRA8888;
762 case kRGB_565_SkColorType:
763 return SKDEBUGCANVAS_COLORTYPE_565;
764 case kGray_8_SkColorType:
765 return SKDEBUGCANVAS_COLORTYPE_GRAY8;
ethannicholas50a8dd02016-02-10 05:40:46 -0800766 case kAlpha_8_SkColorType:
767 return SKDEBUGCANVAS_COLORTYPE_ALPHA8;
768 default:
769 SkASSERT(false);
770 return SKDEBUGCANVAS_COLORTYPE_RGBA8888;
771 }
772}
773
774static const char* alpha_type_name(SkAlphaType alphaType) {
775 switch (alphaType) {
776 case kOpaque_SkAlphaType:
777 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
778 case kPremul_SkAlphaType:
779 return SKDEBUGCANVAS_ALPHATYPE_PREMUL;
780 case kUnpremul_SkAlphaType:
781 return SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
782 default:
783 SkASSERT(false);
784 return SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
785 }
786}
787
brianosmanfad98562016-05-04 11:06:28 -0700788bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target,
789 UrlDataManager& urlDataManager) {
reed9ce9d672016-03-17 10:51:11 -0700790 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
ethannicholas50a8dd02016-02-10 05:40:46 -0800791 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = Json::Value(color_type_name(bitmap.colorType()));
792 (*target)[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = Json::Value(alpha_type_name(bitmap.alphaType()));
ethannicholasf62a8b72016-02-11 10:35:21 -0800793 bool success = flatten(*image, target, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800794 return success;
795}
796
halcanaryf412f092016-08-25 11:10:41 -0700797static void apply_paint_hinting(const SkPaint& paint, Json::Value* target) {
798 SkPaint::Hinting hinting = paint.getHinting();
799 if (hinting != SkPaintDefaults_Hinting) {
800 switch (hinting) {
801 case SkPaint::kNo_Hinting:
802 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NONE;
803 break;
804 case SkPaint::kSlight_Hinting:
805 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_SLIGHT;
806 break;
807 case SkPaint::kNormal_Hinting:
808 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_NORMAL;
809 break;
810 case SkPaint::kFull_Hinting:
811 (*target)[SKDEBUGCANVAS_ATTRIBUTE_HINTING] = SKDEBUGCANVAS_HINTING_FULL;
812 break;
813 }
814 }
815}
816
ethannicholas50a8dd02016-02-10 05:40:46 -0800817static void apply_paint_color(const SkPaint& paint, Json::Value* target) {
818 SkColor color = paint.getColor();
819 if (color != SK_ColorBLACK) {
820 Json::Value colorValue(Json::arrayValue);
821 colorValue.append(Json::Value(SkColorGetA(color)));
822 colorValue.append(Json::Value(SkColorGetR(color)));
823 colorValue.append(Json::Value(SkColorGetG(color)));
824 colorValue.append(Json::Value(SkColorGetB(color)));
825 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = colorValue;;
826 }
827}
828
829static void apply_paint_style(const SkPaint& paint, Json::Value* target) {
830 SkPaint::Style style = paint.getStyle();
831 if (style != SkPaint::kFill_Style) {
832 switch (style) {
833 case SkPaint::kStroke_Style: {
834 Json::Value stroke(SKDEBUGCANVAS_STYLE_STROKE);
835 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = stroke;
836 break;
837 }
838 case SkPaint::kStrokeAndFill_Style: {
839 Json::Value strokeAndFill(SKDEBUGCANVAS_STYLE_STROKEANDFILL);
840 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = strokeAndFill;
841 break;
842 }
843 default: SkASSERT(false);
844 }
845 }
846}
847
848static void apply_paint_cap(const SkPaint& paint, Json::Value* target) {
849 SkPaint::Cap cap = paint.getStrokeCap();
850 if (cap != SkPaint::kDefault_Cap) {
851 switch (cap) {
ethannicholas1446a9a2016-02-10 14:05:02 -0800852 case SkPaint::kButt_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800853 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_BUTT);
854 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800855 case SkPaint::kRound_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800856 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_ROUND);
857 break;
ethannicholas1446a9a2016-02-10 14:05:02 -0800858 case SkPaint::kSquare_Cap:
ethannicholas50a8dd02016-02-10 05:40:46 -0800859 (*target)[SKDEBUGCANVAS_ATTRIBUTE_CAP] = Json::Value(SKDEBUGCANVAS_CAP_SQUARE);
860 break;
ethannicholas50a8dd02016-02-10 05:40:46 -0800861 default: SkASSERT(false);
862 }
863 }
864}
ethannicholas1446a9a2016-02-10 14:05:02 -0800865
866static void apply_paint_join(const SkPaint& paint, Json::Value* target) {
867 SkPaint::Join join = paint.getStrokeJoin();
868 if (join != SkPaint::kDefault_Join) {
869 switch (join) {
870 case SkPaint::kMiter_Join:
871 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
872 SKDEBUGCANVAS_MITER_JOIN);
873 break;
874 case SkPaint::kRound_Join:
875 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
876 SKDEBUGCANVAS_ROUND_JOIN);
877 break;
878 case SkPaint::kBevel_Join:
879 (*target)[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN] = Json::Value(
880 SKDEBUGCANVAS_BEVEL_JOIN);
881 break;
882 default: SkASSERT(false);
883 }
884 }
885}
886
887static void apply_paint_filterquality(const SkPaint& paint, Json::Value* target) {
888 SkFilterQuality quality = paint.getFilterQuality();
889 switch (quality) {
890 case kNone_SkFilterQuality:
891 break;
892 case kLow_SkFilterQuality:
893 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
894 SKDEBUGCANVAS_FILTERQUALITY_LOW);
895 break;
896 case kMedium_SkFilterQuality:
897 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
898 SKDEBUGCANVAS_FILTERQUALITY_MEDIUM);
899 break;
900 case kHigh_SkFilterQuality:
901 (*target)[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY] = Json::Value(
902 SKDEBUGCANVAS_FILTERQUALITY_HIGH);
903 break;
904 }
905}
906
halcanary9d524f22016-03-29 09:03:52 -0700907static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800908 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800909 SkMaskFilter* maskFilter = paint.getMaskFilter();
910 if (maskFilter != nullptr) {
Mike Reed80747ef2018-01-23 15:29:32 -0500911 SkMaskFilterBase::BlurRec blurRec;
912 if (as_MFB(maskFilter)->asABlur(&blurRec)) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800913 Json::Value blur(Json::objectValue);
914 blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA] = Json::Value(blurRec.fSigma);
915 switch (blurRec.fStyle) {
916 case SkBlurStyle::kNormal_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800917 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
918 SKDEBUGCANVAS_BLURSTYLE_NORMAL);
ethannicholas50a8dd02016-02-10 05:40:46 -0800919 break;
920 case SkBlurStyle::kSolid_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800921 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
922 SKDEBUGCANVAS_BLURSTYLE_SOLID);
ethannicholas50a8dd02016-02-10 05:40:46 -0800923 break;
924 case SkBlurStyle::kOuter_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800925 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
926 SKDEBUGCANVAS_BLURSTYLE_OUTER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800927 break;
928 case SkBlurStyle::kInner_SkBlurStyle:
ethannicholas1446a9a2016-02-10 14:05:02 -0800929 blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE] = Json::Value(
930 SKDEBUGCANVAS_BLURSTYLE_INNER);
ethannicholas50a8dd02016-02-10 05:40:46 -0800931 break;
932 default:
933 SkASSERT(false);
934 }
ethannicholas50a8dd02016-02-10 05:40:46 -0800935 (*target)[SKDEBUGCANVAS_ATTRIBUTE_BLUR] = blur;
936 } else {
937 Json::Value jsonMaskFilter;
brianosmanfad98562016-05-04 11:06:28 -0700938 SkDrawCommand::flatten(maskFilter, &jsonMaskFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800939 (*target)[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER] = jsonMaskFilter;
940 }
941 }
942}
943
halcanary9d524f22016-03-29 09:03:52 -0700944static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800945 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800946 SkPathEffect* pathEffect = paint.getPathEffect();
947 if (pathEffect != nullptr) {
948 SkPathEffect::DashInfo dashInfo;
949 SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
950 if (dashType == SkPathEffect::kDash_DashType) {
951 dashInfo.fIntervals = (SkScalar*) sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
952 pathEffect->asADash(&dashInfo);
953 Json::Value dashing(Json::objectValue);
954 Json::Value intervals(Json::arrayValue);
955 for (int32_t i = 0; i < dashInfo.fCount; i++) {
956 intervals.append(Json::Value(dashInfo.fIntervals[i]));
957 }
958 sk_free(dashInfo.fIntervals);
959 dashing[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS] = intervals;
960 dashing[SKDEBUGCANVAS_ATTRIBUTE_PHASE] = dashInfo.fPhase;
961 (*target)[SKDEBUGCANVAS_ATTRIBUTE_DASHING] = dashing;
962 } else {
963 Json::Value jsonPathEffect;
brianosmanfad98562016-05-04 11:06:28 -0700964 SkDrawCommand::flatten(pathEffect, &jsonPathEffect, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800965 (*target)[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT] = jsonPathEffect;
966 }
967 }
968}
halcanary9d524f22016-03-29 09:03:52 -0700969
ethannicholas50a8dd02016-02-10 05:40:46 -0800970static void apply_paint_textalign(const SkPaint& paint, Json::Value* target) {
971 SkPaint::Align textAlign = paint.getTextAlign();
972 if (textAlign != SkPaint::kLeft_Align) {
973 switch (textAlign) {
974 case SkPaint::kCenter_Align: {
975 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_CENTER;
976 break;
977 }
978 case SkPaint::kRight_Align: {
979 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN] = SKDEBUGCANVAS_ALIGN_RIGHT;
980 break;
981 }
982 default: SkASSERT(false);
983 }
984 }
985}
986
halcanary9d524f22016-03-29 09:03:52 -0700987static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -0800988 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -0800989 SkTypeface* typeface = paint.getTypeface();
990 if (typeface != nullptr) {
ethannicholasf62a8b72016-02-11 10:35:21 -0800991 Json::Value jsonTypeface;
992 SkDynamicMemoryWStream buffer;
993 typeface->serialize(&buffer);
994 void* data = sk_malloc_throw(buffer.bytesWritten());
995 buffer.copyTo(data);
996 Json::Value jsonData;
halcanary9d524f22016-03-29 09:03:52 -0700997 encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
ethannicholasf62a8b72016-02-11 10:35:21 -0800998 &jsonData);
999 jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
1000 sk_free(data);
1001 (*target)[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
ethannicholas50a8dd02016-02-10 05:40:46 -08001002 }
1003}
1004
halcanary9d524f22016-03-29 09:03:52 -07001005static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001006 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001007 SkFlattenable* shader = paint.getShader();
1008 if (shader != nullptr) {
1009 Json::Value jsonShader;
brianosmanfad98562016-05-04 11:06:28 -07001010 SkDrawCommand::flatten(shader, &jsonShader, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001011 (*target)[SKDEBUGCANVAS_ATTRIBUTE_SHADER] = jsonShader;
1012 }
1013}
1014
ethannicholasf62a8b72016-02-11 10:35:21 -08001015static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target,
1016 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001017 SkFlattenable* imageFilter = paint.getImageFilter();
1018 if (imageFilter != nullptr) {
1019 Json::Value jsonImageFilter;
brianosmanfad98562016-05-04 11:06:28 -07001020 SkDrawCommand::flatten(imageFilter, &jsonImageFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001021 (*target)[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER] = jsonImageFilter;
1022 }
1023}
1024
halcanary9d524f22016-03-29 09:03:52 -07001025static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001026 UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001027 SkFlattenable* colorFilter = paint.getColorFilter();
1028 if (colorFilter != nullptr) {
1029 Json::Value jsonColorFilter;
brianosmanfad98562016-05-04 11:06:28 -07001030 SkDrawCommand::flatten(colorFilter, &jsonColorFilter, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001031 (*target)[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
1032 }
1033}
1034
halcanary9d524f22016-03-29 09:03:52 -07001035static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
ethannicholasf62a8b72016-02-11 10:35:21 -08001036 UrlDataManager& urlDataManager) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001037 SkFlattenable* looper = paint.getLooper();
1038 if (looper != nullptr) {
1039 Json::Value jsonLooper;
brianosmanfad98562016-05-04 11:06:28 -07001040 SkDrawCommand::flatten(looper, &jsonLooper, urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001041 (*target)[SKDEBUGCANVAS_ATTRIBUTE_LOOPER] = jsonLooper;
1042 }
1043}
1044
brianosmanfad98562016-05-04 11:06:28 -07001045Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001046 Json::Value result(Json::objectValue);
1047 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
halcanary9d524f22016-03-29 09:03:52 -07001048 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001049 SkPaintDefaults_MiterLimit);
1050 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
ethannicholas1446a9a2016-02-10 14:05:02 -08001051 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001052 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, paint.isFakeBoldText(), false);
1053 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT, paint.isLinearText(), false);
1054 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, paint.isSubpixelText(), false);
Ben Wagner78f1f5a2017-06-23 14:35:07 -04001055 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT, paint.isLCDRenderText(), false);
1056 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, paint.isEmbeddedBitmapText(), false);
1057 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING, paint.isAutohinted(), false);
1058 store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT, paint.isVerticalText(), false);
1059 //kGenA8FromLCD_Flag
1060
halcanary9d524f22016-03-29 09:03:52 -07001061 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
ethannicholas50a8dd02016-02-10 05:40:46 -08001062 SkPaintDefaults_TextSize);
1063 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
1064 store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
halcanaryf412f092016-08-25 11:10:41 -07001065 apply_paint_hinting(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001066 apply_paint_color(paint, &result);
1067 apply_paint_style(paint, &result);
Florin Malita82d80872017-06-06 16:58:40 -04001068 apply_paint_blend_mode(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001069 apply_paint_cap(paint, &result);
ethannicholas1446a9a2016-02-10 14:05:02 -08001070 apply_paint_join(paint, &result);
1071 apply_paint_filterquality(paint, &result);
ethannicholas50a8dd02016-02-10 05:40:46 -08001072 apply_paint_textalign(paint, &result);
ethannicholasf62a8b72016-02-11 10:35:21 -08001073 apply_paint_patheffect(paint, &result, urlDataManager);
1074 apply_paint_maskfilter(paint, &result, urlDataManager);
1075 apply_paint_shader(paint, &result, urlDataManager);
ethannicholasf62a8b72016-02-11 10:35:21 -08001076 apply_paint_looper(paint, &result, urlDataManager);
1077 apply_paint_imagefilter(paint, &result, urlDataManager);
1078 apply_paint_colorfilter(paint, &result, urlDataManager);
1079 apply_paint_typeface(paint, &result, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001080 return result;
1081}
1082
Stan Ilievac42aeb2017-01-12 16:20:50 -05001083Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) {
1084 Json::Value result(Json::objectValue);
1085 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount);
1086 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount);
1087 if (nullptr != lattice.fBounds) {
1088 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds);
1089 }
1090 Json::Value XDivs(Json::arrayValue);
1091 for (int i = 0; i < lattice.fXCount; i++) {
1092 XDivs.append(Json::Value(lattice.fXDivs[i]));
1093 }
1094 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs;
1095 Json::Value YDivs(Json::arrayValue);
1096 for (int i = 0; i < lattice.fYCount; i++) {
1097 YDivs.append(Json::Value(lattice.fYDivs[i]));
1098 }
1099 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs;
Stan Ilievca8c0952017-12-11 13:01:58 -05001100 if (nullptr != lattice.fRectTypes) {
Stan Ilievac42aeb2017-01-12 16:20:50 -05001101 Json::Value flags(Json::arrayValue);
1102 int flagCount = 0;
1103 for (int row = 0; row < lattice.fYCount+1; row++) {
1104 Json::Value flagsRow(Json::arrayValue);
1105 for (int column = 0; column < lattice.fXCount+1; column++) {
Stan Ilievca8c0952017-12-11 13:01:58 -05001106 flagsRow.append(Json::Value(lattice.fRectTypes[flagCount++]));
Stan Ilievac42aeb2017-01-12 16:20:50 -05001107 }
1108 flags.append(flagsRow);
1109 }
1110 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags;
1111 }
1112 return result;
1113}
1114
Brian Osmanc25e2692018-03-12 10:57:28 -04001115SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kClear_OpType) {
ethannicholas1446a9a2016-02-10 14:05:02 -08001116 fColor = color;
ethannicholas1446a9a2016-02-10 14:05:02 -08001117}
1118
1119void SkClearCommand::execute(SkCanvas* canvas) const {
1120 canvas->clear(fColor);
1121}
1122
ethannicholasf62a8b72016-02-11 10:35:21 -08001123Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const {
1124 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001125 result[SKDEBUGCANVAS_ATTRIBUTE_COLOR] = MakeJsonColor(fColor);
ethannicholas1446a9a2016-02-10 14:05:02 -08001126 return result;
1127}
1128
Mike Reedc1f77742016-12-09 09:00:50 -05001129SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001130 : INHERITED(kClipPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001131 fPath = path;
1132 fOp = op;
1133 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001134}
1135
fmalita8c89c522014-11-08 16:18:56 -08001136void SkClipPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001137 canvas->clipPath(fPath, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001138}
1139
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001140bool SkClipPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001141 render_path(canvas, fPath);
1142 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001143}
1144
ethannicholasf62a8b72016-02-11 10:35:21 -08001145Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1146 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001147 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
ethannicholas50a8dd02016-02-10 05:40:46 -08001148 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1149 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = fDoAA;
1150 return result;
1151}
1152
Mike Reedc1f77742016-12-09 09:00:50 -05001153SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op)
robertphillips9bafc302015-02-13 11:13:00 -08001154 : INHERITED(kClipRegion_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001155 fRegion = region;
1156 fOp = op;
chudy@google.com902ebe52012-06-29 14:21:22 +00001157}
1158
fmalita8c89c522014-11-08 16:18:56 -08001159void SkClipRegionCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001160 canvas->clipRegion(fRegion, fOp);
chudy@google.com902ebe52012-06-29 14:21:22 +00001161}
1162
ethannicholasf62a8b72016-02-11 10:35:21 -08001163Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1164 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001165 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
ethannicholas50a8dd02016-02-10 05:40:46 -08001166 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1167 return result;
1168}
1169
Mike Reedc1f77742016-12-09 09:00:50 -05001170SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001171 : INHERITED(kClipRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001172 fRect = rect;
1173 fOp = op;
1174 fDoAA = doAA;
chudy@google.com902ebe52012-06-29 14:21:22 +00001175}
1176
fmalita8c89c522014-11-08 16:18:56 -08001177void SkClipRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001178 canvas->clipRect(fRect, fOp, fDoAA);
chudy@google.com902ebe52012-06-29 14:21:22 +00001179}
1180
ethannicholasf62a8b72016-02-11 10:35:21 -08001181Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1182 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001183 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
ethannicholas50a8dd02016-02-10 05:40:46 -08001184 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1185 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
reed67f62fa2016-06-29 11:36:34 -07001186
1187 SkString desc;
1188 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
1189
ethannicholas50a8dd02016-02-10 05:40:46 -08001190 return result;
1191}
1192
Mike Reedc1f77742016-12-09 09:00:50 -05001193SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
robertphillips9bafc302015-02-13 11:13:00 -08001194 : INHERITED(kClipRRect_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001195 fRRect = rrect;
1196 fOp = op;
1197 fDoAA = doAA;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001198}
1199
fmalita8c89c522014-11-08 16:18:56 -08001200void SkClipRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001201 canvas->clipRRect(fRRect, fOp, fDoAA);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001202}
1203
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001204bool SkClipRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001205 render_rrect(canvas, fRRect);
1206 return true;
1207}
1208
ethannicholasf62a8b72016-02-11 10:35:21 -08001209Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1210 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001211 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
1212 result[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP] = make_json_regionop(fOp);
1213 result[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS] = Json::Value(fDoAA);
1214 return result;
1215}
1216
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001217SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08001218 : INHERITED(kConcat_OpType) {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001219 fMatrix = matrix;
chudy@google.com902ebe52012-06-29 14:21:22 +00001220}
1221
fmalita8c89c522014-11-08 16:18:56 -08001222void SkConcatCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com24bfdac2013-03-22 16:33:31 +00001223 canvas->concat(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00001224}
1225
ethannicholasf62a8b72016-02-11 10:35:21 -08001226Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const {
1227 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08001228 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08001229 return result;
1230}
1231
reed97660cc2016-06-28 18:54:19 -07001232////
1233
1234SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[],
1235 sk_sp<SkData> value)
1236 : INHERITED(kDrawAnnotation_OpType)
1237 , fRect(rect)
1238 , fKey(key)
1239 , fValue(std::move(value))
robertphillipsfb409232016-06-29 10:28:11 -07001240{
robertphillipsfb409232016-06-29 10:28:11 -07001241}
reed97660cc2016-06-28 18:54:19 -07001242
1243void SkDrawAnnotationCommand::execute(SkCanvas* canvas) const {
1244 canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1245}
1246
1247Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) const {
1248 Json::Value result = INHERITED::toJSON(urlDataManager);
1249
1250 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
1251 result["key"] = Json::Value(fKey.c_str());
1252 if (fValue.get()) {
1253 // TODO: dump out the "value"
1254 }
reed67f62fa2016-06-29 11:36:34 -07001255
1256 SkString desc;
1257 str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1258 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(desc.c_str());
1259
reed97660cc2016-06-28 18:54:19 -07001260 return result;
1261}
1262
reed97660cc2016-06-28 18:54:19 -07001263////
1264
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001265SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
robertphillipsb3f319f2014-08-13 10:46:23 -07001266 const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001267 : INHERITED(kDrawBitmap_OpType)
1268 , fBitmap(bitmap)
1269 , fLeft(left)
1270 , fTop(top)
1271 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001272
fmalita8c89c522014-11-08 16:18:56 -08001273void SkDrawBitmapCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001274 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001275}
1276
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001277bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001278 render_bitmap(canvas, fBitmap);
1279 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001280}
1281
ethannicholasf62a8b72016-02-11 10:35:21 -08001282Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const {
1283 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001284 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001285 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001286 Json::Value command(Json::objectValue);
1287 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001288 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
Brian Osman8363be12018-05-29 13:38:07 -04001289 if (fPaint.isValid()) {
1290 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001291 }
1292 }
1293 return result;
1294}
1295
Brian Osman78a76482018-05-18 16:59:13 -04001296SkDrawBitmapLatticeCommand::SkDrawBitmapLatticeCommand(const SkBitmap& bitmap,
1297 const SkCanvas::Lattice& lattice,
1298 const SkRect& dst, const SkPaint* paint)
1299 : INHERITED(kDrawBitmapLattice_OpType)
1300 , fBitmap(bitmap)
1301 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001302 , fDst(dst)
1303 , fPaint(paint) {}
Brian Osman78a76482018-05-18 16:59:13 -04001304
1305void SkDrawBitmapLatticeCommand::execute(SkCanvas* canvas) const {
1306 canvas->drawBitmapLattice(fBitmap, fLattice, fDst, fPaint.getMaybeNull());
1307}
1308
1309bool SkDrawBitmapLatticeCommand::render(SkCanvas* canvas) const {
1310 SkAutoCanvasRestore acr(canvas, true);
1311 canvas->clear(0xFFFFFFFF);
1312
1313 xlate_and_scale_to_bounds(canvas, fDst);
1314
1315 this->execute(canvas);
1316 return true;
1317}
1318
1319Json::Value SkDrawBitmapLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1320 Json::Value result = INHERITED::toJSON(urlDataManager);
1321 Json::Value encoded;
1322 if (flatten(fBitmap, &encoded, urlDataManager)) {
1323 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
1324 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1325 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1326 if (fPaint.isValid()) {
1327 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1328 }
1329 }
1330
1331 SkString desc;
1332 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1333
1334 return result;
1335}
1336
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001337SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
skia.committer@gmail.comdb35dab2014-03-27 03:02:48 +00001338 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001339 : INHERITED(kDrawBitmapNine_OpType)
1340 , fBitmap(bitmap)
1341 , fCenter(center)
1342 , fDst(dst)
1343 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001344
fmalita8c89c522014-11-08 16:18:56 -08001345void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001346 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaint.getMaybeNull());
chudy@google.com902ebe52012-06-29 14:21:22 +00001347}
1348
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001349bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
robertphillips2b829822015-11-18 12:59:42 -08001350 SkRect tmp = SkRect::Make(fCenter);
1351 render_bitmap(canvas, fBitmap, &tmp);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001352 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001353}
1354
ethannicholasf62a8b72016-02-11 10:35:21 -08001355Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1356 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001357 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001358 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001359 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
joshualittbd724132016-03-03 11:39:38 -08001360 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
brianosmanfad98562016-05-04 11:06:28 -07001361 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001362 if (fPaint.isValid()) {
1363 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001364 }
1365 }
1366 return result;
1367}
1368
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001369SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +00001370 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -07001371 SkCanvas::SrcRectConstraint constraint)
Brian Osman8363be12018-05-29 13:38:07 -04001372 : INHERITED(kDrawBitmapRect_OpType)
1373 , fBitmap(bitmap)
1374 , fSrc(src)
1375 , fDst(dst)
1376 , fPaint(paint)
1377 , fConstraint(constraint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001378
fmalita8c89c522014-11-08 16:18:56 -08001379void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001380 canvas->legacy_drawBitmapRect(fBitmap, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
1381 fConstraint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001382}
1383
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001384bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001385 render_bitmap(canvas, fBitmap, fSrc.getMaybeNull());
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001386 return true;
robertphillips@google.com53ec73d2012-11-26 13:09:17 +00001387}
1388
ethannicholasf62a8b72016-02-11 10:35:21 -08001389Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1390 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001391 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001392 if (flatten(fBitmap, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001393 result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded;
Brian Osman8363be12018-05-29 13:38:07 -04001394 if (fSrc.isValid()) {
1395 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001396 }
brianosmanfad98562016-05-04 11:06:28 -07001397 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001398 if (fPaint.isValid()) {
1399 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001400 }
1401 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1402 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1403 }
1404 }
reed67f62fa2016-06-29 11:36:34 -07001405
1406 SkString desc;
1407 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1408
ethannicholas50a8dd02016-02-10 05:40:46 -08001409 return result;
1410}
1411
fmalita651c9202015-07-22 10:23:01 -07001412SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top,
1413 const SkPaint* paint)
1414 : INHERITED(kDrawImage_OpType)
1415 , fImage(SkRef(image))
1416 , fLeft(left)
Brian Osman8363be12018-05-29 13:38:07 -04001417 , fTop(top)
1418 , fPaint(paint) {}
fmalita651c9202015-07-22 10:23:01 -07001419
1420void SkDrawImageCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001421 canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull());
fmalita651c9202015-07-22 10:23:01 -07001422}
1423
1424bool SkDrawImageCommand::render(SkCanvas* canvas) const {
1425 SkAutoCanvasRestore acr(canvas, true);
1426 canvas->clear(0xFFFFFFFF);
1427
1428 xlate_and_scale_to_bounds(canvas, SkRect::MakeXYWH(fLeft, fTop,
1429 SkIntToScalar(fImage->width()),
1430 SkIntToScalar(fImage->height())));
1431 this->execute(canvas);
1432 return true;
1433}
1434
ethannicholasf62a8b72016-02-11 10:35:21 -08001435Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const {
1436 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001437 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001438 if (flatten(*fImage, &encoded, urlDataManager)) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001439 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
brianosmanfad98562016-05-04 11:06:28 -07001440 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop);
ethannicholas50a8dd02016-02-10 05:40:46 -08001441 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001442 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001443 }
msarett0ac1bec2016-08-29 09:15:33 -07001444
1445 result[SKDEBUGCANVAS_ATTRIBUTE_UNIQUE_ID] = fImage->uniqueID();
1446 result[SKDEBUGCANVAS_ATTRIBUTE_WIDTH] = fImage->width();
1447 result[SKDEBUGCANVAS_ATTRIBUTE_HEIGHT] = fImage->height();
1448 switch (fImage->alphaType()) {
1449 case kOpaque_SkAlphaType:
1450 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_OPAQUE;
1451 break;
1452 case kPremul_SkAlphaType:
1453 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_PREMUL;
1454 break;
1455 case kUnpremul_SkAlphaType:
1456 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNPREMUL;
1457 break;
1458 default:
1459 result[SKDEBUGCANVAS_ATTRIBUTE_ALPHA] = SKDEBUGCANVAS_ALPHATYPE_UNKNOWN;
1460 break;
1461 }
ethannicholas50a8dd02016-02-10 05:40:46 -08001462 }
1463 return result;
1464}
1465
Stan Ilievac42aeb2017-01-12 16:20:50 -05001466SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image,
1467 const SkCanvas::Lattice& lattice,
1468 const SkRect& dst, const SkPaint* paint)
1469 : INHERITED(kDrawImageLattice_OpType)
1470 , fImage(SkRef(image))
1471 , fLattice(lattice)
Brian Osman8363be12018-05-29 13:38:07 -04001472 , fDst(dst)
1473 , fPaint(paint) {}
Stan Ilievac42aeb2017-01-12 16:20:50 -05001474
1475void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const {
Brian Osman78a76482018-05-18 16:59:13 -04001476 canvas->drawImageLattice(fImage.get(), fLattice, fDst, fPaint.getMaybeNull());
Stan Ilievac42aeb2017-01-12 16:20:50 -05001477}
1478
1479bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const {
1480 SkAutoCanvasRestore acr(canvas, true);
1481 canvas->clear(0xFFFFFFFF);
1482
1483 xlate_and_scale_to_bounds(canvas, fDst);
1484
1485 this->execute(canvas);
1486 return true;
1487}
1488
1489Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const {
1490 Json::Value result = INHERITED::toJSON(urlDataManager);
1491 Json::Value encoded;
1492 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001493 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
Stan Ilievac42aeb2017-01-12 16:20:50 -05001494 result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice);
1495 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
1496 if (fPaint.isValid()) {
1497 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
1498 }
1499 }
1500
1501 SkString desc;
1502 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1503
1504 return result;
1505}
1506
fmalita651c9202015-07-22 10:23:01 -07001507SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src,
1508 const SkRect& dst, const SkPaint* paint,
1509 SkCanvas::SrcRectConstraint constraint)
1510 : INHERITED(kDrawImageRect_OpType)
1511 , fImage(SkRef(image))
Brian Osman8363be12018-05-29 13:38:07 -04001512 , fSrc(src)
fmalita651c9202015-07-22 10:23:01 -07001513 , fDst(dst)
Brian Osman8363be12018-05-29 13:38:07 -04001514 , fPaint(paint)
1515 , fConstraint(constraint) {}
fmalita651c9202015-07-22 10:23:01 -07001516
1517void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
Hal Canary1b612a82016-11-03 16:26:13 -04001518 canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst,
1519 fPaint.getMaybeNull(), fConstraint);
fmalita651c9202015-07-22 10:23:01 -07001520}
1521
1522bool SkDrawImageRectCommand::render(SkCanvas* canvas) const {
1523 SkAutoCanvasRestore acr(canvas, true);
1524 canvas->clear(0xFFFFFFFF);
1525
1526 xlate_and_scale_to_bounds(canvas, fDst);
1527
1528 this->execute(canvas);
1529 return true;
1530}
1531
ethannicholasf62a8b72016-02-11 10:35:21 -08001532Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const {
1533 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001534 Json::Value encoded;
ethannicholasf62a8b72016-02-11 10:35:21 -08001535 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
Brian Osmanc25e2692018-03-12 10:57:28 -04001536 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
ethannicholas50a8dd02016-02-10 05:40:46 -08001537 if (fSrc.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001538 result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08001539 }
brianosmanfad98562016-05-04 11:06:28 -07001540 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
ethannicholas50a8dd02016-02-10 05:40:46 -08001541 if (fPaint.isValid()) {
brianosmanfad98562016-05-04 11:06:28 -07001542 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001543 }
1544 if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1545 result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true);
1546 }
1547 }
reed67f62fa2016-06-29 11:36:34 -07001548
1549 SkString desc;
1550 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str());
1551
ethannicholas50a8dd02016-02-10 05:40:46 -08001552 return result;
1553}
1554
Brian Osmanc25e2692018-03-12 10:57:28 -04001555SkDrawImageNineCommand::SkDrawImageNineCommand(const SkImage* image, const SkIRect& center,
1556 const SkRect& dst, const SkPaint* paint)
Brian Osman8363be12018-05-29 13:38:07 -04001557 : INHERITED(kDrawImageNine_OpType)
1558 , fImage(SkRef(image))
1559 , fCenter(center)
1560 , fDst(dst)
1561 , fPaint(paint) {}
Brian Osmanc25e2692018-03-12 10:57:28 -04001562
1563void SkDrawImageNineCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001564 canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaint.getMaybeNull());
Brian Osmanc25e2692018-03-12 10:57:28 -04001565}
1566
1567bool SkDrawImageNineCommand::render(SkCanvas* canvas) const {
1568 SkAutoCanvasRestore acr(canvas, true);
1569 canvas->clear(0xFFFFFFFF);
1570
1571 xlate_and_scale_to_bounds(canvas, fDst);
1572
1573 this->execute(canvas);
1574 return true;
1575}
1576
1577Json::Value SkDrawImageNineCommand::toJSON(UrlDataManager& urlDataManager) const {
1578 Json::Value result = INHERITED::toJSON(urlDataManager);
1579 Json::Value encoded;
1580 if (flatten(*fImage.get(), &encoded, urlDataManager)) {
1581 result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded;
1582 result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter);
1583 result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst);
Brian Osman8363be12018-05-29 13:38:07 -04001584 if (fPaint.isValid()) {
1585 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
Brian Osmanc25e2692018-03-12 10:57:28 -04001586 }
1587 }
1588 return result;
1589}
1590
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001591SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001592 : INHERITED(kDrawOval_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001593 fOval = oval;
1594 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00001595}
1596
fmalita8c89c522014-11-08 16:18:56 -08001597void SkDrawOvalCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001598 canvas->drawOval(fOval, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00001599}
1600
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001601bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001602 canvas->clear(0xFFFFFFFF);
1603 canvas->save();
1604
1605 xlate_and_scale_to_bounds(canvas, fOval);
1606
1607 SkPaint p;
1608 p.setColor(SK_ColorBLACK);
1609 p.setStyle(SkPaint::kStroke_Style);
1610
1611 canvas->drawOval(fOval, p);
1612 canvas->restore();
1613
1614 return true;
1615}
1616
ethannicholasf62a8b72016-02-11 10:35:21 -08001617Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const {
1618 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001619 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1620 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001621 return result;
1622}
1623
bsalomonac3aa242016-08-19 11:25:19 -07001624SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle,
1625 bool useCenter, const SkPaint& paint)
Brian Osmanc25e2692018-03-12 10:57:28 -04001626 : INHERITED(kDrawArc_OpType) {
bsalomonac3aa242016-08-19 11:25:19 -07001627 fOval = oval;
1628 fStartAngle = startAngle;
1629 fSweepAngle = sweepAngle;
1630 fUseCenter = useCenter;
1631 fPaint = paint;
bsalomonac3aa242016-08-19 11:25:19 -07001632}
1633
1634void SkDrawArcCommand::execute(SkCanvas* canvas) const {
1635 canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
1636}
1637
1638bool SkDrawArcCommand::render(SkCanvas* canvas) const {
1639 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->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
1649 canvas->restore();
1650
1651 return true;
1652}
1653
1654Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const {
1655 Json::Value result = INHERITED::toJSON(urlDataManager);
1656 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fOval);
1657 result[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE] = MakeJsonScalar(fStartAngle);
1658 result[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE] = MakeJsonScalar(fSweepAngle);
1659 result[SKDEBUGCANVAS_ATTRIBUTE_USECENTER] = fUseCenter;
1660 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1661 return result;
1662}
1663
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001664SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001665 : INHERITED(kDrawPaint_OpType) {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001666 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001667}
1668
fmalita8c89c522014-11-08 16:18:56 -08001669void SkDrawPaintCommand::execute(SkCanvas* canvas) const {
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +00001670 canvas->drawPaint(fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001671}
1672
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001673bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001674 canvas->clear(0xFFFFFFFF);
1675 canvas->drawPaint(fPaint);
1676 return true;
1677}
1678
ethannicholasf62a8b72016-02-11 10:35:21 -08001679Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const {
1680 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001681 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001682 return result;
1683}
1684
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001685SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001686 : INHERITED(kDrawPath_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001687 fPath = path;
1688 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00001689}
1690
fmalita8c89c522014-11-08 16:18:56 -08001691void SkDrawPathCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00001692 canvas->drawPath(fPath, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001693}
1694
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001695bool SkDrawPathCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001696 render_path(canvas, fPath);
1697 return true;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +00001698}
1699
ethannicholasf62a8b72016-02-11 10:35:21 -08001700Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const {
1701 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07001702 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
1703 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001704 return result;
1705}
1706
Brian Osmanc25e2692018-03-12 10:57:28 -04001707SkDrawRegionCommand::SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint)
1708 : INHERITED(kDrawRegion_OpType) {
1709 fRegion = region;
1710 fPaint = paint;
Brian Osmanc25e2692018-03-12 10:57:28 -04001711}
1712
1713void SkDrawRegionCommand::execute(SkCanvas* canvas) const {
1714 canvas->drawRegion(fRegion, fPaint);
1715}
1716
1717bool SkDrawRegionCommand::render(SkCanvas* canvas) const {
1718 render_region(canvas, fRegion);
1719 return true;
1720}
1721
1722Json::Value SkDrawRegionCommand::toJSON(UrlDataManager& urlDataManager) const {
1723 Json::Value result = INHERITED::toJSON(urlDataManager);
1724 result[SKDEBUGCANVAS_ATTRIBUTE_REGION] = MakeJsonRegion(fRegion);
1725 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
1726 return result;
1727}
1728
fmalita160ebb22015-04-01 20:58:37 -07001729SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture,
1730 const SkMatrix* matrix,
1731 const SkPaint* paint)
1732 : INHERITED(kBeginDrawPicture_OpType)
Brian Osman8363be12018-05-29 13:38:07 -04001733 , fPicture(SkRef(picture))
1734 , fMatrix(matrix)
1735 , fPaint(paint) {}
fmalita160ebb22015-04-01 20:58:37 -07001736
1737void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const {
1738 if (fPaint.isValid()) {
1739 SkRect bounds = fPicture->cullRect();
1740 if (fMatrix.isValid()) {
1741 fMatrix.get()->mapRect(&bounds);
1742 }
1743 canvas->saveLayer(&bounds, fPaint.get());
1744 }
1745
1746 if (fMatrix.isValid()) {
1747 if (!fPaint.isValid()) {
1748 canvas->save();
1749 }
1750 canvas->concat(*fMatrix.get());
1751 }
chudy@google.com902ebe52012-06-29 14:21:22 +00001752}
1753
fmalita160ebb22015-04-01 20:58:37 -07001754bool SkBeginDrawPictureCommand::render(SkCanvas* canvas) const {
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001755 canvas->clear(0xFFFFFFFF);
1756 canvas->save();
1757
robertphillipsa8d7f0b2014-08-29 08:03:56 -07001758 xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001759
robertphillips9b14f262014-06-04 05:40:44 -07001760 canvas->drawPicture(fPicture.get());
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +00001761
1762 canvas->restore();
1763
1764 return true;
1765}
1766
fmalita160ebb22015-04-01 20:58:37 -07001767SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore)
1768 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { }
1769
1770void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const {
1771 if (fRestore) {
1772 canvas->restore();
1773 }
1774}
1775
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001776SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001777 const SkPoint pts[], const SkPaint& paint)
Brian Osman8363be12018-05-29 13:38:07 -04001778 : INHERITED(kDrawPoints_OpType)
1779 , fMode(mode)
1780 , fPts(pts, count)
1781 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001782
fmalita8c89c522014-11-08 16:18:56 -08001783void SkDrawPointsCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04001784 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001785}
1786
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001787bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001788 canvas->clear(0xFFFFFFFF);
1789 canvas->save();
1790
1791 SkRect bounds;
1792
1793 bounds.setEmpty();
Brian Osman8363be12018-05-29 13:38:07 -04001794 for (int i = 0; i < fPts.count(); ++i) {
Mike Reed185ffe92018-01-08 17:09:54 -05001795 SkRectPriv::GrowToInclude(&bounds, fPts[i]);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001796 }
skia.committer@gmail.coma0090832013-06-07 07:01:06 +00001797
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001798 xlate_and_scale_to_bounds(canvas, bounds);
1799
1800 SkPaint p;
1801 p.setColor(SK_ColorBLACK);
1802 p.setStyle(SkPaint::kStroke_Style);
1803
Brian Osman8363be12018-05-29 13:38:07 -04001804 canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p);
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00001805 canvas->restore();
1806
1807 return true;
1808}
1809
ethannicholasf62a8b72016-02-11 10:35:21 -08001810Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const {
1811 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001812 result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode);
1813 Json::Value points(Json::arrayValue);
Brian Osman8363be12018-05-29 13:38:07 -04001814 for (int i = 0; i < fPts.count(); i++) {
brianosmanfad98562016-05-04 11:06:28 -07001815 points.append(MakeJsonPoint(fPts[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001816 }
1817 result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points;
brianosmanfad98562016-05-04 11:06:28 -07001818 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001819 return result;
1820}
1821
Brian Osman65197ff2018-05-29 14:25:39 -04001822static Json::Value make_json_text(sk_sp<SkData> text) {
1823 return Json::Value((const char*)text->data(), (const char*)text->data() + text->size());
chudy@google.com902ebe52012-06-29 14:21:22 +00001824}
1825
Brian Osman65197ff2018-05-29 14:25:39 -04001826SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength,
1827 const SkPoint pos[], const SkPaint& paint)
1828 : INHERITED(kDrawPosText_OpType)
1829 , fText(SkData::MakeWithCopy(text, byteLength))
1830 , fPos(pos, paint.countText(text, byteLength))
1831 , fPaint(paint) {}
1832
fmalita8c89c522014-11-08 16:18:56 -08001833void SkDrawPosTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001834 canvas->drawPosText(fText->data(), fText->size(), fPos.begin(), fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001835}
1836
ethannicholasf62a8b72016-02-11 10:35:21 -08001837Json::Value SkDrawPosTextCommand::toJSON(UrlDataManager& urlDataManager) const {
1838 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001839 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08001840 Json::Value coords(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001841 size_t numCoords = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001842 for (size_t i = 0; i < numCoords; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001843 coords.append(MakeJsonPoint(fPos[i]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001844 }
1845 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = coords;
brianosmanfad98562016-05-04 11:06:28 -07001846 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001847 return result;
1848}
1849
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00001850SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength,
1851 const SkScalar xpos[], SkScalar constY,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00001852 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04001853 : INHERITED(kDrawPosTextH_OpType)
1854 , fText(SkData::MakeWithCopy(text, byteLength))
1855 , fXpos(xpos, paint.countText(text, byteLength))
1856 , fConstY(constY)
1857 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00001858
fmalita8c89c522014-11-08 16:18:56 -08001859void SkDrawPosTextHCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04001860 canvas->drawPosTextH(fText->data(), fText->size(), fXpos.begin(), fConstY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00001861}
1862
bungeman51190df2016-03-09 07:42:54 -08001863Json::Value SkDrawPosTextHCommand::toJSON(UrlDataManager& urlDataManager) const {
1864 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04001865 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
bungeman51190df2016-03-09 07:42:54 -08001866 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fConstY);
1867 Json::Value xpos(Json::arrayValue);
Brian Osman65197ff2018-05-29 14:25:39 -04001868 size_t numXpos = fPaint.textToGlyphs(fText->data(), fText->size(), nullptr);
bungeman51190df2016-03-09 07:42:54 -08001869 for (size_t i = 0; i < numXpos; i++) {
1870 xpos.append(Json::Value(fXpos[i]));
1871 }
1872 result[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = xpos;
brianosmanfad98562016-05-04 11:06:28 -07001873 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
bungeman51190df2016-03-09 07:42:54 -08001874 return result;
1875}
1876
fmalita37283c22016-09-13 10:00:23 -07001877SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y,
fmalitab7425172014-08-26 07:56:44 -07001878 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08001879 : INHERITED(kDrawTextBlob_OpType)
fmalita37283c22016-09-13 10:00:23 -07001880 , fBlob(std::move(blob))
fmalitab7425172014-08-26 07:56:44 -07001881 , fXPos(x)
1882 , fYPos(y)
Brian Osman255735e2018-04-06 14:51:42 -04001883 , fPaint(paint) {}
fmalitab7425172014-08-26 07:56:44 -07001884
fmalita8c89c522014-11-08 16:18:56 -08001885void SkDrawTextBlobCommand::execute(SkCanvas* canvas) const {
fmalitab7425172014-08-26 07:56:44 -07001886 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1887}
1888
fmalita55773872014-08-29 15:08:20 -07001889bool SkDrawTextBlobCommand::render(SkCanvas* canvas) const {
1890 canvas->clear(SK_ColorWHITE);
1891 canvas->save();
1892
1893 SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
1894 xlate_and_scale_to_bounds(canvas, bounds);
1895
fmalita37283c22016-09-13 10:00:23 -07001896 canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
fmalita55773872014-08-29 15:08:20 -07001897
1898 canvas->restore();
1899
1900 return true;
1901}
1902
ethannicholasf62a8b72016-02-11 10:35:21 -08001903Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const {
1904 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08001905 Json::Value runs(Json::arrayValue);
1906 SkTextBlobRunIterator iter(fBlob.get());
1907 while (!iter.done()) {
1908 Json::Value run(Json::objectValue);
1909 Json::Value jsonPositions(Json::arrayValue);
1910 Json::Value jsonGlyphs(Json::arrayValue);
1911 const SkScalar* iterPositions = iter.pos();
1912 const uint16_t* iterGlyphs = iter.glyphs();
1913 for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1914 switch (iter.positioning()) {
Florin Malitaab54e732018-07-27 09:47:15 -04001915 case SkTextBlobRunIterator::kFull_Positioning:
brianosmanfad98562016-05-04 11:06:28 -07001916 jsonPositions.append(MakeJsonPoint(iterPositions[i * 2],
1917 iterPositions[i * 2 + 1]));
ethannicholas50a8dd02016-02-10 05:40:46 -08001918 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001919 case SkTextBlobRunIterator::kHorizontal_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001920 jsonPositions.append(Json::Value(iterPositions[i]));
1921 break;
Florin Malitaab54e732018-07-27 09:47:15 -04001922 case SkTextBlobRunIterator::kDefault_Positioning:
ethannicholas50a8dd02016-02-10 05:40:46 -08001923 break;
1924 }
1925 jsonGlyphs.append(Json::Value(iterGlyphs[i]));
1926 }
Florin Malitaab54e732018-07-27 09:47:15 -04001927 if (iter.positioning() != SkTextBlobRunIterator::kDefault_Positioning) {
ethannicholas50a8dd02016-02-10 05:40:46 -08001928 run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
1929 }
1930 run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
1931 SkPaint fontPaint;
1932 iter.applyFontToPaint(&fontPaint);
brianosmanfad98562016-05-04 11:06:28 -07001933 run[SKDEBUGCANVAS_ATTRIBUTE_FONT] = MakeJsonPaint(fontPaint, urlDataManager);
1934 run[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(iter.offset());
ethannicholas50a8dd02016-02-10 05:40:46 -08001935 runs.append(run);
1936 iter.next();
1937 }
reed6d2c3e72016-07-07 14:10:14 -07001938 SkRect bounds = fBlob->bounds();
ethannicholas50a8dd02016-02-10 05:40:46 -08001939 result[SKDEBUGCANVAS_ATTRIBUTE_RUNS] = runs;
1940 result[SKDEBUGCANVAS_ATTRIBUTE_X] = Json::Value(fXPos);
1941 result[SKDEBUGCANVAS_ATTRIBUTE_Y] = Json::Value(fYPos);
reed6d2c3e72016-07-07 14:10:14 -07001942 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(bounds);
brianosmanfad98562016-05-04 11:06:28 -07001943 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed6d2c3e72016-07-07 14:10:14 -07001944
1945 SkString desc;
1946 // make the bounds local by applying the x,y
1947 bounds.offset(fXPos, fYPos);
1948 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, bounds)->c_str());
1949
ethannicholas50a8dd02016-02-10 05:40:46 -08001950 return result;
1951}
1952
robertphillips9bafc302015-02-13 11:13:00 -08001953SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -04001954 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -08001955 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04001956 : INHERITED(kDrawPatch_OpType)
1957 , fBlendMode(bmode)
1958{
robertphillips9bafc302015-02-13 11:13:00 -08001959 memcpy(fCubics, cubics, sizeof(fCubics));
ethannicholas1446a9a2016-02-10 14:05:02 -08001960 if (colors != nullptr) {
1961 memcpy(fColors, colors, sizeof(fColors));
1962 fColorsPtr = fColors;
1963 } else {
1964 fColorsPtr = nullptr;
1965 }
1966 if (texCoords != nullptr) {
1967 memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
1968 fTexCoordsPtr = fTexCoords;
1969 } else {
1970 fTexCoordsPtr = nullptr;
1971 }
robertphillips9bafc302015-02-13 11:13:00 -08001972 fPaint = paint;
robertphillips9bafc302015-02-13 11:13:00 -08001973}
1974
1975void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
Mike Reed7d954ad2016-10-28 15:42:34 -04001976 canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
ethannicholas1446a9a2016-02-10 14:05:02 -08001977}
1978
ethannicholasf62a8b72016-02-11 10:35:21 -08001979Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
1980 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas1446a9a2016-02-10 14:05:02 -08001981 Json::Value cubics = Json::Value(Json::arrayValue);
1982 for (int i = 0; i < 12; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001983 cubics.append(MakeJsonPoint(fCubics[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001984 }
1985 result[SKDEBUGCANVAS_ATTRIBUTE_CUBICS] = cubics;
1986 if (fColorsPtr != nullptr) {
1987 Json::Value colors = Json::Value(Json::arrayValue);
1988 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001989 colors.append(MakeJsonColor(fColorsPtr[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001990 }
1991 result[SKDEBUGCANVAS_ATTRIBUTE_COLORS] = colors;
1992 }
1993 if (fTexCoordsPtr != nullptr) {
1994 Json::Value texCoords = Json::Value(Json::arrayValue);
1995 for (int i = 0; i < 4; i++) {
brianosmanfad98562016-05-04 11:06:28 -07001996 texCoords.append(MakeJsonPoint(fTexCoords[i]));
ethannicholas1446a9a2016-02-10 14:05:02 -08001997 }
1998 result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
1999 }
Mike Reed7d954ad2016-10-28 15:42:34 -04002000 // fBlendMode
ethannicholas1446a9a2016-02-10 14:05:02 -08002001 return result;
2002}
2003
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002004SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002005 : INHERITED(kDrawRect_OpType) {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002006 fRect = rect;
2007 fPaint = paint;
chudy@google.com902ebe52012-06-29 14:21:22 +00002008}
2009
fmalita8c89c522014-11-08 16:18:56 -08002010void SkDrawRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.com91217d02013-03-17 18:33:46 +00002011 canvas->drawRect(fRect, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002012}
2013
ethannicholasf62a8b72016-02-11 10:35:21 -08002014Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2015 Json::Value result = INHERITED::toJSON(urlDataManager);
brianosmanfad98562016-05-04 11:06:28 -07002016 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonRect(fRect);
2017 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
reed67f62fa2016-06-29 11:36:34 -07002018
2019 SkString desc;
2020 result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fRect)->c_str());
2021
ethannicholas50a8dd02016-02-10 05:40:46 -08002022 return result;
2023}
2024
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002025SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002026 : INHERITED(kDrawRRect_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002027 fRRect = rrect;
2028 fPaint = paint;
robertphillips@google.com67baba42013-01-02 20:20:31 +00002029}
2030
fmalita8c89c522014-11-08 16:18:56 -08002031void SkDrawRRectCommand::execute(SkCanvas* canvas) const {
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +00002032 canvas->drawRRect(fRRect, fPaint);
robertphillips@google.com67baba42013-01-02 20:20:31 +00002033}
2034
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002035bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +00002036 render_rrect(canvas, fRRect);
2037 return true;
2038}
2039
ethannicholasf62a8b72016-02-11 10:35:21 -08002040Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2041 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002042 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_rrect(fRRect);
brianosmanfad98562016-05-04 11:06:28 -07002043 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002044 return result;
2045}
2046
skia.committer@gmail.com90667ba2014-02-25 03:05:18 +00002047SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002048 const SkRRect& inner,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002049 const SkPaint& paint)
robertphillips9bafc302015-02-13 11:13:00 -08002050 : INHERITED(kDrawDRRect_OpType) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002051 fOuter = outer;
2052 fInner = inner;
2053 fPaint = paint;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002054}
2055
fmalita8c89c522014-11-08 16:18:56 -08002056void SkDrawDRRectCommand::execute(SkCanvas* canvas) const {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +00002057 canvas->drawDRRect(fOuter, fInner, fPaint);
2058}
2059
2060bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
2061 render_drrect(canvas, fOuter, fInner);
2062 return true;
2063}
2064
ethannicholasf62a8b72016-02-11 10:35:21 -08002065Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const {
2066 Json::Value result = INHERITED::toJSON(urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002067 result[SKDEBUGCANVAS_ATTRIBUTE_OUTER] = make_json_rrect(fOuter);
2068 result[SKDEBUGCANVAS_ATTRIBUTE_INNER] = make_json_rrect(fInner);
brianosmanfad98562016-05-04 11:06:28 -07002069 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002070 return result;
2071}
2072
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -04002073SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
2074 : INHERITED(kDrawShadow_OpType) {
2075 fPath = path;
2076 fShadowRec = rec;
2077}
2078
2079void SkDrawShadowCommand::execute(SkCanvas* canvas) const {
2080 canvas->private_draw_shadow_rec(fPath, fShadowRec);
2081}
2082
2083bool SkDrawShadowCommand::render(SkCanvas* canvas) const {
2084 render_shadow(canvas, fPath, fShadowRec);
2085 return true;
2086}
2087
2088Json::Value SkDrawShadowCommand::toJSON(UrlDataManager& urlDataManager) const {
2089 Json::Value result = INHERITED::toJSON(urlDataManager);
2090 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2091
2092 bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
2093 bool transparentOccluder =
2094 SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
2095
2096 result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath);
2097 result[SKDEBUGCANVAS_ATTRIBUTE_ZPLANE] = MakeJsonPoint3(fShadowRec.fZPlaneParams);
2098 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION] = MakeJsonPoint3(fShadowRec.fLightPos);
2099 result[SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS] = MakeJsonScalar(fShadowRec.fLightRadius);
2100 result[SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR] = MakeJsonColor(fShadowRec.fAmbientColor);
2101 result[SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR] = MakeJsonColor(fShadowRec.fSpotColor);
2102 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
2103 store_bool(&result, SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
2104 return result;
2105}
2106
Brian Osmanc7611082018-05-29 14:55:50 -04002107///////////////////////////////////////////////////////////////////////////////////////////////////
2108
2109SkDrawDrawableCommand::SkDrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
2110 : INHERITED(kDrawDrawable_OpType)
2111 , fDrawable(SkRef(drawable))
2112 , fMatrix(matrix) {}
2113
2114void SkDrawDrawableCommand::execute(SkCanvas* canvas) const {
2115 canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
2116}
2117
2118///////////////////////////////////////////////////////////////////////////////////////////////////
2119
commit-bot@chromium.org7a115912013-06-18 20:20:55 +00002120SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002121 const SkPaint& paint)
Brian Osman65197ff2018-05-29 14:25:39 -04002122 : INHERITED(kDrawText_OpType)
2123 , fText(SkData::MakeWithCopy(text, byteLength))
2124 , fX(x)
2125 , fY(y)
2126 , fPaint(paint) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002127
fmalita8c89c522014-11-08 16:18:56 -08002128void SkDrawTextCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002129 canvas->drawText(fText->data(), fText->size(), fX, fY, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002130}
2131
ethannicholasf62a8b72016-02-11 10:35:21 -08002132Json::Value SkDrawTextCommand::toJSON(UrlDataManager& urlDataManager) const {
2133 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002134 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
ethannicholas50a8dd02016-02-10 05:40:46 -08002135 Json::Value coords(Json::arrayValue);
brianosmanfad98562016-05-04 11:06:28 -07002136 result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fX, fY);
2137 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002138 return result;
2139}
2140
reed45561a02016-07-07 12:47:17 -07002141///////////////////////////////////////////////////////////////////////////////////////////////////
2142
reed45561a02016-07-07 12:47:17 -07002143SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength,
2144 const SkRSXform xform[], const SkRect* cull,
2145 const SkPaint& paint)
reed63f30d92016-07-07 16:32:51 -07002146 : INHERITED(kDrawTextRSXform_OpType)
Brian Osman65197ff2018-05-29 14:25:39 -04002147 , fText(SkData::MakeWithCopy(text, byteLength))
2148 , fXform(xform, paint.countText(text, byteLength))
Brian Osman8363be12018-05-29 13:38:07 -04002149 , fCull(cull)
Brian Osman65197ff2018-05-29 14:25:39 -04002150 , fPaint(paint) {}
reed45561a02016-07-07 12:47:17 -07002151
2152void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const {
Brian Osman65197ff2018-05-29 14:25:39 -04002153 canvas->drawTextRSXform(fText->data(), fText->size(), fXform.begin(), fCull.getMaybeNull(),
2154 fPaint);
reed45561a02016-07-07 12:47:17 -07002155}
2156
2157Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) const {
2158 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman65197ff2018-05-29 14:25:39 -04002159 result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = make_json_text(fText);
reed45561a02016-07-07 12:47:17 -07002160 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager);
2161 return result;
2162}
2163
reed45561a02016-07-07 12:47:17 -07002164///////////////////////////////////////////////////////////////////////////////////////////////////
2165
Mike Reedfed9cfd2017-03-17 12:09:04 -04002166SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002167 const SkPaint& paint)
Mike Reed7d954ad2016-10-28 15:42:34 -04002168 : INHERITED(kDrawVertices_OpType)
Mike Reedfed9cfd2017-03-17 12:09:04 -04002169 , fVertices(std::move(vertices))
Mike Reed7d954ad2016-10-28 15:42:34 -04002170 , fBlendMode(bmode)
Brian Osman255735e2018-04-06 14:51:42 -04002171 , fPaint(paint) {}
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002172
fmalita8c89c522014-11-08 16:18:56 -08002173void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
Mike Reedfed9cfd2017-03-17 12:09:04 -04002174 canvas->drawVertices(fVertices, fBlendMode, fPaint);
chudy@google.com902ebe52012-06-29 14:21:22 +00002175}
2176
Brian Osman616f1cb2018-05-29 11:23:35 -04002177///////////////////////////////////////////////////////////////////////////////////////////////////
2178
2179SkDrawAtlasCommand::SkDrawAtlasCommand(const SkImage* image, const SkRSXform xform[],
2180 const SkRect tex[], const SkColor colors[], int count,
2181 SkBlendMode bmode, const SkRect* cull,
2182 const SkPaint* paint)
2183 : INHERITED(kDrawAtlas_OpType)
2184 , fImage(SkRef(image))
2185 , fXform(xform, count)
2186 , fTex(tex, count)
2187 , fColors(colors, colors ? count : 0)
2188 , fBlendMode(bmode)
2189 , fCull(cull)
2190 , fPaint(paint) {}
2191
2192void SkDrawAtlasCommand::execute(SkCanvas* canvas) const {
2193 canvas->drawAtlas(fImage.get(), fXform.begin(), fTex.begin(),
2194 fColors.isEmpty() ? nullptr : fColors.begin(), fXform.count(), fBlendMode,
2195 fCull.getMaybeNull(), fPaint.getMaybeNull());
2196}
2197
2198///////////////////////////////////////////////////////////////////////////////////////////////////
2199
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002200SkRestoreCommand::SkRestoreCommand()
Brian Osman255735e2018-04-06 14:51:42 -04002201 : INHERITED(kRestore_OpType) {}
chudy@google.com902ebe52012-06-29 14:21:22 +00002202
fmalita8c89c522014-11-08 16:18:56 -08002203void SkRestoreCommand::execute(SkCanvas* canvas) const {
chudy@google.com902ebe52012-06-29 14:21:22 +00002204 canvas->restore();
2205}
2206
Florin Malita5f6102d2014-06-30 10:13:28 -04002207SkSaveCommand::SkSaveCommand()
robertphillips9bafc302015-02-13 11:13:00 -08002208 : INHERITED(kSave_OpType) {
chudy@google.com902ebe52012-06-29 14:21:22 +00002209}
2210
fmalita8c89c522014-11-08 16:18:56 -08002211void SkSaveCommand::execute(SkCanvas* canvas) const {
Florin Malita5f6102d2014-06-30 10:13:28 -04002212 canvas->save();
chudy@google.com902ebe52012-06-29 14:21:22 +00002213}
2214
reed4960eee2015-12-18 07:09:18 -08002215SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
Brian Osman8363be12018-05-29 13:38:07 -04002216 : INHERITED(kSaveLayer_OpType)
2217 , fBounds(rec.fBounds)
2218 , fPaint(rec.fPaint)
2219 , fBackdrop(SkSafeRef(rec.fBackdrop))
2220 , fSaveLayerFlags(rec.fSaveLayerFlags) {}
ethannicholas50a8dd02016-02-10 05:40:46 -08002221
fmalita8c89c522014-11-08 16:18:56 -08002222void SkSaveLayerCommand::execute(SkCanvas* canvas) const {
Brian Osman8363be12018-05-29 13:38:07 -04002223 canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(),
reed4960eee2015-12-18 07:09:18 -08002224 fSaveLayerFlags));
chudy@google.com902ebe52012-06-29 14:21:22 +00002225}
2226
ethannicholasf62a8b72016-02-11 10:35:21 -08002227Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const {
2228 Json::Value result = INHERITED::toJSON(urlDataManager);
Brian Osman8363be12018-05-29 13:38:07 -04002229 if (fBounds.isValid()) {
2230 result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(*fBounds.get());
ethannicholas50a8dd02016-02-10 05:40:46 -08002231 }
Brian Osman8363be12018-05-29 13:38:07 -04002232 if (fPaint.isValid()) {
2233 result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002234 }
2235 if (fBackdrop != nullptr) {
2236 Json::Value jsonBackdrop;
Brian Osman8363be12018-05-29 13:38:07 -04002237 flatten(fBackdrop.get(), &jsonBackdrop, urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -08002238 result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop;
2239 }
2240 if (fSaveLayerFlags != 0) {
2241 SkDebugf("unsupported: saveLayer flags\n");
2242 SkASSERT(false);
2243 }
2244 return result;
2245}
2246
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +00002247SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
robertphillips9bafc302015-02-13 11:13:00 -08002248 : INHERITED(kSetMatrix_OpType) {
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +00002249 fMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -07002250}
2251
fmalita8c89c522014-11-08 16:18:56 -08002252void SkSetMatrixCommand::execute(SkCanvas* canvas) const {
Brian Osman255735e2018-04-06 14:51:42 -04002253 canvas->setMatrix(fMatrix);
chudy@google.com902ebe52012-06-29 14:21:22 +00002254}
2255
ethannicholasf62a8b72016-02-11 10:35:21 -08002256Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const {
2257 Json::Value result = INHERITED::toJSON(urlDataManager);
joshualittbd724132016-03-03 11:39:38 -08002258 result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix);
ethannicholas50a8dd02016-02-10 05:40:46 -08002259 return result;
2260}