SkDebugCanvas.h revision 44c48d062f7996b5b46917e1b312a32ad101f326
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 SkTexOverrideFilter; 20 21class SK_API SkDebugCanvas : public SkCanvas { 22public: 23 SkDebugCanvas(int width, int height); 24 virtual ~SkDebugCanvas(); 25 26 void toggleFilter(bool toggle) { fFilter = toggle; } 27 28 void setMegaVizMode(bool megaVizMode) { fMegaVizMode = megaVizMode; } 29 30 /** 31 * Enable or disable overdraw visualization 32 */ 33 void setOverdrawViz(bool overdrawViz) { fOverdrawViz = overdrawViz; } 34 35 /** 36 * Enable or disable texure filtering override 37 */ 38 void overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level); 39 40 /** 41 Executes all draw calls to the canvas. 42 @param canvas The canvas being drawn to 43 */ 44 void draw(SkCanvas* canvas); 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 */ 106 SK_ATTR_DEPRECATED("please use getDrawCommandAt and getSize instead") 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 void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, 149 const SkPaint*) SK_OVERRIDE; 150 151 virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src, 152 const SkRect& dst, const SkPaint* paint, 153 DrawBitmapRectFlags flags) SK_OVERRIDE; 154 155 virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&, 156 const SkPaint*) SK_OVERRIDE; 157 158 virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 159 const SkRect& dst, const SkPaint*) SK_OVERRIDE; 160 161 virtual void drawData(const void*, size_t) SK_OVERRIDE; 162 163 virtual void beginCommentGroup(const char* description) SK_OVERRIDE; 164 165 virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE; 166 167 virtual void endCommentGroup() SK_OVERRIDE; 168 169 virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE; 170 171 virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE; 172 173 virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE; 174 175 virtual void drawPicture(SkPicture& picture) SK_OVERRIDE; 176 177 virtual void drawPoints(PointMode, size_t count, const SkPoint pts[], 178 const SkPaint&) SK_OVERRIDE; 179 180 virtual void drawPosText(const void* text, size_t byteLength, 181 const SkPoint pos[], const SkPaint&) SK_OVERRIDE; 182 183 virtual void drawPosTextH(const void* text, size_t byteLength, 184 const SkScalar xpos[], SkScalar constY, 185 const SkPaint&) SK_OVERRIDE; 186 187 virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE; 188 189 virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE; 190 191 virtual void drawSprite(const SkBitmap&, int left, int top, 192 const SkPaint*) SK_OVERRIDE; 193 194 virtual void drawText(const void* text, size_t byteLength, SkScalar x, 195 SkScalar y, const SkPaint&) SK_OVERRIDE; 196 197 virtual void drawTextOnPath(const void* text, size_t byteLength, 198 const SkPath& path, const SkMatrix* matrix, 199 const SkPaint&) SK_OVERRIDE; 200 201 virtual void drawVertices(VertexMode, int vertexCount, 202 const SkPoint vertices[], const SkPoint texs[], 203 const SkColor colors[], SkXfermode*, 204 const uint16_t indices[], int indexCount, 205 const SkPaint&) SK_OVERRIDE; 206 207 static const int kVizImageHeight = 256; 208 static const int kVizImageWidth = 256; 209 210 virtual bool isClipEmpty() const SK_OVERRIDE { return false; } 211 virtual bool isClipRect() const SK_OVERRIDE { return true; } 212#ifdef SK_SUPPORT_LEGACY_GETCLIPTYPE 213 virtual ClipType getClipType() const SK_OVERRIDE { 214 return kRect_ClipType; 215 } 216#endif 217 virtual bool getClipBounds(SkRect* bounds) const SK_OVERRIDE { 218 if (NULL != bounds) { 219 bounds->setXYWH(0, 0, 220 SkIntToScalar(this->imageInfo().fWidth), 221 SkIntToScalar(this->imageInfo().fHeight)); 222 } 223 return true; 224 } 225 virtual bool getClipDeviceBounds(SkIRect* bounds) const SK_OVERRIDE { 226 if (NULL != bounds) { 227 bounds->setLargest(); 228 } 229 return true; 230 } 231 232protected: 233 virtual void willSave(SaveFlags) SK_OVERRIDE; 234 virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE; 235 virtual void willRestore() SK_OVERRIDE; 236 237 virtual void didTranslate(SkScalar, SkScalar) SK_OVERRIDE; 238 virtual void didScale(SkScalar, SkScalar) SK_OVERRIDE; 239 virtual void didRotate(SkScalar) SK_OVERRIDE; 240 virtual void didSkew(SkScalar, SkScalar) SK_OVERRIDE; 241 virtual void didConcat(const SkMatrix&) SK_OVERRIDE; 242 virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE; 243 244 virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE; 245 virtual void onPushCull(const SkRect& cullRect) SK_OVERRIDE; 246 virtual void onPopCull() SK_OVERRIDE; 247 248 virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 249 virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 250 virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 251 virtual void onClipRegion(const SkRegion& region, SkRegion::Op) SK_OVERRIDE; 252 253 void markActiveCommands(int index); 254 255private: 256 SkTDArray<SkDrawCommand*> fCommandVector; 257 int fWidth; 258 int fHeight; 259 bool fFilter; 260 bool fMegaVizMode; 261 int fIndex; 262 SkMatrix fUserMatrix; 263 SkMatrix fMatrix; 264 SkIRect fClip; 265 266 bool fOverdrawViz; 267 SkDrawFilter* fOverdrawFilter; 268 269 bool fOverrideTexFiltering; 270 SkTexOverrideFilter* fTexOverrideFilter; 271 272 /** 273 Number of unmatched save() calls at any point during a draw. 274 If there are any saveLayer() calls outstanding, we need to resolve 275 all of them, which in practice means resolving all save() calls, 276 to avoid corruption of our canvas. 277 */ 278 int fOutstandingSaveCount; 279 280 /** 281 The active saveLayer commands at a given point in the renderering. 282 Only used when "mega" visualization is enabled. 283 */ 284 SkTDArray<SkDrawCommand*> fActiveLayers; 285 286 /** 287 The active cull commands at a given point in the rendering. 288 Only used when "mega" visualization is enabled. 289 */ 290 SkTDArray<SkDrawCommand*> fActiveCulls; 291 292 /** 293 Adds the command to the classes vector of commands. 294 @param command The draw command for execution 295 */ 296 void addDrawCommand(SkDrawCommand* command); 297 298 /** 299 Applies any panning and zooming the user has specified before 300 drawing anything else into the canvas. 301 */ 302 void applyUserTransform(SkCanvas* canvas); 303 304 typedef SkCanvas INHERITED; 305}; 306 307#endif 308