1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2012 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "tools/debugger/DrawCommand.h"
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#include <algorithm>
11cb93a386Sopenharmony_ci#include "include/core/SkColorFilter.h"
12cb93a386Sopenharmony_ci#include "include/core/SkDrawable.h"
13cb93a386Sopenharmony_ci#include "include/core/SkImageFilter.h"
14cb93a386Sopenharmony_ci#include "include/core/SkPathEffect.h"
15cb93a386Sopenharmony_ci#include "include/core/SkPicture.h"
16cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h"
17cb93a386Sopenharmony_ci#include "include/effects/SkDashPathEffect.h"
18cb93a386Sopenharmony_ci#include "include/encode/SkPngEncoder.h"
19cb93a386Sopenharmony_ci#include "include/private/SkShadowFlags.h"
20cb93a386Sopenharmony_ci#include "include/private/SkTHash.h"
21cb93a386Sopenharmony_ci#include "src/core/SkAutoMalloc.h"
22cb93a386Sopenharmony_ci#include "src/core/SkCanvasPriv.h"
23cb93a386Sopenharmony_ci#include "src/core/SkLatticeIter.h"
24cb93a386Sopenharmony_ci#include "src/core/SkMaskFilterBase.h"
25cb93a386Sopenharmony_ci#include "src/core/SkPaintDefaults.h"
26cb93a386Sopenharmony_ci#include "src/core/SkPaintPriv.h"
27cb93a386Sopenharmony_ci#include "src/core/SkReadBuffer.h"
28cb93a386Sopenharmony_ci#include "src/core/SkRectPriv.h"
29cb93a386Sopenharmony_ci#include "src/core/SkTextBlobPriv.h"
30cb93a386Sopenharmony_ci#include "src/core/SkWriteBuffer.h"
31cb93a386Sopenharmony_ci#include "src/image/SkImage_Base.h"
32cb93a386Sopenharmony_ci#include "tools/debugger/DebugLayerManager.h"
33cb93a386Sopenharmony_ci#include "tools/debugger/JsonWriteBuffer.h"
34cb93a386Sopenharmony_ci
35cb93a386Sopenharmony_ci#if SK_SUPPORT_GPU
36cb93a386Sopenharmony_ci#include "include/gpu/GrDirectContext.h"
37cb93a386Sopenharmony_ci#else
38cb93a386Sopenharmony_ciclass GrDirectContext;
39cb93a386Sopenharmony_ci#endif
40cb93a386Sopenharmony_ci
41cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_COMMAND "command"
42cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_VISIBLE "visible"
43cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_MATRIX "matrix"
44cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS "drawDepthTranslation"
45cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_COORDS "coords"
46cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_EDGING "edging"
47cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_HINTING "hinting"
48cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_BOUNDS "bounds"
49cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_PAINT "paint"
50cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_OUTER "outer"
51cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_INNER "inner"
52cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_MODE "mode"
53cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_POINTS "points"
54cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_PATH "path"
55cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_TEXT "text"
56cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_COLOR "color"
57cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
58cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_BLENDMODE "blendMode"
59cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_STYLE "style"
60cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_STROKEWIDTH "strokeWidth"
61cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_STROKEMITER "strokeMiter"
62cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_STROKEJOIN "strokeJoin"
63cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_CAP "cap"
64cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_ANTIALIAS "antiAlias"
65cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_DITHER "dither"
66cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT "fakeBoldText"
67cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_LINEARTEXT "linearText"
68cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT "subpixelText"
69cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT "devKernText"
70cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT "lcdRenderText"
71cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT "embeddedBitmapText"
72cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_AUTOHINTING "forceAutoHinting"
73cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_REGION "region"
74cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_REGIONOP "op"
75cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_EDGESTYLE "edgeStyle"
76cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_DEVICEREGION "deviceRegion"
77cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_BLUR "blur"
78cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_SIGMA "sigma"
79cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_QUALITY "quality"
80cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_TEXTSIZE "textSize"
81cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_TEXTSCALEX "textScaleX"
82cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_TEXTSKEWX "textSkewX"
83cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_DASHING "dashing"
84cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_INTERVALS "intervals"
85cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_PHASE "phase"
86cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_FILLTYPE "fillType"
87cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_VERBS "verbs"
88cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_NAME "name"
89cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_DATA "data"
90cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_VALUES "values"
91cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_SHADER "shader"
92cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_PATHEFFECT "pathEffect"
93cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_MASKFILTER "maskFilter"
94cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_XFERMODE "xfermode"
95cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_BACKDROP "backdrop"
96cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_COLORFILTER "colorfilter"
97cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_IMAGEFILTER "imagefilter"
98cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_IMAGE "image"
99cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_IMAGE_INDEX "imageIndex"
100cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_BITMAP "bitmap"
101cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_SRC "src"
102cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_DST "dst"
103cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_CENTER "center"
104cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_STRICT "strict"
105cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_DESCRIPTION "description"
106cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_X "x"
107cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_Y "y"
108cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_RUNS "runs"
109cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_POSITIONS "positions"
110cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_GLYPHS "glyphs"
111cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_FONT "font"
112cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_TYPEFACE "typeface"
113cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_CUBICS "cubics"
114cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_COLORS "colors"
115cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS "textureCoords"
116cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_STARTANGLE "startAngle"
117cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_SWEEPANGLE "sweepAngle"
118cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_USECENTER "useCenter"
119cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_SHORTDESC "shortDesc"
120cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_UNIQUE_ID "uniqueID"
121cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_WIDTH "width"
122cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_HEIGHT "height"
123cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_ALPHA "alpha"
124cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_LATTICE "lattice"
125cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT "xCount"
126cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT "yCount"
127cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS "xDivs"
128cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS "yDivs"
129cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS "flags"
130cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_ZPLANE "zPlane"
131cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION "lightPositions"
132cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR "ambientColor"
133cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_SPOTCOLOR "spotColor"
134cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS "lightRadius"
135cb93a386Sopenharmony_ci#define DEBUGCANVAS_ATTRIBUTE_LAYERNODEID "layerNodeId"
136cb93a386Sopenharmony_ci
137cb93a386Sopenharmony_ci#define DEBUGCANVAS_VERB_MOVE "move"
138cb93a386Sopenharmony_ci#define DEBUGCANVAS_VERB_LINE "line"
139cb93a386Sopenharmony_ci#define DEBUGCANVAS_VERB_QUAD "quad"
140cb93a386Sopenharmony_ci#define DEBUGCANVAS_VERB_CUBIC "cubic"
141cb93a386Sopenharmony_ci#define DEBUGCANVAS_VERB_CONIC "conic"
142cb93a386Sopenharmony_ci#define DEBUGCANVAS_VERB_CLOSE "close"
143cb93a386Sopenharmony_ci
144cb93a386Sopenharmony_ci#define DEBUGCANVAS_STYLE_FILL "fill"
145cb93a386Sopenharmony_ci#define DEBUGCANVAS_STYLE_STROKE "stroke"
146cb93a386Sopenharmony_ci#define DEBUGCANVAS_STYLE_STROKEANDFILL "strokeAndFill"
147cb93a386Sopenharmony_ci
148cb93a386Sopenharmony_ci#define DEBUGCANVAS_POINTMODE_POINTS "points"
149cb93a386Sopenharmony_ci#define DEBUGCANVAS_POINTMODE_LINES "lines"
150cb93a386Sopenharmony_ci#define DEBUGCANVAS_POINTMODE_POLYGON "polygon"
151cb93a386Sopenharmony_ci
152cb93a386Sopenharmony_ci#define DEBUGCANVAS_CLIPOP_DIFFERENCE "difference"
153cb93a386Sopenharmony_ci#define DEBUGCANVAS_CLIPOP_INTERSECT "intersect"
154cb93a386Sopenharmony_ci
155cb93a386Sopenharmony_ci#define DEBUGCANVAS_BLURSTYLE_NORMAL "normal"
156cb93a386Sopenharmony_ci#define DEBUGCANVAS_BLURSTYLE_SOLID "solid"
157cb93a386Sopenharmony_ci#define DEBUGCANVAS_BLURSTYLE_OUTER "outer"
158cb93a386Sopenharmony_ci#define DEBUGCANVAS_BLURSTYLE_INNER "inner"
159cb93a386Sopenharmony_ci
160cb93a386Sopenharmony_ci#define DEBUGCANVAS_BLURQUALITY_LOW "low"
161cb93a386Sopenharmony_ci#define DEBUGCANVAS_BLURQUALITY_HIGH "high"
162cb93a386Sopenharmony_ci
163cb93a386Sopenharmony_ci#define DEBUGCANVAS_FILLTYPE_WINDING "winding"
164cb93a386Sopenharmony_ci#define DEBUGCANVAS_FILLTYPE_EVENODD "evenOdd"
165cb93a386Sopenharmony_ci#define DEBUGCANVAS_FILLTYPE_INVERSEWINDING "inverseWinding"
166cb93a386Sopenharmony_ci#define DEBUGCANVAS_FILLTYPE_INVERSEEVENODD "inverseEvenOdd"
167cb93a386Sopenharmony_ci
168cb93a386Sopenharmony_ci#define DEBUGCANVAS_CAP_BUTT "butt"
169cb93a386Sopenharmony_ci#define DEBUGCANVAS_CAP_ROUND "round"
170cb93a386Sopenharmony_ci#define DEBUGCANVAS_CAP_SQUARE "square"
171cb93a386Sopenharmony_ci
172cb93a386Sopenharmony_ci#define DEBUGCANVAS_MITER_JOIN "miter"
173cb93a386Sopenharmony_ci#define DEBUGCANVAS_ROUND_JOIN "round"
174cb93a386Sopenharmony_ci#define DEBUGCANVAS_BEVEL_JOIN "bevel"
175cb93a386Sopenharmony_ci
176cb93a386Sopenharmony_ci#define DEBUGCANVAS_COLORTYPE_ARGB4444 "ARGB4444"
177cb93a386Sopenharmony_ci#define DEBUGCANVAS_COLORTYPE_RGBA8888 "RGBA8888"
178cb93a386Sopenharmony_ci#define DEBUGCANVAS_COLORTYPE_BGRA8888 "BGRA8888"
179cb93a386Sopenharmony_ci#define DEBUGCANVAS_COLORTYPE_565 "565"
180cb93a386Sopenharmony_ci#define DEBUGCANVAS_COLORTYPE_GRAY8 "Gray8"
181cb93a386Sopenharmony_ci#define DEBUGCANVAS_COLORTYPE_INDEX8 "Index8"
182cb93a386Sopenharmony_ci#define DEBUGCANVAS_COLORTYPE_ALPHA8 "Alpha8"
183cb93a386Sopenharmony_ci
184cb93a386Sopenharmony_ci#define DEBUGCANVAS_ALPHATYPE_OPAQUE "opaque"
185cb93a386Sopenharmony_ci#define DEBUGCANVAS_ALPHATYPE_PREMUL "premul"
186cb93a386Sopenharmony_ci#define DEBUGCANVAS_ALPHATYPE_UNPREMUL "unpremul"
187cb93a386Sopenharmony_ci#define DEBUGCANVAS_ALPHATYPE_UNKNOWN "unknown"
188cb93a386Sopenharmony_ci
189cb93a386Sopenharmony_ci#define DEBUGCANVAS_HINTING_NONE "none"
190cb93a386Sopenharmony_ci#define DEBUGCANVAS_HINTING_SLIGHT "slight"
191cb93a386Sopenharmony_ci#define DEBUGCANVAS_HINTING_NORMAL "normal"
192cb93a386Sopenharmony_ci#define DEBUGCANVAS_HINTING_FULL "full"
193cb93a386Sopenharmony_ci
194cb93a386Sopenharmony_ci#define DEBUGCANVAS_EDGING_ALIAS "alias"
195cb93a386Sopenharmony_ci#define DEBUGCANVAS_EDGING_ANTIALIAS "antialias"
196cb93a386Sopenharmony_ci#define DEBUGCANVAS_EDGING_SUBPIXELANTIALIAS "subpixelantialias"
197cb93a386Sopenharmony_ci
198cb93a386Sopenharmony_ci#define DEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC "transparentOccluder"
199cb93a386Sopenharmony_ci#define DEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY "geometricOnly"
200cb93a386Sopenharmony_ci
201cb93a386Sopenharmony_cistatic SkString* str_append(SkString* str, const SkRect& r) {
202cb93a386Sopenharmony_ci    str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom());
203cb93a386Sopenharmony_ci    return str;
204cb93a386Sopenharmony_ci}
205cb93a386Sopenharmony_ci
206cb93a386Sopenharmony_ciDrawCommand::DrawCommand(OpType type) : fOpType(type), fVisible(true) {}
207cb93a386Sopenharmony_ci
208cb93a386Sopenharmony_ciconst char* DrawCommand::GetCommandString(OpType type) {
209cb93a386Sopenharmony_ci    switch (type) {
210cb93a386Sopenharmony_ci        case kBeginDrawPicture_OpType: return "BeginDrawPicture";
211cb93a386Sopenharmony_ci        case kClear_OpType: return "DrawClear";
212cb93a386Sopenharmony_ci        case kClipPath_OpType: return "ClipPath";
213cb93a386Sopenharmony_ci        case kClipRegion_OpType: return "ClipRegion";
214cb93a386Sopenharmony_ci        case kClipRect_OpType: return "ClipRect";
215cb93a386Sopenharmony_ci        case kClipRRect_OpType: return "ClipRRect";
216cb93a386Sopenharmony_ci        case kResetClip_OpType: return "ResetClip";
217cb93a386Sopenharmony_ci        case kConcat_OpType: return "Concat";
218cb93a386Sopenharmony_ci        case kConcat44_OpType: return "Concat44";
219cb93a386Sopenharmony_ci        case kDrawAnnotation_OpType: return "DrawAnnotation";
220cb93a386Sopenharmony_ci        case kDrawBitmap_OpType: return "DrawBitmap";
221cb93a386Sopenharmony_ci        case kDrawBitmapRect_OpType: return "DrawBitmapRect";
222cb93a386Sopenharmony_ci        case kDrawDRRect_OpType: return "DrawDRRect";
223cb93a386Sopenharmony_ci        case kDrawImage_OpType: return "DrawImage";
224cb93a386Sopenharmony_ci        case kDrawImageLattice_OpType: return "DrawImageLattice";
225cb93a386Sopenharmony_ci        case kDrawImageRect_OpType: return "DrawImageRect";
226cb93a386Sopenharmony_ci        case kDrawImageRectLayer_OpType: return "DrawImageRectLayer";
227cb93a386Sopenharmony_ci        case kDrawOval_OpType: return "DrawOval";
228cb93a386Sopenharmony_ci        case kDrawPaint_OpType: return "DrawPaint";
229cb93a386Sopenharmony_ci        case kDrawPatch_OpType: return "DrawPatch";
230cb93a386Sopenharmony_ci        case kDrawPath_OpType: return "DrawPath";
231cb93a386Sopenharmony_ci        case kDrawArc_OpType: return "DrawArc";
232cb93a386Sopenharmony_ci        case kDrawPoints_OpType: return "DrawPoints";
233cb93a386Sopenharmony_ci        case kDrawRect_OpType: return "DrawRect";
234cb93a386Sopenharmony_ci        case kDrawRRect_OpType: return "DrawRRect";
235cb93a386Sopenharmony_ci        case kDrawRegion_OpType: return "DrawRegion";
236cb93a386Sopenharmony_ci        case kDrawShadow_OpType: return "DrawShadow";
237cb93a386Sopenharmony_ci        case kDrawTextBlob_OpType: return "DrawTextBlob";
238cb93a386Sopenharmony_ci        case kDrawVertices_OpType: return "DrawVertices";
239cb93a386Sopenharmony_ci        case kDrawAtlas_OpType: return "DrawAtlas";
240cb93a386Sopenharmony_ci        case kDrawDrawable_OpType: return "DrawDrawable";
241cb93a386Sopenharmony_ci        case kDrawEdgeAAQuad_OpType: return "DrawEdgeAAQuad";
242cb93a386Sopenharmony_ci        case kDrawEdgeAAImageSet_OpType: return "DrawEdgeAAImageSet";
243cb93a386Sopenharmony_ci        case kEndDrawPicture_OpType: return "EndDrawPicture";
244cb93a386Sopenharmony_ci        case kRestore_OpType: return "Restore";
245cb93a386Sopenharmony_ci        case kSave_OpType: return "Save";
246cb93a386Sopenharmony_ci        case kSaveLayer_OpType: return "SaveLayer";
247cb93a386Sopenharmony_ci        case kSetMatrix_OpType: return "SetMatrix";
248cb93a386Sopenharmony_ci        case kSetM44_OpType: return "SetM44";
249cb93a386Sopenharmony_ci        default:
250cb93a386Sopenharmony_ci            SkDebugf("OpType error 0x%08x\n", type);
251cb93a386Sopenharmony_ci            SkASSERT(0);
252cb93a386Sopenharmony_ci            break;
253cb93a386Sopenharmony_ci    }
254cb93a386Sopenharmony_ci    SkDEBUGFAIL("DrawType UNUSED\n");
255cb93a386Sopenharmony_ci    return nullptr;
256cb93a386Sopenharmony_ci}
257cb93a386Sopenharmony_ci
258cb93a386Sopenharmony_civoid DrawCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
259cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_COMMAND, this->GetCommandString(fOpType));
260cb93a386Sopenharmony_ci    writer.appendBool(DEBUGCANVAS_ATTRIBUTE_VISIBLE, this->isVisible());
261cb93a386Sopenharmony_ci}
262cb93a386Sopenharmony_ci
263cb93a386Sopenharmony_cinamespace {
264cb93a386Sopenharmony_ci
265cb93a386Sopenharmony_civoid xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
266cb93a386Sopenharmony_ci    const SkISize& size = canvas->getBaseLayerSize();
267cb93a386Sopenharmony_ci
268cb93a386Sopenharmony_ci    static const SkScalar kInsetFrac = 0.9f;  // Leave a border around object
269cb93a386Sopenharmony_ci
270cb93a386Sopenharmony_ci    canvas->translate(size.fWidth / 2.0f, size.fHeight / 2.0f);
271cb93a386Sopenharmony_ci    if (bounds.width() > bounds.height()) {
272cb93a386Sopenharmony_ci        canvas->scale(SkDoubleToScalar((kInsetFrac * size.fWidth) / bounds.width()),
273cb93a386Sopenharmony_ci                      SkDoubleToScalar((kInsetFrac * size.fHeight) / bounds.width()));
274cb93a386Sopenharmony_ci    } else {
275cb93a386Sopenharmony_ci        canvas->scale(SkDoubleToScalar((kInsetFrac * size.fWidth) / bounds.height()),
276cb93a386Sopenharmony_ci                      SkDoubleToScalar((kInsetFrac * size.fHeight) / bounds.height()));
277cb93a386Sopenharmony_ci    }
278cb93a386Sopenharmony_ci    canvas->translate(-bounds.centerX(), -bounds.centerY());
279cb93a386Sopenharmony_ci}
280cb93a386Sopenharmony_ci
281cb93a386Sopenharmony_civoid render_path(SkCanvas* canvas, const SkPath& path) {
282cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
283cb93a386Sopenharmony_ci
284cb93a386Sopenharmony_ci    const SkRect& bounds = path.getBounds();
285cb93a386Sopenharmony_ci    if (bounds.isEmpty()) {
286cb93a386Sopenharmony_ci        return;
287cb93a386Sopenharmony_ci    }
288cb93a386Sopenharmony_ci
289cb93a386Sopenharmony_ci    SkAutoCanvasRestore acr(canvas, true);
290cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, bounds);
291cb93a386Sopenharmony_ci
292cb93a386Sopenharmony_ci    SkPaint p;
293cb93a386Sopenharmony_ci    p.setColor(SK_ColorBLACK);
294cb93a386Sopenharmony_ci    p.setStyle(SkPaint::kStroke_Style);
295cb93a386Sopenharmony_ci
296cb93a386Sopenharmony_ci    canvas->drawPath(path, p);
297cb93a386Sopenharmony_ci}
298cb93a386Sopenharmony_ci
299cb93a386Sopenharmony_civoid render_region(SkCanvas* canvas, const SkRegion& region) {
300cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
301cb93a386Sopenharmony_ci
302cb93a386Sopenharmony_ci    const SkIRect& bounds = region.getBounds();
303cb93a386Sopenharmony_ci    if (bounds.isEmpty()) {
304cb93a386Sopenharmony_ci        return;
305cb93a386Sopenharmony_ci    }
306cb93a386Sopenharmony_ci
307cb93a386Sopenharmony_ci    SkAutoCanvasRestore acr(canvas, true);
308cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, SkRect::Make(bounds));
309cb93a386Sopenharmony_ci
310cb93a386Sopenharmony_ci    SkPaint p;
311cb93a386Sopenharmony_ci    p.setColor(SK_ColorBLACK);
312cb93a386Sopenharmony_ci    p.setStyle(SkPaint::kStroke_Style);
313cb93a386Sopenharmony_ci
314cb93a386Sopenharmony_ci    canvas->drawRegion(region, p);
315cb93a386Sopenharmony_ci}
316cb93a386Sopenharmony_ci
317cb93a386Sopenharmony_civoid render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
318cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
319cb93a386Sopenharmony_ci    canvas->save();
320cb93a386Sopenharmony_ci
321cb93a386Sopenharmony_ci    const SkRect& bounds = rrect.getBounds();
322cb93a386Sopenharmony_ci
323cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, bounds);
324cb93a386Sopenharmony_ci
325cb93a386Sopenharmony_ci    SkPaint p;
326cb93a386Sopenharmony_ci    p.setColor(SK_ColorBLACK);
327cb93a386Sopenharmony_ci    p.setStyle(SkPaint::kStroke_Style);
328cb93a386Sopenharmony_ci
329cb93a386Sopenharmony_ci    canvas->drawRRect(rrect, p);
330cb93a386Sopenharmony_ci    canvas->restore();
331cb93a386Sopenharmony_ci}
332cb93a386Sopenharmony_ci
333cb93a386Sopenharmony_civoid render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
334cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
335cb93a386Sopenharmony_ci    canvas->save();
336cb93a386Sopenharmony_ci
337cb93a386Sopenharmony_ci    const SkRect& bounds = outer.getBounds();
338cb93a386Sopenharmony_ci
339cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, bounds);
340cb93a386Sopenharmony_ci
341cb93a386Sopenharmony_ci    SkPaint p;
342cb93a386Sopenharmony_ci    p.setColor(SK_ColorBLACK);
343cb93a386Sopenharmony_ci    p.setStyle(SkPaint::kStroke_Style);
344cb93a386Sopenharmony_ci
345cb93a386Sopenharmony_ci    canvas->drawDRRect(outer, inner, p);
346cb93a386Sopenharmony_ci    canvas->restore();
347cb93a386Sopenharmony_ci}
348cb93a386Sopenharmony_ci
349cb93a386Sopenharmony_civoid render_shadow(SkCanvas* canvas, const SkPath& path, SkDrawShadowRec rec) {
350cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
351cb93a386Sopenharmony_ci
352cb93a386Sopenharmony_ci    const SkRect& bounds = path.getBounds();
353cb93a386Sopenharmony_ci    if (bounds.isEmpty()) {
354cb93a386Sopenharmony_ci        return;
355cb93a386Sopenharmony_ci    }
356cb93a386Sopenharmony_ci
357cb93a386Sopenharmony_ci    SkAutoCanvasRestore acr(canvas, true);
358cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, bounds);
359cb93a386Sopenharmony_ci
360cb93a386Sopenharmony_ci    rec.fAmbientColor = SK_ColorBLACK;
361cb93a386Sopenharmony_ci    rec.fSpotColor    = SK_ColorBLACK;
362cb93a386Sopenharmony_ci    canvas->private_draw_shadow_rec(path, rec);
363cb93a386Sopenharmony_ci}
364cb93a386Sopenharmony_ci
365cb93a386Sopenharmony_cistatic const char* const gBlendModeMap[] = {
366cb93a386Sopenharmony_ci        "clear",      "src",        "dst",      "srcOver",    "dstOver",   "srcIn",     "dstIn",
367cb93a386Sopenharmony_ci        "srcOut",     "dstOut",     "srcATop",  "dstATop",    "xor",       "plus",      "modulate",
368cb93a386Sopenharmony_ci
369cb93a386Sopenharmony_ci        "screen",
370cb93a386Sopenharmony_ci
371cb93a386Sopenharmony_ci        "overlay",    "darken",     "lighten",  "colorDodge", "colorBurn", "hardLight", "softLight",
372cb93a386Sopenharmony_ci        "difference", "exclusion",  "multiply",
373cb93a386Sopenharmony_ci
374cb93a386Sopenharmony_ci        "hue",        "saturation", "color",    "luminosity",
375cb93a386Sopenharmony_ci};
376cb93a386Sopenharmony_ci
377cb93a386Sopenharmony_cistatic_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLastMode) + 1,
378cb93a386Sopenharmony_ci              "blendMode mismatch");
379cb93a386Sopenharmony_cistatic_assert(SK_ARRAY_COUNT(gBlendModeMap) == static_cast<size_t>(SkBlendMode::kLuminosity) + 1,
380cb93a386Sopenharmony_ci              "blendMode mismatch");
381cb93a386Sopenharmony_ci
382cb93a386Sopenharmony_civoid apply_paint_blend_mode(const SkPaint& paint, SkJSONWriter& writer) {
383cb93a386Sopenharmony_ci    const auto mode = paint.getBlendMode_or(SkBlendMode::kSrcOver);
384cb93a386Sopenharmony_ci    if (mode != SkBlendMode::kSrcOver) {
385cb93a386Sopenharmony_ci        SkASSERT(static_cast<size_t>(mode) < SK_ARRAY_COUNT(gBlendModeMap));
386cb93a386Sopenharmony_ci        writer.appendString(DEBUGCANVAS_ATTRIBUTE_BLENDMODE,
387cb93a386Sopenharmony_ci                            gBlendModeMap[static_cast<size_t>(mode)]);
388cb93a386Sopenharmony_ci    }
389cb93a386Sopenharmony_ci}
390cb93a386Sopenharmony_ci
391cb93a386Sopenharmony_ci};  // namespace
392cb93a386Sopenharmony_ci
393cb93a386Sopenharmony_civoid DrawCommand::MakeJsonColor(SkJSONWriter& writer, const SkColor color) {
394cb93a386Sopenharmony_ci    writer.beginArray(nullptr, false);
395cb93a386Sopenharmony_ci    writer.appendS32(SkColorGetA(color));
396cb93a386Sopenharmony_ci    writer.appendS32(SkColorGetR(color));
397cb93a386Sopenharmony_ci    writer.appendS32(SkColorGetG(color));
398cb93a386Sopenharmony_ci    writer.appendS32(SkColorGetB(color));
399cb93a386Sopenharmony_ci    writer.endArray();
400cb93a386Sopenharmony_ci}
401cb93a386Sopenharmony_ci
402cb93a386Sopenharmony_civoid DrawCommand::MakeJsonColor4f(SkJSONWriter& writer, const SkColor4f& color) {
403cb93a386Sopenharmony_ci    writer.beginArray(nullptr, false);
404cb93a386Sopenharmony_ci    writer.appendFloat(color.fA);
405cb93a386Sopenharmony_ci    writer.appendFloat(color.fR);
406cb93a386Sopenharmony_ci    writer.appendFloat(color.fG);
407cb93a386Sopenharmony_ci    writer.appendFloat(color.fB);
408cb93a386Sopenharmony_ci    writer.endArray();
409cb93a386Sopenharmony_ci}
410cb93a386Sopenharmony_ci
411cb93a386Sopenharmony_civoid DrawCommand::MakeJsonPoint(SkJSONWriter& writer, const SkPoint& point) {
412cb93a386Sopenharmony_ci    writer.beginArray(nullptr, false);
413cb93a386Sopenharmony_ci    writer.appendFloat(point.x());
414cb93a386Sopenharmony_ci    writer.appendFloat(point.y());
415cb93a386Sopenharmony_ci    writer.endArray();
416cb93a386Sopenharmony_ci}
417cb93a386Sopenharmony_ci
418cb93a386Sopenharmony_civoid DrawCommand::MakeJsonPoint(SkJSONWriter& writer, SkScalar x, SkScalar y) {
419cb93a386Sopenharmony_ci    writer.beginArray(nullptr, false);
420cb93a386Sopenharmony_ci    writer.appendFloat(x);
421cb93a386Sopenharmony_ci    writer.appendFloat(y);
422cb93a386Sopenharmony_ci    writer.endArray();
423cb93a386Sopenharmony_ci}
424cb93a386Sopenharmony_ci
425cb93a386Sopenharmony_civoid DrawCommand::MakeJsonPoint3(SkJSONWriter& writer, const SkPoint3& point) {
426cb93a386Sopenharmony_ci    writer.beginArray(nullptr, false);
427cb93a386Sopenharmony_ci    writer.appendFloat(point.x());
428cb93a386Sopenharmony_ci    writer.appendFloat(point.y());
429cb93a386Sopenharmony_ci    writer.appendFloat(point.z());
430cb93a386Sopenharmony_ci    writer.endArray();
431cb93a386Sopenharmony_ci}
432cb93a386Sopenharmony_ci
433cb93a386Sopenharmony_civoid DrawCommand::MakeJsonRect(SkJSONWriter& writer, const SkRect& rect) {
434cb93a386Sopenharmony_ci    writer.beginArray(nullptr, false);
435cb93a386Sopenharmony_ci    writer.appendFloat(rect.left());
436cb93a386Sopenharmony_ci    writer.appendFloat(rect.top());
437cb93a386Sopenharmony_ci    writer.appendFloat(rect.right());
438cb93a386Sopenharmony_ci    writer.appendFloat(rect.bottom());
439cb93a386Sopenharmony_ci    writer.endArray();
440cb93a386Sopenharmony_ci}
441cb93a386Sopenharmony_ci
442cb93a386Sopenharmony_civoid DrawCommand::MakeJsonIRect(SkJSONWriter& writer, const SkIRect& rect) {
443cb93a386Sopenharmony_ci    writer.beginArray(nullptr, false);
444cb93a386Sopenharmony_ci    writer.appendS32(rect.left());
445cb93a386Sopenharmony_ci    writer.appendS32(rect.top());
446cb93a386Sopenharmony_ci    writer.appendS32(rect.right());
447cb93a386Sopenharmony_ci    writer.appendS32(rect.bottom());
448cb93a386Sopenharmony_ci    writer.endArray();
449cb93a386Sopenharmony_ci}
450cb93a386Sopenharmony_ci
451cb93a386Sopenharmony_cistatic void make_json_rrect(SkJSONWriter& writer, const SkRRect& rrect) {
452cb93a386Sopenharmony_ci    writer.beginArray(nullptr, false);
453cb93a386Sopenharmony_ci    DrawCommand::MakeJsonRect(writer, rrect.rect());
454cb93a386Sopenharmony_ci    DrawCommand::MakeJsonPoint(writer, rrect.radii(SkRRect::kUpperLeft_Corner));
455cb93a386Sopenharmony_ci    DrawCommand::MakeJsonPoint(writer, rrect.radii(SkRRect::kUpperRight_Corner));
456cb93a386Sopenharmony_ci    DrawCommand::MakeJsonPoint(writer, rrect.radii(SkRRect::kLowerRight_Corner));
457cb93a386Sopenharmony_ci    DrawCommand::MakeJsonPoint(writer, rrect.radii(SkRRect::kLowerLeft_Corner));
458cb93a386Sopenharmony_ci    writer.endArray();
459cb93a386Sopenharmony_ci}
460cb93a386Sopenharmony_ci
461cb93a386Sopenharmony_civoid DrawCommand::MakeJsonMatrix(SkJSONWriter& writer, const SkMatrix& matrix) {
462cb93a386Sopenharmony_ci    writer.beginArray();
463cb93a386Sopenharmony_ci    for (int r = 0; r < 3; ++r) {
464cb93a386Sopenharmony_ci        writer.beginArray(nullptr, false);
465cb93a386Sopenharmony_ci        for (int c = 0; c < 3; ++c) {
466cb93a386Sopenharmony_ci            writer.appendFloat(matrix[r * 3 + c]);
467cb93a386Sopenharmony_ci        }
468cb93a386Sopenharmony_ci        writer.endArray();
469cb93a386Sopenharmony_ci    }
470cb93a386Sopenharmony_ci    writer.endArray();
471cb93a386Sopenharmony_ci}
472cb93a386Sopenharmony_ci
473cb93a386Sopenharmony_civoid DrawCommand::MakeJsonMatrix44(SkJSONWriter& writer, const SkM44& matrix) {
474cb93a386Sopenharmony_ci    writer.beginArray();
475cb93a386Sopenharmony_ci    for (int r = 0; r < 4; ++r) {
476cb93a386Sopenharmony_ci        writer.beginArray(nullptr, false);
477cb93a386Sopenharmony_ci        for (int c = 0; c < 4; ++c) {
478cb93a386Sopenharmony_ci            writer.appendFloat(matrix.rc(r, c));
479cb93a386Sopenharmony_ci        }
480cb93a386Sopenharmony_ci        writer.endArray();
481cb93a386Sopenharmony_ci    }
482cb93a386Sopenharmony_ci    writer.endArray();
483cb93a386Sopenharmony_ci}
484cb93a386Sopenharmony_ci
485cb93a386Sopenharmony_civoid DrawCommand::MakeJsonPath(SkJSONWriter& writer, const SkPath& path) {
486cb93a386Sopenharmony_ci    writer.beginObject();
487cb93a386Sopenharmony_ci    switch (path.getFillType()) {
488cb93a386Sopenharmony_ci        case SkPathFillType::kWinding:
489cb93a386Sopenharmony_ci            writer.appendString(DEBUGCANVAS_ATTRIBUTE_FILLTYPE, DEBUGCANVAS_FILLTYPE_WINDING);
490cb93a386Sopenharmony_ci            break;
491cb93a386Sopenharmony_ci        case SkPathFillType::kEvenOdd:
492cb93a386Sopenharmony_ci            writer.appendString(DEBUGCANVAS_ATTRIBUTE_FILLTYPE, DEBUGCANVAS_FILLTYPE_EVENODD);
493cb93a386Sopenharmony_ci            break;
494cb93a386Sopenharmony_ci        case SkPathFillType::kInverseWinding:
495cb93a386Sopenharmony_ci            writer.appendString(DEBUGCANVAS_ATTRIBUTE_FILLTYPE,
496cb93a386Sopenharmony_ci                                DEBUGCANVAS_FILLTYPE_INVERSEWINDING);
497cb93a386Sopenharmony_ci            break;
498cb93a386Sopenharmony_ci        case SkPathFillType::kInverseEvenOdd:
499cb93a386Sopenharmony_ci            writer.appendString(DEBUGCANVAS_ATTRIBUTE_FILLTYPE,
500cb93a386Sopenharmony_ci                                DEBUGCANVAS_FILLTYPE_INVERSEEVENODD);
501cb93a386Sopenharmony_ci            break;
502cb93a386Sopenharmony_ci    }
503cb93a386Sopenharmony_ci    writer.beginArray(DEBUGCANVAS_ATTRIBUTE_VERBS);
504cb93a386Sopenharmony_ci    SkPath::Iter iter(path, false);
505cb93a386Sopenharmony_ci    SkPoint      pts[4];
506cb93a386Sopenharmony_ci    SkPath::Verb verb;
507cb93a386Sopenharmony_ci    while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
508cb93a386Sopenharmony_ci        if (verb == SkPath::kClose_Verb) {
509cb93a386Sopenharmony_ci            writer.appendString(DEBUGCANVAS_VERB_CLOSE);
510cb93a386Sopenharmony_ci            continue;
511cb93a386Sopenharmony_ci        }
512cb93a386Sopenharmony_ci        writer.beginObject();  // verb
513cb93a386Sopenharmony_ci        switch (verb) {
514cb93a386Sopenharmony_ci            case SkPath::kLine_Verb: {
515cb93a386Sopenharmony_ci                writer.appendName(DEBUGCANVAS_VERB_LINE);
516cb93a386Sopenharmony_ci                MakeJsonPoint(writer, pts[1]);
517cb93a386Sopenharmony_ci                break;
518cb93a386Sopenharmony_ci            }
519cb93a386Sopenharmony_ci            case SkPath::kQuad_Verb: {
520cb93a386Sopenharmony_ci                writer.beginArray(DEBUGCANVAS_VERB_QUAD);
521cb93a386Sopenharmony_ci                MakeJsonPoint(writer, pts[1]);
522cb93a386Sopenharmony_ci                MakeJsonPoint(writer, pts[2]);
523cb93a386Sopenharmony_ci                writer.endArray();  // quad coords
524cb93a386Sopenharmony_ci                break;
525cb93a386Sopenharmony_ci            }
526cb93a386Sopenharmony_ci            case SkPath::kCubic_Verb: {
527cb93a386Sopenharmony_ci                writer.beginArray(DEBUGCANVAS_VERB_CUBIC);
528cb93a386Sopenharmony_ci                MakeJsonPoint(writer, pts[1]);
529cb93a386Sopenharmony_ci                MakeJsonPoint(writer, pts[2]);
530cb93a386Sopenharmony_ci                MakeJsonPoint(writer, pts[3]);
531cb93a386Sopenharmony_ci                writer.endArray();  // cubic coords
532cb93a386Sopenharmony_ci                break;
533cb93a386Sopenharmony_ci            }
534cb93a386Sopenharmony_ci            case SkPath::kConic_Verb: {
535cb93a386Sopenharmony_ci                writer.beginArray(DEBUGCANVAS_VERB_CONIC);
536cb93a386Sopenharmony_ci                MakeJsonPoint(writer, pts[1]);
537cb93a386Sopenharmony_ci                MakeJsonPoint(writer, pts[2]);
538cb93a386Sopenharmony_ci                writer.appendFloat(iter.conicWeight());
539cb93a386Sopenharmony_ci                writer.endArray();  // conic coords
540cb93a386Sopenharmony_ci                break;
541cb93a386Sopenharmony_ci            }
542cb93a386Sopenharmony_ci            case SkPath::kMove_Verb: {
543cb93a386Sopenharmony_ci                writer.appendName(DEBUGCANVAS_VERB_MOVE);
544cb93a386Sopenharmony_ci                MakeJsonPoint(writer, pts[0]);
545cb93a386Sopenharmony_ci                break;
546cb93a386Sopenharmony_ci            }
547cb93a386Sopenharmony_ci            case SkPath::kClose_Verb:
548cb93a386Sopenharmony_ci            case SkPath::kDone_Verb:
549cb93a386Sopenharmony_ci                // Unreachable
550cb93a386Sopenharmony_ci                break;
551cb93a386Sopenharmony_ci        }
552cb93a386Sopenharmony_ci        writer.endObject();  // verb
553cb93a386Sopenharmony_ci    }
554cb93a386Sopenharmony_ci    writer.endArray();   // verbs
555cb93a386Sopenharmony_ci    writer.endObject();  // path
556cb93a386Sopenharmony_ci}
557cb93a386Sopenharmony_ci
558cb93a386Sopenharmony_civoid DrawCommand::MakeJsonRegion(SkJSONWriter& writer, const SkRegion& region) {
559cb93a386Sopenharmony_ci    // TODO: Actually serialize the rectangles, rather than just devolving to path
560cb93a386Sopenharmony_ci    SkPath path;
561cb93a386Sopenharmony_ci    region.getBoundaryPath(&path);
562cb93a386Sopenharmony_ci    MakeJsonPath(writer, path);
563cb93a386Sopenharmony_ci}
564cb93a386Sopenharmony_ci
565cb93a386Sopenharmony_cistatic const char* clipop_name(SkClipOp op) {
566cb93a386Sopenharmony_ci    switch (op) {
567cb93a386Sopenharmony_ci        case SkClipOp::kDifference: return DEBUGCANVAS_CLIPOP_DIFFERENCE;
568cb93a386Sopenharmony_ci        case SkClipOp::kIntersect: return DEBUGCANVAS_CLIPOP_INTERSECT;
569cb93a386Sopenharmony_ci        default: SkASSERT(false); return "<invalid region op>";
570cb93a386Sopenharmony_ci    }
571cb93a386Sopenharmony_ci}
572cb93a386Sopenharmony_ci
573cb93a386Sopenharmony_cistatic const char* pointmode_name(SkCanvas::PointMode mode) {
574cb93a386Sopenharmony_ci    switch (mode) {
575cb93a386Sopenharmony_ci        case SkCanvas::kPoints_PointMode: return DEBUGCANVAS_POINTMODE_POINTS;
576cb93a386Sopenharmony_ci        case SkCanvas::kLines_PointMode: return DEBUGCANVAS_POINTMODE_LINES;
577cb93a386Sopenharmony_ci        case SkCanvas::kPolygon_PointMode: return DEBUGCANVAS_POINTMODE_POLYGON;
578cb93a386Sopenharmony_ci        default: SkASSERT(false); return "<invalid point mode>";
579cb93a386Sopenharmony_ci    }
580cb93a386Sopenharmony_ci}
581cb93a386Sopenharmony_ci
582cb93a386Sopenharmony_cistatic void store_scalar(SkJSONWriter& writer,
583cb93a386Sopenharmony_ci                         const char*   key,
584cb93a386Sopenharmony_ci                         SkScalar      value,
585cb93a386Sopenharmony_ci                         SkScalar      defaultValue) {
586cb93a386Sopenharmony_ci    if (value != defaultValue) {
587cb93a386Sopenharmony_ci        writer.appendFloat(key, value);
588cb93a386Sopenharmony_ci    }
589cb93a386Sopenharmony_ci}
590cb93a386Sopenharmony_ci
591cb93a386Sopenharmony_cistatic void store_bool(SkJSONWriter& writer, const char* key, bool value, bool defaultValue) {
592cb93a386Sopenharmony_ci    if (value != defaultValue) {
593cb93a386Sopenharmony_ci        writer.appendBool(key, value);
594cb93a386Sopenharmony_ci    }
595cb93a386Sopenharmony_ci}
596cb93a386Sopenharmony_ci
597cb93a386Sopenharmony_cistatic SkString encode_data(const void*     bytes,
598cb93a386Sopenharmony_ci                            size_t          count,
599cb93a386Sopenharmony_ci                            const char*     contentType,
600cb93a386Sopenharmony_ci                            UrlDataManager& urlDataManager) {
601cb93a386Sopenharmony_ci    sk_sp<SkData> data(SkData::MakeWithCopy(bytes, count));
602cb93a386Sopenharmony_ci    return urlDataManager.addData(data.get(), contentType);
603cb93a386Sopenharmony_ci}
604cb93a386Sopenharmony_ci
605cb93a386Sopenharmony_civoid DrawCommand::flatten(const SkFlattenable* flattenable,
606cb93a386Sopenharmony_ci                          SkJSONWriter&        writer,
607cb93a386Sopenharmony_ci                          UrlDataManager&      urlDataManager) {
608cb93a386Sopenharmony_ci    SkBinaryWriteBuffer buffer;
609cb93a386Sopenharmony_ci    flattenable->flatten(buffer);
610cb93a386Sopenharmony_ci    void* data = sk_malloc_throw(buffer.bytesWritten());
611cb93a386Sopenharmony_ci    buffer.writeToMemory(data);
612cb93a386Sopenharmony_ci    SkString url =
613cb93a386Sopenharmony_ci            encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager);
614cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_NAME, flattenable->getTypeName());
615cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_DATA, url.c_str());
616cb93a386Sopenharmony_ci
617cb93a386Sopenharmony_ci    writer.beginObject(DEBUGCANVAS_ATTRIBUTE_VALUES);
618cb93a386Sopenharmony_ci    JsonWriteBuffer jsonBuffer(&writer, &urlDataManager);
619cb93a386Sopenharmony_ci    flattenable->flatten(jsonBuffer);
620cb93a386Sopenharmony_ci    writer.endObject();  // values
621cb93a386Sopenharmony_ci
622cb93a386Sopenharmony_ci    sk_free(data);
623cb93a386Sopenharmony_ci}
624cb93a386Sopenharmony_ci
625cb93a386Sopenharmony_civoid DrawCommand::WritePNG(SkBitmap bitmap, SkWStream& out) {
626cb93a386Sopenharmony_ci    SkPixmap pm;
627cb93a386Sopenharmony_ci    SkAssertResult(bitmap.peekPixels(&pm));
628cb93a386Sopenharmony_ci
629cb93a386Sopenharmony_ci    SkPngEncoder::Options options;
630cb93a386Sopenharmony_ci    options.fZLibLevel   = 1;
631cb93a386Sopenharmony_ci    options.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
632cb93a386Sopenharmony_ci    SkPngEncoder::Encode(&out, pm, options);
633cb93a386Sopenharmony_ci}
634cb93a386Sopenharmony_ci
635cb93a386Sopenharmony_ci// flattens an image to a Json stream, also called from shader flatten
636cb93a386Sopenharmony_cibool DrawCommand::flatten(const SkImage&  image,
637cb93a386Sopenharmony_ci                          SkJSONWriter&   writer,
638cb93a386Sopenharmony_ci                          UrlDataManager& urlDataManager) {
639cb93a386Sopenharmony_ci    // For MSKP files, there is no need to encode the image,
640cb93a386Sopenharmony_ci    // just report its id.
641cb93a386Sopenharmony_ci    if (urlDataManager.hasImageIndex()) {
642cb93a386Sopenharmony_ci        writer.appendName(DEBUGCANVAS_ATTRIBUTE_IMAGE_INDEX);
643cb93a386Sopenharmony_ci        writer.appendU64(urlDataManager.lookupImage(&image));
644cb93a386Sopenharmony_ci        return true;
645cb93a386Sopenharmony_ci    }
646cb93a386Sopenharmony_ci
647cb93a386Sopenharmony_ci    writer.beginObject(DEBUGCANVAS_ATTRIBUTE_IMAGE);
648cb93a386Sopenharmony_ci    size_t       rowBytes = 4 * image.width();
649cb93a386Sopenharmony_ci    SkAutoMalloc buffer(rowBytes * image.height());
650cb93a386Sopenharmony_ci    SkImageInfo  dstInfo =
651cb93a386Sopenharmony_ci            SkImageInfo::Make(image.dimensions(), kN32_SkColorType, kPremul_SkAlphaType);
652cb93a386Sopenharmony_ci    // "cheat" for this debug tool and use image's context
653cb93a386Sopenharmony_ci    GrDirectContext* dContext = nullptr;
654cb93a386Sopenharmony_ci#if SK_SUPPORT_GPU
655cb93a386Sopenharmony_ci    dContext = GrAsDirectContext(as_IB(&image)->context());
656cb93a386Sopenharmony_ci#endif
657cb93a386Sopenharmony_ci    if (!image.readPixels(dContext, dstInfo, buffer.get(), rowBytes, 0, 0)) {
658cb93a386Sopenharmony_ci        SkDebugf("DrawCommand::flatten SkImage: readPixels failed\n");
659cb93a386Sopenharmony_ci        writer.endObject();
660cb93a386Sopenharmony_ci        return false;
661cb93a386Sopenharmony_ci    }
662cb93a386Sopenharmony_ci
663cb93a386Sopenharmony_ci    SkBitmap bm;
664cb93a386Sopenharmony_ci    bm.installPixels(dstInfo, buffer.get(), rowBytes);
665cb93a386Sopenharmony_ci
666cb93a386Sopenharmony_ci    SkDynamicMemoryWStream out;
667cb93a386Sopenharmony_ci    DrawCommand::WritePNG(bm, out);
668cb93a386Sopenharmony_ci    sk_sp<SkData> encoded = out.detachAsData();
669cb93a386Sopenharmony_ci    if (encoded == nullptr) {
670cb93a386Sopenharmony_ci        SkDebugf("DrawCommand::flatten SkImage: could not encode image as PNG\n");
671cb93a386Sopenharmony_ci        writer.endObject();
672cb93a386Sopenharmony_ci        return false;
673cb93a386Sopenharmony_ci    }
674cb93a386Sopenharmony_ci    auto dataPtr = encoded->data();
675cb93a386Sopenharmony_ci    if (!dataPtr) {
676cb93a386Sopenharmony_ci      SkDebugf("DrawCommand::flatten SkImage: encoding as PNG produced zero length data\n");
677cb93a386Sopenharmony_ci      writer.endObject();
678cb93a386Sopenharmony_ci      return false;
679cb93a386Sopenharmony_ci    }
680cb93a386Sopenharmony_ci    SkString      url = encode_data(encoded->data(), encoded->size(), "image/png", urlDataManager);
681cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_DATA, url.c_str());
682cb93a386Sopenharmony_ci    writer.endObject();
683cb93a386Sopenharmony_ci    return true;
684cb93a386Sopenharmony_ci}
685cb93a386Sopenharmony_ci
686cb93a386Sopenharmony_cistatic const char* color_type_name(SkColorType colorType) {
687cb93a386Sopenharmony_ci    switch (colorType) {
688cb93a386Sopenharmony_ci        case kARGB_4444_SkColorType: return DEBUGCANVAS_COLORTYPE_ARGB4444;
689cb93a386Sopenharmony_ci        case kRGBA_8888_SkColorType: return DEBUGCANVAS_COLORTYPE_RGBA8888;
690cb93a386Sopenharmony_ci        case kBGRA_8888_SkColorType: return DEBUGCANVAS_COLORTYPE_BGRA8888;
691cb93a386Sopenharmony_ci        case kRGB_565_SkColorType: return DEBUGCANVAS_COLORTYPE_565;
692cb93a386Sopenharmony_ci        case kGray_8_SkColorType: return DEBUGCANVAS_COLORTYPE_GRAY8;
693cb93a386Sopenharmony_ci        case kAlpha_8_SkColorType: return DEBUGCANVAS_COLORTYPE_ALPHA8;
694cb93a386Sopenharmony_ci        default: SkASSERT(false); return DEBUGCANVAS_COLORTYPE_RGBA8888;
695cb93a386Sopenharmony_ci    }
696cb93a386Sopenharmony_ci}
697cb93a386Sopenharmony_ci
698cb93a386Sopenharmony_cistatic const char* alpha_type_name(SkAlphaType alphaType) {
699cb93a386Sopenharmony_ci    switch (alphaType) {
700cb93a386Sopenharmony_ci        case kOpaque_SkAlphaType: return DEBUGCANVAS_ALPHATYPE_OPAQUE;
701cb93a386Sopenharmony_ci        case kPremul_SkAlphaType: return DEBUGCANVAS_ALPHATYPE_PREMUL;
702cb93a386Sopenharmony_ci        case kUnpremul_SkAlphaType: return DEBUGCANVAS_ALPHATYPE_UNPREMUL;
703cb93a386Sopenharmony_ci        default: SkASSERT(false); return DEBUGCANVAS_ALPHATYPE_OPAQUE;
704cb93a386Sopenharmony_ci    }
705cb93a386Sopenharmony_ci}
706cb93a386Sopenharmony_ci
707cb93a386Sopenharmony_cibool DrawCommand::flatten(const SkBitmap& bitmap,
708cb93a386Sopenharmony_ci                          SkJSONWriter&   writer,
709cb93a386Sopenharmony_ci                          UrlDataManager& urlDataManager) {
710cb93a386Sopenharmony_ci    sk_sp<SkImage> image(bitmap.asImage());
711cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_COLOR, color_type_name(bitmap.colorType()));
712cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_ALPHA, alpha_type_name(bitmap.alphaType()));
713cb93a386Sopenharmony_ci    // Image will appear to have no uses, TODO(nifong): provide the user with a useful explanation
714cb93a386Sopenharmony_ci    bool success = flatten(*image, writer, urlDataManager);
715cb93a386Sopenharmony_ci    return success;
716cb93a386Sopenharmony_ci}
717cb93a386Sopenharmony_ci
718cb93a386Sopenharmony_cistatic void apply_font_hinting(const SkFont& font, SkJSONWriter& writer) {
719cb93a386Sopenharmony_ci    SkFontHinting hinting = font.getHinting();
720cb93a386Sopenharmony_ci    if (hinting != SkPaintDefaults_Hinting) {
721cb93a386Sopenharmony_ci        switch (hinting) {
722cb93a386Sopenharmony_ci            case SkFontHinting::kNone:
723cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_HINTING, DEBUGCANVAS_HINTING_NONE);
724cb93a386Sopenharmony_ci                break;
725cb93a386Sopenharmony_ci            case SkFontHinting::kSlight:
726cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_HINTING, DEBUGCANVAS_HINTING_SLIGHT);
727cb93a386Sopenharmony_ci                break;
728cb93a386Sopenharmony_ci            case SkFontHinting::kNormal:
729cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_HINTING, DEBUGCANVAS_HINTING_NORMAL);
730cb93a386Sopenharmony_ci                break;
731cb93a386Sopenharmony_ci            case SkFontHinting::kFull:
732cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_HINTING, DEBUGCANVAS_HINTING_FULL);
733cb93a386Sopenharmony_ci                break;
734cb93a386Sopenharmony_ci        }
735cb93a386Sopenharmony_ci    }
736cb93a386Sopenharmony_ci}
737cb93a386Sopenharmony_ci
738cb93a386Sopenharmony_cistatic void apply_font_edging(const SkFont& font, SkJSONWriter& writer) {
739cb93a386Sopenharmony_ci    switch (font.getEdging()) {
740cb93a386Sopenharmony_ci        case SkFont::Edging::kAlias:
741cb93a386Sopenharmony_ci            writer.appendString(DEBUGCANVAS_ATTRIBUTE_EDGING, DEBUGCANVAS_EDGING_ALIAS);
742cb93a386Sopenharmony_ci            break;
743cb93a386Sopenharmony_ci        case SkFont::Edging::kAntiAlias:
744cb93a386Sopenharmony_ci            writer.appendString(DEBUGCANVAS_ATTRIBUTE_EDGING, DEBUGCANVAS_EDGING_ANTIALIAS);
745cb93a386Sopenharmony_ci            break;
746cb93a386Sopenharmony_ci        case SkFont::Edging::kSubpixelAntiAlias:
747cb93a386Sopenharmony_ci            writer.appendString(DEBUGCANVAS_ATTRIBUTE_EDGING, DEBUGCANVAS_EDGING_SUBPIXELANTIALIAS);
748cb93a386Sopenharmony_ci            break;
749cb93a386Sopenharmony_ci    }
750cb93a386Sopenharmony_ci}
751cb93a386Sopenharmony_ci
752cb93a386Sopenharmony_cistatic void apply_paint_color(const SkPaint& paint, SkJSONWriter& writer) {
753cb93a386Sopenharmony_ci    SkColor color = paint.getColor();
754cb93a386Sopenharmony_ci    if (color != SK_ColorBLACK) {
755cb93a386Sopenharmony_ci        writer.appendName(DEBUGCANVAS_ATTRIBUTE_COLOR);
756cb93a386Sopenharmony_ci        DrawCommand::MakeJsonColor(writer, color);
757cb93a386Sopenharmony_ci    }
758cb93a386Sopenharmony_ci}
759cb93a386Sopenharmony_ci
760cb93a386Sopenharmony_cistatic void apply_paint_style(const SkPaint& paint, SkJSONWriter& writer) {
761cb93a386Sopenharmony_ci    SkPaint::Style style = paint.getStyle();
762cb93a386Sopenharmony_ci    if (style != SkPaint::kFill_Style) {
763cb93a386Sopenharmony_ci        switch (style) {
764cb93a386Sopenharmony_ci            case SkPaint::kStroke_Style: {
765cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_STYLE, DEBUGCANVAS_STYLE_STROKE);
766cb93a386Sopenharmony_ci                break;
767cb93a386Sopenharmony_ci            }
768cb93a386Sopenharmony_ci            case SkPaint::kStrokeAndFill_Style: {
769cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_STYLE, DEBUGCANVAS_STYLE_STROKEANDFILL);
770cb93a386Sopenharmony_ci                break;
771cb93a386Sopenharmony_ci            }
772cb93a386Sopenharmony_ci            default: SkASSERT(false);
773cb93a386Sopenharmony_ci        }
774cb93a386Sopenharmony_ci    }
775cb93a386Sopenharmony_ci}
776cb93a386Sopenharmony_ci
777cb93a386Sopenharmony_cistatic void apply_paint_cap(const SkPaint& paint, SkJSONWriter& writer) {
778cb93a386Sopenharmony_ci    SkPaint::Cap cap = paint.getStrokeCap();
779cb93a386Sopenharmony_ci    if (cap != SkPaint::kDefault_Cap) {
780cb93a386Sopenharmony_ci        switch (cap) {
781cb93a386Sopenharmony_ci            case SkPaint::kButt_Cap:
782cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_CAP, DEBUGCANVAS_CAP_BUTT);
783cb93a386Sopenharmony_ci                break;
784cb93a386Sopenharmony_ci            case SkPaint::kRound_Cap:
785cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_CAP, DEBUGCANVAS_CAP_ROUND);
786cb93a386Sopenharmony_ci                break;
787cb93a386Sopenharmony_ci            case SkPaint::kSquare_Cap:
788cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_CAP, DEBUGCANVAS_CAP_SQUARE);
789cb93a386Sopenharmony_ci                break;
790cb93a386Sopenharmony_ci            default: SkASSERT(false);
791cb93a386Sopenharmony_ci        }
792cb93a386Sopenharmony_ci    }
793cb93a386Sopenharmony_ci}
794cb93a386Sopenharmony_ci
795cb93a386Sopenharmony_cistatic void apply_paint_join(const SkPaint& paint, SkJSONWriter& writer) {
796cb93a386Sopenharmony_ci    SkPaint::Join join = paint.getStrokeJoin();
797cb93a386Sopenharmony_ci    if (join != SkPaint::kDefault_Join) {
798cb93a386Sopenharmony_ci        switch (join) {
799cb93a386Sopenharmony_ci            case SkPaint::kMiter_Join:
800cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_STROKEJOIN, DEBUGCANVAS_MITER_JOIN);
801cb93a386Sopenharmony_ci                break;
802cb93a386Sopenharmony_ci            case SkPaint::kRound_Join:
803cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_STROKEJOIN, DEBUGCANVAS_ROUND_JOIN);
804cb93a386Sopenharmony_ci                break;
805cb93a386Sopenharmony_ci            case SkPaint::kBevel_Join:
806cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_STROKEJOIN, DEBUGCANVAS_BEVEL_JOIN);
807cb93a386Sopenharmony_ci                break;
808cb93a386Sopenharmony_ci            default: SkASSERT(false);
809cb93a386Sopenharmony_ci        }
810cb93a386Sopenharmony_ci    }
811cb93a386Sopenharmony_ci}
812cb93a386Sopenharmony_ci
813cb93a386Sopenharmony_cistatic void apply_paint_maskfilter(const SkPaint&  paint,
814cb93a386Sopenharmony_ci                                   SkJSONWriter&   writer,
815cb93a386Sopenharmony_ci                                   UrlDataManager& urlDataManager) {
816cb93a386Sopenharmony_ci    SkMaskFilter* maskFilter = paint.getMaskFilter();
817cb93a386Sopenharmony_ci    if (maskFilter != nullptr) {
818cb93a386Sopenharmony_ci        SkMaskFilterBase::BlurRec blurRec;
819cb93a386Sopenharmony_ci        if (as_MFB(maskFilter)->asABlur(&blurRec)) {
820cb93a386Sopenharmony_ci            writer.beginObject(DEBUGCANVAS_ATTRIBUTE_BLUR);
821cb93a386Sopenharmony_ci            writer.appendFloat(DEBUGCANVAS_ATTRIBUTE_SIGMA, blurRec.fSigma);
822cb93a386Sopenharmony_ci            switch (blurRec.fStyle) {
823cb93a386Sopenharmony_ci                case SkBlurStyle::kNormal_SkBlurStyle:
824cb93a386Sopenharmony_ci                    writer.appendString(DEBUGCANVAS_ATTRIBUTE_STYLE, DEBUGCANVAS_BLURSTYLE_NORMAL);
825cb93a386Sopenharmony_ci                    break;
826cb93a386Sopenharmony_ci                case SkBlurStyle::kSolid_SkBlurStyle:
827cb93a386Sopenharmony_ci                    writer.appendString(DEBUGCANVAS_ATTRIBUTE_STYLE, DEBUGCANVAS_BLURSTYLE_SOLID);
828cb93a386Sopenharmony_ci                    break;
829cb93a386Sopenharmony_ci                case SkBlurStyle::kOuter_SkBlurStyle:
830cb93a386Sopenharmony_ci                    writer.appendString(DEBUGCANVAS_ATTRIBUTE_STYLE, DEBUGCANVAS_BLURSTYLE_OUTER);
831cb93a386Sopenharmony_ci                    break;
832cb93a386Sopenharmony_ci                case SkBlurStyle::kInner_SkBlurStyle:
833cb93a386Sopenharmony_ci                    writer.appendString(DEBUGCANVAS_ATTRIBUTE_STYLE, DEBUGCANVAS_BLURSTYLE_INNER);
834cb93a386Sopenharmony_ci                    break;
835cb93a386Sopenharmony_ci                default: SkASSERT(false);
836cb93a386Sopenharmony_ci            }
837cb93a386Sopenharmony_ci            writer.endObject();  // blur
838cb93a386Sopenharmony_ci        } else {
839cb93a386Sopenharmony_ci            writer.beginObject(DEBUGCANVAS_ATTRIBUTE_MASKFILTER);
840cb93a386Sopenharmony_ci            DrawCommand::flatten(maskFilter, writer, urlDataManager);
841cb93a386Sopenharmony_ci            writer.endObject();  // maskFilter
842cb93a386Sopenharmony_ci        }
843cb93a386Sopenharmony_ci    }
844cb93a386Sopenharmony_ci}
845cb93a386Sopenharmony_ci
846cb93a386Sopenharmony_cistatic void apply_paint_patheffect(const SkPaint&  paint,
847cb93a386Sopenharmony_ci                                   SkJSONWriter&   writer,
848cb93a386Sopenharmony_ci                                   UrlDataManager& urlDataManager) {
849cb93a386Sopenharmony_ci    SkPathEffect* pathEffect = paint.getPathEffect();
850cb93a386Sopenharmony_ci    if (pathEffect != nullptr) {
851cb93a386Sopenharmony_ci        SkPathEffect::DashInfo dashInfo;
852cb93a386Sopenharmony_ci        SkPathEffect::DashType dashType = pathEffect->asADash(&dashInfo);
853cb93a386Sopenharmony_ci        if (dashType == SkPathEffect::kDash_DashType) {
854cb93a386Sopenharmony_ci            dashInfo.fIntervals = (SkScalar*)sk_malloc_throw(dashInfo.fCount * sizeof(SkScalar));
855cb93a386Sopenharmony_ci            pathEffect->asADash(&dashInfo);
856cb93a386Sopenharmony_ci            writer.beginObject(DEBUGCANVAS_ATTRIBUTE_DASHING);
857cb93a386Sopenharmony_ci            writer.beginArray(DEBUGCANVAS_ATTRIBUTE_INTERVALS, false);
858cb93a386Sopenharmony_ci            for (int32_t i = 0; i < dashInfo.fCount; i++) {
859cb93a386Sopenharmony_ci                writer.appendFloat(dashInfo.fIntervals[i]);
860cb93a386Sopenharmony_ci            }
861cb93a386Sopenharmony_ci            writer.endArray();  // intervals
862cb93a386Sopenharmony_ci            sk_free(dashInfo.fIntervals);
863cb93a386Sopenharmony_ci            writer.appendFloat(DEBUGCANVAS_ATTRIBUTE_PHASE, dashInfo.fPhase);
864cb93a386Sopenharmony_ci            writer.endObject();  // dashing
865cb93a386Sopenharmony_ci        } else {
866cb93a386Sopenharmony_ci            writer.beginObject(DEBUGCANVAS_ATTRIBUTE_PATHEFFECT);
867cb93a386Sopenharmony_ci            DrawCommand::flatten(pathEffect, writer, urlDataManager);
868cb93a386Sopenharmony_ci            writer.endObject();  // pathEffect
869cb93a386Sopenharmony_ci        }
870cb93a386Sopenharmony_ci    }
871cb93a386Sopenharmony_ci}
872cb93a386Sopenharmony_ci
873cb93a386Sopenharmony_cistatic void apply_font_typeface(const SkFont&   font,
874cb93a386Sopenharmony_ci                                SkJSONWriter&   writer,
875cb93a386Sopenharmony_ci                                UrlDataManager& urlDataManager) {
876cb93a386Sopenharmony_ci    SkTypeface* typeface = font.getTypefaceOrDefault();
877cb93a386Sopenharmony_ci    if (typeface != nullptr) {
878cb93a386Sopenharmony_ci        writer.beginObject(DEBUGCANVAS_ATTRIBUTE_TYPEFACE);
879cb93a386Sopenharmony_ci        SkDynamicMemoryWStream buffer;
880cb93a386Sopenharmony_ci        typeface->serialize(&buffer);
881cb93a386Sopenharmony_ci        void* data = sk_malloc_throw(buffer.bytesWritten());
882cb93a386Sopenharmony_ci        buffer.copyTo(data);
883cb93a386Sopenharmony_ci        SkString url = encode_data(
884cb93a386Sopenharmony_ci                data, buffer.bytesWritten(), "application/octet-stream", urlDataManager);
885cb93a386Sopenharmony_ci        writer.appendString(DEBUGCANVAS_ATTRIBUTE_DATA, url.c_str());
886cb93a386Sopenharmony_ci        sk_free(data);
887cb93a386Sopenharmony_ci        writer.endObject();
888cb93a386Sopenharmony_ci    }
889cb93a386Sopenharmony_ci}
890cb93a386Sopenharmony_ci
891cb93a386Sopenharmony_cistatic void apply_flattenable(const char*     key,
892cb93a386Sopenharmony_ci                              SkFlattenable*  flattenable,
893cb93a386Sopenharmony_ci                              SkJSONWriter&   writer,
894cb93a386Sopenharmony_ci                              UrlDataManager& urlDataManager) {
895cb93a386Sopenharmony_ci    if (flattenable != nullptr) {
896cb93a386Sopenharmony_ci        writer.beginObject(key);
897cb93a386Sopenharmony_ci        DrawCommand::flatten(flattenable, writer, urlDataManager);
898cb93a386Sopenharmony_ci        writer.endObject();
899cb93a386Sopenharmony_ci    }
900cb93a386Sopenharmony_ci}
901cb93a386Sopenharmony_ci
902cb93a386Sopenharmony_civoid DrawCommand::MakeJsonPaint(SkJSONWriter&   writer,
903cb93a386Sopenharmony_ci                                const SkPaint&  paint,
904cb93a386Sopenharmony_ci                                UrlDataManager& urlDataManager) {
905cb93a386Sopenharmony_ci    writer.beginObject();
906cb93a386Sopenharmony_ci    store_scalar(writer, DEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
907cb93a386Sopenharmony_ci    store_scalar(writer,
908cb93a386Sopenharmony_ci                 DEBUGCANVAS_ATTRIBUTE_STROKEMITER,
909cb93a386Sopenharmony_ci                 paint.getStrokeMiter(),
910cb93a386Sopenharmony_ci                 SkPaintDefaults_MiterLimit);
911cb93a386Sopenharmony_ci    store_bool(writer, DEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
912cb93a386Sopenharmony_ci    store_bool(writer, DEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
913cb93a386Sopenharmony_ci
914cb93a386Sopenharmony_ci    apply_paint_color(paint, writer);
915cb93a386Sopenharmony_ci    apply_paint_style(paint, writer);
916cb93a386Sopenharmony_ci    apply_paint_blend_mode(paint, writer);
917cb93a386Sopenharmony_ci    apply_paint_cap(paint, writer);
918cb93a386Sopenharmony_ci    apply_paint_join(paint, writer);
919cb93a386Sopenharmony_ci    apply_paint_patheffect(paint, writer, urlDataManager);
920cb93a386Sopenharmony_ci    apply_paint_maskfilter(paint, writer, urlDataManager);
921cb93a386Sopenharmony_ci    apply_flattenable(DEBUGCANVAS_ATTRIBUTE_SHADER, paint.getShader(), writer, urlDataManager);
922cb93a386Sopenharmony_ci    apply_flattenable(
923cb93a386Sopenharmony_ci            DEBUGCANVAS_ATTRIBUTE_IMAGEFILTER, paint.getImageFilter(), writer, urlDataManager);
924cb93a386Sopenharmony_ci    apply_flattenable(
925cb93a386Sopenharmony_ci            DEBUGCANVAS_ATTRIBUTE_COLORFILTER, paint.getColorFilter(), writer, urlDataManager);
926cb93a386Sopenharmony_ci    writer.endObject();  // paint
927cb93a386Sopenharmony_ci}
928cb93a386Sopenharmony_ci
929cb93a386Sopenharmony_cistatic void MakeJsonFont(const SkFont& font, SkJSONWriter& writer, UrlDataManager& urlDataManager) {
930cb93a386Sopenharmony_ci    writer.beginObject();
931cb93a386Sopenharmony_ci    store_bool(writer, DEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT, font.isEmbolden(), false);
932cb93a386Sopenharmony_ci    store_bool(writer, DEBUGCANVAS_ATTRIBUTE_LINEARTEXT, font.isLinearMetrics(), false);
933cb93a386Sopenharmony_ci    store_bool(writer, DEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT, font.isSubpixel(), false);
934cb93a386Sopenharmony_ci    store_bool(writer, DEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT, font.isEmbeddedBitmaps(), false);
935cb93a386Sopenharmony_ci    store_bool(writer, DEBUGCANVAS_ATTRIBUTE_AUTOHINTING, font.isForceAutoHinting(), false);
936cb93a386Sopenharmony_ci
937cb93a386Sopenharmony_ci    store_scalar(writer, DEBUGCANVAS_ATTRIBUTE_TEXTSIZE, font.getSize(), SkPaintDefaults_TextSize);
938cb93a386Sopenharmony_ci    store_scalar(writer, DEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, font.getScaleX(), SK_Scalar1);
939cb93a386Sopenharmony_ci    store_scalar(writer, DEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, font.getSkewX(), 0.0f);
940cb93a386Sopenharmony_ci    apply_font_edging(font, writer);
941cb93a386Sopenharmony_ci    apply_font_hinting(font, writer);
942cb93a386Sopenharmony_ci    apply_font_typeface(font, writer, urlDataManager);
943cb93a386Sopenharmony_ci    writer.endObject();  // font
944cb93a386Sopenharmony_ci}
945cb93a386Sopenharmony_ci
946cb93a386Sopenharmony_civoid DrawCommand::MakeJsonLattice(SkJSONWriter& writer, const SkCanvas::Lattice& lattice) {
947cb93a386Sopenharmony_ci    writer.beginObject();
948cb93a386Sopenharmony_ci    writer.appendS32(DEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT, lattice.fXCount);
949cb93a386Sopenharmony_ci    writer.appendS32(DEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT, lattice.fYCount);
950cb93a386Sopenharmony_ci    if (nullptr != lattice.fBounds) {
951cb93a386Sopenharmony_ci        writer.appendName(DEBUGCANVAS_ATTRIBUTE_BOUNDS);
952cb93a386Sopenharmony_ci        MakeJsonIRect(writer, *lattice.fBounds);
953cb93a386Sopenharmony_ci    }
954cb93a386Sopenharmony_ci    writer.beginArray(DEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS);
955cb93a386Sopenharmony_ci    for (int i = 0; i < lattice.fXCount; i++) {
956cb93a386Sopenharmony_ci        writer.appendS32(lattice.fXDivs[i]);
957cb93a386Sopenharmony_ci    }
958cb93a386Sopenharmony_ci    writer.endArray();  // xdivs
959cb93a386Sopenharmony_ci    writer.beginArray(DEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS);
960cb93a386Sopenharmony_ci    for (int i = 0; i < lattice.fYCount; i++) {
961cb93a386Sopenharmony_ci        writer.appendS32(lattice.fYDivs[i]);
962cb93a386Sopenharmony_ci    }
963cb93a386Sopenharmony_ci    writer.endArray();  // ydivs
964cb93a386Sopenharmony_ci    if (nullptr != lattice.fRectTypes) {
965cb93a386Sopenharmony_ci        writer.beginArray(DEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS);
966cb93a386Sopenharmony_ci        int flagCount = 0;
967cb93a386Sopenharmony_ci        for (int row = 0; row < lattice.fYCount + 1; row++) {
968cb93a386Sopenharmony_ci            writer.beginArray();
969cb93a386Sopenharmony_ci            for (int column = 0; column < lattice.fXCount + 1; column++) {
970cb93a386Sopenharmony_ci                writer.appendS32(lattice.fRectTypes[flagCount++]);
971cb93a386Sopenharmony_ci            }
972cb93a386Sopenharmony_ci            writer.endArray();  // row
973cb93a386Sopenharmony_ci        }
974cb93a386Sopenharmony_ci        writer.endArray();
975cb93a386Sopenharmony_ci    }
976cb93a386Sopenharmony_ci    writer.endObject();
977cb93a386Sopenharmony_ci}
978cb93a386Sopenharmony_ci
979cb93a386Sopenharmony_ciClearCommand::ClearCommand(SkColor color) : INHERITED(kClear_OpType) { fColor = color; }
980cb93a386Sopenharmony_ci
981cb93a386Sopenharmony_civoid ClearCommand::execute(SkCanvas* canvas) const { canvas->clear(fColor); }
982cb93a386Sopenharmony_ci
983cb93a386Sopenharmony_civoid ClearCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
984cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
985cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_COLOR);
986cb93a386Sopenharmony_ci    MakeJsonColor(writer, fColor);
987cb93a386Sopenharmony_ci}
988cb93a386Sopenharmony_ci
989cb93a386Sopenharmony_ciClipPathCommand::ClipPathCommand(const SkPath& path, SkClipOp op, bool doAA)
990cb93a386Sopenharmony_ci        : INHERITED(kClipPath_OpType) {
991cb93a386Sopenharmony_ci    fPath = path;
992cb93a386Sopenharmony_ci    fOp   = op;
993cb93a386Sopenharmony_ci    fDoAA = doAA;
994cb93a386Sopenharmony_ci}
995cb93a386Sopenharmony_ci
996cb93a386Sopenharmony_civoid ClipPathCommand::execute(SkCanvas* canvas) const { canvas->clipPath(fPath, fOp, fDoAA); }
997cb93a386Sopenharmony_ci
998cb93a386Sopenharmony_cibool ClipPathCommand::render(SkCanvas* canvas) const {
999cb93a386Sopenharmony_ci    render_path(canvas, fPath);
1000cb93a386Sopenharmony_ci    return true;
1001cb93a386Sopenharmony_ci}
1002cb93a386Sopenharmony_ci
1003cb93a386Sopenharmony_civoid ClipPathCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1004cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1005cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PATH);
1006cb93a386Sopenharmony_ci    MakeJsonPath(writer, fPath);
1007cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_REGIONOP, clipop_name(fOp));
1008cb93a386Sopenharmony_ci    writer.appendBool(DEBUGCANVAS_ATTRIBUTE_ANTIALIAS, fDoAA);
1009cb93a386Sopenharmony_ci}
1010cb93a386Sopenharmony_ci
1011cb93a386Sopenharmony_ciClipRegionCommand::ClipRegionCommand(const SkRegion& region, SkClipOp op)
1012cb93a386Sopenharmony_ci        : INHERITED(kClipRegion_OpType) {
1013cb93a386Sopenharmony_ci    fRegion = region;
1014cb93a386Sopenharmony_ci    fOp     = op;
1015cb93a386Sopenharmony_ci}
1016cb93a386Sopenharmony_ci
1017cb93a386Sopenharmony_civoid ClipRegionCommand::execute(SkCanvas* canvas) const { canvas->clipRegion(fRegion, fOp); }
1018cb93a386Sopenharmony_ci
1019cb93a386Sopenharmony_civoid ClipRegionCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1020cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1021cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_REGION);
1022cb93a386Sopenharmony_ci    MakeJsonRegion(writer, fRegion);
1023cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_REGIONOP, clipop_name(fOp));
1024cb93a386Sopenharmony_ci}
1025cb93a386Sopenharmony_ci
1026cb93a386Sopenharmony_ciClipRectCommand::ClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA)
1027cb93a386Sopenharmony_ci        : INHERITED(kClipRect_OpType) {
1028cb93a386Sopenharmony_ci    fRect = rect;
1029cb93a386Sopenharmony_ci    fOp   = op;
1030cb93a386Sopenharmony_ci    fDoAA = doAA;
1031cb93a386Sopenharmony_ci}
1032cb93a386Sopenharmony_ci
1033cb93a386Sopenharmony_civoid ClipRectCommand::execute(SkCanvas* canvas) const { canvas->clipRect(fRect, fOp, fDoAA); }
1034cb93a386Sopenharmony_ci
1035cb93a386Sopenharmony_civoid ClipRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1036cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1037cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_COORDS);
1038cb93a386Sopenharmony_ci    MakeJsonRect(writer, fRect);
1039cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_REGIONOP, clipop_name(fOp));
1040cb93a386Sopenharmony_ci    writer.appendBool(DEBUGCANVAS_ATTRIBUTE_ANTIALIAS, fDoAA);
1041cb93a386Sopenharmony_ci
1042cb93a386Sopenharmony_ci    SkString desc;
1043cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, fRect)->c_str());
1044cb93a386Sopenharmony_ci}
1045cb93a386Sopenharmony_ci
1046cb93a386Sopenharmony_ciClipRRectCommand::ClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA)
1047cb93a386Sopenharmony_ci        : INHERITED(kClipRRect_OpType) {
1048cb93a386Sopenharmony_ci    fRRect = rrect;
1049cb93a386Sopenharmony_ci    fOp    = op;
1050cb93a386Sopenharmony_ci    fDoAA  = doAA;
1051cb93a386Sopenharmony_ci}
1052cb93a386Sopenharmony_ci
1053cb93a386Sopenharmony_civoid ClipRRectCommand::execute(SkCanvas* canvas) const { canvas->clipRRect(fRRect, fOp, fDoAA); }
1054cb93a386Sopenharmony_ci
1055cb93a386Sopenharmony_cibool ClipRRectCommand::render(SkCanvas* canvas) const {
1056cb93a386Sopenharmony_ci    render_rrect(canvas, fRRect);
1057cb93a386Sopenharmony_ci    return true;
1058cb93a386Sopenharmony_ci}
1059cb93a386Sopenharmony_ci
1060cb93a386Sopenharmony_civoid ClipRRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1061cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1062cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_COORDS);
1063cb93a386Sopenharmony_ci    make_json_rrect(writer, fRRect);
1064cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_REGIONOP, clipop_name(fOp));
1065cb93a386Sopenharmony_ci    writer.appendBool(DEBUGCANVAS_ATTRIBUTE_ANTIALIAS, fDoAA);
1066cb93a386Sopenharmony_ci}
1067cb93a386Sopenharmony_ci
1068cb93a386Sopenharmony_ciClipShaderCommand::ClipShaderCommand(sk_sp<SkShader> cs, SkClipOp op)
1069cb93a386Sopenharmony_ci        : INHERITED(kClipShader_OpType) {
1070cb93a386Sopenharmony_ci    fShader = cs;
1071cb93a386Sopenharmony_ci    fOp     = op;
1072cb93a386Sopenharmony_ci}
1073cb93a386Sopenharmony_ci
1074cb93a386Sopenharmony_civoid ClipShaderCommand::execute(SkCanvas* canvas) const { canvas->clipShader(fShader, fOp); }
1075cb93a386Sopenharmony_ci
1076cb93a386Sopenharmony_cibool ClipShaderCommand::render(SkCanvas* canvas) const {
1077cb93a386Sopenharmony_ci    SkPaint paint;
1078cb93a386Sopenharmony_ci    paint.setShader(fShader);
1079cb93a386Sopenharmony_ci    canvas->drawPaint(paint);
1080cb93a386Sopenharmony_ci    return true;
1081cb93a386Sopenharmony_ci}
1082cb93a386Sopenharmony_ci
1083cb93a386Sopenharmony_civoid ClipShaderCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1084cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1085cb93a386Sopenharmony_ci    apply_flattenable(DEBUGCANVAS_ATTRIBUTE_SHADER, fShader.get(), writer, urlDataManager);
1086cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_REGIONOP, clipop_name(fOp));
1087cb93a386Sopenharmony_ci}
1088cb93a386Sopenharmony_ci
1089cb93a386Sopenharmony_ciResetClipCommand::ResetClipCommand() : INHERITED(kResetClip_OpType) {}
1090cb93a386Sopenharmony_ci
1091cb93a386Sopenharmony_civoid ResetClipCommand::execute(SkCanvas* canvas) const { SkCanvasPriv::ResetClip(canvas); }
1092cb93a386Sopenharmony_ci
1093cb93a386Sopenharmony_ciConcatCommand::ConcatCommand(const SkMatrix& matrix) : INHERITED(kConcat_OpType) {
1094cb93a386Sopenharmony_ci    fMatrix = matrix;
1095cb93a386Sopenharmony_ci}
1096cb93a386Sopenharmony_ci
1097cb93a386Sopenharmony_civoid ConcatCommand::execute(SkCanvas* canvas) const { canvas->concat(fMatrix); }
1098cb93a386Sopenharmony_ci
1099cb93a386Sopenharmony_cinamespace {
1100cb93a386Sopenharmony_ci    void writeMatrixType(SkJSONWriter& writer, const SkMatrix& m) {
1101cb93a386Sopenharmony_ci        switch (m.getType()) {
1102cb93a386Sopenharmony_ci            case SkMatrix::kTranslate_Mask:
1103cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_SHORTDESC, " (translate)");
1104cb93a386Sopenharmony_ci                break;
1105cb93a386Sopenharmony_ci            case SkMatrix::kScale_Mask:
1106cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_SHORTDESC, " (scale)");
1107cb93a386Sopenharmony_ci                break;
1108cb93a386Sopenharmony_ci            case SkMatrix::kAffine_Mask:
1109cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_SHORTDESC, " (rotation or skew)");
1110cb93a386Sopenharmony_ci                break;
1111cb93a386Sopenharmony_ci            case SkMatrix::kPerspective_Mask:
1112cb93a386Sopenharmony_ci                writer.appendString(DEBUGCANVAS_ATTRIBUTE_SHORTDESC, " (perspective)");
1113cb93a386Sopenharmony_ci                break;
1114cb93a386Sopenharmony_ci            default:
1115cb93a386Sopenharmony_ci                break;
1116cb93a386Sopenharmony_ci        }
1117cb93a386Sopenharmony_ci    }
1118cb93a386Sopenharmony_ci}
1119cb93a386Sopenharmony_ci
1120cb93a386Sopenharmony_civoid ConcatCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1121cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1122cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_MATRIX);
1123cb93a386Sopenharmony_ci    MakeJsonMatrix(writer, fMatrix);
1124cb93a386Sopenharmony_ci    writeMatrixType(writer, fMatrix);
1125cb93a386Sopenharmony_ci}
1126cb93a386Sopenharmony_ci
1127cb93a386Sopenharmony_ciConcat44Command::Concat44Command(const SkM44& matrix) : INHERITED(kConcat44_OpType) {
1128cb93a386Sopenharmony_ci    fMatrix = matrix;
1129cb93a386Sopenharmony_ci}
1130cb93a386Sopenharmony_ci
1131cb93a386Sopenharmony_civoid Concat44Command::execute(SkCanvas* canvas) const { canvas->concat(fMatrix); }
1132cb93a386Sopenharmony_ci
1133cb93a386Sopenharmony_civoid Concat44Command::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1134cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1135cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_MATRIX);
1136cb93a386Sopenharmony_ci    MakeJsonMatrix44(writer, fMatrix);
1137cb93a386Sopenharmony_ci}
1138cb93a386Sopenharmony_ci
1139cb93a386Sopenharmony_ci////
1140cb93a386Sopenharmony_ci
1141cb93a386Sopenharmony_ciDrawAnnotationCommand::DrawAnnotationCommand(const SkRect& rect,
1142cb93a386Sopenharmony_ci                                             const char    key[],
1143cb93a386Sopenharmony_ci                                             sk_sp<SkData> value)
1144cb93a386Sopenharmony_ci        : INHERITED(kDrawAnnotation_OpType), fRect(rect), fKey(key), fValue(std::move(value)) {}
1145cb93a386Sopenharmony_ci
1146cb93a386Sopenharmony_civoid DrawAnnotationCommand::execute(SkCanvas* canvas) const {
1147cb93a386Sopenharmony_ci    canvas->drawAnnotation(fRect, fKey.c_str(), fValue);
1148cb93a386Sopenharmony_ci}
1149cb93a386Sopenharmony_ci
1150cb93a386Sopenharmony_civoid DrawAnnotationCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1151cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1152cb93a386Sopenharmony_ci
1153cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_COORDS);
1154cb93a386Sopenharmony_ci    MakeJsonRect(writer, fRect);
1155cb93a386Sopenharmony_ci    writer.appendString("key", fKey.c_str());
1156cb93a386Sopenharmony_ci    if (fValue) {
1157cb93a386Sopenharmony_ci        writer.appendString("value", std::string(
1158cb93a386Sopenharmony_ci            static_cast<const char*>(fValue->data()), fValue->size()
1159cb93a386Sopenharmony_ci            ).c_str());
1160cb93a386Sopenharmony_ci    }
1161cb93a386Sopenharmony_ci
1162cb93a386Sopenharmony_ci    SkString desc;
1163cb93a386Sopenharmony_ci    str_append(&desc, fRect)->appendf(" %s", fKey.c_str());
1164cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_SHORTDESC, desc.c_str());
1165cb93a386Sopenharmony_ci}
1166cb93a386Sopenharmony_ci
1167cb93a386Sopenharmony_ci////
1168cb93a386Sopenharmony_ci
1169cb93a386Sopenharmony_ciDrawImageCommand::DrawImageCommand(const SkImage*           image,
1170cb93a386Sopenharmony_ci                                   SkScalar                 left,
1171cb93a386Sopenharmony_ci                                   SkScalar                 top,
1172cb93a386Sopenharmony_ci                                   const SkSamplingOptions& sampling,
1173cb93a386Sopenharmony_ci                                   const SkPaint*           paint)
1174cb93a386Sopenharmony_ci        : INHERITED(kDrawImage_OpType)
1175cb93a386Sopenharmony_ci        , fImage(SkRef(image))
1176cb93a386Sopenharmony_ci        , fLeft(left)
1177cb93a386Sopenharmony_ci        , fTop(top)
1178cb93a386Sopenharmony_ci        , fSampling(sampling)
1179cb93a386Sopenharmony_ci        , fPaint(paint) {}
1180cb93a386Sopenharmony_ci
1181cb93a386Sopenharmony_civoid DrawImageCommand::execute(SkCanvas* canvas) const {
1182cb93a386Sopenharmony_ci    canvas->drawImage(fImage.get(), fLeft, fTop, fSampling, fPaint.getMaybeNull());
1183cb93a386Sopenharmony_ci}
1184cb93a386Sopenharmony_ci
1185cb93a386Sopenharmony_cibool DrawImageCommand::render(SkCanvas* canvas) const {
1186cb93a386Sopenharmony_ci    SkAutoCanvasRestore acr(canvas, true);
1187cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
1188cb93a386Sopenharmony_ci
1189cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(
1190cb93a386Sopenharmony_ci            canvas,
1191cb93a386Sopenharmony_ci            SkRect::MakeXYWH(
1192cb93a386Sopenharmony_ci                    fLeft, fTop, SkIntToScalar(fImage->width()), SkIntToScalar(fImage->height())));
1193cb93a386Sopenharmony_ci    this->execute(canvas);
1194cb93a386Sopenharmony_ci    return true;
1195cb93a386Sopenharmony_ci}
1196cb93a386Sopenharmony_ci
1197cb93a386Sopenharmony_ciuint64_t DrawImageCommand::imageId(UrlDataManager& udm) const {
1198cb93a386Sopenharmony_ci    return udm.lookupImage(fImage.get());
1199cb93a386Sopenharmony_ci}
1200cb93a386Sopenharmony_ci
1201cb93a386Sopenharmony_civoid DrawImageCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1202cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1203cb93a386Sopenharmony_ci    flatten(*fImage, writer, urlDataManager);
1204cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_COORDS);
1205cb93a386Sopenharmony_ci    MakeJsonPoint(writer, fLeft, fTop);
1206cb93a386Sopenharmony_ci    if (fPaint.isValid()) {
1207cb93a386Sopenharmony_ci        writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1208cb93a386Sopenharmony_ci        MakeJsonPaint(writer, *fPaint, urlDataManager);
1209cb93a386Sopenharmony_ci    }
1210cb93a386Sopenharmony_ci
1211cb93a386Sopenharmony_ci    writer.appendU32(DEBUGCANVAS_ATTRIBUTE_UNIQUE_ID, fImage->uniqueID());
1212cb93a386Sopenharmony_ci    writer.appendS32(DEBUGCANVAS_ATTRIBUTE_WIDTH, fImage->width());
1213cb93a386Sopenharmony_ci    writer.appendS32(DEBUGCANVAS_ATTRIBUTE_HEIGHT, fImage->height());
1214cb93a386Sopenharmony_ci    switch (fImage->alphaType()) {
1215cb93a386Sopenharmony_ci        case kOpaque_SkAlphaType:
1216cb93a386Sopenharmony_ci            writer.appendString(DEBUGCANVAS_ATTRIBUTE_ALPHA, DEBUGCANVAS_ALPHATYPE_OPAQUE);
1217cb93a386Sopenharmony_ci            break;
1218cb93a386Sopenharmony_ci        case kPremul_SkAlphaType:
1219cb93a386Sopenharmony_ci            writer.appendString(DEBUGCANVAS_ATTRIBUTE_ALPHA, DEBUGCANVAS_ALPHATYPE_PREMUL);
1220cb93a386Sopenharmony_ci            break;
1221cb93a386Sopenharmony_ci        case kUnpremul_SkAlphaType:
1222cb93a386Sopenharmony_ci            writer.appendString(DEBUGCANVAS_ATTRIBUTE_ALPHA, DEBUGCANVAS_ALPHATYPE_UNPREMUL);
1223cb93a386Sopenharmony_ci            break;
1224cb93a386Sopenharmony_ci        default:
1225cb93a386Sopenharmony_ci            writer.appendString(DEBUGCANVAS_ATTRIBUTE_ALPHA, DEBUGCANVAS_ALPHATYPE_UNKNOWN);
1226cb93a386Sopenharmony_ci            break;
1227cb93a386Sopenharmony_ci    }
1228cb93a386Sopenharmony_ci}
1229cb93a386Sopenharmony_ci
1230cb93a386Sopenharmony_ciDrawImageLatticeCommand::DrawImageLatticeCommand(const SkImage*           image,
1231cb93a386Sopenharmony_ci                                                 const SkCanvas::Lattice& lattice,
1232cb93a386Sopenharmony_ci                                                 const SkRect&            dst,
1233cb93a386Sopenharmony_ci                                                 SkFilterMode             filter,
1234cb93a386Sopenharmony_ci                                                 const SkPaint*           paint)
1235cb93a386Sopenharmony_ci        : INHERITED(kDrawImageLattice_OpType)
1236cb93a386Sopenharmony_ci        , fImage(SkRef(image))
1237cb93a386Sopenharmony_ci        , fLattice(lattice)
1238cb93a386Sopenharmony_ci        , fDst(dst)
1239cb93a386Sopenharmony_ci        , fFilter(filter)
1240cb93a386Sopenharmony_ci        , fPaint(paint) {}
1241cb93a386Sopenharmony_ci
1242cb93a386Sopenharmony_civoid DrawImageLatticeCommand::execute(SkCanvas* canvas) const {
1243cb93a386Sopenharmony_ci    canvas->drawImageLattice(fImage.get(), fLattice, fDst, fFilter, fPaint.getMaybeNull());
1244cb93a386Sopenharmony_ci}
1245cb93a386Sopenharmony_ci
1246cb93a386Sopenharmony_cibool DrawImageLatticeCommand::render(SkCanvas* canvas) const {
1247cb93a386Sopenharmony_ci    SkAutoCanvasRestore acr(canvas, true);
1248cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
1249cb93a386Sopenharmony_ci
1250cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, fDst);
1251cb93a386Sopenharmony_ci
1252cb93a386Sopenharmony_ci    this->execute(canvas);
1253cb93a386Sopenharmony_ci    return true;
1254cb93a386Sopenharmony_ci}
1255cb93a386Sopenharmony_ci
1256cb93a386Sopenharmony_ciuint64_t DrawImageLatticeCommand::imageId(UrlDataManager& udm) const {
1257cb93a386Sopenharmony_ci    return udm.lookupImage(fImage.get());
1258cb93a386Sopenharmony_ci}
1259cb93a386Sopenharmony_ci
1260cb93a386Sopenharmony_civoid DrawImageLatticeCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1261cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1262cb93a386Sopenharmony_ci    flatten(*fImage, writer, urlDataManager);
1263cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_LATTICE);
1264cb93a386Sopenharmony_ci    MakeJsonLattice(writer, fLattice);
1265cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_DST);
1266cb93a386Sopenharmony_ci    MakeJsonRect(writer, fDst);
1267cb93a386Sopenharmony_ci    if (fPaint.isValid()) {
1268cb93a386Sopenharmony_ci        writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1269cb93a386Sopenharmony_ci        MakeJsonPaint(writer, *fPaint, urlDataManager);
1270cb93a386Sopenharmony_ci    }
1271cb93a386Sopenharmony_ci
1272cb93a386Sopenharmony_ci    SkString desc;
1273cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, fDst)->c_str());
1274cb93a386Sopenharmony_ci}
1275cb93a386Sopenharmony_ci
1276cb93a386Sopenharmony_ciDrawImageRectCommand::DrawImageRectCommand(const SkImage*              image,
1277cb93a386Sopenharmony_ci                                           const SkRect&               src,
1278cb93a386Sopenharmony_ci                                           const SkRect&               dst,
1279cb93a386Sopenharmony_ci                                           const SkSamplingOptions&    sampling,
1280cb93a386Sopenharmony_ci                                           const SkPaint*              paint,
1281cb93a386Sopenharmony_ci                                           SkCanvas::SrcRectConstraint constraint)
1282cb93a386Sopenharmony_ci        : INHERITED(kDrawImageRect_OpType)
1283cb93a386Sopenharmony_ci        , fImage(SkRef(image))
1284cb93a386Sopenharmony_ci        , fSrc(src)
1285cb93a386Sopenharmony_ci        , fDst(dst)
1286cb93a386Sopenharmony_ci        , fSampling(sampling)
1287cb93a386Sopenharmony_ci        , fPaint(paint)
1288cb93a386Sopenharmony_ci        , fConstraint(constraint) {}
1289cb93a386Sopenharmony_ci
1290cb93a386Sopenharmony_civoid DrawImageRectCommand::execute(SkCanvas* canvas) const {
1291cb93a386Sopenharmony_ci    canvas->drawImageRect(fImage.get(), fSrc, fDst, fSampling, fPaint.getMaybeNull(), fConstraint);
1292cb93a386Sopenharmony_ci}
1293cb93a386Sopenharmony_ci
1294cb93a386Sopenharmony_cibool DrawImageRectCommand::render(SkCanvas* canvas) const {
1295cb93a386Sopenharmony_ci    SkAutoCanvasRestore acr(canvas, true);
1296cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
1297cb93a386Sopenharmony_ci
1298cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, fDst);
1299cb93a386Sopenharmony_ci
1300cb93a386Sopenharmony_ci    this->execute(canvas);
1301cb93a386Sopenharmony_ci    return true;
1302cb93a386Sopenharmony_ci}
1303cb93a386Sopenharmony_ci
1304cb93a386Sopenharmony_ciuint64_t DrawImageRectCommand::imageId(UrlDataManager& udm) const {
1305cb93a386Sopenharmony_ci    return udm.lookupImage(fImage.get());
1306cb93a386Sopenharmony_ci}
1307cb93a386Sopenharmony_ci
1308cb93a386Sopenharmony_civoid DrawImageRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1309cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1310cb93a386Sopenharmony_ci    flatten(*fImage, writer, urlDataManager);
1311cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_SRC);
1312cb93a386Sopenharmony_ci    MakeJsonRect(writer, fSrc);
1313cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_DST);
1314cb93a386Sopenharmony_ci    MakeJsonRect(writer, fDst);
1315cb93a386Sopenharmony_ci    if (fPaint.isValid()) {
1316cb93a386Sopenharmony_ci        writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1317cb93a386Sopenharmony_ci        MakeJsonPaint(writer, *fPaint, urlDataManager);
1318cb93a386Sopenharmony_ci    }
1319cb93a386Sopenharmony_ci    if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1320cb93a386Sopenharmony_ci        writer.appendBool(DEBUGCANVAS_ATTRIBUTE_STRICT, true);
1321cb93a386Sopenharmony_ci    }
1322cb93a386Sopenharmony_ci
1323cb93a386Sopenharmony_ci    SkString desc;
1324cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, fDst)->c_str());
1325cb93a386Sopenharmony_ci}
1326cb93a386Sopenharmony_ci
1327cb93a386Sopenharmony_ciDrawImageRectLayerCommand::DrawImageRectLayerCommand(DebugLayerManager*    layerManager,
1328cb93a386Sopenharmony_ci                                                     const int                   nodeId,
1329cb93a386Sopenharmony_ci                                                     const int                   frame,
1330cb93a386Sopenharmony_ci                                                     const SkRect&               src,
1331cb93a386Sopenharmony_ci                                                     const SkRect&               dst,
1332cb93a386Sopenharmony_ci                                                     const SkSamplingOptions&    sampling,
1333cb93a386Sopenharmony_ci                                                     const SkPaint*              paint,
1334cb93a386Sopenharmony_ci                                                     SkCanvas::SrcRectConstraint constraint)
1335cb93a386Sopenharmony_ci        : INHERITED(kDrawImageRectLayer_OpType)
1336cb93a386Sopenharmony_ci        , fLayerManager(layerManager)
1337cb93a386Sopenharmony_ci        , fNodeId(nodeId)
1338cb93a386Sopenharmony_ci        , fFrame(frame)
1339cb93a386Sopenharmony_ci        , fSrc(src)
1340cb93a386Sopenharmony_ci        , fDst(dst)
1341cb93a386Sopenharmony_ci        , fSampling(sampling)
1342cb93a386Sopenharmony_ci        , fPaint(paint)
1343cb93a386Sopenharmony_ci        , fConstraint(constraint) {}
1344cb93a386Sopenharmony_ci
1345cb93a386Sopenharmony_civoid DrawImageRectLayerCommand::execute(SkCanvas* canvas) const {
1346cb93a386Sopenharmony_ci    sk_sp<SkImage> snapshot = fLayerManager->getLayerAsImage(fNodeId, fFrame);
1347cb93a386Sopenharmony_ci    canvas->drawImageRect(snapshot.get(), fSrc, fDst, SkSamplingOptions(), fPaint.getMaybeNull(), fConstraint);
1348cb93a386Sopenharmony_ci}
1349cb93a386Sopenharmony_ci
1350cb93a386Sopenharmony_cibool DrawImageRectLayerCommand::render(SkCanvas* canvas) const {
1351cb93a386Sopenharmony_ci    SkAutoCanvasRestore acr(canvas, true);
1352cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
1353cb93a386Sopenharmony_ci
1354cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, fDst);
1355cb93a386Sopenharmony_ci
1356cb93a386Sopenharmony_ci    this->execute(canvas);
1357cb93a386Sopenharmony_ci    return true;
1358cb93a386Sopenharmony_ci}
1359cb93a386Sopenharmony_ci
1360cb93a386Sopenharmony_civoid DrawImageRectLayerCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1361cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1362cb93a386Sopenharmony_ci
1363cb93a386Sopenharmony_ci    // Don't append an image attribute here, the image can be rendered in as many different ways
1364cb93a386Sopenharmony_ci    // as there are commands in the layer, at least. the urlDataManager would save each one under
1365cb93a386Sopenharmony_ci    // a different URL.
1366cb93a386Sopenharmony_ci    // Append the node id, and the layer inspector of the debugger will know what to do with it.
1367cb93a386Sopenharmony_ci    writer.appendS64(DEBUGCANVAS_ATTRIBUTE_LAYERNODEID, fNodeId);
1368cb93a386Sopenharmony_ci
1369cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_SRC);
1370cb93a386Sopenharmony_ci    MakeJsonRect(writer, fSrc);
1371cb93a386Sopenharmony_ci
1372cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_DST);
1373cb93a386Sopenharmony_ci    MakeJsonRect(writer, fDst);
1374cb93a386Sopenharmony_ci    if (fPaint.isValid()) {
1375cb93a386Sopenharmony_ci        writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1376cb93a386Sopenharmony_ci        MakeJsonPaint(writer, *fPaint, urlDataManager);
1377cb93a386Sopenharmony_ci    }
1378cb93a386Sopenharmony_ci    if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) {
1379cb93a386Sopenharmony_ci        writer.appendBool(DEBUGCANVAS_ATTRIBUTE_STRICT, true);
1380cb93a386Sopenharmony_ci    }
1381cb93a386Sopenharmony_ci
1382cb93a386Sopenharmony_ci    SkString desc;
1383cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, fDst)->c_str());
1384cb93a386Sopenharmony_ci}
1385cb93a386Sopenharmony_ci
1386cb93a386Sopenharmony_ciDrawOvalCommand::DrawOvalCommand(const SkRect& oval, const SkPaint& paint)
1387cb93a386Sopenharmony_ci        : INHERITED(kDrawOval_OpType) {
1388cb93a386Sopenharmony_ci    fOval  = oval;
1389cb93a386Sopenharmony_ci    fPaint = paint;
1390cb93a386Sopenharmony_ci}
1391cb93a386Sopenharmony_ci
1392cb93a386Sopenharmony_civoid DrawOvalCommand::execute(SkCanvas* canvas) const { canvas->drawOval(fOval, fPaint); }
1393cb93a386Sopenharmony_ci
1394cb93a386Sopenharmony_cibool DrawOvalCommand::render(SkCanvas* canvas) const {
1395cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
1396cb93a386Sopenharmony_ci    canvas->save();
1397cb93a386Sopenharmony_ci
1398cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, fOval);
1399cb93a386Sopenharmony_ci
1400cb93a386Sopenharmony_ci    SkPaint p;
1401cb93a386Sopenharmony_ci    p.setColor(SK_ColorBLACK);
1402cb93a386Sopenharmony_ci    p.setStyle(SkPaint::kStroke_Style);
1403cb93a386Sopenharmony_ci
1404cb93a386Sopenharmony_ci    canvas->drawOval(fOval, p);
1405cb93a386Sopenharmony_ci    canvas->restore();
1406cb93a386Sopenharmony_ci
1407cb93a386Sopenharmony_ci    return true;
1408cb93a386Sopenharmony_ci}
1409cb93a386Sopenharmony_ci
1410cb93a386Sopenharmony_civoid DrawOvalCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1411cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1412cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_COORDS);
1413cb93a386Sopenharmony_ci    MakeJsonRect(writer, fOval);
1414cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1415cb93a386Sopenharmony_ci    MakeJsonPaint(writer, fPaint, urlDataManager);
1416cb93a386Sopenharmony_ci}
1417cb93a386Sopenharmony_ci
1418cb93a386Sopenharmony_ciDrawArcCommand::DrawArcCommand(const SkRect&  oval,
1419cb93a386Sopenharmony_ci                               SkScalar       startAngle,
1420cb93a386Sopenharmony_ci                               SkScalar       sweepAngle,
1421cb93a386Sopenharmony_ci                               bool           useCenter,
1422cb93a386Sopenharmony_ci                               const SkPaint& paint)
1423cb93a386Sopenharmony_ci        : INHERITED(kDrawArc_OpType) {
1424cb93a386Sopenharmony_ci    fOval       = oval;
1425cb93a386Sopenharmony_ci    fStartAngle = startAngle;
1426cb93a386Sopenharmony_ci    fSweepAngle = sweepAngle;
1427cb93a386Sopenharmony_ci    fUseCenter  = useCenter;
1428cb93a386Sopenharmony_ci    fPaint      = paint;
1429cb93a386Sopenharmony_ci}
1430cb93a386Sopenharmony_ci
1431cb93a386Sopenharmony_civoid DrawArcCommand::execute(SkCanvas* canvas) const {
1432cb93a386Sopenharmony_ci    canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, fPaint);
1433cb93a386Sopenharmony_ci}
1434cb93a386Sopenharmony_ci
1435cb93a386Sopenharmony_cibool DrawArcCommand::render(SkCanvas* canvas) const {
1436cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
1437cb93a386Sopenharmony_ci    canvas->save();
1438cb93a386Sopenharmony_ci
1439cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, fOval);
1440cb93a386Sopenharmony_ci
1441cb93a386Sopenharmony_ci    SkPaint p;
1442cb93a386Sopenharmony_ci    p.setColor(SK_ColorBLACK);
1443cb93a386Sopenharmony_ci    p.setStyle(SkPaint::kStroke_Style);
1444cb93a386Sopenharmony_ci
1445cb93a386Sopenharmony_ci    canvas->drawArc(fOval, fStartAngle, fSweepAngle, fUseCenter, p);
1446cb93a386Sopenharmony_ci    canvas->restore();
1447cb93a386Sopenharmony_ci
1448cb93a386Sopenharmony_ci    return true;
1449cb93a386Sopenharmony_ci}
1450cb93a386Sopenharmony_ci
1451cb93a386Sopenharmony_civoid DrawArcCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1452cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1453cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_COORDS);
1454cb93a386Sopenharmony_ci    MakeJsonRect(writer, fOval);
1455cb93a386Sopenharmony_ci    writer.appendFloat(DEBUGCANVAS_ATTRIBUTE_STARTANGLE, fStartAngle);
1456cb93a386Sopenharmony_ci    writer.appendFloat(DEBUGCANVAS_ATTRIBUTE_SWEEPANGLE, fSweepAngle);
1457cb93a386Sopenharmony_ci    writer.appendBool(DEBUGCANVAS_ATTRIBUTE_USECENTER, fUseCenter);
1458cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1459cb93a386Sopenharmony_ci    MakeJsonPaint(writer, fPaint, urlDataManager);
1460cb93a386Sopenharmony_ci}
1461cb93a386Sopenharmony_ci
1462cb93a386Sopenharmony_ciDrawPaintCommand::DrawPaintCommand(const SkPaint& paint) : INHERITED(kDrawPaint_OpType) {
1463cb93a386Sopenharmony_ci    fPaint = paint;
1464cb93a386Sopenharmony_ci}
1465cb93a386Sopenharmony_ci
1466cb93a386Sopenharmony_civoid DrawPaintCommand::execute(SkCanvas* canvas) const { canvas->drawPaint(fPaint); }
1467cb93a386Sopenharmony_ci
1468cb93a386Sopenharmony_cibool DrawPaintCommand::render(SkCanvas* canvas) const {
1469cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
1470cb93a386Sopenharmony_ci    canvas->drawPaint(fPaint);
1471cb93a386Sopenharmony_ci    return true;
1472cb93a386Sopenharmony_ci}
1473cb93a386Sopenharmony_ci
1474cb93a386Sopenharmony_civoid DrawPaintCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1475cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1476cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1477cb93a386Sopenharmony_ci    MakeJsonPaint(writer, fPaint, urlDataManager);
1478cb93a386Sopenharmony_ci}
1479cb93a386Sopenharmony_ci
1480cb93a386Sopenharmony_ciDrawBehindCommand::DrawBehindCommand(const SkPaint& paint) : INHERITED(kDrawPaint_OpType) {
1481cb93a386Sopenharmony_ci    fPaint = paint;
1482cb93a386Sopenharmony_ci}
1483cb93a386Sopenharmony_ci
1484cb93a386Sopenharmony_civoid DrawBehindCommand::execute(SkCanvas* canvas) const {
1485cb93a386Sopenharmony_ci    SkCanvasPriv::DrawBehind(canvas, fPaint);
1486cb93a386Sopenharmony_ci}
1487cb93a386Sopenharmony_ci
1488cb93a386Sopenharmony_cibool DrawBehindCommand::render(SkCanvas* canvas) const {
1489cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
1490cb93a386Sopenharmony_ci    SkCanvasPriv::DrawBehind(canvas, fPaint);
1491cb93a386Sopenharmony_ci    return true;
1492cb93a386Sopenharmony_ci}
1493cb93a386Sopenharmony_ci
1494cb93a386Sopenharmony_civoid DrawBehindCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1495cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1496cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1497cb93a386Sopenharmony_ci    MakeJsonPaint(writer, fPaint, urlDataManager);
1498cb93a386Sopenharmony_ci}
1499cb93a386Sopenharmony_ci
1500cb93a386Sopenharmony_ciDrawPathCommand::DrawPathCommand(const SkPath& path, const SkPaint& paint)
1501cb93a386Sopenharmony_ci        : INHERITED(kDrawPath_OpType) {
1502cb93a386Sopenharmony_ci    fPath  = path;
1503cb93a386Sopenharmony_ci    fPaint = paint;
1504cb93a386Sopenharmony_ci}
1505cb93a386Sopenharmony_ci
1506cb93a386Sopenharmony_civoid DrawPathCommand::execute(SkCanvas* canvas) const { canvas->drawPath(fPath, fPaint); }
1507cb93a386Sopenharmony_ci
1508cb93a386Sopenharmony_cibool DrawPathCommand::render(SkCanvas* canvas) const {
1509cb93a386Sopenharmony_ci    render_path(canvas, fPath);
1510cb93a386Sopenharmony_ci    return true;
1511cb93a386Sopenharmony_ci}
1512cb93a386Sopenharmony_ci
1513cb93a386Sopenharmony_civoid DrawPathCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1514cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1515cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PATH);
1516cb93a386Sopenharmony_ci    MakeJsonPath(writer, fPath);
1517cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1518cb93a386Sopenharmony_ci    MakeJsonPaint(writer, fPaint, urlDataManager);
1519cb93a386Sopenharmony_ci}
1520cb93a386Sopenharmony_ci
1521cb93a386Sopenharmony_ciDrawRegionCommand::DrawRegionCommand(const SkRegion& region, const SkPaint& paint)
1522cb93a386Sopenharmony_ci        : INHERITED(kDrawRegion_OpType) {
1523cb93a386Sopenharmony_ci    fRegion = region;
1524cb93a386Sopenharmony_ci    fPaint  = paint;
1525cb93a386Sopenharmony_ci}
1526cb93a386Sopenharmony_ci
1527cb93a386Sopenharmony_civoid DrawRegionCommand::execute(SkCanvas* canvas) const { canvas->drawRegion(fRegion, fPaint); }
1528cb93a386Sopenharmony_ci
1529cb93a386Sopenharmony_cibool DrawRegionCommand::render(SkCanvas* canvas) const {
1530cb93a386Sopenharmony_ci    render_region(canvas, fRegion);
1531cb93a386Sopenharmony_ci    return true;
1532cb93a386Sopenharmony_ci}
1533cb93a386Sopenharmony_ci
1534cb93a386Sopenharmony_civoid DrawRegionCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1535cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1536cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_REGION);
1537cb93a386Sopenharmony_ci    MakeJsonRegion(writer, fRegion);
1538cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1539cb93a386Sopenharmony_ci    MakeJsonPaint(writer, fPaint, urlDataManager);
1540cb93a386Sopenharmony_ci}
1541cb93a386Sopenharmony_ci
1542cb93a386Sopenharmony_ciBeginDrawPictureCommand::BeginDrawPictureCommand(const SkPicture* picture,
1543cb93a386Sopenharmony_ci                                                 const SkMatrix*  matrix,
1544cb93a386Sopenharmony_ci                                                 const SkPaint*   paint)
1545cb93a386Sopenharmony_ci        : INHERITED(kBeginDrawPicture_OpType)
1546cb93a386Sopenharmony_ci        , fPicture(SkRef(picture))
1547cb93a386Sopenharmony_ci        , fMatrix(matrix)
1548cb93a386Sopenharmony_ci        , fPaint(paint) {}
1549cb93a386Sopenharmony_ci
1550cb93a386Sopenharmony_civoid BeginDrawPictureCommand::execute(SkCanvas* canvas) const {
1551cb93a386Sopenharmony_ci    if (fPaint.isValid()) {
1552cb93a386Sopenharmony_ci        SkRect bounds = fPicture->cullRect();
1553cb93a386Sopenharmony_ci        if (fMatrix.isValid()) {
1554cb93a386Sopenharmony_ci            fMatrix->mapRect(&bounds);
1555cb93a386Sopenharmony_ci        }
1556cb93a386Sopenharmony_ci        canvas->saveLayer(&bounds, fPaint.get());
1557cb93a386Sopenharmony_ci    }
1558cb93a386Sopenharmony_ci
1559cb93a386Sopenharmony_ci    if (fMatrix.isValid()) {
1560cb93a386Sopenharmony_ci        if (!fPaint.isValid()) {
1561cb93a386Sopenharmony_ci            canvas->save();
1562cb93a386Sopenharmony_ci        }
1563cb93a386Sopenharmony_ci        canvas->concat(*fMatrix);
1564cb93a386Sopenharmony_ci    }
1565cb93a386Sopenharmony_ci}
1566cb93a386Sopenharmony_ci
1567cb93a386Sopenharmony_cibool BeginDrawPictureCommand::render(SkCanvas* canvas) const {
1568cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
1569cb93a386Sopenharmony_ci    canvas->save();
1570cb93a386Sopenharmony_ci
1571cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, fPicture->cullRect());
1572cb93a386Sopenharmony_ci
1573cb93a386Sopenharmony_ci    canvas->drawPicture(fPicture.get());
1574cb93a386Sopenharmony_ci
1575cb93a386Sopenharmony_ci    canvas->restore();
1576cb93a386Sopenharmony_ci
1577cb93a386Sopenharmony_ci    return true;
1578cb93a386Sopenharmony_ci}
1579cb93a386Sopenharmony_ci
1580cb93a386Sopenharmony_ciEndDrawPictureCommand::EndDrawPictureCommand(bool restore)
1581cb93a386Sopenharmony_ci        : INHERITED(kEndDrawPicture_OpType), fRestore(restore) {}
1582cb93a386Sopenharmony_ci
1583cb93a386Sopenharmony_civoid EndDrawPictureCommand::execute(SkCanvas* canvas) const {
1584cb93a386Sopenharmony_ci    if (fRestore) {
1585cb93a386Sopenharmony_ci        canvas->restore();
1586cb93a386Sopenharmony_ci    }
1587cb93a386Sopenharmony_ci}
1588cb93a386Sopenharmony_ci
1589cb93a386Sopenharmony_ciDrawPointsCommand::DrawPointsCommand(SkCanvas::PointMode mode,
1590cb93a386Sopenharmony_ci                                     size_t              count,
1591cb93a386Sopenharmony_ci                                     const SkPoint       pts[],
1592cb93a386Sopenharmony_ci                                     const SkPaint&      paint)
1593cb93a386Sopenharmony_ci        : INHERITED(kDrawPoints_OpType), fMode(mode), fPts(pts, count), fPaint(paint) {}
1594cb93a386Sopenharmony_ci
1595cb93a386Sopenharmony_civoid DrawPointsCommand::execute(SkCanvas* canvas) const {
1596cb93a386Sopenharmony_ci    canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint);
1597cb93a386Sopenharmony_ci}
1598cb93a386Sopenharmony_ci
1599cb93a386Sopenharmony_cibool DrawPointsCommand::render(SkCanvas* canvas) const {
1600cb93a386Sopenharmony_ci    canvas->clear(0xFFFFFFFF);
1601cb93a386Sopenharmony_ci    canvas->save();
1602cb93a386Sopenharmony_ci
1603cb93a386Sopenharmony_ci    SkRect bounds;
1604cb93a386Sopenharmony_ci
1605cb93a386Sopenharmony_ci    bounds.setEmpty();
1606cb93a386Sopenharmony_ci    for (int i = 0; i < fPts.count(); ++i) {
1607cb93a386Sopenharmony_ci        SkRectPriv::GrowToInclude(&bounds, fPts[i]);
1608cb93a386Sopenharmony_ci    }
1609cb93a386Sopenharmony_ci
1610cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, bounds);
1611cb93a386Sopenharmony_ci
1612cb93a386Sopenharmony_ci    SkPaint p;
1613cb93a386Sopenharmony_ci    p.setColor(SK_ColorBLACK);
1614cb93a386Sopenharmony_ci    p.setStyle(SkPaint::kStroke_Style);
1615cb93a386Sopenharmony_ci
1616cb93a386Sopenharmony_ci    canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p);
1617cb93a386Sopenharmony_ci    canvas->restore();
1618cb93a386Sopenharmony_ci
1619cb93a386Sopenharmony_ci    return true;
1620cb93a386Sopenharmony_ci}
1621cb93a386Sopenharmony_ci
1622cb93a386Sopenharmony_civoid DrawPointsCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1623cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1624cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_MODE, pointmode_name(fMode));
1625cb93a386Sopenharmony_ci    writer.beginArray(DEBUGCANVAS_ATTRIBUTE_POINTS);
1626cb93a386Sopenharmony_ci    for (int i = 0; i < fPts.count(); i++) {
1627cb93a386Sopenharmony_ci        MakeJsonPoint(writer, fPts[i]);
1628cb93a386Sopenharmony_ci    }
1629cb93a386Sopenharmony_ci    writer.endArray();  // points
1630cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1631cb93a386Sopenharmony_ci    MakeJsonPaint(writer, fPaint, urlDataManager);
1632cb93a386Sopenharmony_ci}
1633cb93a386Sopenharmony_ci
1634cb93a386Sopenharmony_ciDrawTextBlobCommand::DrawTextBlobCommand(sk_sp<SkTextBlob> blob,
1635cb93a386Sopenharmony_ci                                         SkScalar          x,
1636cb93a386Sopenharmony_ci                                         SkScalar          y,
1637cb93a386Sopenharmony_ci                                         const SkPaint&    paint)
1638cb93a386Sopenharmony_ci        : INHERITED(kDrawTextBlob_OpType)
1639cb93a386Sopenharmony_ci        , fBlob(std::move(blob))
1640cb93a386Sopenharmony_ci        , fXPos(x)
1641cb93a386Sopenharmony_ci        , fYPos(y)
1642cb93a386Sopenharmony_ci        , fPaint(paint) {}
1643cb93a386Sopenharmony_ci
1644cb93a386Sopenharmony_civoid DrawTextBlobCommand::execute(SkCanvas* canvas) const {
1645cb93a386Sopenharmony_ci    canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1646cb93a386Sopenharmony_ci}
1647cb93a386Sopenharmony_ci
1648cb93a386Sopenharmony_cibool DrawTextBlobCommand::render(SkCanvas* canvas) const {
1649cb93a386Sopenharmony_ci    canvas->clear(SK_ColorWHITE);
1650cb93a386Sopenharmony_ci    canvas->save();
1651cb93a386Sopenharmony_ci
1652cb93a386Sopenharmony_ci    SkRect bounds = fBlob->bounds().makeOffset(fXPos, fYPos);
1653cb93a386Sopenharmony_ci    xlate_and_scale_to_bounds(canvas, bounds);
1654cb93a386Sopenharmony_ci
1655cb93a386Sopenharmony_ci    canvas->drawTextBlob(fBlob, fXPos, fYPos, fPaint);
1656cb93a386Sopenharmony_ci
1657cb93a386Sopenharmony_ci    canvas->restore();
1658cb93a386Sopenharmony_ci
1659cb93a386Sopenharmony_ci    return true;
1660cb93a386Sopenharmony_ci}
1661cb93a386Sopenharmony_ci
1662cb93a386Sopenharmony_civoid DrawTextBlobCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1663cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1664cb93a386Sopenharmony_ci    writer.beginArray(DEBUGCANVAS_ATTRIBUTE_RUNS);
1665cb93a386Sopenharmony_ci    SkTextBlobRunIterator iter(fBlob.get());
1666cb93a386Sopenharmony_ci    while (!iter.done()) {
1667cb93a386Sopenharmony_ci        writer.beginObject();  // run
1668cb93a386Sopenharmony_ci        writer.beginArray(DEBUGCANVAS_ATTRIBUTE_GLYPHS);
1669cb93a386Sopenharmony_ci        for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1670cb93a386Sopenharmony_ci            writer.appendU32(iter.glyphs()[i]);
1671cb93a386Sopenharmony_ci        }
1672cb93a386Sopenharmony_ci        writer.endArray();  // glyphs
1673cb93a386Sopenharmony_ci        if (iter.positioning() != SkTextBlobRunIterator::kDefault_Positioning) {
1674cb93a386Sopenharmony_ci            writer.beginArray(DEBUGCANVAS_ATTRIBUTE_POSITIONS);
1675cb93a386Sopenharmony_ci            const SkScalar* iterPositions = iter.pos();
1676cb93a386Sopenharmony_ci            for (uint32_t i = 0; i < iter.glyphCount(); i++) {
1677cb93a386Sopenharmony_ci                switch (iter.positioning()) {
1678cb93a386Sopenharmony_ci                    case SkTextBlobRunIterator::kFull_Positioning:
1679cb93a386Sopenharmony_ci                        MakeJsonPoint(writer, iterPositions[i * 2], iterPositions[i * 2 + 1]);
1680cb93a386Sopenharmony_ci                        break;
1681cb93a386Sopenharmony_ci                    case SkTextBlobRunIterator::kHorizontal_Positioning:
1682cb93a386Sopenharmony_ci                        writer.appendFloat(iterPositions[i]);
1683cb93a386Sopenharmony_ci                        break;
1684cb93a386Sopenharmony_ci                    case SkTextBlobRunIterator::kDefault_Positioning: break;
1685cb93a386Sopenharmony_ci                    case SkTextBlobRunIterator::kRSXform_Positioning:
1686cb93a386Sopenharmony_ci                        // TODO_RSXFORM_BLOB
1687cb93a386Sopenharmony_ci                        break;
1688cb93a386Sopenharmony_ci                }
1689cb93a386Sopenharmony_ci            }
1690cb93a386Sopenharmony_ci            writer.endArray();  // positions
1691cb93a386Sopenharmony_ci        }
1692cb93a386Sopenharmony_ci        writer.appendName(DEBUGCANVAS_ATTRIBUTE_FONT);
1693cb93a386Sopenharmony_ci        MakeJsonFont(iter.font(), writer, urlDataManager);
1694cb93a386Sopenharmony_ci        writer.appendName(DEBUGCANVAS_ATTRIBUTE_COORDS);
1695cb93a386Sopenharmony_ci        MakeJsonPoint(writer, iter.offset());
1696cb93a386Sopenharmony_ci
1697cb93a386Sopenharmony_ci        writer.endObject();  // run
1698cb93a386Sopenharmony_ci        iter.next();
1699cb93a386Sopenharmony_ci    }
1700cb93a386Sopenharmony_ci    writer.endArray();  // runs
1701cb93a386Sopenharmony_ci    writer.appendFloat(DEBUGCANVAS_ATTRIBUTE_X, fXPos);
1702cb93a386Sopenharmony_ci    writer.appendFloat(DEBUGCANVAS_ATTRIBUTE_Y, fYPos);
1703cb93a386Sopenharmony_ci    SkRect bounds = fBlob->bounds();
1704cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_COORDS);
1705cb93a386Sopenharmony_ci    MakeJsonRect(writer, bounds);
1706cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1707cb93a386Sopenharmony_ci    MakeJsonPaint(writer, fPaint, urlDataManager);
1708cb93a386Sopenharmony_ci
1709cb93a386Sopenharmony_ci    SkString desc;
1710cb93a386Sopenharmony_ci    // make the bounds local by applying the x,y
1711cb93a386Sopenharmony_ci    bounds.offset(fXPos, fYPos);
1712cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, bounds)->c_str());
1713cb93a386Sopenharmony_ci}
1714cb93a386Sopenharmony_ci
1715cb93a386Sopenharmony_ciDrawPatchCommand::DrawPatchCommand(const SkPoint  cubics[12],
1716cb93a386Sopenharmony_ci                                   const SkColor  colors[4],
1717cb93a386Sopenharmony_ci                                   const SkPoint  texCoords[4],
1718cb93a386Sopenharmony_ci                                   SkBlendMode    bmode,
1719cb93a386Sopenharmony_ci                                   const SkPaint& paint)
1720cb93a386Sopenharmony_ci        : INHERITED(kDrawPatch_OpType), fBlendMode(bmode) {
1721cb93a386Sopenharmony_ci    memcpy(fCubics, cubics, sizeof(fCubics));
1722cb93a386Sopenharmony_ci    if (colors != nullptr) {
1723cb93a386Sopenharmony_ci        memcpy(fColors, colors, sizeof(fColors));
1724cb93a386Sopenharmony_ci        fColorsPtr = fColors;
1725cb93a386Sopenharmony_ci    } else {
1726cb93a386Sopenharmony_ci        fColorsPtr = nullptr;
1727cb93a386Sopenharmony_ci    }
1728cb93a386Sopenharmony_ci    if (texCoords != nullptr) {
1729cb93a386Sopenharmony_ci        memcpy(fTexCoords, texCoords, sizeof(fTexCoords));
1730cb93a386Sopenharmony_ci        fTexCoordsPtr = fTexCoords;
1731cb93a386Sopenharmony_ci    } else {
1732cb93a386Sopenharmony_ci        fTexCoordsPtr = nullptr;
1733cb93a386Sopenharmony_ci    }
1734cb93a386Sopenharmony_ci    fPaint = paint;
1735cb93a386Sopenharmony_ci}
1736cb93a386Sopenharmony_ci
1737cb93a386Sopenharmony_civoid DrawPatchCommand::execute(SkCanvas* canvas) const {
1738cb93a386Sopenharmony_ci    canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
1739cb93a386Sopenharmony_ci}
1740cb93a386Sopenharmony_ci
1741cb93a386Sopenharmony_civoid DrawPatchCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1742cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1743cb93a386Sopenharmony_ci    writer.beginArray(DEBUGCANVAS_ATTRIBUTE_CUBICS);
1744cb93a386Sopenharmony_ci    for (int i = 0; i < 12; i++) {
1745cb93a386Sopenharmony_ci        MakeJsonPoint(writer, fCubics[i]);
1746cb93a386Sopenharmony_ci    }
1747cb93a386Sopenharmony_ci    writer.endArray();  // cubics
1748cb93a386Sopenharmony_ci    if (fColorsPtr != nullptr) {
1749cb93a386Sopenharmony_ci        writer.beginArray(DEBUGCANVAS_ATTRIBUTE_COLORS);
1750cb93a386Sopenharmony_ci        for (int i = 0; i < 4; i++) {
1751cb93a386Sopenharmony_ci            MakeJsonColor(writer, fColorsPtr[i]);
1752cb93a386Sopenharmony_ci        }
1753cb93a386Sopenharmony_ci        writer.endArray();  // colors
1754cb93a386Sopenharmony_ci    }
1755cb93a386Sopenharmony_ci    if (fTexCoordsPtr != nullptr) {
1756cb93a386Sopenharmony_ci        writer.beginArray(DEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS);
1757cb93a386Sopenharmony_ci        for (int i = 0; i < 4; i++) {
1758cb93a386Sopenharmony_ci            MakeJsonPoint(writer, fTexCoords[i]);
1759cb93a386Sopenharmony_ci        }
1760cb93a386Sopenharmony_ci        writer.endArray();  // texCoords
1761cb93a386Sopenharmony_ci    }
1762cb93a386Sopenharmony_ci    // fBlendMode
1763cb93a386Sopenharmony_ci}
1764cb93a386Sopenharmony_ci
1765cb93a386Sopenharmony_ciDrawRectCommand::DrawRectCommand(const SkRect& rect, const SkPaint& paint)
1766cb93a386Sopenharmony_ci        : INHERITED(kDrawRect_OpType) {
1767cb93a386Sopenharmony_ci    fRect  = rect;
1768cb93a386Sopenharmony_ci    fPaint = paint;
1769cb93a386Sopenharmony_ci}
1770cb93a386Sopenharmony_ci
1771cb93a386Sopenharmony_civoid DrawRectCommand::execute(SkCanvas* canvas) const { canvas->drawRect(fRect, fPaint); }
1772cb93a386Sopenharmony_ci
1773cb93a386Sopenharmony_civoid DrawRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1774cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1775cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_COORDS);
1776cb93a386Sopenharmony_ci    MakeJsonRect(writer, fRect);
1777cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1778cb93a386Sopenharmony_ci    MakeJsonPaint(writer, fPaint, urlDataManager);
1779cb93a386Sopenharmony_ci
1780cb93a386Sopenharmony_ci    SkString desc;
1781cb93a386Sopenharmony_ci    writer.appendString(DEBUGCANVAS_ATTRIBUTE_SHORTDESC, str_append(&desc, fRect)->c_str());
1782cb93a386Sopenharmony_ci}
1783cb93a386Sopenharmony_ci
1784cb93a386Sopenharmony_ciDrawRRectCommand::DrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
1785cb93a386Sopenharmony_ci        : INHERITED(kDrawRRect_OpType) {
1786cb93a386Sopenharmony_ci    fRRect = rrect;
1787cb93a386Sopenharmony_ci    fPaint = paint;
1788cb93a386Sopenharmony_ci}
1789cb93a386Sopenharmony_ci
1790cb93a386Sopenharmony_civoid DrawRRectCommand::execute(SkCanvas* canvas) const { canvas->drawRRect(fRRect, fPaint); }
1791cb93a386Sopenharmony_ci
1792cb93a386Sopenharmony_cibool DrawRRectCommand::render(SkCanvas* canvas) const {
1793cb93a386Sopenharmony_ci    render_rrect(canvas, fRRect);
1794cb93a386Sopenharmony_ci    return true;
1795cb93a386Sopenharmony_ci}
1796cb93a386Sopenharmony_ci
1797cb93a386Sopenharmony_civoid DrawRRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1798cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1799cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_COORDS);
1800cb93a386Sopenharmony_ci    make_json_rrect(writer, fRRect);
1801cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1802cb93a386Sopenharmony_ci    MakeJsonPaint(writer, fPaint, urlDataManager);
1803cb93a386Sopenharmony_ci}
1804cb93a386Sopenharmony_ci
1805cb93a386Sopenharmony_ciDrawDRRectCommand::DrawDRRectCommand(const SkRRect& outer,
1806cb93a386Sopenharmony_ci                                     const SkRRect& inner,
1807cb93a386Sopenharmony_ci                                     const SkPaint& paint)
1808cb93a386Sopenharmony_ci        : INHERITED(kDrawDRRect_OpType) {
1809cb93a386Sopenharmony_ci    fOuter = outer;
1810cb93a386Sopenharmony_ci    fInner = inner;
1811cb93a386Sopenharmony_ci    fPaint = paint;
1812cb93a386Sopenharmony_ci}
1813cb93a386Sopenharmony_ci
1814cb93a386Sopenharmony_civoid DrawDRRectCommand::execute(SkCanvas* canvas) const {
1815cb93a386Sopenharmony_ci    canvas->drawDRRect(fOuter, fInner, fPaint);
1816cb93a386Sopenharmony_ci}
1817cb93a386Sopenharmony_ci
1818cb93a386Sopenharmony_cibool DrawDRRectCommand::render(SkCanvas* canvas) const {
1819cb93a386Sopenharmony_ci    render_drrect(canvas, fOuter, fInner);
1820cb93a386Sopenharmony_ci    return true;
1821cb93a386Sopenharmony_ci}
1822cb93a386Sopenharmony_ci
1823cb93a386Sopenharmony_civoid DrawDRRectCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1824cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1825cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_OUTER);
1826cb93a386Sopenharmony_ci    make_json_rrect(writer, fOuter);
1827cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_INNER);
1828cb93a386Sopenharmony_ci    make_json_rrect(writer, fInner);
1829cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
1830cb93a386Sopenharmony_ci    MakeJsonPaint(writer, fPaint, urlDataManager);
1831cb93a386Sopenharmony_ci}
1832cb93a386Sopenharmony_ci
1833cb93a386Sopenharmony_ciDrawShadowCommand::DrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec)
1834cb93a386Sopenharmony_ci        : INHERITED(kDrawShadow_OpType) {
1835cb93a386Sopenharmony_ci    fPath      = path;
1836cb93a386Sopenharmony_ci    fShadowRec = rec;
1837cb93a386Sopenharmony_ci}
1838cb93a386Sopenharmony_ci
1839cb93a386Sopenharmony_civoid DrawShadowCommand::execute(SkCanvas* canvas) const {
1840cb93a386Sopenharmony_ci    canvas->private_draw_shadow_rec(fPath, fShadowRec);
1841cb93a386Sopenharmony_ci}
1842cb93a386Sopenharmony_ci
1843cb93a386Sopenharmony_cibool DrawShadowCommand::render(SkCanvas* canvas) const {
1844cb93a386Sopenharmony_ci    render_shadow(canvas, fPath, fShadowRec);
1845cb93a386Sopenharmony_ci    return true;
1846cb93a386Sopenharmony_ci}
1847cb93a386Sopenharmony_ci
1848cb93a386Sopenharmony_civoid DrawShadowCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
1849cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
1850cb93a386Sopenharmony_ci
1851cb93a386Sopenharmony_ci    bool geometricOnly = SkToBool(fShadowRec.fFlags & SkShadowFlags::kGeometricOnly_ShadowFlag);
1852cb93a386Sopenharmony_ci    bool transparentOccluder =
1853cb93a386Sopenharmony_ci            SkToBool(fShadowRec.fFlags & SkShadowFlags::kTransparentOccluder_ShadowFlag);
1854cb93a386Sopenharmony_ci
1855cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_PATH);
1856cb93a386Sopenharmony_ci    MakeJsonPath(writer, fPath);
1857cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_ZPLANE);
1858cb93a386Sopenharmony_ci    MakeJsonPoint3(writer, fShadowRec.fZPlaneParams);
1859cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION);
1860cb93a386Sopenharmony_ci    MakeJsonPoint3(writer, fShadowRec.fLightPos);
1861cb93a386Sopenharmony_ci    writer.appendFloat(DEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS, fShadowRec.fLightRadius);
1862cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR);
1863cb93a386Sopenharmony_ci    MakeJsonColor(writer, fShadowRec.fAmbientColor);
1864cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_SPOTCOLOR);
1865cb93a386Sopenharmony_ci    MakeJsonColor(writer, fShadowRec.fSpotColor);
1866cb93a386Sopenharmony_ci    store_bool(writer, DEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC, transparentOccluder, false);
1867cb93a386Sopenharmony_ci    store_bool(writer, DEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY, geometricOnly, false);
1868cb93a386Sopenharmony_ci}
1869cb93a386Sopenharmony_ci
1870cb93a386Sopenharmony_ci///////////////////////////////////////////////////////////////////////////////////////////////////
1871cb93a386Sopenharmony_ci
1872cb93a386Sopenharmony_ciDrawEdgeAAQuadCommand::DrawEdgeAAQuadCommand(const SkRect&         rect,
1873cb93a386Sopenharmony_ci                                             const SkPoint         clip[],
1874cb93a386Sopenharmony_ci                                             SkCanvas::QuadAAFlags aa,
1875cb93a386Sopenharmony_ci                                             const SkColor4f&      color,
1876cb93a386Sopenharmony_ci                                             SkBlendMode           mode)
1877cb93a386Sopenharmony_ci        : INHERITED(kDrawEdgeAAQuad_OpType)
1878cb93a386Sopenharmony_ci        , fRect(rect)
1879cb93a386Sopenharmony_ci        , fHasClip(clip != nullptr)
1880cb93a386Sopenharmony_ci        , fAA(aa)
1881cb93a386Sopenharmony_ci        , fColor(color)
1882cb93a386Sopenharmony_ci        , fMode(mode) {
1883cb93a386Sopenharmony_ci    if (clip) {
1884cb93a386Sopenharmony_ci        for (int i = 0; i < 4; ++i) {
1885cb93a386Sopenharmony_ci            fClip[i] = clip[i];
1886cb93a386Sopenharmony_ci        }
1887cb93a386Sopenharmony_ci    }
1888cb93a386Sopenharmony_ci}
1889cb93a386Sopenharmony_ci
1890cb93a386Sopenharmony_civoid DrawEdgeAAQuadCommand::execute(SkCanvas* canvas) const {
1891cb93a386Sopenharmony_ci    canvas->experimental_DrawEdgeAAQuad(fRect, fHasClip ? fClip : nullptr, fAA, fColor, fMode);
1892cb93a386Sopenharmony_ci}
1893cb93a386Sopenharmony_ci
1894cb93a386Sopenharmony_ciDrawEdgeAAImageSetCommand::DrawEdgeAAImageSetCommand(const SkCanvas::ImageSetEntry set[],
1895cb93a386Sopenharmony_ci                                                     int                           count,
1896cb93a386Sopenharmony_ci                                                     const SkPoint                 dstClips[],
1897cb93a386Sopenharmony_ci                                                     const SkMatrix              preViewMatrices[],
1898cb93a386Sopenharmony_ci                                                     const SkSamplingOptions&    sampling,
1899cb93a386Sopenharmony_ci                                                     const SkPaint*              paint,
1900cb93a386Sopenharmony_ci                                                     SkCanvas::SrcRectConstraint constraint)
1901cb93a386Sopenharmony_ci        : INHERITED(kDrawEdgeAAImageSet_OpType)
1902cb93a386Sopenharmony_ci        , fSet(count)
1903cb93a386Sopenharmony_ci        , fCount(count)
1904cb93a386Sopenharmony_ci        , fSampling(sampling)
1905cb93a386Sopenharmony_ci        , fPaint(paint)
1906cb93a386Sopenharmony_ci        , fConstraint(constraint) {
1907cb93a386Sopenharmony_ci    int totalDstClipCount, totalMatrixCount;
1908cb93a386Sopenharmony_ci    SkCanvasPriv::GetDstClipAndMatrixCounts(set, count, &totalDstClipCount, &totalMatrixCount);
1909cb93a386Sopenharmony_ci
1910cb93a386Sopenharmony_ci    std::copy_n(set, count, fSet.get());
1911cb93a386Sopenharmony_ci    fDstClips.reset(totalDstClipCount);
1912cb93a386Sopenharmony_ci    std::copy_n(dstClips, totalDstClipCount, fDstClips.get());
1913cb93a386Sopenharmony_ci    fPreViewMatrices.reset(totalMatrixCount);
1914cb93a386Sopenharmony_ci    std::copy_n(preViewMatrices, totalMatrixCount, fPreViewMatrices.get());
1915cb93a386Sopenharmony_ci}
1916cb93a386Sopenharmony_ci
1917cb93a386Sopenharmony_civoid DrawEdgeAAImageSetCommand::execute(SkCanvas* canvas) const {
1918cb93a386Sopenharmony_ci    canvas->experimental_DrawEdgeAAImageSet(fSet.get(),
1919cb93a386Sopenharmony_ci                                            fCount,
1920cb93a386Sopenharmony_ci                                            fDstClips.get(),
1921cb93a386Sopenharmony_ci                                            fPreViewMatrices.get(),
1922cb93a386Sopenharmony_ci                                            fSampling,
1923cb93a386Sopenharmony_ci                                            fPaint.getMaybeNull(),
1924cb93a386Sopenharmony_ci                                            fConstraint);
1925cb93a386Sopenharmony_ci}
1926cb93a386Sopenharmony_ci
1927cb93a386Sopenharmony_ci///////////////////////////////////////////////////////////////////////////////////////////////////
1928cb93a386Sopenharmony_ci
1929cb93a386Sopenharmony_ciDrawDrawableCommand::DrawDrawableCommand(SkDrawable* drawable, const SkMatrix* matrix)
1930cb93a386Sopenharmony_ci        : INHERITED(kDrawDrawable_OpType), fDrawable(SkRef(drawable)), fMatrix(matrix) {}
1931cb93a386Sopenharmony_ci
1932cb93a386Sopenharmony_civoid DrawDrawableCommand::execute(SkCanvas* canvas) const {
1933cb93a386Sopenharmony_ci    canvas->drawDrawable(fDrawable.get(), fMatrix.getMaybeNull());
1934cb93a386Sopenharmony_ci}
1935cb93a386Sopenharmony_ci
1936cb93a386Sopenharmony_ci///////////////////////////////////////////////////////////////////////////////////////////////////
1937cb93a386Sopenharmony_ci
1938cb93a386Sopenharmony_ciDrawVerticesCommand::DrawVerticesCommand(sk_sp<SkVertices> vertices,
1939cb93a386Sopenharmony_ci                                         SkBlendMode       bmode,
1940cb93a386Sopenharmony_ci                                         const SkPaint&    paint)
1941cb93a386Sopenharmony_ci        : INHERITED(kDrawVertices_OpType)
1942cb93a386Sopenharmony_ci        , fVertices(std::move(vertices))
1943cb93a386Sopenharmony_ci        , fBlendMode(bmode)
1944cb93a386Sopenharmony_ci        , fPaint(paint) {}
1945cb93a386Sopenharmony_ci
1946cb93a386Sopenharmony_civoid DrawVerticesCommand::execute(SkCanvas* canvas) const {
1947cb93a386Sopenharmony_ci    canvas->drawVertices(fVertices, fBlendMode, fPaint);
1948cb93a386Sopenharmony_ci}
1949cb93a386Sopenharmony_ci
1950cb93a386Sopenharmony_ci///////////////////////////////////////////////////////////////////////////////////////////////////
1951cb93a386Sopenharmony_ci
1952cb93a386Sopenharmony_ciDrawAtlasCommand::DrawAtlasCommand(const SkImage*  image,
1953cb93a386Sopenharmony_ci                                   const SkRSXform xform[],
1954cb93a386Sopenharmony_ci                                   const SkRect    tex[],
1955cb93a386Sopenharmony_ci                                   const SkColor   colors[],
1956cb93a386Sopenharmony_ci                                   int             count,
1957cb93a386Sopenharmony_ci                                   SkBlendMode     bmode,
1958cb93a386Sopenharmony_ci                                   const SkSamplingOptions& sampling,
1959cb93a386Sopenharmony_ci                                   const SkRect*   cull,
1960cb93a386Sopenharmony_ci                                   const SkPaint*  paint)
1961cb93a386Sopenharmony_ci        : INHERITED(kDrawAtlas_OpType)
1962cb93a386Sopenharmony_ci        , fImage(SkRef(image))
1963cb93a386Sopenharmony_ci        , fXform(xform, count)
1964cb93a386Sopenharmony_ci        , fTex(tex, count)
1965cb93a386Sopenharmony_ci        , fColors(colors, colors ? count : 0)
1966cb93a386Sopenharmony_ci        , fBlendMode(bmode)
1967cb93a386Sopenharmony_ci        , fSampling(sampling)
1968cb93a386Sopenharmony_ci        , fCull(cull)
1969cb93a386Sopenharmony_ci        , fPaint(paint) {}
1970cb93a386Sopenharmony_ci
1971cb93a386Sopenharmony_civoid DrawAtlasCommand::execute(SkCanvas* canvas) const {
1972cb93a386Sopenharmony_ci    canvas->drawAtlas(fImage.get(),
1973cb93a386Sopenharmony_ci                      fXform.begin(),
1974cb93a386Sopenharmony_ci                      fTex.begin(),
1975cb93a386Sopenharmony_ci                      fColors.isEmpty() ? nullptr : fColors.begin(),
1976cb93a386Sopenharmony_ci                      fXform.count(),
1977cb93a386Sopenharmony_ci                      fBlendMode,
1978cb93a386Sopenharmony_ci                      fSampling,
1979cb93a386Sopenharmony_ci                      fCull.getMaybeNull(),
1980cb93a386Sopenharmony_ci                      fPaint.getMaybeNull());
1981cb93a386Sopenharmony_ci}
1982cb93a386Sopenharmony_ci
1983cb93a386Sopenharmony_ci///////////////////////////////////////////////////////////////////////////////////////////////////
1984cb93a386Sopenharmony_ci
1985cb93a386Sopenharmony_ciRestoreCommand::RestoreCommand() : INHERITED(kRestore_OpType) {}
1986cb93a386Sopenharmony_ci
1987cb93a386Sopenharmony_civoid RestoreCommand::execute(SkCanvas* canvas) const { canvas->restore(); }
1988cb93a386Sopenharmony_ci
1989cb93a386Sopenharmony_ciSaveCommand::SaveCommand() : INHERITED(kSave_OpType) {}
1990cb93a386Sopenharmony_ci
1991cb93a386Sopenharmony_civoid SaveCommand::execute(SkCanvas* canvas) const { canvas->save(); }
1992cb93a386Sopenharmony_ci
1993cb93a386Sopenharmony_ciSaveLayerCommand::SaveLayerCommand(const SkCanvas::SaveLayerRec& rec)
1994cb93a386Sopenharmony_ci        : INHERITED(kSaveLayer_OpType)
1995cb93a386Sopenharmony_ci        , fBounds(rec.fBounds)
1996cb93a386Sopenharmony_ci        , fPaint(rec.fPaint)
1997cb93a386Sopenharmony_ci        , fBackdrop(SkSafeRef(rec.fBackdrop))
1998cb93a386Sopenharmony_ci        , fSaveLayerFlags(rec.fSaveLayerFlags)
1999cb93a386Sopenharmony_ci        , fBackdropScale(SkCanvasPriv::GetBackdropScaleFactor(rec)) {}
2000cb93a386Sopenharmony_ci
2001cb93a386Sopenharmony_civoid SaveLayerCommand::execute(SkCanvas* canvas) const {
2002cb93a386Sopenharmony_ci    // In the common case fBackdropScale == 1.f and then this is no different than a regular Rec
2003cb93a386Sopenharmony_ci    canvas->saveLayer(SkCanvasPriv::ScaledBackdropLayer(fBounds.getMaybeNull(),
2004cb93a386Sopenharmony_ci                                                        fPaint.getMaybeNull(),
2005cb93a386Sopenharmony_ci                                                        fBackdrop.get(),
2006cb93a386Sopenharmony_ci                                                        fBackdropScale,
2007cb93a386Sopenharmony_ci                                                        fSaveLayerFlags));
2008cb93a386Sopenharmony_ci}
2009cb93a386Sopenharmony_ci
2010cb93a386Sopenharmony_civoid SaveLayerCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
2011cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
2012cb93a386Sopenharmony_ci    if (fBounds.isValid()) {
2013cb93a386Sopenharmony_ci        writer.appendName(DEBUGCANVAS_ATTRIBUTE_BOUNDS);
2014cb93a386Sopenharmony_ci        MakeJsonRect(writer, *fBounds);
2015cb93a386Sopenharmony_ci    }
2016cb93a386Sopenharmony_ci    if (fPaint.isValid()) {
2017cb93a386Sopenharmony_ci        writer.appendName(DEBUGCANVAS_ATTRIBUTE_PAINT);
2018cb93a386Sopenharmony_ci        MakeJsonPaint(writer, *fPaint, urlDataManager);
2019cb93a386Sopenharmony_ci    }
2020cb93a386Sopenharmony_ci    if (fBackdrop != nullptr) {
2021cb93a386Sopenharmony_ci        writer.beginObject(DEBUGCANVAS_ATTRIBUTE_BACKDROP);
2022cb93a386Sopenharmony_ci        flatten(fBackdrop.get(), writer, urlDataManager);
2023cb93a386Sopenharmony_ci        writer.endObject();  // backdrop
2024cb93a386Sopenharmony_ci    }
2025cb93a386Sopenharmony_ci    if (fSaveLayerFlags != 0) {
2026cb93a386Sopenharmony_ci        SkDebugf("unsupported: saveLayer flags\n");
2027cb93a386Sopenharmony_ci        SkASSERT(false);
2028cb93a386Sopenharmony_ci    }
2029cb93a386Sopenharmony_ci}
2030cb93a386Sopenharmony_ci
2031cb93a386Sopenharmony_ciSetMatrixCommand::SetMatrixCommand(const SkMatrix& matrix) : INHERITED(kSetMatrix_OpType) {
2032cb93a386Sopenharmony_ci    fMatrix = matrix;
2033cb93a386Sopenharmony_ci}
2034cb93a386Sopenharmony_ci
2035cb93a386Sopenharmony_civoid SetMatrixCommand::execute(SkCanvas* canvas) const { canvas->setMatrix(fMatrix); }
2036cb93a386Sopenharmony_ci
2037cb93a386Sopenharmony_civoid SetMatrixCommand::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
2038cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
2039cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_MATRIX);
2040cb93a386Sopenharmony_ci    MakeJsonMatrix(writer, fMatrix);
2041cb93a386Sopenharmony_ci    writeMatrixType(writer, fMatrix);
2042cb93a386Sopenharmony_ci}
2043cb93a386Sopenharmony_ci
2044cb93a386Sopenharmony_ciSetM44Command::SetM44Command(const SkM44& matrix) : INHERITED(kSetM44_OpType) {
2045cb93a386Sopenharmony_ci    fMatrix = matrix;
2046cb93a386Sopenharmony_ci}
2047cb93a386Sopenharmony_ci
2048cb93a386Sopenharmony_civoid SetM44Command::execute(SkCanvas* canvas) const { canvas->setMatrix(fMatrix); }
2049cb93a386Sopenharmony_ci
2050cb93a386Sopenharmony_civoid SetM44Command::toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const {
2051cb93a386Sopenharmony_ci    INHERITED::toJSON(writer, urlDataManager);
2052cb93a386Sopenharmony_ci    writer.appendName(DEBUGCANVAS_ATTRIBUTE_MATRIX);
2053cb93a386Sopenharmony_ci    MakeJsonMatrix44(writer, fMatrix);
2054cb93a386Sopenharmony_ci}
2055