SkDebugCanvas.h revision 945ec3a2bec668ca845071a65df8ec55e8f43819
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    bool getMegaVizMode() const { return fMegaVizMode; }
30
31    /**
32     * Enable or disable overdraw visualization
33     */
34    void setOverdrawViz(bool overdrawViz) { fOverdrawViz = overdrawViz; }
35    bool getOverdrawViz() const { return fOverdrawViz; }
36
37    void setOutstandingSaveCount(int saveCount) { fOutstandingSaveCount = saveCount; }
38    int getOutstandingSaveCount() const { return fOutstandingSaveCount; }
39
40    void setPicture(SkPicture* picture) { fPicture = picture; }
41
42    /**
43     * Enable or disable texure filtering override
44     */
45    void overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level);
46
47    /**
48        Executes all draw calls to the canvas.
49        @param canvas  The canvas being drawn to
50     */
51    void draw(SkCanvas* canvas);
52
53    /**
54        Executes the draw calls up to the specified index.
55        @param canvas  The canvas being drawn to
56        @param index  The index of the final command being executed
57     */
58    void drawTo(SkCanvas* canvas, int index);
59
60    /**
61        Returns the most recently calculated transformation matrix
62     */
63    const SkMatrix& getCurrentMatrix() {
64        return fMatrix;
65    }
66
67    /**
68        Returns the most recently calculated clip
69     */
70    const SkIRect& getCurrentClip() {
71        return fClip;
72    }
73
74    /**
75        Returns the index of the last draw command to write to the pixel at (x,y)
76     */
77    int getCommandAtPoint(int x, int y, int index);
78
79    /**
80        Removes the command at the specified index
81        @param index  The index of the command to delete
82     */
83    void deleteDrawCommandAt(int index);
84
85    /**
86        Returns the draw command at the given index.
87        @param index  The index of the command
88     */
89    SkDrawCommand* getDrawCommandAt(int index);
90
91    /**
92        Sets the draw command for a given index.
93        @param index  The index to overwrite
94        @param command The new command
95     */
96    void setDrawCommandAt(int index, SkDrawCommand* command);
97
98    /**
99        Returns information about the command at the given index.
100        @param index  The index of the command
101     */
102    SkTDArray<SkString*>* getCommandInfo(int index);
103
104    /**
105        Returns the visibility of the command at the given index.
106        @param index  The index of the command
107     */
108    bool getDrawCommandVisibilityAt(int index);
109
110    /**
111        Returns the vector of draw commands
112     */
113    SK_ATTR_DEPRECATED("please use getDrawCommandAt and getSize instead")
114    const SkTDArray<SkDrawCommand*>& getDrawCommands() const;
115
116    /**
117        Returns the vector of draw commands. Do not use this entry
118        point - it is going away!
119     */
120    SkTDArray<SkDrawCommand*>& getDrawCommands();
121
122    /**
123     * Returns the string vector of draw commands
124     */
125    SkTArray<SkString>* getDrawCommandsAsStrings() const;
126
127    /**
128     * Returns an array containing an offset (in the SkPicture) for each command
129     */
130    SkTDArray<size_t>* getDrawCommandOffsets() const;
131
132    /**
133        Returns length of draw command vector.
134     */
135    int getSize() const {
136        return fCommandVector.count();
137    }
138
139    /**
140        Toggles the visibility / execution of the draw command at index i with
141        the value of toggle.
142     */
143    void toggleCommand(int index, bool toggle);
144
145    void setBounds(int width, int height) {
146        fWidth = width;
147        fHeight = height;
148    }
149
150    void setUserMatrix(SkMatrix matrix) {
151        fUserMatrix = matrix;
152    }
153
154////////////////////////////////////////////////////////////////////////////////
155// Inherited from SkCanvas
156////////////////////////////////////////////////////////////////////////////////
157
158    virtual void clear(SkColor) 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 drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
186
187    virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
188
189    virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
190                            const SkPaint&) SK_OVERRIDE;
191
192    virtual void drawPosText(const void* text, size_t byteLength,
193                             const SkPoint pos[], const SkPaint&) SK_OVERRIDE;
194
195    virtual void drawPosTextH(const void* text, size_t byteLength,
196                              const SkScalar xpos[], SkScalar constY,
197                              const SkPaint&) SK_OVERRIDE;
198
199    virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
200
201    virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
202
203    virtual void drawSprite(const SkBitmap&, int left, int top,
204                            const SkPaint*) SK_OVERRIDE;
205
206    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
207                          SkScalar y, const SkPaint&) SK_OVERRIDE;
208
209    virtual void drawTextOnPath(const void* text, size_t byteLength,
210                                const SkPath& path, const SkMatrix* matrix,
211                                const SkPaint&) SK_OVERRIDE;
212
213    virtual void drawVertices(VertexMode, int vertexCount,
214                              const SkPoint vertices[], const SkPoint texs[],
215                              const SkColor colors[], SkXfermode*,
216                              const uint16_t indices[], int indexCount,
217                              const SkPaint&) SK_OVERRIDE;
218
219    static const int kVizImageHeight = 256;
220    static const int kVizImageWidth = 256;
221
222    virtual bool isClipEmpty() const SK_OVERRIDE { return false; }
223    virtual bool isClipRect() const SK_OVERRIDE { return true; }
224#ifdef SK_SUPPORT_LEGACY_GETCLIPTYPE
225    virtual ClipType getClipType() const SK_OVERRIDE {
226        return kRect_ClipType;
227    }
228#endif
229    virtual bool getClipBounds(SkRect* bounds) const SK_OVERRIDE {
230        if (NULL != bounds) {
231            bounds->setXYWH(0, 0,
232                            SkIntToScalar(this->imageInfo().fWidth),
233                            SkIntToScalar(this->imageInfo().fHeight));
234        }
235        return true;
236    }
237    virtual bool getClipDeviceBounds(SkIRect* bounds) const SK_OVERRIDE {
238        if (NULL != bounds) {
239            bounds->setLargest();
240        }
241        return true;
242    }
243
244protected:
245    virtual void willSave(SaveFlags) SK_OVERRIDE;
246    virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
247    virtual void willRestore() SK_OVERRIDE;
248
249    virtual void didConcat(const SkMatrix&) SK_OVERRIDE;
250    virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE;
251
252    virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
253    virtual void onPushCull(const SkRect& cullRect) SK_OVERRIDE;
254    virtual void onPopCull() SK_OVERRIDE;
255
256    virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
257    virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
258    virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
259    virtual void onClipRegion(const SkRegion& region, SkRegion::Op) SK_OVERRIDE;
260
261    void markActiveCommands(int index);
262
263private:
264    SkTDArray<SkDrawCommand*> fCommandVector;
265    SkPicture* fPicture;
266    int fWidth;
267    int fHeight;
268    bool fFilter;
269    bool fMegaVizMode;
270    int fIndex;
271    SkMatrix fUserMatrix;
272    SkMatrix fMatrix;
273    SkIRect fClip;
274
275    bool fOverdrawViz;
276    SkDrawFilter* fOverdrawFilter;
277
278    bool fOverrideTexFiltering;
279    SkTexOverrideFilter* fTexOverrideFilter;
280
281    /**
282        Number of unmatched save() calls at any point during a draw.
283        If there are any saveLayer() calls outstanding, we need to resolve
284        all of them, which in practice means resolving all save() calls,
285        to avoid corruption of our canvas.
286    */
287    int fOutstandingSaveCount;
288
289    /**
290        The active saveLayer commands at a given point in the renderering.
291        Only used when "mega" visualization is enabled.
292    */
293    SkTDArray<SkDrawCommand*> fActiveLayers;
294
295    /**
296        The active cull commands at a given point in the rendering.
297        Only used when "mega" visualization is enabled.
298    */
299    SkTDArray<SkDrawCommand*> fActiveCulls;
300
301    /**
302        Adds the command to the classes vector of commands.
303        @param command  The draw command for execution
304     */
305    void addDrawCommand(SkDrawCommand* command);
306
307    /**
308        Applies any panning and zooming the user has specified before
309        drawing anything else into the canvas.
310     */
311    void applyUserTransform(SkCanvas* canvas);
312
313    size_t getOpID() const {
314        if (NULL != fPicture) {
315            return fPicture->EXPERIMENTAL_curOpID();
316        }
317        return 0;
318    }
319
320    typedef SkCanvas INHERITED;
321};
322
323#endif
324