Coverage Report

Created: 2024-05-20 07:14

/src/skia/tools/debugger/DebugCanvas.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2012 Google Inc.
3
 *
4
 * Use of this source code is governed by a BSD-style license that can be
5
 * found in the LICENSE file.
6
 */
7
8
#ifndef SKDEBUGCANVAS_H_
9
#define SKDEBUGCANVAS_H_
10
11
#include "include/core/SkCanvas.h"
12
#include "include/core/SkCanvasVirtualEnforcer.h"
13
#include "include/core/SkColor.h"
14
#include "include/core/SkM44.h"
15
#include "include/core/SkRect.h"
16
#include "include/core/SkRefCnt.h"
17
#include "include/core/SkSamplingOptions.h"
18
#include "include/core/SkScalar.h"
19
#include "include/core/SkTypes.h"
20
#include "include/private/base/SkTDArray.h"
21
22
#include <cstddef>
23
#include <map>
24
#include <vector>
25
26
class DebugLayerManager;
27
class DrawCommand;
28
class GrAuditTrail;
29
class SkData;
30
class SkDrawable;
31
class SkImage;
32
class SkJSONWriter;
33
class SkMatrix;
34
class SkPaint;
35
class SkPath;
36
class SkPicture;
37
class SkRRect;
38
class SkRegion;
39
class SkShader;
40
class SkTextBlob;
41
class SkVertices;
42
class UrlDataManager;
43
enum class SkBlendMode;
44
enum class SkClipOp;
45
struct SkDrawShadowRec;
46
struct SkPoint;
47
struct SkRSXform;
48
49
class DebugCanvas : public SkCanvasVirtualEnforcer<SkCanvas> {
50
public:
51
    DebugCanvas(int width, int height);
52
53
    DebugCanvas(SkIRect bounds);
54
55
    ~DebugCanvas() override;
56
57
    /**
58
     * Provide a DebugLayerManager for mskp files containing layer information
59
     * when set this DebugCanvas will attempt to parse layer info from annotations.
60
     * it will store layer pictures to the layer manager, and interpret some drawImageRects
61
     * as layer draws, deferring to the layer manager for images.
62
     * Provide a frame number that will be passed to all layer manager functions to identify this
63
     * DebugCanvas.
64
     *
65
     * Used only in wasm debugger animations.
66
     */
67
0
    void setLayerManagerAndFrame(DebugLayerManager* lm, int frame) {
68
0
        fLayerManager = lm;
69
0
        fFrame = frame;
70
0
    }
71
72
    /**
73
     * Enable or disable overdraw visualization
74
     */
75
    void setOverdrawViz(bool overdrawViz);
76
77
0
    bool getOverdrawViz() const { return fOverdrawViz; }
78
79
    /**
80
     * Set the color of the clip visualization. An alpha of zero renders the clip invisible.
81
     */
82
0
    void setClipVizColor(SkColor clipVizColor) { this->fClipVizColor = clipVizColor; }
83
84
0
    void setAndroidClipViz(bool enable) { this->fShowAndroidClip = enable; }
85
86
0
    void setOriginVisible(bool enable) { this->fShowOrigin = enable; }
87
88
0
    void setDrawGpuOpBounds(bool drawGpuOpBounds) { fDrawGpuOpBounds = drawGpuOpBounds; }
89
90
0
    bool getDrawGpuOpBounds() const { return fDrawGpuOpBounds; }
91
92
    /**
93
        Executes all draw calls to the canvas.
94
        @param canvas  The canvas being drawn to
95
     */
96
    void draw(SkCanvas* canvas);
97
98
    /**
99
        Executes the draw calls up to the specified index.
100
        Does not clear the canvas to transparent black first,
101
        if needed, caller should do that first.
102
        @param canvas  The canvas being drawn to
103
        @param index  The index of the final command being executed
104
        @param m an optional Mth gpu op to highlight, or -1
105
     */
106
    void drawTo(SkCanvas* canvas, int index, int m = -1);
107
108
    /**
109
        Returns the most recently calculated transformation matrix
110
     */
111
0
    const SkM44& getCurrentMatrix() { return fMatrix; }
112
113
    /**
114
        Returns the most recently calculated clip
115
     */
116
0
    const SkIRect& getCurrentClip() { return fClip; }
117
118
    /**
119
        Removes the command at the specified index
120
        @param index  The index of the command to delete
121
     */
122
    void deleteDrawCommandAt(int index);
123
124
    /**
125
        Returns the draw command at the given index.
126
        @param index  The index of the command
127
     */
128
    DrawCommand* getDrawCommandAt(int index) const;
129
130
    /**
131
        Returns length of draw command vector.
132
     */
133
0
    int getSize() const { return fCommandVector.size(); }
134
135
    /**
136
        Toggles the visibility / execution of the draw command at index i with
137
        the value of toggle.
138
     */
139
    void toggleCommand(int index, bool toggle);
140
141
    /**
142
        Returns a JSON object representing all commands in the picture.
143
        The encoder may use the UrlDataManager to store binary data such
144
        as images, referring to them via URLs embedded in the JSON.
145
     */
146
    void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager, SkCanvas*);
147
148
    void toJSONOpsTask(SkJSONWriter& writer, SkCanvas*);
149
150
0
    void detachCommands(SkTDArray<DrawCommand*>* dst) { fCommandVector.swap(*dst); }
151
152
    /**
153
        Returns a map from image IDs to command indices where they are used.
154
     */
155
    std::map<int, std::vector<int>> getImageIdToCommandMap(UrlDataManager& udm) const;
156
157
protected:
158
    void              willSave() override;
159
    SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override;
160
    bool              onDoSaveBehind(const SkRect*) override;
161
    void              willRestore() override;
162
163
    void didConcat44(const SkM44&) override;
164
    void didSetM44(const SkM44&) override;
165
    void didScale(SkScalar, SkScalar) override;
166
    void didTranslate(SkScalar, SkScalar) override;
167
168
    void onDrawAnnotation(const SkRect&, const char[], SkData*) override;
169
    void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
170
    void onDrawTextBlob(const SkTextBlob* blob,
171
                        SkScalar          x,
172
                        SkScalar          y,
173
                        const SkPaint&    paint) override;
174
175
    void onDrawPatch(const SkPoint cubics[12],
176
                     const SkColor colors[4],
177
                     const SkPoint texCoords[4],
178
                     SkBlendMode,
179
                     const SkPaint& paint) override;
180
    void onDrawPaint(const SkPaint&) override;
181
    void onDrawBehind(const SkPaint&) override;
182
183
    void onDrawRect(const SkRect&, const SkPaint&) override;
184
    void onDrawOval(const SkRect&, const SkPaint&) override;
185
    void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) override;
186
    void onDrawRRect(const SkRRect&, const SkPaint&) override;
187
    void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
188
    void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override;
189
    void onDrawPath(const SkPath&, const SkPaint&) override;
190
    void onDrawRegion(const SkRegion&, const SkPaint&) override;
191
192
    void onDrawImage2(const SkImage*, SkScalar, SkScalar, const SkSamplingOptions&,
193
                      const SkPaint*) override;
194
    void onDrawImageRect2(const SkImage*, const SkRect&, const SkRect&, const SkSamplingOptions&,
195
                          const SkPaint*, SrcRectConstraint) override;
196
    void onDrawImageLattice2(const SkImage*, const Lattice&, const SkRect&, SkFilterMode,
197
                             const SkPaint*) override;
198
    void onDrawAtlas2(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int,
199
                     SkBlendMode, const SkSamplingOptions&, const SkRect*, const SkPaint*) override;
200
201
    void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override;
202
    void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override;
203
    void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override;
204
    void onClipShader(sk_sp<SkShader>, SkClipOp) override;
205
    void onClipRegion(const SkRegion& region, SkClipOp) override;
206
    void onResetClip() override;
207
208
    void onDrawShadowRec(const SkPath&, const SkDrawShadowRec&) override;
209
    void onDrawDrawable(SkDrawable*, const SkMatrix*) override;
210
    void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override;
211
212
    void onDrawEdgeAAQuad(const SkRect&,
213
                          const SkPoint[4],
214
                          QuadAAFlags,
215
                          const SkColor4f&,
216
                          SkBlendMode) override;
217
    void onDrawEdgeAAImageSet2(const ImageSetEntry[],
218
                               int count,
219
                               const SkPoint[],
220
                               const SkMatrix[],
221
                               const SkSamplingOptions&,
222
                               const SkPaint*,
223
                               SrcRectConstraint) override;
224
225
private:
226
    SkTDArray<DrawCommand*> fCommandVector;
227
    SkM44                   fMatrix;
228
    SkIRect                 fClip;
229
230
    bool    fOverdrawViz = false;
231
    SkColor fClipVizColor;
232
    bool    fDrawGpuOpBounds = false;
233
    bool    fShowAndroidClip = false;
234
    bool    fShowOrigin = false;
235
236
    // When not negative, indicates the render node id of the layer represented by the next
237
    // drawPicture call.
238
    int         fnextDrawPictureLayerId = -1;
239
    int         fnextDrawImageRectLayerId = -1;
240
    SkIRect     fnextDrawPictureDirtyRect;
241
    // may be null, in which case layer annotations are ignored.
242
    DebugLayerManager* fLayerManager = nullptr;
243
    // May be set when DebugCanvas is used in playing back an animation.
244
    // Only used for passing to fLayerManager to identify itself.
245
    int fFrame = -1;
246
    SkRect fAndroidClip = SkRect::MakeEmpty();
247
248
    /**
249
        Adds the command to the class' vector of commands.
250
        @param command  The draw command for execution
251
     */
252
    void addDrawCommand(DrawCommand* command);
253
254
#if defined(SK_GANESH)
255
    GrAuditTrail* getAuditTrail(SkCanvas*);
256
    void drawAndCollectOps(SkCanvas*);
257
    void cleanupAuditTrail(GrAuditTrail*);
258
#endif
259
260
    using INHERITED = SkCanvasVirtualEnforcer<SkCanvas>;
261
};
262
263
#endif