blob: 34832a7cf1b66a40df38fa14f0161dce97198fcc [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
joshualitt6b3cf732016-02-17 11:20:26 -0800105 Json::Value drawToAndCollectJSON(SkCanvas*, UrlDataManager& urlDataManager) const;
106
ethannicholas50a8dd02016-02-10 05:40:46 -0800107 /* Converts a JSON representation of a command into a newly-allocated SkDrawCommand object. It
108 * is the caller's responsibility to delete this object. This method may return null if an error
109 * occurs.
110 */
ethannicholasf62a8b72016-02-11 10:35:21 -0800111 static SkDrawCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800112
robertphillips9bafc302015-02-13 11:13:00 -0800113 static const char* GetCommandString(OpType type);
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000114
chudy@google.com902ebe52012-06-29 14:21:22 +0000115protected:
chudy@google.com97cee972012-08-07 20:41:37 +0000116 SkTDArray<SkString*> fInfo;
chudy@google.com902ebe52012-06-29 14:21:22 +0000117
118private:
robertphillips9bafc302015-02-13 11:13:00 -0800119 OpType fOpType;
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000120 bool fVisible;
chudy@google.com902ebe52012-06-29 14:21:22 +0000121};
122
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000123class SkRestoreCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000124public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000125 SkRestoreCommand();
mtklein36352bf2015-03-25 18:17:31 -0700126 void execute(SkCanvas* canvas) const override;
127 Action action() const override { return kPopLayer_Action; }
ethannicholasf62a8b72016-02-11 10:35:21 -0800128 static SkRestoreCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000129
130private:
131 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000132};
133
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000134class SkClearCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000135public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000136 SkClearCommand(SkColor color);
mtklein36352bf2015-03-25 18:17:31 -0700137 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800138 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
139 static SkClearCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800140
chudy@google.com902ebe52012-06-29 14:21:22 +0000141private:
142 SkColor fColor;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000143
144 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000145};
146
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000147class SkClipPathCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000148public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000149 SkClipPathCommand(const SkPath& path, SkRegion::Op op, bool doAA);
mtklein36352bf2015-03-25 18:17:31 -0700150 void execute(SkCanvas* canvas) const override;
151 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800152 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
153 static SkClipPathCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800154
chudy@google.com902ebe52012-06-29 14:21:22 +0000155private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000156 SkPath fPath;
chudy@google.com902ebe52012-06-29 14:21:22 +0000157 SkRegion::Op fOp;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000158 bool fDoAA;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000159
160 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000161};
162
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000163class SkClipRegionCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000164public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000165 SkClipRegionCommand(const SkRegion& region, SkRegion::Op op);
mtklein36352bf2015-03-25 18:17:31 -0700166 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800167 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
168 static SkClipRegionCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800169
chudy@google.com902ebe52012-06-29 14:21:22 +0000170private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000171 SkRegion fRegion;
chudy@google.com902ebe52012-06-29 14:21:22 +0000172 SkRegion::Op fOp;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000173
174 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000175};
176
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000177class SkClipRectCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000178public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000179 SkClipRectCommand(const SkRect& rect, SkRegion::Op op, bool doAA);
mtklein36352bf2015-03-25 18:17:31 -0700180 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800181 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
182 static SkClipRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000183
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000184 const SkRect& rect() const { return fRect; }
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000185 SkRegion::Op op() const { return fOp; }
186 bool doAA() const { return fDoAA; }
187
chudy@google.com902ebe52012-06-29 14:21:22 +0000188private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000189 SkRect fRect;
chudy@google.com902ebe52012-06-29 14:21:22 +0000190 SkRegion::Op fOp;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000191 bool fDoAA;
192
193 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000194};
195
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000196class SkClipRRectCommand : public SkDrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000197public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000198 SkClipRRectCommand(const SkRRect& rrect, SkRegion::Op op, bool doAA);
mtklein36352bf2015-03-25 18:17:31 -0700199 void execute(SkCanvas* canvas) const override;
200 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800201 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
202 static SkClipRRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000203
204 const SkRRect& rrect() const { return fRRect; }
205 SkRegion::Op op() const { return fOp; }
206 bool doAA() const { return fDoAA; }
207
robertphillips@google.com67baba42013-01-02 20:20:31 +0000208private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000209 SkRRect fRRect;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000210 SkRegion::Op fOp;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000211 bool fDoAA;
212
213 typedef SkDrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000214};
215
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000216class SkConcatCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000217public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000218 SkConcatCommand(const SkMatrix& matrix);
mtklein36352bf2015-03-25 18:17:31 -0700219 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800220 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
221 static SkConcatCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800222
chudy@google.com902ebe52012-06-29 14:21:22 +0000223private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000224 SkMatrix fMatrix;
225
226 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000227};
228
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000229class SkDrawBitmapCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000230public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000231 SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000232 const SkPaint* paint);
mtklein36352bf2015-03-25 18:17:31 -0700233 void execute(SkCanvas* canvas) const override;
234 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800235 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
236 static SkDrawBitmapCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800237
chudy@google.com902ebe52012-06-29 14:21:22 +0000238private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000239 SkBitmap fBitmap;
chudy@google.com902ebe52012-06-29 14:21:22 +0000240 SkScalar fLeft;
241 SkScalar fTop;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000242 SkPaint fPaint;
243 SkPaint* fPaintPtr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000244
245 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000246};
247
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000248class SkDrawBitmapNineCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000249public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000250 SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000251 const SkRect& dst, const SkPaint* paint);
mtklein36352bf2015-03-25 18:17:31 -0700252 void execute(SkCanvas* canvas) const override;
253 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800254 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
255 static SkDrawBitmapNineCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800256
chudy@google.com902ebe52012-06-29 14:21:22 +0000257private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000258 SkBitmap fBitmap;
259 SkIRect fCenter;
260 SkRect fDst;
261 SkPaint fPaint;
262 SkPaint* fPaintPtr;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000263
264 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000265};
266
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000267class SkDrawBitmapRectCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000268public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000269 SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000270 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -0700271 SkCanvas::SrcRectConstraint);
mtklein36352bf2015-03-25 18:17:31 -0700272 void execute(SkCanvas* canvas) const override;
273 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800274 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
275 static SkDrawBitmapRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000276
robertphillips@google.comc3410b82013-03-28 12:25:25 +0000277 const SkBitmap& bitmap() const { return fBitmap; }
278
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000279 // The non-const 'paint' method allows modification of this object's
280 // SkPaint. For this reason the ctor and setPaint method make a local copy.
281 // The 'fPaintPtr' member acts a signal that the local SkPaint is valid
282 // (since only an SkPaint* is passed into the ctor).
283 const SkPaint* paint() const { return fPaintPtr; }
284 SkPaint* paint() { return fPaintPtr; }
285
286 void setPaint(const SkPaint& paint) { fPaint = paint; fPaintPtr = &fPaint; }
287
halcanary96fcdcc2015-08-27 07:41:13 -0700288 const SkRect* srcRect() const { return fSrc.isEmpty() ? nullptr : &fSrc; }
robertphillips@google.comc3410b82013-03-28 12:25:25 +0000289 void setSrcRect(const SkRect& src) { fSrc = src; }
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000290
291 const SkRect& dstRect() const { return fDst; }
robertphillips@google.comc3410b82013-03-28 12:25:25 +0000292 void setDstRect(const SkRect& dst) { fDst = dst; }
293
reeda5517e22015-07-14 10:54:12 -0700294 SkCanvas::SrcRectConstraint constraint() const { return fConstraint; }
295 void setConstraint(SkCanvas::SrcRectConstraint constraint) { fConstraint = constraint; }
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000296
chudy@google.com902ebe52012-06-29 14:21:22 +0000297private:
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000298 SkBitmap fBitmap;
299 SkRect fSrc;
300 SkRect fDst;
301 SkPaint fPaint;
302 SkPaint* fPaintPtr;
reeda5517e22015-07-14 10:54:12 -0700303 SkCanvas::SrcRectConstraint fConstraint;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000304
305 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000306};
307
fmalita651c9202015-07-22 10:23:01 -0700308class SkDrawImageCommand : public SkDrawCommand {
309public:
310 SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top, const SkPaint* paint);
311 void execute(SkCanvas* canvas) const override;
312 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800313 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
314 static SkDrawImageCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800315
fmalita651c9202015-07-22 10:23:01 -0700316private:
317 SkAutoTUnref<const SkImage> fImage;
318 SkScalar fLeft;
319 SkScalar fTop;
320 SkTLazy<SkPaint> fPaint;
321
322 typedef SkDrawCommand INHERITED;
323};
324
325class SkDrawImageRectCommand : public SkDrawCommand {
326public:
327 SkDrawImageRectCommand(const SkImage* image, const SkRect* src, const SkRect& dst,
328 const SkPaint* paint, SkCanvas::SrcRectConstraint constraint);
329 void execute(SkCanvas* canvas) const override;
330 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800331 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
332 static SkDrawImageRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800333
fmalita651c9202015-07-22 10:23:01 -0700334private:
335 SkAutoTUnref<const SkImage> fImage;
336 SkTLazy<SkRect> fSrc;
337 SkRect fDst;
338 SkTLazy<SkPaint> fPaint;
339 SkCanvas::SrcRectConstraint fConstraint;
340
341 typedef SkDrawCommand INHERITED;
342};
343
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000344class SkDrawOvalCommand : public SkDrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000345public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000346 SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700347 void execute(SkCanvas* canvas) const override;
348 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800349 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
350 static SkDrawOvalCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800351
robertphillips@google.com67baba42013-01-02 20:20:31 +0000352private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000353 SkRect fOval;
354 SkPaint fPaint;
355
356 typedef SkDrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000357};
358
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000359class SkDrawPaintCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000360public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000361 SkDrawPaintCommand(const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700362 void execute(SkCanvas* canvas) const override;
363 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800364 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
365 static SkDrawPaintCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800366
chudy@google.com902ebe52012-06-29 14:21:22 +0000367private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000368 SkPaint fPaint;
369
370 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000371};
372
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000373class SkDrawPathCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000374public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000375 SkDrawPathCommand(const SkPath& path, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700376 void execute(SkCanvas* canvas) const override;
377 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800378 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
379 static SkDrawPathCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000380
chudy@google.com902ebe52012-06-29 14:21:22 +0000381private:
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000382 SkPath fPath;
383 SkPaint fPaint;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000384
385 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000386};
387
fmalita160ebb22015-04-01 20:58:37 -0700388class SkBeginDrawPictureCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000389public:
fmalita160ebb22015-04-01 20:58:37 -0700390 SkBeginDrawPictureCommand(const SkPicture* picture,
391 const SkMatrix* matrix,
392 const SkPaint* paint);
393
mtklein36352bf2015-03-25 18:17:31 -0700394 void execute(SkCanvas* canvas) const override;
395 bool render(SkCanvas* canvas) const override;
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +0000396
chudy@google.com902ebe52012-06-29 14:21:22 +0000397private:
robertphillips9b14f262014-06-04 05:40:44 -0700398 SkAutoTUnref<const SkPicture> fPicture;
fmalita160ebb22015-04-01 20:58:37 -0700399 SkTLazy<SkMatrix> fMatrix;
400 SkTLazy<SkPaint> fPaint;
401
402 typedef SkDrawCommand INHERITED;
403};
404
405class SkEndDrawPictureCommand : public SkDrawCommand {
406public:
407 SkEndDrawPictureCommand(bool restore);
408
409 void execute(SkCanvas* canvas) const override;
410
411private:
412 bool fRestore;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000413
414 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000415};
416
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000417class SkDrawPointsCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000418public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000419 SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, const SkPoint pts[],
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000420 const SkPaint& paint);
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000421 virtual ~SkDrawPointsCommand() { delete [] fPts; }
mtklein36352bf2015-03-25 18:17:31 -0700422 void execute(SkCanvas* canvas) const override;
423 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800424 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
425 static SkDrawPointsCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800426
chudy@google.com902ebe52012-06-29 14:21:22 +0000427private:
chudy@google.com902ebe52012-06-29 14:21:22 +0000428 SkCanvas::PointMode fMode;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000429 size_t fCount;
430 SkPoint* fPts;
431 SkPaint fPaint;
432
433 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000434};
435
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000436class SkDrawTextCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000437public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000438 SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000439 const SkPaint& paint);
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000440 virtual ~SkDrawTextCommand() { delete [] fText; }
mtklein36352bf2015-03-25 18:17:31 -0700441 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800442 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
443 static SkDrawTextCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800444
chudy@google.com902ebe52012-06-29 14:21:22 +0000445private:
robertphillips@google.com77279cb2013-03-25 12:01:45 +0000446 char* fText;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000447 size_t fByteLength;
chudy@google.com902ebe52012-06-29 14:21:22 +0000448 SkScalar fX;
449 SkScalar fY;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000450 SkPaint fPaint;
451
452 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000453};
454
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000455class SkDrawPosTextCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000456public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000457 SkDrawPosTextCommand(const void* text, size_t byteLength, const SkPoint pos[],
458 const SkPaint& paint);
459 virtual ~SkDrawPosTextCommand() { delete [] fPos; delete [] fText; }
mtklein36352bf2015-03-25 18:17:31 -0700460 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800461 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
462 static SkDrawPosTextCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800463
chudy@google.com902ebe52012-06-29 14:21:22 +0000464private:
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000465 char* fText;
466 size_t fByteLength;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000467 SkPoint* fPos;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000468 SkPaint fPaint;
469
470 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000471};
472
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000473class SkDrawTextOnPathCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000474public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000475 SkDrawTextOnPathCommand(const void* text, size_t byteLength, const SkPath& path,
476 const SkMatrix* matrix, const SkPaint& paint);
477 virtual ~SkDrawTextOnPathCommand() { delete [] fText; }
mtklein36352bf2015-03-25 18:17:31 -0700478 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800479 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
480 static SkDrawTextOnPathCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800481
chudy@google.com902ebe52012-06-29 14:21:22 +0000482private:
robertphillips@google.com77279cb2013-03-25 12:01:45 +0000483 char* fText;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000484 size_t fByteLength;
485 SkPath fPath;
486 SkMatrix fMatrix;
487 SkPaint fPaint;
488
489 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000490};
491
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000492class SkDrawPosTextHCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000493public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000494 SkDrawPosTextHCommand(const void* text, size_t byteLength, const SkScalar xpos[],
495 SkScalar constY, const SkPaint& paint);
496 virtual ~SkDrawPosTextHCommand() { delete [] fXpos; delete [] fText; }
mtklein36352bf2015-03-25 18:17:31 -0700497 void execute(SkCanvas* canvas) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800498
chudy@google.com902ebe52012-06-29 14:21:22 +0000499private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000500 SkScalar* fXpos;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000501 char* fText;
502 size_t fByteLength;
503 SkScalar fConstY;
504 SkPaint fPaint;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000505
506 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000507};
508
fmalitab7425172014-08-26 07:56:44 -0700509class SkDrawTextBlobCommand : public SkDrawCommand {
510public:
511 SkDrawTextBlobCommand(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPaint& paint);
512
mtklein36352bf2015-03-25 18:17:31 -0700513 void execute(SkCanvas* canvas) const override;
514 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800515 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
516 static SkDrawTextBlobCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
fmalitab7425172014-08-26 07:56:44 -0700517
518private:
519 SkAutoTUnref<const SkTextBlob> fBlob;
520 SkScalar fXPos;
521 SkScalar fYPos;
522 SkPaint fPaint;
523
524 typedef SkDrawCommand INHERITED;
525};
526
robertphillips9bafc302015-02-13 11:13:00 -0800527class SkDrawPatchCommand : public SkDrawCommand {
528public:
529 SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
530 const SkPoint texCoords[4], SkXfermode* xmode,
531 const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700532 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800533 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
534 static SkDrawPatchCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips9bafc302015-02-13 11:13:00 -0800535
536private:
537 SkPoint fCubics[12];
ethannicholas1446a9a2016-02-10 14:05:02 -0800538 SkColor* fColorsPtr;
539 SkColor fColors[4];
540 SkPoint* fTexCoordsPtr;
541 SkPoint fTexCoords[4];
robertphillips9bafc302015-02-13 11:13:00 -0800542 SkAutoTUnref<SkXfermode> fXfermode;
543 SkPaint fPaint;
544
545 typedef SkDrawCommand INHERITED;
546};
547
548
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000549class SkDrawRectCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000550public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000551 SkDrawRectCommand(const SkRect& rect, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700552 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800553 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
554 static SkDrawRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000555
robertphillips@google.com91217d02013-03-17 18:33:46 +0000556 const SkRect& rect() const { return fRect; }
557 const SkPaint& paint() const { return fPaint; }
chudy@google.com902ebe52012-06-29 14:21:22 +0000558private:
robertphillips@google.com91217d02013-03-17 18:33:46 +0000559 SkRect fRect;
560 SkPaint fPaint;
561
562 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000563};
564
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000565class SkDrawRRectCommand : public SkDrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000566public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000567 SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700568 void execute(SkCanvas* canvas) const override;
569 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800570 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
571 static SkDrawRRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800572
robertphillips@google.com67baba42013-01-02 20:20:31 +0000573private:
574 SkRRect fRRect;
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000575 SkPaint fPaint;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000576
577 typedef SkDrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000578};
579
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000580class SkDrawDRRectCommand : public SkDrawCommand {
581public:
582 SkDrawDRRectCommand(const SkRRect& outer, const SkRRect& inner,
583 const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700584 void execute(SkCanvas* canvas) const override;
585 bool render(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800586 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
587 static SkDrawDRRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800588
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000589private:
590 SkRRect fOuter;
591 SkRRect fInner;
592 SkPaint fPaint;
593
594 typedef SkDrawCommand INHERITED;
595};
596
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000597class SkDrawVerticesCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000598public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000599 SkDrawVerticesCommand(SkCanvas::VertexMode vmode, int vertexCount,
600 const SkPoint vertices[], const SkPoint texs[],
601 const SkColor colors[], SkXfermode* xfermode,
602 const uint16_t indices[], int indexCount,
603 const SkPaint& paint);
604 virtual ~SkDrawVerticesCommand();
mtklein36352bf2015-03-25 18:17:31 -0700605 void execute(SkCanvas* canvas) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800606
chudy@google.com902ebe52012-06-29 14:21:22 +0000607private:
608 SkCanvas::VertexMode fVmode;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000609 int fVertexCount;
610 SkPoint* fVertices;
611 SkPoint* fTexs;
612 SkColor* fColors;
chudy@google.com902ebe52012-06-29 14:21:22 +0000613 SkXfermode* fXfermode;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000614 uint16_t* fIndices;
615 int fIndexCount;
616 SkPaint fPaint;
617
618 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000619};
620
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000621class SkSaveCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000622public:
Florin Malita5f6102d2014-06-30 10:13:28 -0400623 SkSaveCommand();
mtklein36352bf2015-03-25 18:17:31 -0700624 void execute(SkCanvas* canvas) const override;
625 Action action() const override { return kPushLayer_Action; }
ethannicholasf62a8b72016-02-11 10:35:21 -0800626 static SkSaveCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800627
chudy@google.com902ebe52012-06-29 14:21:22 +0000628private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000629 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000630};
631
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000632class SkSaveLayerCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000633public:
reed4960eee2015-12-18 07:09:18 -0800634 SkSaveLayerCommand(const SkCanvas::SaveLayerRec&);
ethannicholas50a8dd02016-02-10 05:40:46 -0800635 virtual ~SkSaveLayerCommand();
mtklein36352bf2015-03-25 18:17:31 -0700636 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800637 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
638 static SkSaveLayerCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
mtklein36352bf2015-03-25 18:17:31 -0700639 void vizExecute(SkCanvas* canvas) const override;
640 Action action() const override{ return kPushLayer_Action; }
641 void setActive(bool active) override { fActive = active; }
642 bool active() const override { return fActive; }
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000643
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000644 const SkPaint* paint() const { return fPaintPtr; }
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000645
chudy@google.com902ebe52012-06-29 14:21:22 +0000646private:
ethannicholas50a8dd02016-02-10 05:40:46 -0800647 SkRect fBounds;
648 SkPaint fPaint;
649 SkPaint* fPaintPtr;
650 const SkImageFilter* fBackdrop;
651 uint32_t fSaveLayerFlags;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000652
reed4960eee2015-12-18 07:09:18 -0800653 bool fActive;
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000654
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000655 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000656};
657
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000658class SkSetMatrixCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000659public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000660 SkSetMatrixCommand(const SkMatrix& matrix);
mtklein36352bf2015-03-25 18:17:31 -0700661 void setUserMatrix(const SkMatrix&) override;
662 void execute(SkCanvas* canvas) const override;
ethannicholasf62a8b72016-02-11 10:35:21 -0800663 Json::Value toJSON(UrlDataManager& urlDataManager) const override;
664 static SkSetMatrixCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager);
ethannicholas50a8dd02016-02-10 05:40:46 -0800665
chudy@google.com902ebe52012-06-29 14:21:22 +0000666private:
robertphillips70171682014-10-16 14:28:28 -0700667 SkMatrix fUserMatrix;
robertphillips@google.comb94b1e72013-02-19 21:00:26 +0000668 SkMatrix fMatrix;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000669
670 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000671};
672
chudy@google.com902ebe52012-06-29 14:21:22 +0000673#endif