blob: a2835dc6e7250d6aedbe425925c1565c823deafe [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
chudy@google.com902ebe52012-06-29 14:21:22 +000011#include "SkCanvas.h"
bungemand3ebb482015-08-05 13:57:49 -070012#include "SkTLazy.h"
13#include "SkPath.h"
14#include "SkRRect.h"
robertphillips@google.com0a4805e2013-05-29 13:24:23 +000015#include "SkString.h"
bungemand3ebb482015-08-05 13:57:49 -070016#include "SkTDArray.h"
ethannicholas50a8dd02016-02-10 05:40:46 -080017#include "SkJSONCPP.h"
ethannicholasf62a8b72016-02-11 10:35:21 -080018#include "UrlDataManager.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000019
fmalita@google.com86681b32013-06-13 20:59:14 +000020class SK_API SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +000021public:
robertphillips9bafc302015-02-13 11:13:00 -080022 enum OpType {
fmalita160ebb22015-04-01 20:58:37 -070023 kBeginDrawPicture_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080024 kClipPath_OpType,
25 kClipRegion_OpType,
26 kClipRect_OpType,
27 kClipRRect_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080028 kConcat_OpType,
29 kDrawBitmap_OpType,
30 kDrawBitmapNine_OpType,
31 kDrawBitmapRect_OpType,
32 kDrawClear_OpType,
33 kDrawDRRect_OpType,
fmalita651c9202015-07-22 10:23:01 -070034 kDrawImage_OpType,
35 kDrawImageRect_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080036 kDrawOval_OpType,
37 kDrawPaint_OpType,
38 kDrawPatch_OpType,
39 kDrawPath_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080040 kDrawPoints_OpType,
41 kDrawPosText_OpType,
42 kDrawPosTextH_OpType,
43 kDrawRect_OpType,
44 kDrawRRect_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080045 kDrawText_OpType,
46 kDrawTextBlob_OpType,
47 kDrawTextOnPath_OpType,
48 kDrawVertices_OpType,
fmalita160ebb22015-04-01 20:58:37 -070049 kEndDrawPicture_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080050 kRestore_OpType,
51 kSave_OpType,
52 kSaveLayer_OpType,
53 kSetMatrix_OpType,
robertphillips72942b8e2015-02-12 06:37:12 -080054
robertphillips9bafc302015-02-13 11:13:00 -080055 kLast_OpType = kSetMatrix_OpType
56 };
57
58 static const int kOpTypeCount = kLast_OpType + 1;
59
60 SkDrawCommand(OpType opType);
chudy@google.com902ebe52012-06-29 14:21:22 +000061
62 virtual ~SkDrawCommand();
63
fmalita8c89c522014-11-08 16:18:56 -080064 virtual SkString toString() const;
chudy@google.com902ebe52012-06-29 14:21:22 +000065
fmalita8c89c522014-11-08 16:18:56 -080066 virtual const char* toCString() const {
robertphillips9bafc302015-02-13 11:13:00 -080067 return GetCommandString(fOpType);
chudy@google.com902ebe52012-06-29 14:21:22 +000068 }
69
chudy@google.com0b5bbb02012-07-31 19:55:32 +000070 bool isVisible() const {
71 return fVisible;
72 }
73
74 void setVisible(bool toggle) {
75 fVisible = toggle;
76 }
chudy@google.com902ebe52012-06-29 14:21:22 +000077
fmalita8c89c522014-11-08 16:18:56 -080078 const SkTDArray<SkString*>* Info() const { return &fInfo; }
79 virtual void execute(SkCanvas*) const = 0;
80 virtual void vizExecute(SkCanvas*) const {}
robertphillips70171682014-10-16 14:28:28 -070081
fmalita8c89c522014-11-08 16:18:56 -080082 virtual void setUserMatrix(const SkMatrix&) {}
robertphillips70171682014-10-16 14:28:28 -070083
mtkleinf0f14112014-12-12 08:46:25 -080084 // The next "active" system is only used by save, saveLayer, and restore.
85 // It is used to determine which saveLayers are currently active (at a
commit-bot@chromium.org768ac852014-03-03 16:32:17 +000086 // given point in the rendering).
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +000087 // saves just return a kPushLayer action but don't track active state
88 // restores just return a kPopLayer action
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +000089 // saveLayers return kPushLayer but also track the active state
commit-bot@chromium.org768ac852014-03-03 16:32:17 +000090 enum Action {
91 kNone_Action,
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +000092 kPopLayer_Action,
93 kPushLayer_Action,
commit-bot@chromium.org768ac852014-03-03 16:32:17 +000094 };
95 virtual Action action() const { return kNone_Action; }
96 virtual void setActive(bool active) {}
97 virtual bool active() const { return false; }
98
robertphillips9bafc302015-02-13 11:13:00 -080099 OpType getType() const { return fOpType; }
chudy@google.com902ebe52012-06-29 14:21:22 +0000100
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000101 virtual bool render(SkCanvas* canvas) const { return false; }
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000102
ethannicholasf62a8b72016-02-11 10:35:21 -0800103 virtual Json::Value toJSON(UrlDataManager& urlDataManager) const;
ethannicholas50a8dd02016-02-10 05:40:46 -0800104
joshualittb95c7722016-02-29 07:44:02 -0800105 Json::Value drawToAndCollectJSON(SkCanvas*, UrlDataManager& urlDataManager,
106 int opIndex) const;
joshualitt6b3cf732016-02-17 11:20:26 -0800107
ethannicholas50a8dd02016-02-10 05:40:46 -0800108 /* Converts a JSON representation of a command into a newly-allocated SkDrawCommand object. It
109 * is the caller's responsibility to delete this object. This method may return null if an error
110 * occurs.
111 */
ethannicholasf62a8b72016-02-11 10:35:21 -0800112 static SkDrawCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800113
robertphillips9bafc302015-02-13 11:13:00 -0800114 static const char* GetCommandString(OpType type);
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000115
joshualittbd724132016-03-03 11:39:38 -0800116 // Helper methods for converting things to JSON
117 static Json::Value MakeJsonIRect(const SkIRect&);
118 static Json::Value MakeJsonMatrix(const SkMatrix&);
119
chudy@google.com902ebe52012-06-29 14:21:22 +0000120protected:
chudy@google.com97cee972012-08-07 20:41:37 +0000121 SkTDArray<SkString*> fInfo;
chudy@google.com902ebe52012-06-29 14:21:22 +0000122
123private:
robertphillips9bafc302015-02-13 11:13:00 -0800124 OpType fOpType;
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000125 bool fVisible;
chudy@google.com902ebe52012-06-29 14:21:22 +0000126};
127
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000128class SkRestoreCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000129public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000130 SkRestoreCommand();
mtklein36352bf2015-03-25 18:17:31 -0700131 void execute(SkCanvas* canvas) const override;
132 Action action() const override { return kPopLayer_Action; }
ethannicholasf62a8b72016-02-11 10:35:21 -0800133 static SkRestoreCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000134
135private:
136 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000137};
138
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000139class SkClearCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000140public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000141 SkClearCommand(SkColor color);
mtklein36352bf2015-03-25 18:17:31 -0700142 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800143 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
144 static SkClearCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800145
chudy@google.com902ebe52012-06-29 14:21:22 +0000146private:
147 SkColor fColor;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000148
149 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000150};
151
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000152class SkClipPathCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000153public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000154 SkClipPathCommand(const SkPath& path, SkRegion::Op op, bool doAA);
mtklein36352bf2015-03-25 18:17:31 -0700155 void execute(SkCanvas* canvas) const override;
156 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800157 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
158 static SkClipPathCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800159
chudy@google.com902ebe52012-06-29 14:21:22 +0000160private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000161 SkPath fPath;
chudy@google.com902ebe52012-06-29 14:21:22 +0000162 SkRegion::Op fOp;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000163 bool fDoAA;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000164
165 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000166};
167
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000168class SkClipRegionCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000169public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000170 SkClipRegionCommand(const SkRegion& region, SkRegion::Op op);
mtklein36352bf2015-03-25 18:17:31 -0700171 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800172 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
173 static SkClipRegionCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800174
chudy@google.com902ebe52012-06-29 14:21:22 +0000175private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000176 SkRegion fRegion;
chudy@google.com902ebe52012-06-29 14:21:22 +0000177 SkRegion::Op fOp;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000178
179 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000180};
181
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000182class SkClipRectCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000183public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000184 SkClipRectCommand(const SkRect& rect, SkRegion::Op op, bool doAA);
mtklein36352bf2015-03-25 18:17:31 -0700185 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800186 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
187 static SkClipRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000188
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000189 const SkRect& rect() const { return fRect; }
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000190 SkRegion::Op op() const { return fOp; }
191 bool doAA() const { return fDoAA; }
192
chudy@google.com902ebe52012-06-29 14:21:22 +0000193private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000194 SkRect fRect;
chudy@google.com902ebe52012-06-29 14:21:22 +0000195 SkRegion::Op fOp;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000196 bool fDoAA;
197
198 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000199};
200
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000201class SkClipRRectCommand : public SkDrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000202public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000203 SkClipRRectCommand(const SkRRect& rrect, SkRegion::Op op, bool doAA);
mtklein36352bf2015-03-25 18:17:31 -0700204 void execute(SkCanvas* canvas) const override;
205 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800206 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
207 static SkClipRRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000208
209 const SkRRect& rrect() const { return fRRect; }
210 SkRegion::Op op() const { return fOp; }
211 bool doAA() const { return fDoAA; }
212
robertphillips@google.com67baba42013-01-02 20:20:31 +0000213private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000214 SkRRect fRRect;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000215 SkRegion::Op fOp;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000216 bool fDoAA;
217
218 typedef SkDrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000219};
220
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000221class SkConcatCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000222public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000223 SkConcatCommand(const SkMatrix& matrix);
mtklein36352bf2015-03-25 18:17:31 -0700224 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800225 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
226 static SkConcatCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800227
chudy@google.com902ebe52012-06-29 14:21:22 +0000228private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000229 SkMatrix fMatrix;
230
231 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000232};
233
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000234class SkDrawBitmapCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000235public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000236 SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000237 const SkPaint* paint);
mtklein36352bf2015-03-25 18:17:31 -0700238 void execute(SkCanvas* canvas) const override;
239 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800240 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
241 static SkDrawBitmapCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800242
chudy@google.com902ebe52012-06-29 14:21:22 +0000243private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000244 SkBitmap fBitmap;
chudy@google.com902ebe52012-06-29 14:21:22 +0000245 SkScalar fLeft;
246 SkScalar fTop;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000247 SkPaint fPaint;
248 SkPaint* fPaintPtr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000249
250 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000251};
252
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000253class SkDrawBitmapNineCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000254public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000255 SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000256 const SkRect& dst, const SkPaint* paint);
mtklein36352bf2015-03-25 18:17:31 -0700257 void execute(SkCanvas* canvas) const override;
258 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800259 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
260 static SkDrawBitmapNineCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800261
chudy@google.com902ebe52012-06-29 14:21:22 +0000262private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000263 SkBitmap fBitmap;
264 SkIRect fCenter;
265 SkRect fDst;
266 SkPaint fPaint;
267 SkPaint* fPaintPtr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000268
269 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000270};
271
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000272class SkDrawBitmapRectCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000273public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000274 SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000275 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -0700276 SkCanvas::SrcRectConstraint);
mtklein36352bf2015-03-25 18:17:31 -0700277 void execute(SkCanvas* canvas) const override;
278 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800279 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
280 static SkDrawBitmapRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000281
robertphillips@google.comc3410b82013-03-28 12:25:25 +0000282 const SkBitmap& bitmap() const { return fBitmap; }
283
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000284 // The non-const 'paint' method allows modification of this object's
285 // SkPaint. For this reason the ctor and setPaint method make a local copy.
286 // The 'fPaintPtr' member acts a signal that the local SkPaint is valid
287 // (since only an SkPaint* is passed into the ctor).
288 const SkPaint* paint() const { return fPaintPtr; }
289 SkPaint* paint() { return fPaintPtr; }
290
291 void setPaint(const SkPaint& paint) { fPaint = paint; fPaintPtr = &fPaint; }
292
halcanary96fcdcc2015-08-27 07:41:13 -0700293 const SkRect* srcRect() const { return fSrc.isEmpty() ? nullptr : &fSrc; }
robertphillips@google.comc3410b82013-03-28 12:25:25 +0000294 void setSrcRect(const SkRect& src) { fSrc = src; }
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000295
296 const SkRect& dstRect() const { return fDst; }
robertphillips@google.comc3410b82013-03-28 12:25:25 +0000297 void setDstRect(const SkRect& dst) { fDst = dst; }
298
reeda5517e22015-07-14 10:54:12 -0700299 SkCanvas::SrcRectConstraint constraint() const { return fConstraint; }
300 void setConstraint(SkCanvas::SrcRectConstraint constraint) { fConstraint = constraint; }
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000301
chudy@google.com902ebe52012-06-29 14:21:22 +0000302private:
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000303 SkBitmap fBitmap;
304 SkRect fSrc;
305 SkRect fDst;
306 SkPaint fPaint;
307 SkPaint* fPaintPtr;
reeda5517e22015-07-14 10:54:12 -0700308 SkCanvas::SrcRectConstraint fConstraint;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000309
310 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000311};
312
fmalita651c9202015-07-22 10:23:01 -0700313class SkDrawImageCommand : public SkDrawCommand {
314public:
315 SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top, const SkPaint* paint);
316 void execute(SkCanvas* canvas) const override;
317 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800318 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
319 static SkDrawImageCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800320
fmalita651c9202015-07-22 10:23:01 -0700321private:
322 SkAutoTUnref<const SkImage> fImage;
323 SkScalar fLeft;
324 SkScalar fTop;
325 SkTLazy<SkPaint> fPaint;
326
327 typedef SkDrawCommand INHERITED;
328};
329
330class SkDrawImageRectCommand : public SkDrawCommand {
331public:
332 SkDrawImageRectCommand(const SkImage* image, const SkRect* src, const SkRect& dst,
333 const SkPaint* paint, SkCanvas::SrcRectConstraint constraint);
334 void execute(SkCanvas* canvas) const override;
335 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800336 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
337 static SkDrawImageRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800338
fmalita651c9202015-07-22 10:23:01 -0700339private:
340 SkAutoTUnref<const SkImage> fImage;
341 SkTLazy<SkRect> fSrc;
342 SkRect fDst;
343 SkTLazy<SkPaint> fPaint;
344 SkCanvas::SrcRectConstraint fConstraint;
345
346 typedef SkDrawCommand INHERITED;
347};
348
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000349class SkDrawOvalCommand : public SkDrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000350public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000351 SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700352 void execute(SkCanvas* canvas) const override;
353 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800354 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
355 static SkDrawOvalCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800356
robertphillips@google.com67baba42013-01-02 20:20:31 +0000357private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000358 SkRect fOval;
359 SkPaint fPaint;
360
361 typedef SkDrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000362};
363
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000364class SkDrawPaintCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000365public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000366 SkDrawPaintCommand(const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700367 void execute(SkCanvas* canvas) const override;
368 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800369 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
370 static SkDrawPaintCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800371
chudy@google.com902ebe52012-06-29 14:21:22 +0000372private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000373 SkPaint fPaint;
374
375 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000376};
377
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000378class SkDrawPathCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000379public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000380 SkDrawPathCommand(const SkPath& path, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700381 void execute(SkCanvas* canvas) const override;
382 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800383 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
384 static SkDrawPathCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000385
chudy@google.com902ebe52012-06-29 14:21:22 +0000386private:
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000387 SkPath fPath;
388 SkPaint fPaint;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000389
390 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000391};
392
fmalita160ebb22015-04-01 20:58:37 -0700393class SkBeginDrawPictureCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000394public:
fmalita160ebb22015-04-01 20:58:37 -0700395 SkBeginDrawPictureCommand(const SkPicture* picture,
396 const SkMatrix* matrix,
397 const SkPaint* paint);
398
mtklein36352bf2015-03-25 18:17:31 -0700399 void execute(SkCanvas* canvas) const override;
400 bool render(SkCanvas* canvas) const override;
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +0000401
chudy@google.com902ebe52012-06-29 14:21:22 +0000402private:
robertphillips9b14f262014-06-04 05:40:44 -0700403 SkAutoTUnref<const SkPicture> fPicture;
fmalita160ebb22015-04-01 20:58:37 -0700404 SkTLazy<SkMatrix> fMatrix;
405 SkTLazy<SkPaint> fPaint;
406
407 typedef SkDrawCommand INHERITED;
408};
409
410class SkEndDrawPictureCommand : public SkDrawCommand {
411public:
412 SkEndDrawPictureCommand(bool restore);
413
414 void execute(SkCanvas* canvas) const override;
415
416private:
417 bool fRestore;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000418
419 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000420};
421
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000422class SkDrawPointsCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000423public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000424 SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, const SkPoint pts[],
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000425 const SkPaint& paint);
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000426 virtual ~SkDrawPointsCommand() { delete [] fPts; }
mtklein36352bf2015-03-25 18:17:31 -0700427 void execute(SkCanvas* canvas) const override;
428 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800429 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
430 static SkDrawPointsCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800431
chudy@google.com902ebe52012-06-29 14:21:22 +0000432private:
chudy@google.com902ebe52012-06-29 14:21:22 +0000433 SkCanvas::PointMode fMode;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000434 size_t fCount;
435 SkPoint* fPts;
436 SkPaint fPaint;
437
438 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000439};
440
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000441class SkDrawTextCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000442public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000443 SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000444 const SkPaint& paint);
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000445 virtual ~SkDrawTextCommand() { delete [] fText; }
mtklein36352bf2015-03-25 18:17:31 -0700446 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800447 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
448 static SkDrawTextCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800449
chudy@google.com902ebe52012-06-29 14:21:22 +0000450private:
robertphillips@google.com77279cb2013-03-25 12:01:45 +0000451 char* fText;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000452 size_t fByteLength;
chudy@google.com902ebe52012-06-29 14:21:22 +0000453 SkScalar fX;
454 SkScalar fY;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000455 SkPaint fPaint;
456
457 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000458};
459
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000460class SkDrawPosTextCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000461public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000462 SkDrawPosTextCommand(const void* text, size_t byteLength, const SkPoint pos[],
463 const SkPaint& paint);
464 virtual ~SkDrawPosTextCommand() { delete [] fPos; delete [] fText; }
mtklein36352bf2015-03-25 18:17:31 -0700465 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800466 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
467 static SkDrawPosTextCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800468
chudy@google.com902ebe52012-06-29 14:21:22 +0000469private:
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000470 char* fText;
471 size_t fByteLength;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000472 SkPoint* fPos;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000473 SkPaint fPaint;
474
475 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000476};
477
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000478class SkDrawTextOnPathCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000479public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000480 SkDrawTextOnPathCommand(const void* text, size_t byteLength, const SkPath& path,
481 const SkMatrix* matrix, const SkPaint& paint);
482 virtual ~SkDrawTextOnPathCommand() { delete [] fText; }
mtklein36352bf2015-03-25 18:17:31 -0700483 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800484 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
485 static SkDrawTextOnPathCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800486
chudy@google.com902ebe52012-06-29 14:21:22 +0000487private:
robertphillips@google.com77279cb2013-03-25 12:01:45 +0000488 char* fText;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000489 size_t fByteLength;
490 SkPath fPath;
491 SkMatrix fMatrix;
492 SkPaint fPaint;
493
494 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000495};
496
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000497class SkDrawPosTextHCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000498public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000499 SkDrawPosTextHCommand(const void* text, size_t byteLength, const SkScalar xpos[],
500 SkScalar constY, const SkPaint& paint);
501 virtual ~SkDrawPosTextHCommand() { delete [] fXpos; delete [] fText; }
mtklein36352bf2015-03-25 18:17:31 -0700502 void execute(SkCanvas* canvas) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800503
chudy@google.com902ebe52012-06-29 14:21:22 +0000504private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000505 SkScalar* fXpos;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000506 char* fText;
507 size_t fByteLength;
508 SkScalar fConstY;
509 SkPaint fPaint;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000510
511 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000512};
513
fmalitab7425172014-08-26 07:56:44 -0700514class SkDrawTextBlobCommand : public SkDrawCommand {
515public:
516 SkDrawTextBlobCommand(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPaint& paint);
517
mtklein36352bf2015-03-25 18:17:31 -0700518 void execute(SkCanvas* canvas) const override;
519 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800520 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
521 static SkDrawTextBlobCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
fmalitab7425172014-08-26 07:56:44 -0700522
523private:
524 SkAutoTUnref<const SkTextBlob> fBlob;
525 SkScalar fXPos;
526 SkScalar fYPos;
527 SkPaint fPaint;
528
529 typedef SkDrawCommand INHERITED;
530};
531
robertphillips9bafc302015-02-13 11:13:00 -0800532class SkDrawPatchCommand : public SkDrawCommand {
533public:
534 SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
535 const SkPoint texCoords[4], SkXfermode* xmode,
536 const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700537 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800538 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
539 static SkDrawPatchCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips9bafc302015-02-13 11:13:00 -0800540
541private:
542 SkPoint fCubics[12];
ethannicholas1446a9a2016-02-10 14:05:02 -0800543 SkColor* fColorsPtr;
544 SkColor fColors[4];
545 SkPoint* fTexCoordsPtr;
546 SkPoint fTexCoords[4];
robertphillips9bafc302015-02-13 11:13:00 -0800547 SkAutoTUnref<SkXfermode> fXfermode;
548 SkPaint fPaint;
549
550 typedef SkDrawCommand INHERITED;
551};
552
553
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000554class SkDrawRectCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000555public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000556 SkDrawRectCommand(const SkRect& rect, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700557 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800558 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
559 static SkDrawRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000560
robertphillips@google.com91217d02013-03-17 18:33:46 +0000561 const SkRect& rect() const { return fRect; }
562 const SkPaint& paint() const { return fPaint; }
chudy@google.com902ebe52012-06-29 14:21:22 +0000563private:
robertphillips@google.com91217d02013-03-17 18:33:46 +0000564 SkRect fRect;
565 SkPaint fPaint;
566
567 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000568};
569
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000570class SkDrawRRectCommand : public SkDrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000571public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000572 SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700573 void execute(SkCanvas* canvas) const override;
574 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800575 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
576 static SkDrawRRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800577
robertphillips@google.com67baba42013-01-02 20:20:31 +0000578private:
579 SkRRect fRRect;
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000580 SkPaint fPaint;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000581
582 typedef SkDrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000583};
584
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000585class SkDrawDRRectCommand : public SkDrawCommand {
586public:
587 SkDrawDRRectCommand(const SkRRect& outer, const SkRRect& inner,
588 const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700589 void execute(SkCanvas* canvas) const override;
590 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800591 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
592 static SkDrawDRRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800593
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000594private:
595 SkRRect fOuter;
596 SkRRect fInner;
597 SkPaint fPaint;
598
599 typedef SkDrawCommand INHERITED;
600};
601
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000602class SkDrawVerticesCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000603public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000604 SkDrawVerticesCommand(SkCanvas::VertexMode vmode, int vertexCount,
605 const SkPoint vertices[], const SkPoint texs[],
606 const SkColor colors[], SkXfermode* xfermode,
607 const uint16_t indices[], int indexCount,
608 const SkPaint& paint);
609 virtual ~SkDrawVerticesCommand();
mtklein36352bf2015-03-25 18:17:31 -0700610 void execute(SkCanvas* canvas) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800611
chudy@google.com902ebe52012-06-29 14:21:22 +0000612private:
613 SkCanvas::VertexMode fVmode;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000614 int fVertexCount;
615 SkPoint* fVertices;
616 SkPoint* fTexs;
617 SkColor* fColors;
chudy@google.com902ebe52012-06-29 14:21:22 +0000618 SkXfermode* fXfermode;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000619 uint16_t* fIndices;
620 int fIndexCount;
621 SkPaint fPaint;
622
623 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000624};
625
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000626class SkSaveCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000627public:
Florin Malita5f6102d2014-06-30 10:13:28 -0400628 SkSaveCommand();
mtklein36352bf2015-03-25 18:17:31 -0700629 void execute(SkCanvas* canvas) const override;
630 Action action() const override { return kPushLayer_Action; }
ethannicholasf62a8b72016-02-11 10:35:21 -0800631 static SkSaveCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800632
chudy@google.com902ebe52012-06-29 14:21:22 +0000633private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000634 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000635};
636
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000637class SkSaveLayerCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000638public:
reed4960eee2015-12-18 07:09:18 -0800639 SkSaveLayerCommand(const SkCanvas::SaveLayerRec&);
ethannicholas50a8dd02016-02-10 05:40:46 -0800640 virtual ~SkSaveLayerCommand();
mtklein36352bf2015-03-25 18:17:31 -0700641 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800642 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
643 static SkSaveLayerCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
mtklein36352bf2015-03-25 18:17:31 -0700644 void vizExecute(SkCanvas* canvas) const override;
645 Action action() const override{ return kPushLayer_Action; }
646 void setActive(bool active) override { fActive = active; }
647 bool active() const override { return fActive; }
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000648
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000649 const SkPaint* paint() const { return fPaintPtr; }
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000650
chudy@google.com902ebe52012-06-29 14:21:22 +0000651private:
ethannicholas50a8dd02016-02-10 05:40:46 -0800652 SkRect fBounds;
653 SkPaint fPaint;
654 SkPaint* fPaintPtr;
655 const SkImageFilter* fBackdrop;
656 uint32_t fSaveLayerFlags;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000657
reed4960eee2015-12-18 07:09:18 -0800658 bool fActive;
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000659
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000660 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000661};
662
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000663class SkSetMatrixCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000664public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000665 SkSetMatrixCommand(const SkMatrix& matrix);
mtklein36352bf2015-03-25 18:17:31 -0700666 void setUserMatrix(const SkMatrix&) override;
667 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800668 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
669 static SkSetMatrixCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800670
chudy@google.com902ebe52012-06-29 14:21:22 +0000671private:
robertphillips70171682014-10-16 14:28:28 -0700672 SkMatrix fUserMatrix;
robertphillips@google.comb94b1e72013-02-19 21:00:26 +0000673 SkMatrix fMatrix;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000674
675 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000676};
677
chudy@google.com902ebe52012-06-29 14:21:22 +0000678#endif