Home | History | Annotate | Download | only in debugger
      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 
     19 class SK_API SkDebugCanvas : public SkCanvas {
     20 public:
     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*) SK_OVERRIDE;
    165 
    166     virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
    167                                   const SkPaint*) SK_OVERRIDE;
    168 
    169     virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
    170                                 const SkRect& dst, const SkPaint*) SK_OVERRIDE;
    171 
    172     virtual void drawData(const void*, size_t) SK_OVERRIDE;
    173 
    174     virtual void beginCommentGroup(const char* description) SK_OVERRIDE;
    175 
    176     virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
    177 
    178     virtual void endCommentGroup() SK_OVERRIDE;
    179 
    180     virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE;
    181 
    182     virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
    183 
    184     virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
    185 
    186     virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
    187 
    188     virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
    189                             const SkPaint&) SK_OVERRIDE;
    190 
    191     virtual void drawPosText(const void* text, size_t byteLength,
    192                              const SkPoint pos[], const SkPaint&) SK_OVERRIDE;
    193 
    194     virtual void drawPosTextH(const void* text, size_t byteLength,
    195                               const SkScalar xpos[], SkScalar constY,
    196                               const SkPaint&) SK_OVERRIDE;
    197 
    198     virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
    199 
    200     virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
    201 
    202     virtual void drawSprite(const SkBitmap&, int left, int top,
    203                             const SkPaint*) SK_OVERRIDE;
    204 
    205     virtual void drawText(const void* text, size_t byteLength, SkScalar x,
    206                           SkScalar y, const SkPaint&) SK_OVERRIDE;
    207 
    208     virtual void drawTextOnPath(const void* text, size_t byteLength,
    209                                 const SkPath& path, const SkMatrix* matrix,
    210                                 const SkPaint&) SK_OVERRIDE;
    211 
    212     virtual void drawVertices(VertexMode, int vertexCount,
    213                               const SkPoint vertices[], const SkPoint texs[],
    214                               const SkColor colors[], SkXfermode*,
    215                               const uint16_t indices[], int indexCount,
    216                               const SkPaint&) SK_OVERRIDE;
    217 
    218     virtual void restore() SK_OVERRIDE;
    219 
    220     virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
    221 
    222     virtual int save(SaveFlags) SK_OVERRIDE;
    223 
    224     virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
    225 
    226     virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
    227 
    228     virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
    229 
    230     virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
    231 
    232     virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
    233 
    234     static const int kVizImageHeight = 256;
    235     static const int kVizImageWidth = 256;
    236 
    237 private:
    238     SkTDArray<SkDrawCommand*> fCommandVector;
    239     int fHeight;
    240     int fWidth;
    241     SkBitmap fBm;
    242     bool fFilter;
    243     int fIndex;
    244     SkMatrix fUserMatrix;
    245     SkMatrix fMatrix;
    246     SkIRect fClip;
    247     bool fOverdrawViz;
    248     SkDrawFilter* fOverdrawFilter;
    249 
    250     /**
    251         Number of unmatched save() calls at any point during a draw.
    252         If there are any saveLayer() calls outstanding, we need to resolve
    253         all of them, which in practice means resolving all save() calls,
    254         to avoid corruption of our canvas.
    255     */
    256     int fOutstandingSaveCount;
    257 
    258     /**
    259         Adds the command to the classes vector of commands.
    260         @param command  The draw command for execution
    261      */
    262     void addDrawCommand(SkDrawCommand* command);
    263 
    264     /**
    265         Applies any panning and zooming the user has specified before
    266         drawing anything else into the canvas.
    267      */
    268     void applyUserTransform(SkCanvas* canvas);
    269 
    270     typedef SkCanvas INHERITED;
    271 };
    272 
    273 #endif
    274