1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SKDEBUGCANVAS_H_ 9 #define SKDEBUGCANVAS_H_ 10 11 #include "include/core/SkCanvas.h" 12 #include "include/core/SkCanvasVirtualEnforcer.h" 13 #include "include/core/SkPath.h" 14 #include "include/core/SkString.h" 15 #include "include/core/SkVertices.h" 16 #include "include/pathops/SkPathOps.h" 17 #include "include/private/SkTArray.h" 18 #include "tools/UrlDataManager.h" 19 #include "tools/debugger/DebugLayerManager.h" 20 #include "tools/debugger/DrawCommand.h" 21 22 #include <map> 23 #include <vector> 24 25 class GrAuditTrail; 26 class SkNWayCanvas; 27 class SkPicture; 28 class DebugLayerManager; 29 30 class DebugCanvas : public SkCanvasVirtualEnforcer<SkCanvas> { 31 public: 32 DebugCanvas(int width, int height); 33 34 DebugCanvas(SkIRect bounds); 35 36 ~DebugCanvas() override; 37 38 /** 39 * Provide a DebugLayerManager for mskp files containing layer information 40 * when set this DebugCanvas will attempt to parse layer info from annotations. 41 * it will store layer pictures to the layer manager, and interpret some drawImageRects 42 * as layer draws, deferring to the layer manager for images. 43 * Provide a frame number that will be passed to all layer manager functions to identify this 44 * DebugCanvas. 45 * 46 * Used only in wasm debugger animations. 47 */ setLayerManagerAndFrame(DebugLayerManager * lm,int frame)48 void setLayerManagerAndFrame(DebugLayerManager* lm, int frame) { 49 fLayerManager = lm; 50 fFrame = frame; 51 } 52 53 /** 54 * Enable or disable overdraw visualization 55 */ 56 void setOverdrawViz(bool overdrawViz); 57 getOverdrawViz()58 bool getOverdrawViz() const { return fOverdrawViz; } 59 60 /** 61 * Set the color of the clip visualization. An alpha of zero renders the clip invisible. 62 */ setClipVizColor(SkColor clipVizColor)63 void setClipVizColor(SkColor clipVizColor) { this->fClipVizColor = clipVizColor; } 64 setAndroidClipViz(bool enable)65 void setAndroidClipViz(bool enable) { this->fShowAndroidClip = enable; } 66 setOriginVisible(bool enable)67 void setOriginVisible(bool enable) { this->fShowOrigin = enable; } 68 setDrawGpuOpBounds(bool drawGpuOpBounds)69 void setDrawGpuOpBounds(bool drawGpuOpBounds) { fDrawGpuOpBounds = drawGpuOpBounds; } 70 getDrawGpuOpBounds()71 bool getDrawGpuOpBounds() const { return fDrawGpuOpBounds; } 72 73 /** 74 Executes all draw calls to the canvas. 75 @param canvas The canvas being drawn to 76 */ 77 void draw(SkCanvas* canvas); 78 79 /** 80 Executes the draw calls up to the specified index. 81 Does not clear the canvas to transparent black first, 82 if needed, caller should do that first. 83 @param canvas The canvas being drawn to 84 @param index The index of the final command being executed 85 @param m an optional Mth gpu op to highlight, or -1 86 */ 87 void drawTo(SkCanvas* canvas, int index, int m = -1); 88 89 /** 90 Returns the most recently calculated transformation matrix 91 */ getCurrentMatrix()92 const SkM44& getCurrentMatrix() { return fMatrix; } 93 94 /** 95 Returns the most recently calculated clip 96 */ getCurrentClip()97 const SkIRect& getCurrentClip() { return fClip; } 98 99 /** 100 Removes the command at the specified index 101 @param index The index of the command to delete 102 */ 103 void deleteDrawCommandAt(int index); 104 105 /** 106 Returns the draw command at the given index. 107 @param index The index of the command 108 */ 109 DrawCommand* getDrawCommandAt(int index) const; 110 111 /** 112 Returns length of draw command vector. 113 */ getSize()114 int getSize() const { return fCommandVector.count(); } 115 116 /** 117 Toggles the visibility / execution of the draw command at index i with 118 the value of toggle. 119 */ 120 void toggleCommand(int index, bool toggle); 121 122 /** 123 Returns a JSON object representing all commands in the picture. 124 The encoder may use the UrlDataManager to store binary data such 125 as images, referring to them via URLs embedded in the JSON. 126 */ 127 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager, SkCanvas*); 128 129 void toJSONOpsTask(SkJSONWriter& writer, SkCanvas*); 130 detachCommands(SkTDArray<DrawCommand * > * dst)131 void detachCommands(SkTDArray<DrawCommand*>* dst) { fCommandVector.swap(*dst); } 132 133 /** 134 Returns a map from image IDs to command indices where they are used. 135 */ 136 std::map<int, std::vector<int>> getImageIdToCommandMap(UrlDataManager& udm) const; 137 138 protected: 139 void willSave() override; 140 SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override; 141 bool onDoSaveBehind(const SkRect*) override; 142 void willRestore() override; 143 144 void didConcat44(const SkM44&) override; 145 void didSetM44(const SkM44&) override; 146 void didScale(SkScalar, SkScalar) override; 147 void didTranslate(SkScalar, SkScalar) override; 148 149 void onDrawAnnotation(const SkRect&, const char[], SkData*) override; 150 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; 151 void onDrawTextBlob(const SkTextBlob* blob, 152 SkScalar x, 153 SkScalar y, 154 const SkPaint& paint) override; 155 156 void onDrawPatch(const SkPoint cubics[12], 157 const SkColor colors[4], 158 const SkPoint texCoords[4], 159 SkBlendMode, 160 const SkPaint& paint) override; 161 void onDrawPaint(const SkPaint&) override; 162 void onDrawBehind(const SkPaint&) override; 163 164 void onDrawRect(const SkRect&, const SkPaint&) override; 165 void onDrawOval(const SkRect&, const SkPaint&) override; 166 void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) override; 167 void onDrawRRect(const SkRRect&, const SkPaint&) override; 168 void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override; 169 void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override; 170 void onDrawPath(const SkPath&, const SkPaint&) override; 171 void onDrawRegion(const SkRegion&, const SkPaint&) override; 172 173 void onDrawImage2(const SkImage*, SkScalar, SkScalar, const SkSamplingOptions&, 174 const SkPaint*) override; 175 void onDrawImageRect2(const SkImage*, const SkRect&, const SkRect&, const SkSamplingOptions&, 176 const SkPaint*, SrcRectConstraint) override; 177 void onDrawImageLattice2(const SkImage*, const Lattice&, const SkRect&, SkFilterMode, 178 const SkPaint*) override; 179 void onDrawAtlas2(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int, 180 SkBlendMode, const SkSamplingOptions&, const SkRect*, const SkPaint*) override; 181 182 void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override; 183 void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override; 184 void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override; 185 void onClipShader(sk_sp<SkShader>, SkClipOp) override; 186 void onClipRegion(const SkRegion& region, SkClipOp) override; 187 void onResetClip() override; 188 189 void onDrawShadowRec(const SkPath&, const SkDrawShadowRec&) override; 190 void onDrawDrawable(SkDrawable*, const SkMatrix*) override; 191 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override; 192 193 void onDrawEdgeAAQuad(const SkRect&, 194 const SkPoint[4], 195 QuadAAFlags, 196 const SkColor4f&, 197 SkBlendMode) override; 198 void onDrawEdgeAAImageSet2(const ImageSetEntry[], 199 int count, 200 const SkPoint[], 201 const SkMatrix[], 202 const SkSamplingOptions&, 203 const SkPaint*, 204 SrcRectConstraint) override; 205 206 private: 207 SkTDArray<DrawCommand*> fCommandVector; 208 SkM44 fMatrix; 209 SkIRect fClip; 210 211 bool fOverdrawViz = false; 212 SkColor fClipVizColor; 213 bool fDrawGpuOpBounds = false; 214 bool fShowAndroidClip = false; 215 bool fShowOrigin = false; 216 217 // When not negative, indicates the render node id of the layer represented by the next 218 // drawPicture call. 219 int fnextDrawPictureLayerId = -1; 220 int fnextDrawImageRectLayerId = -1; 221 SkIRect fnextDrawPictureDirtyRect; 222 // may be null, in which case layer annotations are ignored. 223 DebugLayerManager* fLayerManager = nullptr; 224 // May be set when DebugCanvas is used in playing back an animation. 225 // Only used for passing to fLayerManager to identify itself. 226 int fFrame = -1; 227 SkRect fAndroidClip = SkRect::MakeEmpty(); 228 229 /** 230 Adds the command to the class' vector of commands. 231 @param command The draw command for execution 232 */ 233 void addDrawCommand(DrawCommand* command); 234 235 #if SK_GPU_V1 236 GrAuditTrail* getAuditTrail(SkCanvas*); 237 void drawAndCollectOps(SkCanvas*); 238 void cleanupAuditTrail(GrAuditTrail*); 239 #endif 240 241 using INHERITED = SkCanvasVirtualEnforcer<SkCanvas>; 242 }; 243 244 #endif 245