1 2 /* 3 * Copyright 2012 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef SKDEBUGCANVAS_H_ 11 #define SKDEBUGCANVAS_H_ 12 13 #include "SkCanvas.h" 14 #include "SkDrawCommand.h" 15 #include "SkPathOps.h" 16 #include "SkPicture.h" 17 #include "SkTArray.h" 18 #include "SkString.h" 19 20 class SkTexOverrideFilter; 21 22 class SK_API SkDebugCanvas : public SkCanvas { 23 public: 24 SkDebugCanvas(int width, int height); 25 virtual ~SkDebugCanvas(); 26 toggleFilter(bool toggle)27 void toggleFilter(bool toggle) { fFilter = toggle; } 28 setMegaVizMode(bool megaVizMode)29 void setMegaVizMode(bool megaVizMode) { fMegaVizMode = megaVizMode; } getMegaVizMode()30 bool getMegaVizMode() const { return fMegaVizMode; } 31 32 /** 33 * Enable or disable overdraw visualization 34 */ setOverdrawViz(bool overdrawViz)35 void setOverdrawViz(bool overdrawViz) { fOverdrawViz = overdrawViz; } getOverdrawViz()36 bool getOverdrawViz() const { return fOverdrawViz; } 37 setOutstandingSaveCount(int saveCount)38 void setOutstandingSaveCount(int saveCount) { fOutstandingSaveCount = saveCount; } getOutstandingSaveCount()39 int getOutstandingSaveCount() const { return fOutstandingSaveCount; } 40 getAllowSimplifyClip()41 bool getAllowSimplifyClip() const { return fAllowSimplifyClip; } 42 setPicture(SkPicture * picture)43 void setPicture(SkPicture* picture) { fPicture = picture; } 44 45 /** 46 * Enable or disable texure filtering override 47 */ 48 void overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level); 49 50 /** 51 Executes all draw calls to the canvas. 52 @param canvas The canvas being drawn to 53 */ 54 void draw(SkCanvas* canvas); 55 56 /** 57 Executes the draw calls up to the specified index. 58 @param canvas The canvas being drawn to 59 @param index The index of the final command being executed 60 */ 61 void drawTo(SkCanvas* canvas, int index); 62 63 /** 64 Returns the most recently calculated transformation matrix 65 */ getCurrentMatrix()66 const SkMatrix& getCurrentMatrix() { 67 return fMatrix; 68 } 69 70 /** 71 Returns the most recently calculated clip 72 */ getCurrentClip()73 const SkIRect& getCurrentClip() { 74 return fClip; 75 } 76 77 /** 78 Returns the index of the last draw command to write to the pixel at (x,y) 79 */ 80 int getCommandAtPoint(int x, int y, int index); 81 82 /** 83 Removes the command at the specified index 84 @param index The index of the command to delete 85 */ 86 void deleteDrawCommandAt(int index); 87 88 /** 89 Returns the draw command at the given index. 90 @param index The index of the command 91 */ 92 SkDrawCommand* getDrawCommandAt(int index); 93 94 /** 95 Sets the draw command for a given index. 96 @param index The index to overwrite 97 @param command The new command 98 */ 99 void setDrawCommandAt(int index, SkDrawCommand* command); 100 101 /** 102 Returns information about the command at the given index. 103 @param index The index of the command 104 */ 105 SkTDArray<SkString*>* getCommandInfo(int index); 106 107 /** 108 Returns the visibility of the command at the given index. 109 @param index The index of the command 110 */ 111 bool getDrawCommandVisibilityAt(int index); 112 113 /** 114 Returns the vector of draw commands 115 */ 116 SK_ATTR_DEPRECATED("please use getDrawCommandAt and getSize instead") 117 const SkTDArray<SkDrawCommand*>& getDrawCommands() const; 118 119 /** 120 Returns the vector of draw commands. Do not use this entry 121 point - it is going away! 122 */ 123 SkTDArray<SkDrawCommand*>& getDrawCommands(); 124 125 /** 126 * Returns the string vector of draw commands 127 */ 128 SkTArray<SkString>* getDrawCommandsAsStrings() const; 129 130 /** 131 * Returns an array containing an offset (in the SkPicture) for each command 132 */ 133 SkTDArray<size_t>* getDrawCommandOffsets() const; 134 135 /** 136 Returns length of draw command vector. 137 */ getSize()138 int getSize() const { 139 return fCommandVector.count(); 140 } 141 142 /** 143 Toggles the visibility / execution of the draw command at index i with 144 the value of toggle. 145 */ 146 void toggleCommand(int index, bool toggle); 147 setWindowSize(int width,int height)148 void setWindowSize(int width, int height) { fWindowSize.set(width, height); } 149 setUserMatrix(SkMatrix matrix)150 void setUserMatrix(SkMatrix matrix) { 151 fUserMatrix = matrix; 152 } 153 clipStackData()154 SkString clipStackData() const { return fClipStackData; } 155 156 //////////////////////////////////////////////////////////////////////////////// 157 // Inherited from SkCanvas 158 //////////////////////////////////////////////////////////////////////////////// 159 160 virtual void clear(SkColor) SK_OVERRIDE; 161 162 virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, 163 const SkPaint*) SK_OVERRIDE; 164 165 virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src, 166 const SkRect& dst, const SkPaint* paint, 167 DrawBitmapRectFlags flags) SK_OVERRIDE; 168 169 virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 170 const SkPaint*) SK_OVERRIDE; 171 172 virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 173 const SkRect& dst, const SkPaint*) SK_OVERRIDE; 174 175 virtual void drawData(const void*, size_t) SK_OVERRIDE; 176 177 virtual void beginCommentGroup(const char* description) SK_OVERRIDE; 178 179 virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE; 180 181 virtual void endCommentGroup() SK_OVERRIDE; 182 183 virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE; 184 185 virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE; 186 187 virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE; 188 189 virtual void drawPoints(PointMode, size_t count, const SkPoint pts[], 190 const SkPaint&) SK_OVERRIDE; 191 192 virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE; 193 194 virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE; 195 196 virtual void drawSprite(const SkBitmap&, int left, int top, 197 const SkPaint*) SK_OVERRIDE; 198 199 virtual void drawVertices(VertexMode, int vertexCount, 200 const SkPoint vertices[], const SkPoint texs[], 201 const SkColor colors[], SkXfermode*, 202 const uint16_t indices[], int indexCount, 203 const SkPaint&) SK_OVERRIDE; 204 205 static const int kVizImageHeight = 256; 206 static const int kVizImageWidth = 256; 207 isClipEmpty()208 virtual bool isClipEmpty() const SK_OVERRIDE { return false; } isClipRect()209 virtual bool isClipRect() const SK_OVERRIDE { return true; } getClipBounds(SkRect * bounds)210 virtual bool getClipBounds(SkRect* bounds) const SK_OVERRIDE { 211 if (bounds) { 212 bounds->setXYWH(0, 0, 213 SkIntToScalar(this->imageInfo().width()), 214 SkIntToScalar(this->imageInfo().height())); 215 } 216 return true; 217 } getClipDeviceBounds(SkIRect * bounds)218 virtual bool getClipDeviceBounds(SkIRect* bounds) const SK_OVERRIDE { 219 if (bounds) { 220 bounds->setLargest(); 221 } 222 return true; 223 } 224 225 protected: 226 virtual void willSave() SK_OVERRIDE; 227 virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE; 228 virtual void willRestore() SK_OVERRIDE; 229 230 virtual void didConcat(const SkMatrix&) SK_OVERRIDE; 231 virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE; 232 233 virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE; 234 virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 235 const SkPaint&) SK_OVERRIDE; 236 virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 237 const SkPaint&) SK_OVERRIDE; 238 virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 239 SkScalar constY, const SkPaint&) SK_OVERRIDE; 240 virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 241 const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE; 242 virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, 243 const SkPaint& paint) SK_OVERRIDE; 244 virtual void onPushCull(const SkRect& cullRect) SK_OVERRIDE; 245 virtual void onPopCull() SK_OVERRIDE; 246 247 virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 248 virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 249 virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 250 virtual void onClipRegion(const SkRegion& region, SkRegion::Op) SK_OVERRIDE; 251 252 virtual void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) SK_OVERRIDE; 253 254 void markActiveCommands(int index); 255 256 private: 257 SkTDArray<SkDrawCommand*> fCommandVector; 258 SkPicture* fPicture; 259 SkISize fWindowSize; 260 bool fFilter; 261 bool fMegaVizMode; 262 int fIndex; 263 SkMatrix fUserMatrix; 264 SkMatrix fMatrix; 265 SkIRect fClip; 266 267 SkString fClipStackData; 268 bool fCalledAddStackData; 269 SkPath fSaveDevPath; 270 271 bool fOverdrawViz; 272 SkDrawFilter* fOverdrawFilter; 273 274 bool fOverrideTexFiltering; 275 SkTexOverrideFilter* fTexOverrideFilter; 276 277 /** 278 Number of unmatched save() calls at any point during a draw. 279 If there are any saveLayer() calls outstanding, we need to resolve 280 all of them, which in practice means resolving all save() calls, 281 to avoid corruption of our canvas. 282 */ 283 int fOutstandingSaveCount; 284 285 /** 286 The active saveLayer commands at a given point in the renderering. 287 Only used when "mega" visualization is enabled. 288 */ 289 SkTDArray<SkDrawCommand*> fActiveLayers; 290 291 /** 292 The active cull commands at a given point in the rendering. 293 Only used when "mega" visualization is enabled. 294 */ 295 SkTDArray<SkDrawCommand*> fActiveCulls; 296 297 /** 298 Adds the command to the classes vector of commands. 299 @param command The draw command for execution 300 */ 301 void addDrawCommand(SkDrawCommand* command); 302 303 /** 304 Applies any panning and zooming the user has specified before 305 drawing anything else into the canvas. 306 */ 307 void applyUserTransform(SkCanvas* canvas); 308 getOpID()309 size_t getOpID() const { 310 #if 0 311 if (fPicture) { 312 return fPicture->EXPERIMENTAL_curOpID(); 313 } 314 #endif 315 return 0; 316 } 317 resetClipStackData()318 void resetClipStackData() { fClipStackData.reset(); fCalledAddStackData = false; } 319 320 void addClipStackData(const SkPath& devPath, const SkPath& operand, SkRegion::Op elementOp); 321 void addPathData(const SkPath& path, const char* pathName); 322 bool lastClipStackData(const SkPath& devPath); 323 void outputConicPoints(const SkPoint* pts, SkScalar weight); 324 void outputPoints(const SkPoint* pts, int count); 325 void outputPointsCommon(const SkPoint* pts, int count); 326 void outputScalar(SkScalar num); 327 328 typedef SkCanvas INHERITED; 329 }; 330 331 #endif 332