SkDebugCanvas.h revision 521a46750d87d3d206617d05d917ad6aad242ca4
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 "SkPicture.h" 16#include "SkTArray.h" 17#include "SkString.h" 18 19class SK_API SkDebugCanvas : public SkCanvas { 20public: 21 SkDebugCanvas(int width, int height); 22 virtual ~SkDebugCanvas(); 23 24 void toggleFilter(bool toggle); 25 26 /** 27 * Enable or disable overdraw visualization 28 */ 29 void setOverdrawViz(bool overdrawViz) { fOverdrawViz = overdrawViz; } 30 31 /** 32 Executes all draw calls to the canvas. 33 @param canvas The canvas being drawn to 34 */ 35 void draw(SkCanvas* canvas); 36 37 /** 38 Executes the draw calls in the specified range. 39 @param canvas The canvas being drawn to 40 @param i The beginning of the range 41 @param j The end of the range 42 TODO(chudy): Implement 43 */ 44 void drawRange(SkCanvas* canvas, int i, int j); 45 46 /** 47 Executes the draw calls up to the specified index. 48 @param canvas The canvas being drawn to 49 @param index The index of the final command being executed 50 */ 51 void drawTo(SkCanvas* canvas, int index); 52 53 /** 54 Returns the most recently calculated transformation matrix 55 */ 56 const SkMatrix& getCurrentMatrix() { 57 return fMatrix; 58 } 59 60 /** 61 Returns the most recently calculated clip 62 */ 63 const SkIRect& getCurrentClip() { 64 return fClip; 65 } 66 67 /** 68 Returns the index of the last draw command to write to the pixel at (x,y) 69 */ 70 int getCommandAtPoint(int x, int y, int index); 71 72 /** 73 Removes the command at the specified index 74 @param index The index of the command to delete 75 */ 76 void deleteDrawCommandAt(int index); 77 78 /** 79 Returns the draw command at the given index. 80 @param index The index of the command 81 */ 82 SkDrawCommand* getDrawCommandAt(int index); 83 84 /** 85 Sets the draw command for a given index. 86 @param index The index to overwrite 87 @param command The new command 88 */ 89 void setDrawCommandAt(int index, SkDrawCommand* command); 90 91 /** 92 Returns information about the command at the given index. 93 @param index The index of the command 94 */ 95 SkTDArray<SkString*>* getCommandInfo(int index); 96 97 /** 98 Returns the visibility of the command at the given index. 99 @param index The index of the command 100 */ 101 bool getDrawCommandVisibilityAt(int index); 102 103 /** 104 Returns the vector of draw commands 105 DEPRECATED: please use getDrawCommandAt and getSize instead 106 */ 107 const SkTDArray<SkDrawCommand*>& getDrawCommands() const; 108 109 /** 110 Returns the vector of draw commands. Do not use this entry 111 point - it is going away! 112 */ 113 SkTDArray<SkDrawCommand*>& getDrawCommands(); 114 115 /** 116 * Returns the string vector of draw commands 117 */ 118 SkTArray<SkString>* getDrawCommandsAsStrings() const; 119 120 /** 121 Returns length of draw command vector. 122 */ 123 int getSize() const { 124 return fCommandVector.count(); 125 } 126 127 /** 128 Toggles the visibility / execution of the draw command at index i with 129 the value of toggle. 130 */ 131 void toggleCommand(int index, bool toggle); 132 133 void setBounds(int width, int height) { 134 fWidth = width; 135 fHeight = height; 136 } 137 138 void setUserMatrix(SkMatrix matrix) { 139 fUserMatrix = matrix; 140 } 141 142//////////////////////////////////////////////////////////////////////////////// 143// Inherited from SkCanvas 144//////////////////////////////////////////////////////////////////////////////// 145 146 virtual void clear(SkColor) SK_OVERRIDE; 147 148 virtual bool clipPath(const SkPath&, SkRegion::Op, bool) SK_OVERRIDE; 149 150 virtual bool clipRect(const SkRect&, SkRegion::Op, bool) SK_OVERRIDE; 151 152 virtual bool clipRRect(const SkRRect& rrect, 153 SkRegion::Op op = SkRegion::kIntersect_Op, 154 bool doAntiAlias = false) SK_OVERRIDE; 155 156 virtual bool clipRegion(const SkRegion& region, SkRegion::Op op) SK_OVERRIDE; 157 158 virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE; 159 160 virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, 161 const SkPaint*) SK_OVERRIDE; 162 163 virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src, 164 const SkRect& dst, const SkPaint* paint, 165 DrawBitmapRectFlags flags) SK_OVERRIDE; 166 167 virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 168 const SkPaint*) SK_OVERRIDE; 169 170 virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 171 const SkRect& dst, const SkPaint*) SK_OVERRIDE; 172 173 virtual void drawData(const void*, size_t) SK_OVERRIDE; 174 175 virtual void beginCommentGroup(const char* description) SK_OVERRIDE; 176 177 virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE; 178 179 virtual void endCommentGroup() SK_OVERRIDE; 180 181 virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE; 182 183 virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE; 184 185 virtual void drawPicture(SkPicture& picture) SK_OVERRIDE; 186 187 virtual void drawPoints(PointMode, size_t count, const SkPoint pts[], 188 const SkPaint&) SK_OVERRIDE; 189 190 virtual void drawPosText(const void* text, size_t byteLength, 191 const SkPoint pos[], const SkPaint&) SK_OVERRIDE; 192 193 virtual void drawPosTextH(const void* text, size_t byteLength, 194 const SkScalar xpos[], SkScalar constY, 195 const SkPaint&) SK_OVERRIDE; 196 197 virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE; 198 199 virtual void drawSprite(const SkBitmap&, int left, int top, 200 const SkPaint*) SK_OVERRIDE; 201 202 virtual void drawText(const void* text, size_t byteLength, SkScalar x, 203 SkScalar y, const SkPaint&) SK_OVERRIDE; 204 205 virtual void drawTextOnPath(const void* text, size_t byteLength, 206 const SkPath& path, const SkMatrix* matrix, 207 const SkPaint&) SK_OVERRIDE; 208 209 virtual void drawVertices(VertexMode, int vertexCount, 210 const SkPoint vertices[], const SkPoint texs[], 211 const SkColor colors[], SkXfermode*, 212 const uint16_t indices[], int indexCount, 213 const SkPaint&) SK_OVERRIDE; 214 215 virtual void restore() SK_OVERRIDE; 216 217 virtual bool rotate(SkScalar degrees) SK_OVERRIDE; 218 219 virtual int save(SaveFlags) SK_OVERRIDE; 220 221 virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE; 222 223 virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE; 224 225 virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE; 226 227 virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE; 228 229 virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE; 230 231 static const int kVizImageHeight = 256; 232 static const int kVizImageWidth = 256; 233 234protected: 235 virtual void onDrawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE; 236 237 virtual void onDrawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE; 238 239private: 240 SkTDArray<SkDrawCommand*> fCommandVector; 241 int fHeight; 242 int fWidth; 243 SkBitmap fBm; 244 bool fFilter; 245 int fIndex; 246 SkMatrix fUserMatrix; 247 SkMatrix fMatrix; 248 SkIRect fClip; 249 bool fOverdrawViz; 250 SkDrawFilter* fOverdrawFilter; 251 252 /** 253 Number of unmatched save() calls at any point during a draw. 254 If there are any saveLayer() calls outstanding, we need to resolve 255 all of them, which in practice means resolving all save() calls, 256 to avoid corruption of our canvas. 257 */ 258 int fOutstandingSaveCount; 259 260 /** 261 Adds the command to the classes vector of commands. 262 @param command The draw command for execution 263 */ 264 void addDrawCommand(SkDrawCommand* command); 265 266 /** 267 Applies any panning and zooming the user has specified before 268 drawing anything else into the canvas. 269 */ 270 void applyUserTransform(SkCanvas* canvas); 271 272 typedef SkCanvas INHERITED; 273}; 274 275#endif 276