blob: ac849883221661af1efbbca2c3da2f014f72d17e [file] [log] [blame]
chudy@google.com902ebe52012-06-29 14:21:22 +00001/*
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 SKDRAWCOMMAND_H_
9#define SKDRAWCOMMAND_H_
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkBitmap.h"
12#include "include/core/SkCanvas.h"
13#include "include/core/SkFlattenable.h"
14#include "include/core/SkPath.h"
15#include "include/core/SkRRect.h"
16#include "include/core/SkRSXform.h"
17#include "include/core/SkRegion.h"
18#include "include/core/SkString.h"
19#include "include/core/SkVertices.h"
20#include "include/private/SkTDArray.h"
21#include "src/core/SkDrawShadowInfo.h"
22#include "src/core/SkTLazy.h"
23#include "src/utils/SkJSONWriter.h"
24#include "tools/UrlDataManager.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000025
Nathaniel Nifong20b177a2019-12-12 11:05:10 -050026class DebugLayerManager;
27
Mike Klein8f4e2242019-03-20 11:59:00 -050028class DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +000029public:
robertphillips9bafc302015-02-13 11:13:00 -080030 enum OpType {
fmalita160ebb22015-04-01 20:58:37 -070031 kBeginDrawPicture_OpType,
Brian Osmanc25e2692018-03-12 10:57:28 -040032 kClear_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080033 kClipPath_OpType,
34 kClipRegion_OpType,
35 kClipRect_OpType,
36 kClipRRect_OpType,
Mike Reed121c2af2020-03-10 14:02:56 -040037 kClipShader_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080038 kConcat_OpType,
reed97660cc2016-06-28 18:54:19 -070039 kDrawAnnotation_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080040 kDrawBitmap_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080041 kDrawBitmapRect_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080042 kDrawDRRect_OpType,
fmalita651c9202015-07-22 10:23:01 -070043 kDrawImage_OpType,
Stan Ilievac42aeb2017-01-12 16:20:50 -050044 kDrawImageLattice_OpType,
Brian Osmanc25e2692018-03-12 10:57:28 -040045 kDrawImageNine_OpType,
fmalita651c9202015-07-22 10:23:01 -070046 kDrawImageRect_OpType,
Nathaniel Nifong20b177a2019-12-12 11:05:10 -050047 kDrawImageRectLayer_OpType, // unique to DebugCanvas
robertphillips9bafc302015-02-13 11:13:00 -080048 kDrawOval_OpType,
Brian Osmanc25e2692018-03-12 10:57:28 -040049 kDrawArc_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080050 kDrawPaint_OpType,
51 kDrawPatch_OpType,
52 kDrawPath_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080053 kDrawPoints_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080054 kDrawRect_OpType,
55 kDrawRRect_OpType,
Brian Osmanc25e2692018-03-12 10:57:28 -040056 kDrawRegion_OpType,
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -040057 kDrawShadow_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080058 kDrawTextBlob_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080059 kDrawVertices_OpType,
Brian Osman616f1cb2018-05-29 11:23:35 -040060 kDrawAtlas_OpType,
Brian Osmanc7611082018-05-29 14:55:50 -040061 kDrawDrawable_OpType,
Michael Ludwig390f0cc2019-03-19 09:16:38 -040062 kDrawEdgeAAQuad_OpType,
63 kDrawEdgeAAImageSet_OpType,
fmalita160ebb22015-04-01 20:58:37 -070064 kEndDrawPicture_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080065 kRestore_OpType,
66 kSave_OpType,
67 kSaveLayer_OpType,
68 kSetMatrix_OpType,
robertphillips72942b8e2015-02-12 06:37:12 -080069
Jim Van Verth343fe492017-05-02 16:49:24 -040070 kLast_OpType = kSetMatrix_OpType
robertphillips9bafc302015-02-13 11:13:00 -080071 };
72
73 static const int kOpTypeCount = kLast_OpType + 1;
74
Brian Osmand9ea8162018-08-08 17:03:39 -040075 static void WritePNG(SkBitmap bitmap, SkWStream& out);
ethannicholasf67531f2016-03-21 10:19:39 -070076
Mike Klein8f4e2242019-03-20 11:59:00 -050077 DrawCommand(OpType opType);
chudy@google.com902ebe52012-06-29 14:21:22 +000078
Mike Klein8f4e2242019-03-20 11:59:00 -050079 virtual ~DrawCommand() {}
chudy@google.com902ebe52012-06-29 14:21:22 +000080
Mike Klein8f4e2242019-03-20 11:59:00 -050081 bool isVisible() const { return fVisible; }
chudy@google.com0b5bbb02012-07-31 19:55:32 +000082
Mike Klein8f4e2242019-03-20 11:59:00 -050083 void setVisible(bool toggle) { fVisible = toggle; }
chudy@google.com902ebe52012-06-29 14:21:22 +000084
fmalita8c89c522014-11-08 16:18:56 -080085 virtual void execute(SkCanvas*) const = 0;
chudy@google.com902ebe52012-06-29 14:21:22 +000086
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +000087 virtual bool render(SkCanvas* canvas) const { return false; }
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +000088
Brian Osmand8a90f92019-01-28 13:41:19 -050089 virtual void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const;
ethannicholas50a8dd02016-02-10 05:40:46 -080090
robertphillips9bafc302015-02-13 11:13:00 -080091 static const char* GetCommandString(OpType type);
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +000092
joshualittbd724132016-03-03 11:39:38 -080093 // Helper methods for converting things to JSON
Brian Osmand8a90f92019-01-28 13:41:19 -050094 static void MakeJsonColor(SkJSONWriter&, const SkColor color);
95 static void MakeJsonColor4f(SkJSONWriter&, const SkColor4f& color);
96 static void MakeJsonPoint(SkJSONWriter&, const SkPoint& point);
97 static void MakeJsonPoint(SkJSONWriter&, SkScalar x, SkScalar y);
98 static void MakeJsonPoint3(SkJSONWriter&, const SkPoint3& point);
99 static void MakeJsonRect(SkJSONWriter&, const SkRect& rect);
100 static void MakeJsonIRect(SkJSONWriter&, const SkIRect&);
101 static void MakeJsonMatrix(SkJSONWriter&, const SkMatrix&);
102 static void MakeJsonPath(SkJSONWriter&, const SkPath& path);
103 static void MakeJsonRegion(SkJSONWriter&, const SkRegion& region);
104 static void MakeJsonPaint(SkJSONWriter&, const SkPaint& paint, UrlDataManager& urlDataManager);
105 static void MakeJsonLattice(SkJSONWriter&, const SkCanvas::Lattice& lattice);
brianosmanfad98562016-05-04 11:06:28 -0700106
Mike Klein8f4e2242019-03-20 11:59:00 -0500107 static void flatten(const SkFlattenable* flattenable,
108 SkJSONWriter& writer,
109 UrlDataManager& urlDataManager);
110 static bool flatten(const SkImage& image, SkJSONWriter& writer, UrlDataManager& urlDataManager);
111 static bool flatten(const SkBitmap& bitmap,
112 SkJSONWriter& writer,
brianosmanfad98562016-05-04 11:06:28 -0700113 UrlDataManager& urlDataManager);
joshualittbd724132016-03-03 11:39:38 -0800114
chudy@google.com902ebe52012-06-29 14:21:22 +0000115private:
robertphillips9bafc302015-02-13 11:13:00 -0800116 OpType fOpType;
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000117 bool fVisible;
chudy@google.com902ebe52012-06-29 14:21:22 +0000118};
119
Mike Klein17428132019-03-20 13:02:32 -0500120class RestoreCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000121public:
Mike Klein17428132019-03-20 13:02:32 -0500122 RestoreCommand();
mtklein36352bf2015-03-25 18:17:31 -0700123 void execute(SkCanvas* canvas) const override;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000124
125private:
Mike Klein8f4e2242019-03-20 11:59:00 -0500126 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000127};
128
Mike Klein17428132019-03-20 13:02:32 -0500129class ClearCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000130public:
Mike Klein17428132019-03-20 13:02:32 -0500131 ClearCommand(SkColor color);
mtklein36352bf2015-03-25 18:17:31 -0700132 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500133 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800134
chudy@google.com902ebe52012-06-29 14:21:22 +0000135private:
136 SkColor fColor;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000137
Mike Klein8f4e2242019-03-20 11:59:00 -0500138 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000139};
140
Mike Klein17428132019-03-20 13:02:32 -0500141class ClipPathCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000142public:
Mike Klein17428132019-03-20 13:02:32 -0500143 ClipPathCommand(const SkPath& path, SkClipOp op, bool doAA);
mtklein36352bf2015-03-25 18:17:31 -0700144 void execute(SkCanvas* canvas) const override;
145 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500146 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800147
chudy@google.com902ebe52012-06-29 14:21:22 +0000148private:
Mike Reedc1f77742016-12-09 09:00:50 -0500149 SkPath fPath;
150 SkClipOp fOp;
151 bool fDoAA;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000152
Mike Klein8f4e2242019-03-20 11:59:00 -0500153 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000154};
155
Mike Klein17428132019-03-20 13:02:32 -0500156class ClipRegionCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000157public:
Mike Klein17428132019-03-20 13:02:32 -0500158 ClipRegionCommand(const SkRegion& region, SkClipOp op);
mtklein36352bf2015-03-25 18:17:31 -0700159 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500160 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800161
chudy@google.com902ebe52012-06-29 14:21:22 +0000162private:
Mike Reedc1f77742016-12-09 09:00:50 -0500163 SkRegion fRegion;
164 SkClipOp fOp;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000165
Mike Klein8f4e2242019-03-20 11:59:00 -0500166 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000167};
168
Mike Klein17428132019-03-20 13:02:32 -0500169class ClipRectCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000170public:
Mike Klein17428132019-03-20 13:02:32 -0500171 ClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA);
mtklein36352bf2015-03-25 18:17:31 -0700172 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500173 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000174
chudy@google.com902ebe52012-06-29 14:21:22 +0000175private:
Mike Reedc1f77742016-12-09 09:00:50 -0500176 SkRect fRect;
177 SkClipOp fOp;
178 bool fDoAA;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000179
Mike Klein8f4e2242019-03-20 11:59:00 -0500180 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000181};
182
Mike Klein17428132019-03-20 13:02:32 -0500183class ClipRRectCommand : public DrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000184public:
Mike Klein17428132019-03-20 13:02:32 -0500185 ClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA);
mtklein36352bf2015-03-25 18:17:31 -0700186 void execute(SkCanvas* canvas) const override;
187 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500188 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000189
robertphillips@google.com67baba42013-01-02 20:20:31 +0000190private:
Mike Reedc1f77742016-12-09 09:00:50 -0500191 SkRRect fRRect;
192 SkClipOp fOp;
193 bool fDoAA;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000194
Mike Klein8f4e2242019-03-20 11:59:00 -0500195 typedef DrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000196};
197
Mike Reed121c2af2020-03-10 14:02:56 -0400198class ClipShaderCommand : public DrawCommand {
199public:
200 ClipShaderCommand(sk_sp<SkShader>, SkClipOp);
201 void execute(SkCanvas* canvas) const override;
202 bool render(SkCanvas* canvas) const override;
203 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
204
205private:
206 sk_sp<SkShader> fShader;
207 SkClipOp fOp;
208
209 typedef DrawCommand INHERITED;
210};
211
Mike Klein17428132019-03-20 13:02:32 -0500212class ConcatCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000213public:
Mike Klein17428132019-03-20 13:02:32 -0500214 ConcatCommand(const SkMatrix& matrix);
mtklein36352bf2015-03-25 18:17:31 -0700215 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500216 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800217
chudy@google.com902ebe52012-06-29 14:21:22 +0000218private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000219 SkMatrix fMatrix;
220
Mike Klein8f4e2242019-03-20 11:59:00 -0500221 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000222};
223
Mike Klein17428132019-03-20 13:02:32 -0500224class DrawAnnotationCommand : public DrawCommand {
reed97660cc2016-06-28 18:54:19 -0700225public:
Mike Klein17428132019-03-20 13:02:32 -0500226 DrawAnnotationCommand(const SkRect&, const char key[], sk_sp<SkData> value);
reed97660cc2016-06-28 18:54:19 -0700227 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500228 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
reed97660cc2016-06-28 18:54:19 -0700229
230private:
Mike Klein8f4e2242019-03-20 11:59:00 -0500231 SkRect fRect;
232 SkString fKey;
233 sk_sp<SkData> fValue;
reed97660cc2016-06-28 18:54:19 -0700234
Mike Klein8f4e2242019-03-20 11:59:00 -0500235 typedef DrawCommand INHERITED;
reed97660cc2016-06-28 18:54:19 -0700236};
237
Mike Klein17428132019-03-20 13:02:32 -0500238class DrawImageCommand : public DrawCommand {
fmalita651c9202015-07-22 10:23:01 -0700239public:
Mike Klein17428132019-03-20 13:02:32 -0500240 DrawImageCommand(const SkImage* image, SkScalar left, SkScalar top, const SkPaint* paint);
fmalita651c9202015-07-22 10:23:01 -0700241 void execute(SkCanvas* canvas) const override;
242 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500243 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800244
fmalita651c9202015-07-22 10:23:01 -0700245private:
Hal Canary1b612a82016-11-03 16:26:13 -0400246 sk_sp<const SkImage> fImage;
247 SkScalar fLeft;
248 SkScalar fTop;
249 SkTLazy<SkPaint> fPaint;
fmalita651c9202015-07-22 10:23:01 -0700250
Mike Klein8f4e2242019-03-20 11:59:00 -0500251 typedef DrawCommand INHERITED;
fmalita651c9202015-07-22 10:23:01 -0700252};
253
Mike Klein17428132019-03-20 13:02:32 -0500254class DrawImageLatticeCommand : public DrawCommand {
Stan Ilievac42aeb2017-01-12 16:20:50 -0500255public:
Mike Klein17428132019-03-20 13:02:32 -0500256 DrawImageLatticeCommand(const SkImage* image,
257 const SkCanvas::Lattice& lattice,
258 const SkRect& dst,
259 const SkPaint* paint);
Stan Ilievac42aeb2017-01-12 16:20:50 -0500260 void execute(SkCanvas* canvas) const override;
261 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500262 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
Stan Ilievac42aeb2017-01-12 16:20:50 -0500263
264private:
Mike Klein8f4e2242019-03-20 11:59:00 -0500265 sk_sp<const SkImage> fImage;
266 SkCanvas::Lattice fLattice;
267 SkRect fDst;
268 SkTLazy<SkPaint> fPaint;
Stan Ilievac42aeb2017-01-12 16:20:50 -0500269
Mike Klein8f4e2242019-03-20 11:59:00 -0500270 typedef DrawCommand INHERITED;
Stan Ilievac42aeb2017-01-12 16:20:50 -0500271};
272
Mike Klein17428132019-03-20 13:02:32 -0500273class DrawImageNineCommand : public DrawCommand {
Brian Osmanc25e2692018-03-12 10:57:28 -0400274public:
Mike Klein17428132019-03-20 13:02:32 -0500275 DrawImageNineCommand(const SkImage* image,
276 const SkIRect& center,
277 const SkRect& dst,
278 const SkPaint* paint);
Brian Osmanc25e2692018-03-12 10:57:28 -0400279 void execute(SkCanvas* canvas) const override;
280 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500281 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
Brian Osmanc25e2692018-03-12 10:57:28 -0400282
283private:
284 sk_sp<const SkImage> fImage;
285 SkIRect fCenter;
286 SkRect fDst;
Brian Osman8363be12018-05-29 13:38:07 -0400287 SkTLazy<SkPaint> fPaint;
Brian Osmanc25e2692018-03-12 10:57:28 -0400288
Mike Klein8f4e2242019-03-20 11:59:00 -0500289 typedef DrawCommand INHERITED;
Brian Osmanc25e2692018-03-12 10:57:28 -0400290};
291
Mike Klein17428132019-03-20 13:02:32 -0500292class DrawImageRectCommand : public DrawCommand {
fmalita651c9202015-07-22 10:23:01 -0700293public:
Mike Klein17428132019-03-20 13:02:32 -0500294 DrawImageRectCommand(const SkImage* image,
295 const SkRect* src,
296 const SkRect& dst,
297 const SkPaint* paint,
298 SkCanvas::SrcRectConstraint constraint);
fmalita651c9202015-07-22 10:23:01 -0700299 void execute(SkCanvas* canvas) const override;
300 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500301 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800302
fmalita651c9202015-07-22 10:23:01 -0700303private:
Hal Canary1b612a82016-11-03 16:26:13 -0400304 sk_sp<const SkImage> fImage;
fmalita651c9202015-07-22 10:23:01 -0700305 SkTLazy<SkRect> fSrc;
306 SkRect fDst;
307 SkTLazy<SkPaint> fPaint;
308 SkCanvas::SrcRectConstraint fConstraint;
309
Mike Klein8f4e2242019-03-20 11:59:00 -0500310 typedef DrawCommand INHERITED;
fmalita651c9202015-07-22 10:23:01 -0700311};
312
Nathaniel Nifong20b177a2019-12-12 11:05:10 -0500313// Command for resolving the deferred SkImage representing an android layer
314// Functions like DrawImageRect except it uses the saved UrlDataManager to resolve the image
315// at the time execute() is called.
316class DrawImageRectLayerCommand : public DrawCommand {
317public:
318 DrawImageRectLayerCommand(DebugLayerManager* layerManager,
319 const int nodeId,
320 const int frame,
321 const SkRect* src,
322 const SkRect& dst,
323 const SkPaint* paint,
324 SkCanvas::SrcRectConstraint constraint);
325 void execute(SkCanvas* canvas) const override;
326 bool render(SkCanvas* canvas) const override;
327 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
328
329private:
330 DebugLayerManager* fLayerManager;
331 int fNodeId;
332 int fFrame;
333 SkTLazy<SkRect> fSrc;
334 SkRect fDst;
335 SkTLazy<SkPaint> fPaint;
336 SkCanvas::SrcRectConstraint fConstraint;
337
338 typedef DrawCommand INHERITED;
339};
340
Mike Klein17428132019-03-20 13:02:32 -0500341class DrawOvalCommand : public DrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000342public:
Mike Klein17428132019-03-20 13:02:32 -0500343 DrawOvalCommand(const SkRect& oval, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700344 void execute(SkCanvas* canvas) const override;
345 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500346 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800347
robertphillips@google.com67baba42013-01-02 20:20:31 +0000348private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000349 SkRect fOval;
350 SkPaint fPaint;
351
Mike Klein8f4e2242019-03-20 11:59:00 -0500352 typedef DrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000353};
354
Mike Klein17428132019-03-20 13:02:32 -0500355class DrawArcCommand : public DrawCommand {
bsalomonac3aa242016-08-19 11:25:19 -0700356public:
Mike Klein17428132019-03-20 13:02:32 -0500357 DrawArcCommand(const SkRect& oval,
358 SkScalar startAngle,
359 SkScalar sweepAngle,
360 bool useCenter,
361 const SkPaint& paint);
bsalomonac3aa242016-08-19 11:25:19 -0700362 void execute(SkCanvas* canvas) const override;
363 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500364 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
bsalomonac3aa242016-08-19 11:25:19 -0700365
366private:
367 SkRect fOval;
368 SkScalar fStartAngle;
369 SkScalar fSweepAngle;
370 bool fUseCenter;
371 SkPaint fPaint;
372
Mike Klein8f4e2242019-03-20 11:59:00 -0500373 typedef DrawCommand INHERITED;
bsalomonac3aa242016-08-19 11:25:19 -0700374};
375
Mike Klein17428132019-03-20 13:02:32 -0500376class DrawPaintCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000377public:
Mike Klein17428132019-03-20 13:02:32 -0500378 DrawPaintCommand(const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700379 void execute(SkCanvas* canvas) const override;
380 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500381 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800382
chudy@google.com902ebe52012-06-29 14:21:22 +0000383private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000384 SkPaint fPaint;
385
Mike Klein8f4e2242019-03-20 11:59:00 -0500386 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000387};
388
Mike Reedd5674082019-04-19 15:00:47 -0400389class DrawBehindCommand : public DrawCommand {
390public:
391 DrawBehindCommand(const SkPaint& paint);
392 void execute(SkCanvas* canvas) const override;
393 bool render(SkCanvas* canvas) const override;
394 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
395
396private:
397 SkPaint fPaint;
398
399 typedef DrawCommand INHERITED;
400};
401
Mike Klein17428132019-03-20 13:02:32 -0500402class DrawPathCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000403public:
Mike Klein17428132019-03-20 13:02:32 -0500404 DrawPathCommand(const SkPath& path, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700405 void execute(SkCanvas* canvas) const override;
406 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500407 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000408
chudy@google.com902ebe52012-06-29 14:21:22 +0000409private:
Mike Klein8f4e2242019-03-20 11:59:00 -0500410 SkPath fPath;
411 SkPaint fPaint;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000412
Mike Klein8f4e2242019-03-20 11:59:00 -0500413 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000414};
415
Mike Klein17428132019-03-20 13:02:32 -0500416class BeginDrawPictureCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000417public:
Mike Klein17428132019-03-20 13:02:32 -0500418 BeginDrawPictureCommand(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint);
fmalita160ebb22015-04-01 20:58:37 -0700419
mtklein36352bf2015-03-25 18:17:31 -0700420 void execute(SkCanvas* canvas) const override;
421 bool render(SkCanvas* canvas) const override;
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +0000422
chudy@google.com902ebe52012-06-29 14:21:22 +0000423private:
Hal Canary1b612a82016-11-03 16:26:13 -0400424 sk_sp<const SkPicture> fPicture;
425 SkTLazy<SkMatrix> fMatrix;
426 SkTLazy<SkPaint> fPaint;
fmalita160ebb22015-04-01 20:58:37 -0700427
Mike Klein8f4e2242019-03-20 11:59:00 -0500428 typedef DrawCommand INHERITED;
fmalita160ebb22015-04-01 20:58:37 -0700429};
430
Mike Klein17428132019-03-20 13:02:32 -0500431class EndDrawPictureCommand : public DrawCommand {
fmalita160ebb22015-04-01 20:58:37 -0700432public:
Mike Klein17428132019-03-20 13:02:32 -0500433 EndDrawPictureCommand(bool restore);
fmalita160ebb22015-04-01 20:58:37 -0700434
435 void execute(SkCanvas* canvas) const override;
436
437private:
438 bool fRestore;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000439
Mike Klein8f4e2242019-03-20 11:59:00 -0500440 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000441};
442
Mike Klein17428132019-03-20 13:02:32 -0500443class DrawPointsCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000444public:
Mike Klein17428132019-03-20 13:02:32 -0500445 DrawPointsCommand(SkCanvas::PointMode mode,
446 size_t count,
447 const SkPoint pts[],
448 const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700449 void execute(SkCanvas* canvas) const override;
450 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500451 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800452
chudy@google.com902ebe52012-06-29 14:21:22 +0000453private:
chudy@google.com902ebe52012-06-29 14:21:22 +0000454 SkCanvas::PointMode fMode;
Brian Osman8363be12018-05-29 13:38:07 -0400455 SkTDArray<SkPoint> fPts;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000456 SkPaint fPaint;
457
Mike Klein8f4e2242019-03-20 11:59:00 -0500458 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000459};
460
Mike Klein17428132019-03-20 13:02:32 -0500461class DrawRegionCommand : public DrawCommand {
Brian Osmanc25e2692018-03-12 10:57:28 -0400462public:
Mike Klein17428132019-03-20 13:02:32 -0500463 DrawRegionCommand(const SkRegion& region, const SkPaint& paint);
Brian Osmanc25e2692018-03-12 10:57:28 -0400464 void execute(SkCanvas* canvas) const override;
465 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500466 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
Brian Osmanc25e2692018-03-12 10:57:28 -0400467
468private:
469 SkRegion fRegion;
470 SkPaint fPaint;
471
Mike Klein8f4e2242019-03-20 11:59:00 -0500472 typedef DrawCommand INHERITED;
Brian Osmanc25e2692018-03-12 10:57:28 -0400473};
474
Mike Klein17428132019-03-20 13:02:32 -0500475class DrawTextBlobCommand : public DrawCommand {
fmalitab7425172014-08-26 07:56:44 -0700476public:
Mike Klein17428132019-03-20 13:02:32 -0500477 DrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y, const SkPaint& paint);
fmalitab7425172014-08-26 07:56:44 -0700478
mtklein36352bf2015-03-25 18:17:31 -0700479 void execute(SkCanvas* canvas) const override;
480 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500481 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
fmalitab7425172014-08-26 07:56:44 -0700482
483private:
fmalita37283c22016-09-13 10:00:23 -0700484 sk_sp<SkTextBlob> fBlob;
485 SkScalar fXPos;
486 SkScalar fYPos;
487 SkPaint fPaint;
fmalitab7425172014-08-26 07:56:44 -0700488
Mike Klein8f4e2242019-03-20 11:59:00 -0500489 typedef DrawCommand INHERITED;
fmalitab7425172014-08-26 07:56:44 -0700490};
491
Mike Klein17428132019-03-20 13:02:32 -0500492class DrawPatchCommand : public DrawCommand {
robertphillips9bafc302015-02-13 11:13:00 -0800493public:
Mike Klein17428132019-03-20 13:02:32 -0500494 DrawPatchCommand(const SkPoint cubics[12],
495 const SkColor colors[4],
496 const SkPoint texCoords[4],
497 SkBlendMode bmode,
498 const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700499 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500500 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips9bafc302015-02-13 11:13:00 -0800501
502private:
Mike Klein8f4e2242019-03-20 11:59:00 -0500503 SkPoint fCubics[12];
504 SkColor* fColorsPtr;
505 SkColor fColors[4];
506 SkPoint* fTexCoordsPtr;
507 SkPoint fTexCoords[4];
Mike Reed7d954ad2016-10-28 15:42:34 -0400508 SkBlendMode fBlendMode;
Mike Klein8f4e2242019-03-20 11:59:00 -0500509 SkPaint fPaint;
robertphillips9bafc302015-02-13 11:13:00 -0800510
Mike Klein8f4e2242019-03-20 11:59:00 -0500511 typedef DrawCommand INHERITED;
robertphillips9bafc302015-02-13 11:13:00 -0800512};
513
Mike Klein17428132019-03-20 13:02:32 -0500514class DrawRectCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000515public:
Mike Klein17428132019-03-20 13:02:32 -0500516 DrawRectCommand(const SkRect& rect, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700517 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500518 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000519
chudy@google.com902ebe52012-06-29 14:21:22 +0000520private:
robertphillips@google.com91217d02013-03-17 18:33:46 +0000521 SkRect fRect;
522 SkPaint fPaint;
523
Mike Klein8f4e2242019-03-20 11:59:00 -0500524 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000525};
526
Mike Klein17428132019-03-20 13:02:32 -0500527class DrawRRectCommand : public DrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000528public:
Mike Klein17428132019-03-20 13:02:32 -0500529 DrawRRectCommand(const SkRRect& rrect, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700530 void execute(SkCanvas* canvas) const override;
531 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500532 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800533
robertphillips@google.com67baba42013-01-02 20:20:31 +0000534private:
535 SkRRect fRRect;
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000536 SkPaint fPaint;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000537
Mike Klein8f4e2242019-03-20 11:59:00 -0500538 typedef DrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000539};
540
Mike Klein17428132019-03-20 13:02:32 -0500541class DrawDRRectCommand : public DrawCommand {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000542public:
Mike Klein17428132019-03-20 13:02:32 -0500543 DrawDRRectCommand(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700544 void execute(SkCanvas* canvas) const override;
545 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500546 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800547
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000548private:
549 SkRRect fOuter;
550 SkRRect fInner;
551 SkPaint fPaint;
552
Mike Klein8f4e2242019-03-20 11:59:00 -0500553 typedef DrawCommand INHERITED;
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000554};
555
Mike Klein17428132019-03-20 13:02:32 -0500556class DrawVerticesCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000557public:
Mike Klein17428132019-03-20 13:02:32 -0500558 DrawVerticesCommand(sk_sp<SkVertices>, SkBlendMode, const SkPaint&);
Mike Reedfed9cfd2017-03-17 12:09:04 -0400559
mtklein36352bf2015-03-25 18:17:31 -0700560 void execute(SkCanvas* canvas) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800561
chudy@google.com902ebe52012-06-29 14:21:22 +0000562private:
Mike Klein8f4e2242019-03-20 11:59:00 -0500563 sk_sp<SkVertices> fVertices;
564 SkBlendMode fBlendMode;
565 SkPaint fPaint;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000566
Mike Klein8f4e2242019-03-20 11:59:00 -0500567 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000568};
569
Mike Klein17428132019-03-20 13:02:32 -0500570class DrawAtlasCommand : public DrawCommand {
Brian Osman616f1cb2018-05-29 11:23:35 -0400571public:
Mike Klein17428132019-03-20 13:02:32 -0500572 DrawAtlasCommand(const SkImage*,
573 const SkRSXform[],
574 const SkRect[],
575 const SkColor[],
576 int,
577 SkBlendMode,
578 const SkRect*,
579 const SkPaint*);
Brian Osman616f1cb2018-05-29 11:23:35 -0400580
581 void execute(SkCanvas* canvas) const override;
582
583private:
584 sk_sp<const SkImage> fImage;
585 SkTDArray<SkRSXform> fXform;
586 SkTDArray<SkRect> fTex;
587 SkTDArray<SkColor> fColors;
588 SkBlendMode fBlendMode;
589 SkTLazy<SkRect> fCull;
590 SkTLazy<SkPaint> fPaint;
591
Mike Klein8f4e2242019-03-20 11:59:00 -0500592 typedef DrawCommand INHERITED;
Brian Osman616f1cb2018-05-29 11:23:35 -0400593};
594
Mike Klein17428132019-03-20 13:02:32 -0500595class SaveCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000596public:
Mike Klein17428132019-03-20 13:02:32 -0500597 SaveCommand();
mtklein36352bf2015-03-25 18:17:31 -0700598 void execute(SkCanvas* canvas) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800599
chudy@google.com902ebe52012-06-29 14:21:22 +0000600private:
Mike Klein8f4e2242019-03-20 11:59:00 -0500601 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000602};
603
Mike Klein17428132019-03-20 13:02:32 -0500604class SaveLayerCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000605public:
Mike Klein17428132019-03-20 13:02:32 -0500606 SaveLayerCommand(const SkCanvas::SaveLayerRec&);
mtklein36352bf2015-03-25 18:17:31 -0700607 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500608 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000609
chudy@google.com902ebe52012-06-29 14:21:22 +0000610private:
Brian Osman8363be12018-05-29 13:38:07 -0400611 SkTLazy<SkRect> fBounds;
612 SkTLazy<SkPaint> fPaint;
613 sk_sp<const SkImageFilter> fBackdrop;
614 uint32_t fSaveLayerFlags;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000615
Mike Klein8f4e2242019-03-20 11:59:00 -0500616 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000617};
618
Mike Klein17428132019-03-20 13:02:32 -0500619class SetMatrixCommand : public DrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000620public:
Mike Klein17428132019-03-20 13:02:32 -0500621 SetMatrixCommand(const SkMatrix& matrix);
mtklein36352bf2015-03-25 18:17:31 -0700622 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500623 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800624
chudy@google.com902ebe52012-06-29 14:21:22 +0000625private:
robertphillips@google.comb94b1e72013-02-19 21:00:26 +0000626 SkMatrix fMatrix;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000627
Mike Klein8f4e2242019-03-20 11:59:00 -0500628 typedef DrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000629};
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400630
Mike Klein17428132019-03-20 13:02:32 -0500631class DrawShadowCommand : public DrawCommand {
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400632public:
Mike Klein17428132019-03-20 13:02:32 -0500633 DrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec);
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400634 void execute(SkCanvas* canvas) const override;
635 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500636 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400637
638private:
Mike Klein8f4e2242019-03-20 11:59:00 -0500639 SkPath fPath;
640 SkDrawShadowRec fShadowRec;
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400641
Mike Klein8f4e2242019-03-20 11:59:00 -0500642 typedef DrawCommand INHERITED;
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400643};
vjiaoblacke6f5d562016-08-25 06:30:23 -0700644
Mike Klein17428132019-03-20 13:02:32 -0500645class DrawDrawableCommand : public DrawCommand {
Brian Osmanc7611082018-05-29 14:55:50 -0400646public:
Mike Klein17428132019-03-20 13:02:32 -0500647 DrawDrawableCommand(SkDrawable*, const SkMatrix*);
Brian Osmanc7611082018-05-29 14:55:50 -0400648 void execute(SkCanvas* canvas) const override;
649
650private:
651 sk_sp<SkDrawable> fDrawable;
652 SkTLazy<SkMatrix> fMatrix;
653
Mike Klein8f4e2242019-03-20 11:59:00 -0500654 typedef DrawCommand INHERITED;
Brian Osmanc7611082018-05-29 14:55:50 -0400655};
Michael Ludwig390f0cc2019-03-19 09:16:38 -0400656
Mike Klein17428132019-03-20 13:02:32 -0500657class DrawEdgeAAQuadCommand : public DrawCommand {
Michael Ludwig390f0cc2019-03-19 09:16:38 -0400658public:
Mike Klein17428132019-03-20 13:02:32 -0500659 DrawEdgeAAQuadCommand(const SkRect& rect,
660 const SkPoint clip[4],
661 SkCanvas::QuadAAFlags aa,
Michael Ludwiga595f862019-08-27 15:25:49 -0400662 const SkColor4f& color,
Mike Klein17428132019-03-20 13:02:32 -0500663 SkBlendMode mode);
Michael Ludwig390f0cc2019-03-19 09:16:38 -0400664 void execute(SkCanvas* canvas) const override;
665
666private:
Mike Klein8f4e2242019-03-20 11:59:00 -0500667 SkRect fRect;
668 SkPoint fClip[4];
669 int fHasClip;
Michael Ludwig390f0cc2019-03-19 09:16:38 -0400670 SkCanvas::QuadAAFlags fAA;
Michael Ludwiga595f862019-08-27 15:25:49 -0400671 SkColor4f fColor;
Mike Klein8f4e2242019-03-20 11:59:00 -0500672 SkBlendMode fMode;
Michael Ludwig390f0cc2019-03-19 09:16:38 -0400673
Mike Klein8f4e2242019-03-20 11:59:00 -0500674 typedef DrawCommand INHERITED;
Michael Ludwig390f0cc2019-03-19 09:16:38 -0400675};
676
Mike Klein17428132019-03-20 13:02:32 -0500677class DrawEdgeAAImageSetCommand : public DrawCommand {
Michael Ludwig390f0cc2019-03-19 09:16:38 -0400678public:
Mike Klein17428132019-03-20 13:02:32 -0500679 DrawEdgeAAImageSetCommand(const SkCanvas::ImageSetEntry[],
680 int count,
681 const SkPoint[],
682 const SkMatrix[],
683 const SkPaint*,
684 SkCanvas::SrcRectConstraint);
Michael Ludwig390f0cc2019-03-19 09:16:38 -0400685 void execute(SkCanvas* canvas) const override;
686
687private:
688 SkAutoTArray<SkCanvas::ImageSetEntry> fSet;
Mike Klein8f4e2242019-03-20 11:59:00 -0500689 int fCount;
690 SkAutoTArray<SkPoint> fDstClips;
691 SkAutoTArray<SkMatrix> fPreViewMatrices;
692 SkTLazy<SkPaint> fPaint;
693 SkCanvas::SrcRectConstraint fConstraint;
Michael Ludwig390f0cc2019-03-19 09:16:38 -0400694
Mike Klein8f4e2242019-03-20 11:59:00 -0500695 typedef DrawCommand INHERITED;
Michael Ludwig390f0cc2019-03-19 09:16:38 -0400696};
Brian Osmanc7611082018-05-29 14:55:50 -0400697#endif