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