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