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 9 #ifndef SKDEBUGCANVAS_H_ 10 #define SKDEBUGCANVAS_H_ 11 12 #include "SkCanvas.h" 13 #include "SkDrawCommand.h" 14 #include "SkPath.h" 15 #include "SkPathOps.h" 16 #include "SkPicture.h" 17 #include "SkString.h" 18 #include "SkTArray.h" 19 #include "SkVertices.h" 20 #include "UrlDataManager.h" 21 22 class GrAuditTrail; 23 class SkNWayCanvas; 24 25 class SkDebugCanvas : public SkCanvas { 26 public: 27 SkDebugCanvas(int width, int height); 28 29 ~SkDebugCanvas() override; 30 toggleFilter(bool toggle)31 void toggleFilter(bool toggle) { fFilter = toggle; } 32 setMegaVizMode(bool megaVizMode)33 void setMegaVizMode(bool megaVizMode) { fMegaVizMode = megaVizMode; } 34 getMegaVizMode()35 bool getMegaVizMode() const { return fMegaVizMode; } 36 37 /** 38 * Enable or disable overdraw visualization 39 */ 40 void setOverdrawViz(bool overdrawViz); 41 getOverdrawViz()42 bool getOverdrawViz() const { return fOverdrawViz; } 43 44 /** 45 * Set the color of the clip visualization. An alpha of zero renders the clip invisible. 46 */ setClipVizColor(SkColor clipVizColor)47 void setClipVizColor(SkColor clipVizColor) { this->fClipVizColor = clipVizColor; } 48 getClipVizColor()49 SkColor getClipVizColor() const { return fClipVizColor; } 50 setDrawGpuOpBounds(bool drawGpuOpBounds)51 void setDrawGpuOpBounds(bool drawGpuOpBounds) { fDrawGpuOpBounds = drawGpuOpBounds; } 52 getDrawGpuOpBounds()53 bool getDrawGpuOpBounds() const { return fDrawGpuOpBounds; } 54 getAllowSimplifyClip()55 bool getAllowSimplifyClip() const { return fAllowSimplifyClip; } 56 setPicture(SkPicture * picture)57 void setPicture(SkPicture *picture) { fPicture = picture; } 58 59 /** 60 * Enable or disable texure filtering override 61 */ 62 void overrideTexFiltering(bool overrideTexFiltering, SkFilterQuality); 63 64 /** 65 Executes all draw calls to the canvas. 66 @param canvas The canvas being drawn to 67 */ 68 void draw(SkCanvas *canvas); 69 70 /** 71 Executes the draw calls up to the specified index. 72 @param canvas The canvas being drawn to 73 @param index The index of the final command being executed 74 @param m an optional Mth gpu op to highlight, or -1 75 */ 76 void drawTo(SkCanvas *canvas, int index, int m = -1); 77 78 /** 79 Returns the most recently calculated transformation matrix 80 */ getCurrentMatrix()81 const SkMatrix &getCurrentMatrix() { 82 return fMatrix; 83 } 84 85 /** 86 Returns the most recently calculated clip 87 */ getCurrentClip()88 const SkIRect &getCurrentClip() { 89 return fClip; 90 } 91 92 /** 93 Returns the index of the last draw command to write to the pixel at (x,y) 94 */ 95 int getCommandAtPoint(int x, int y, int index); 96 97 /** 98 Removes the command at the specified index 99 @param index The index of the command to delete 100 */ 101 void deleteDrawCommandAt(int index); 102 103 /** 104 Returns the draw command at the given index. 105 @param index The index of the command 106 */ 107 SkDrawCommand *getDrawCommandAt(int index); 108 109 /** 110 Sets the draw command for a given index. 111 @param index The index to overwrite 112 @param command The new command 113 */ 114 void setDrawCommandAt(int index, SkDrawCommand *command); 115 116 /** 117 Returns information about the command at the given index. 118 @param index The index of the command 119 */ 120 const SkTDArray<SkString *> *getCommandInfo(int index) const; 121 122 /** 123 Returns the visibility of the command at the given index. 124 @param index The index of the command 125 */ 126 bool getDrawCommandVisibilityAt(int index); 127 128 /** 129 Returns the vector of draw commands 130 */ 131 SK_ATTR_DEPRECATED("please use getDrawCommandAt and getSize instead") 132 const SkTDArray<SkDrawCommand *> &getDrawCommands() const; 133 134 /** 135 Returns the vector of draw commands. Do not use this entry 136 point - it is going away! 137 */ 138 SkTDArray<SkDrawCommand *> &getDrawCommands(); 139 140 /** 141 Returns length of draw command vector. 142 */ getSize()143 int getSize() const { 144 return fCommandVector.count(); 145 } 146 147 /** 148 Toggles the visibility / execution of the draw command at index i with 149 the value of toggle. 150 */ 151 void toggleCommand(int index, bool toggle); 152 setUserMatrix(SkMatrix matrix)153 void setUserMatrix(SkMatrix matrix) { 154 fUserMatrix = matrix; 155 } 156 clipStackData()157 SkString clipStackData() const { return fClipStackData; } 158 159 /** 160 Returns a JSON object representing up to the Nth draw, where N is less than 161 SkDebugCanvas::getSize(). The encoder may use the UrlDataManager to store binary data such 162 as images, referring to them via URLs embedded in the JSON. 163 */ 164 Json::Value toJSON(UrlDataManager &urlDataManager, int n, SkCanvas *); 165 166 Json::Value toJSONOpList(int n, SkCanvas*); 167 detachCommands(SkTDArray<SkDrawCommand * > * dst)168 void detachCommands(SkTDArray<SkDrawCommand*>* dst) { 169 fCommandVector.swap(*dst); 170 } 171 172 protected: 173 void willSave() override; 174 175 SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec &) override; 176 177 void willRestore() override; 178 179 void didConcat(const SkMatrix &) override; 180 181 void didSetMatrix(const SkMatrix &) override; 182 183 void onDrawAnnotation(const SkRect&, const char[], SkData*) override; 184 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; 185 void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 186 const SkPaint&) override; 187 void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 188 const SkPaint&) override; 189 void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 190 SkScalar constY, const SkPaint&) override; 191 void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 192 const SkMatrix* matrix, const SkPaint&) override; 193 void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform[], const SkRect*, 194 const SkPaint&) override; 195 void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, 196 const SkPaint& paint) override; 197 198 void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], 199 const SkPoint texCoords[4], SkBlendMode, const SkPaint& paint) override; 200 void onDrawPaint(const SkPaint&) override; 201 202 void onDrawRect(const SkRect&, const SkPaint&) override; 203 void onDrawOval(const SkRect&, const SkPaint&) override; 204 void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) override; 205 void onDrawRRect(const SkRRect&, const SkPaint&) override; 206 void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override; 207 void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override; 208 void onDrawPath(const SkPath&, const SkPaint&) override; 209 void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override; 210 void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*, 211 SrcRectConstraint) override; 212 void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override; 213 void onDrawImageLattice(const SkImage* image, const Lattice& lattice, 214 const SkRect& dst, const SkPaint* paint) override; 215 void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, 216 const SkPaint*, SrcRectConstraint) override; 217 void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, 218 const SkPaint*) override; 219 void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override; 220 void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override; 221 void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override; 222 void onClipRegion(const SkRegion& region, SkClipOp) override; 223 224 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override; 225 226 void markActiveCommands(int index); 227 228 private: 229 SkTDArray<SkDrawCommand*> fCommandVector; 230 SkPicture* fPicture; 231 bool fFilter; 232 bool fMegaVizMode; 233 SkMatrix fUserMatrix; 234 SkMatrix fMatrix; 235 SkIRect fClip; 236 237 SkString fClipStackData; 238 bool fCalledAddStackData; 239 SkPath fSaveDevPath; 240 241 bool fOverdrawViz; 242 bool fOverrideFilterQuality; 243 SkFilterQuality fFilterQuality; 244 SkColor fClipVizColor; 245 bool fDrawGpuOpBounds; 246 247 /** 248 The active saveLayer commands at a given point in the renderering. 249 Only used when "mega" visualization is enabled. 250 */ 251 SkTDArray<SkDrawCommand*> fActiveLayers; 252 253 /** 254 Adds the command to the class' vector of commands. 255 @param command The draw command for execution 256 */ 257 void addDrawCommand(SkDrawCommand* command); 258 259 /** 260 Applies any panning and zooming the user has specified before 261 drawing anything else into the canvas. 262 */ 263 void applyUserTransform(SkCanvas* canvas); 264 resetClipStackData()265 void resetClipStackData() { fClipStackData.reset(); fCalledAddStackData = false; } 266 267 void addClipStackData(const SkPath& devPath, const SkPath& operand, SkClipOp elementOp); 268 void addPathData(const SkPath& path, const char* pathName); 269 bool lastClipStackData(const SkPath& devPath); 270 void outputConicPoints(const SkPoint* pts, SkScalar weight); 271 void outputPoints(const SkPoint* pts, int count); 272 void outputPointsCommon(const SkPoint* pts, int count); 273 void outputScalar(SkScalar num); 274 275 GrAuditTrail* getAuditTrail(SkCanvas*); 276 277 void drawAndCollectOps(int n, SkCanvas*); 278 void cleanupAuditTrail(SkCanvas*); 279 280 typedef SkCanvas INHERITED; 281 }; 282 283 #endif 284