SkDebugCanvas.h revision 2a67e123a3e559774a16a58cbe5106bc0fb86740
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
20class SkTexOverrideFilter;
21
22class SK_API SkDebugCanvas : public SkCanvas {
23public:
24    SkDebugCanvas(int width, int height);
25    virtual ~SkDebugCanvas();
26
27    void toggleFilter(bool toggle) { fFilter = toggle; }
28
29    void setMegaVizMode(bool megaVizMode) { fMegaVizMode = megaVizMode; }
30    bool getMegaVizMode() const { return fMegaVizMode; }
31
32    /**
33     * Enable or disable overdraw visualization
34     */
35    void setOverdrawViz(bool overdrawViz) { fOverdrawViz = overdrawViz; }
36    bool getOverdrawViz() const { return fOverdrawViz; }
37
38    void setOutstandingSaveCount(int saveCount) { fOutstandingSaveCount = saveCount; }
39    int getOutstandingSaveCount() const { return fOutstandingSaveCount; }
40
41    bool getAllowSimplifyClip() const { return fAllowSimplifyClip; }
42
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     */
66    const SkMatrix& getCurrentMatrix() {
67        return fMatrix;
68    }
69
70    /**
71        Returns the most recently calculated clip
72     */
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     */
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
148    void setBounds(int width, int height) {
149        fWidth = width;
150        fHeight = height;
151    }
152
153    void setUserMatrix(SkMatrix matrix) {
154        fUserMatrix = matrix;
155    }
156
157    SkString clipStackData() const { return fClipStackData; }
158
159////////////////////////////////////////////////////////////////////////////////
160// Inherited from SkCanvas
161////////////////////////////////////////////////////////////////////////////////
162
163    virtual void clear(SkColor) SK_OVERRIDE;
164
165    virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
166                            const SkPaint*) SK_OVERRIDE;
167
168    virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
169                                      const SkRect& dst, const SkPaint* paint,
170                                      DrawBitmapRectFlags flags) SK_OVERRIDE;
171
172    virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
173                                  const SkPaint*) SK_OVERRIDE;
174
175    virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
176                                const SkRect& dst, const SkPaint*) SK_OVERRIDE;
177
178    virtual void drawData(const void*, size_t) SK_OVERRIDE;
179
180    virtual void beginCommentGroup(const char* description) SK_OVERRIDE;
181
182    virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
183
184    virtual void endCommentGroup() SK_OVERRIDE;
185
186    virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE;
187
188    virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
189
190    virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
191
192    virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
193
194    virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
195                            const SkPaint&) SK_OVERRIDE;
196
197    virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
198
199    virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
200
201    virtual void drawSprite(const SkBitmap&, int left, int top,
202                            const SkPaint*) SK_OVERRIDE;
203
204    virtual void drawVertices(VertexMode, int vertexCount,
205                              const SkPoint vertices[], const SkPoint texs[],
206                              const SkColor colors[], SkXfermode*,
207                              const uint16_t indices[], int indexCount,
208                              const SkPaint&) SK_OVERRIDE;
209
210    static const int kVizImageHeight = 256;
211    static const int kVizImageWidth = 256;
212
213    virtual bool isClipEmpty() const SK_OVERRIDE { return false; }
214    virtual bool isClipRect() const SK_OVERRIDE { return true; }
215#ifdef SK_SUPPORT_LEGACY_GETCLIPTYPE
216    virtual ClipType getClipType() const SK_OVERRIDE {
217        return kRect_ClipType;
218    }
219#endif
220    virtual bool getClipBounds(SkRect* bounds) const SK_OVERRIDE {
221        if (NULL != bounds) {
222            bounds->setXYWH(0, 0,
223                            SkIntToScalar(this->imageInfo().fWidth),
224                            SkIntToScalar(this->imageInfo().fHeight));
225        }
226        return true;
227    }
228    virtual bool getClipDeviceBounds(SkIRect* bounds) const SK_OVERRIDE {
229        if (NULL != bounds) {
230            bounds->setLargest();
231        }
232        return true;
233    }
234
235protected:
236    virtual void willSave(SaveFlags) SK_OVERRIDE;
237    virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
238    virtual void willRestore() SK_OVERRIDE;
239
240    virtual void didConcat(const SkMatrix&) SK_OVERRIDE;
241    virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE;
242
243    virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
244    virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
245                            const SkPaint&) SK_OVERRIDE;
246    virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
247                               const SkPaint&) SK_OVERRIDE;
248    virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
249                                SkScalar constY, const SkPaint&) SK_OVERRIDE;
250    virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
251                                  const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE;
252    virtual void onPushCull(const SkRect& cullRect) SK_OVERRIDE;
253    virtual void onPopCull() SK_OVERRIDE;
254
255    virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
256    virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
257    virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
258    virtual void onClipRegion(const SkRegion& region, SkRegion::Op) SK_OVERRIDE;
259
260    void markActiveCommands(int index);
261
262private:
263    SkTDArray<SkDrawCommand*> fCommandVector;
264    SkPicture* fPicture;
265    int fWidth;
266    int fHeight;
267    bool fFilter;
268    bool fMegaVizMode;
269    int fIndex;
270    SkMatrix fUserMatrix;
271    SkMatrix fMatrix;
272    SkIRect fClip;
273
274    SkString fClipStackData;
275    bool fCalledAddStackData;
276    SkPath fSaveDevPath;
277
278    bool fOverdrawViz;
279    SkDrawFilter* fOverdrawFilter;
280
281    bool fOverrideTexFiltering;
282    SkTexOverrideFilter* fTexOverrideFilter;
283
284    /**
285        Number of unmatched save() calls at any point during a draw.
286        If there are any saveLayer() calls outstanding, we need to resolve
287        all of them, which in practice means resolving all save() calls,
288        to avoid corruption of our canvas.
289    */
290    int fOutstandingSaveCount;
291
292    /**
293        The active saveLayer commands at a given point in the renderering.
294        Only used when "mega" visualization is enabled.
295    */
296    SkTDArray<SkDrawCommand*> fActiveLayers;
297
298    /**
299        The active cull commands at a given point in the rendering.
300        Only used when "mega" visualization is enabled.
301    */
302    SkTDArray<SkDrawCommand*> fActiveCulls;
303
304    /**
305        Adds the command to the classes vector of commands.
306        @param command  The draw command for execution
307     */
308    void addDrawCommand(SkDrawCommand* command);
309
310    /**
311        Applies any panning and zooming the user has specified before
312        drawing anything else into the canvas.
313     */
314    void applyUserTransform(SkCanvas* canvas);
315
316    size_t getOpID() const {
317        if (NULL != fPicture) {
318            return fPicture->EXPERIMENTAL_curOpID();
319        }
320        return 0;
321    }
322
323    void resetClipStackData() { fClipStackData.reset(); fCalledAddStackData = false; }
324
325    void addClipStackData(const SkPath& devPath, const SkPath& operand, SkRegion::Op elementOp);
326    void addPathData(const SkPath& path, const char* pathName);
327    bool lastClipStackData(const SkPath& devPath);
328    void outputConicPoints(const SkPoint* pts, SkScalar weight);
329    void outputPoints(const SkPoint* pts, int count);
330    void outputPointsCommon(const SkPoint* pts, int count);
331    void outputScalar(SkScalar num);
332
333    typedef SkCanvas INHERITED;
334};
335
336#endif
337