blob: 0812d850d0519845ed75e0af6a8e58d76fe11f05 [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
Florin Malitaab244f02017-05-03 19:16:58 +000011#include "SkBitmap.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000012#include "SkCanvas.h"
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -040013#include "SkDrawShadowInfo.h"
Mike Reed086a4272017-07-18 10:53:11 -040014#include "SkFlattenable.h"
Brian Osmand8a90f92019-01-28 13:41:19 -050015#include "SkJSONWriter.h"
bungemand3ebb482015-08-05 13:57:49 -070016#include "SkTLazy.h"
17#include "SkPath.h"
Mike Reed267be7f2017-02-13 09:32:54 -050018#include "SkRegion.h"
bungemand3ebb482015-08-05 13:57:49 -070019#include "SkRRect.h"
reed45561a02016-07-07 12:47:17 -070020#include "SkRSXform.h"
robertphillips@google.com0a4805e2013-05-29 13:24:23 +000021#include "SkString.h"
bungemand3ebb482015-08-05 13:57:49 -070022#include "SkTDArray.h"
Mike Reedfed9cfd2017-03-17 12:09:04 -040023#include "SkVertices.h"
ethannicholasf62a8b72016-02-11 10:35:21 -080024#include "UrlDataManager.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000025
Mike Klein0f61faa2016-10-11 16:26:57 -040026class SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +000027public:
robertphillips9bafc302015-02-13 11:13:00 -080028 enum OpType {
fmalita160ebb22015-04-01 20:58:37 -070029 kBeginDrawPicture_OpType,
Brian Osmanc25e2692018-03-12 10:57:28 -040030 kClear_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080031 kClipPath_OpType,
32 kClipRegion_OpType,
33 kClipRect_OpType,
34 kClipRRect_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080035 kConcat_OpType,
reed97660cc2016-06-28 18:54:19 -070036 kDrawAnnotation_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080037 kDrawBitmap_OpType,
Brian Osman78a76482018-05-18 16:59:13 -040038 kDrawBitmapLattice_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080039 kDrawBitmapNine_OpType,
40 kDrawBitmapRect_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080041 kDrawDRRect_OpType,
fmalita651c9202015-07-22 10:23:01 -070042 kDrawImage_OpType,
Stan Ilievac42aeb2017-01-12 16:20:50 -050043 kDrawImageLattice_OpType,
Brian Osmanc25e2692018-03-12 10:57:28 -040044 kDrawImageNine_OpType,
fmalita651c9202015-07-22 10:23:01 -070045 kDrawImageRect_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080046 kDrawOval_OpType,
Brian Osmanc25e2692018-03-12 10:57:28 -040047 kDrawArc_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080048 kDrawPaint_OpType,
49 kDrawPatch_OpType,
50 kDrawPath_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080051 kDrawPoints_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080052 kDrawRect_OpType,
53 kDrawRRect_OpType,
Brian Osmanc25e2692018-03-12 10:57:28 -040054 kDrawRegion_OpType,
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -040055 kDrawShadow_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080056 kDrawTextBlob_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080057 kDrawVertices_OpType,
Brian Osman616f1cb2018-05-29 11:23:35 -040058 kDrawAtlas_OpType,
Brian Osmanc7611082018-05-29 14:55:50 -040059 kDrawDrawable_OpType,
Michael Ludwig390f0cc2019-03-19 09:16:38 -040060 kDrawEdgeAAQuad_OpType,
61 kDrawEdgeAAImageSet_OpType,
fmalita160ebb22015-04-01 20:58:37 -070062 kEndDrawPicture_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080063 kRestore_OpType,
64 kSave_OpType,
65 kSaveLayer_OpType,
66 kSetMatrix_OpType,
robertphillips72942b8e2015-02-12 06:37:12 -080067
Jim Van Verth343fe492017-05-02 16:49:24 -040068 kLast_OpType = kSetMatrix_OpType
robertphillips9bafc302015-02-13 11:13:00 -080069 };
70
71 static const int kOpTypeCount = kLast_OpType + 1;
72
Brian Osmand9ea8162018-08-08 17:03:39 -040073 static void WritePNG(SkBitmap bitmap, SkWStream& out);
ethannicholasf67531f2016-03-21 10:19:39 -070074
robertphillips9bafc302015-02-13 11:13:00 -080075 SkDrawCommand(OpType opType);
chudy@google.com902ebe52012-06-29 14:21:22 +000076
Brian Osman255735e2018-04-06 14:51:42 -040077 virtual ~SkDrawCommand() {}
chudy@google.com902ebe52012-06-29 14:21:22 +000078
chudy@google.com0b5bbb02012-07-31 19:55:32 +000079 bool isVisible() const {
80 return fVisible;
81 }
82
83 void setVisible(bool toggle) {
84 fVisible = toggle;
85 }
chudy@google.com902ebe52012-06-29 14:21:22 +000086
fmalita8c89c522014-11-08 16:18:56 -080087 virtual void execute(SkCanvas*) const = 0;
chudy@google.com902ebe52012-06-29 14:21:22 +000088
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +000089 virtual bool render(SkCanvas* canvas) const { return false; }
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +000090
Brian Osmand8a90f92019-01-28 13:41:19 -050091 virtual void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const;
ethannicholas50a8dd02016-02-10 05:40:46 -080092
robertphillips9bafc302015-02-13 11:13:00 -080093 static const char* GetCommandString(OpType type);
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +000094
joshualittbd724132016-03-03 11:39:38 -080095 // Helper methods for converting things to JSON
Brian Osmand8a90f92019-01-28 13:41:19 -050096 static void MakeJsonColor(SkJSONWriter&, const SkColor color);
97 static void MakeJsonColor4f(SkJSONWriter&, const SkColor4f& color);
98 static void MakeJsonPoint(SkJSONWriter&, const SkPoint& point);
99 static void MakeJsonPoint(SkJSONWriter&, SkScalar x, SkScalar y);
100 static void MakeJsonPoint3(SkJSONWriter&, const SkPoint3& point);
101 static void MakeJsonRect(SkJSONWriter&, const SkRect& rect);
102 static void MakeJsonIRect(SkJSONWriter&, const SkIRect&);
103 static void MakeJsonMatrix(SkJSONWriter&, const SkMatrix&);
104 static void MakeJsonPath(SkJSONWriter&, const SkPath& path);
105 static void MakeJsonRegion(SkJSONWriter&, const SkRegion& region);
106 static void MakeJsonPaint(SkJSONWriter&, const SkPaint& paint, UrlDataManager& urlDataManager);
107 static void MakeJsonLattice(SkJSONWriter&, const SkCanvas::Lattice& lattice);
brianosmanfad98562016-05-04 11:06:28 -0700108
Brian Osmand8a90f92019-01-28 13:41:19 -0500109 static void flatten(const SkFlattenable* flattenable, SkJSONWriter& writer,
brianosmanfad98562016-05-04 11:06:28 -0700110 UrlDataManager& urlDataManager);
Brian Osmand8a90f92019-01-28 13:41:19 -0500111 static bool flatten(const SkImage& image, SkJSONWriter& writer,
brianosmanfad98562016-05-04 11:06:28 -0700112 UrlDataManager& urlDataManager);
Brian Osmand8a90f92019-01-28 13:41:19 -0500113 static bool flatten(const SkBitmap& bitmap, SkJSONWriter& writer,
brianosmanfad98562016-05-04 11:06:28 -0700114 UrlDataManager& urlDataManager);
joshualittbd724132016-03-03 11:39:38 -0800115
chudy@google.com902ebe52012-06-29 14:21:22 +0000116private:
robertphillips9bafc302015-02-13 11:13:00 -0800117 OpType fOpType;
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000118 bool fVisible;
chudy@google.com902ebe52012-06-29 14:21:22 +0000119};
120
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000121class SkRestoreCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000122public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000123 SkRestoreCommand();
mtklein36352bf2015-03-25 18:17:31 -0700124 void execute(SkCanvas* canvas) const override;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000125
126private:
127 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000128};
129
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000130class SkClearCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000131public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000132 SkClearCommand(SkColor color);
mtklein36352bf2015-03-25 18:17:31 -0700133 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500134 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800135
chudy@google.com902ebe52012-06-29 14:21:22 +0000136private:
137 SkColor fColor;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000138
139 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000140};
141
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000142class SkClipPathCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000143public:
Mike Reedc1f77742016-12-09 09:00:50 -0500144 SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA);
mtklein36352bf2015-03-25 18:17:31 -0700145 void execute(SkCanvas* canvas) const override;
146 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500147 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800148
chudy@google.com902ebe52012-06-29 14:21:22 +0000149private:
Mike Reedc1f77742016-12-09 09:00:50 -0500150 SkPath fPath;
151 SkClipOp fOp;
152 bool fDoAA;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000153
154 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000155};
156
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000157class SkClipRegionCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000158public:
Mike Reedc1f77742016-12-09 09:00:50 -0500159 SkClipRegionCommand(const SkRegion& region, SkClipOp op);
mtklein36352bf2015-03-25 18:17:31 -0700160 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500161 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800162
chudy@google.com902ebe52012-06-29 14:21:22 +0000163private:
Mike Reedc1f77742016-12-09 09:00:50 -0500164 SkRegion fRegion;
165 SkClipOp fOp;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000166
167 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000168};
169
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000170class SkClipRectCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000171public:
Mike Reedc1f77742016-12-09 09:00:50 -0500172 SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA);
mtklein36352bf2015-03-25 18:17:31 -0700173 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500174 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000175
chudy@google.com902ebe52012-06-29 14:21:22 +0000176private:
Mike Reedc1f77742016-12-09 09:00:50 -0500177 SkRect fRect;
178 SkClipOp fOp;
179 bool fDoAA;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000180
181 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000182};
183
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000184class SkClipRRectCommand : public SkDrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000185public:
Mike Reedc1f77742016-12-09 09:00:50 -0500186 SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA);
mtklein36352bf2015-03-25 18:17:31 -0700187 void execute(SkCanvas* canvas) const override;
188 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500189 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000190
robertphillips@google.com67baba42013-01-02 20:20:31 +0000191private:
Mike Reedc1f77742016-12-09 09:00:50 -0500192 SkRRect fRRect;
193 SkClipOp fOp;
194 bool fDoAA;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000195
196 typedef SkDrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000197};
198
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000199class SkConcatCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000200public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000201 SkConcatCommand(const SkMatrix& matrix);
mtklein36352bf2015-03-25 18:17:31 -0700202 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500203 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800204
chudy@google.com902ebe52012-06-29 14:21:22 +0000205private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000206 SkMatrix fMatrix;
207
208 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000209};
210
reed97660cc2016-06-28 18:54:19 -0700211class SkDrawAnnotationCommand : public SkDrawCommand {
212public:
213 SkDrawAnnotationCommand(const SkRect&, const char key[], sk_sp<SkData> value);
214 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500215 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
reed97660cc2016-06-28 18:54:19 -0700216
217private:
218 SkRect fRect;
219 SkString fKey;
220 sk_sp<SkData> fValue;
221
222 typedef SkDrawCommand INHERITED;
223};
224
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000225class SkDrawBitmapCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000226public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000227 SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000228 const SkPaint* paint);
mtklein36352bf2015-03-25 18:17:31 -0700229 void execute(SkCanvas* canvas) const override;
230 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500231 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800232
chudy@google.com902ebe52012-06-29 14:21:22 +0000233private:
Brian Osman8363be12018-05-29 13:38:07 -0400234 SkBitmap fBitmap;
235 SkScalar fLeft;
236 SkScalar fTop;
237 SkTLazy<SkPaint> fPaint;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000238
239 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000240};
241
Brian Osman78a76482018-05-18 16:59:13 -0400242class SkDrawBitmapLatticeCommand : public SkDrawCommand {
243public:
244 SkDrawBitmapLatticeCommand(const SkBitmap& bitmap, const SkCanvas::Lattice& lattice,
245 const SkRect& dst, const SkPaint* paint);
246 void execute(SkCanvas* canvas) const override;
247 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500248 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
Brian Osman78a76482018-05-18 16:59:13 -0400249
250private:
251 SkBitmap fBitmap;
252 SkCanvas::Lattice fLattice;
253 SkRect fDst;
254 SkTLazy<SkPaint> fPaint;
255
256 typedef SkDrawCommand INHERITED;
257};
258
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000259class SkDrawBitmapNineCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000260public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000261 SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000262 const SkRect& dst, const SkPaint* paint);
mtklein36352bf2015-03-25 18:17:31 -0700263 void execute(SkCanvas* canvas) const override;
264 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500265 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800266
chudy@google.com902ebe52012-06-29 14:21:22 +0000267private:
Brian Osman8363be12018-05-29 13:38:07 -0400268 SkBitmap fBitmap;
269 SkIRect fCenter;
270 SkRect fDst;
271 SkTLazy<SkPaint> fPaint;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000272
273 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000274};
275
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000276class SkDrawBitmapRectCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000277public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000278 SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000279 const SkRect& dst, const SkPaint* paint,
reeda5517e22015-07-14 10:54:12 -0700280 SkCanvas::SrcRectConstraint);
mtklein36352bf2015-03-25 18:17:31 -0700281 void execute(SkCanvas* canvas) const override;
282 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500283 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000284
chudy@google.com902ebe52012-06-29 14:21:22 +0000285private:
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000286 SkBitmap fBitmap;
Brian Osman8363be12018-05-29 13:38:07 -0400287 SkTLazy<SkRect> fSrc;
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000288 SkRect fDst;
Brian Osman8363be12018-05-29 13:38:07 -0400289 SkTLazy<SkPaint> fPaint;
reeda5517e22015-07-14 10:54:12 -0700290 SkCanvas::SrcRectConstraint fConstraint;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000291
292 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000293};
294
fmalita651c9202015-07-22 10:23:01 -0700295class SkDrawImageCommand : public SkDrawCommand {
296public:
297 SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top, const SkPaint* paint);
298 void execute(SkCanvas* canvas) const override;
299 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500300 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800301
fmalita651c9202015-07-22 10:23:01 -0700302private:
Hal Canary1b612a82016-11-03 16:26:13 -0400303 sk_sp<const SkImage> fImage;
304 SkScalar fLeft;
305 SkScalar fTop;
306 SkTLazy<SkPaint> fPaint;
fmalita651c9202015-07-22 10:23:01 -0700307
308 typedef SkDrawCommand INHERITED;
309};
310
Stan Ilievac42aeb2017-01-12 16:20:50 -0500311class SkDrawImageLatticeCommand : public SkDrawCommand {
312public:
313 SkDrawImageLatticeCommand(const SkImage* image, const SkCanvas::Lattice& lattice,
314 const SkRect& dst, const SkPaint* paint);
315 void execute(SkCanvas* canvas) const override;
316 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500317 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
Stan Ilievac42aeb2017-01-12 16:20:50 -0500318
319private:
320 sk_sp<const SkImage> fImage;
321 SkCanvas::Lattice fLattice;
322 SkRect fDst;
323 SkTLazy<SkPaint> fPaint;
324
325 typedef SkDrawCommand INHERITED;
326};
327
Brian Osmanc25e2692018-03-12 10:57:28 -0400328class SkDrawImageNineCommand : public SkDrawCommand {
329public:
330 SkDrawImageNineCommand(const SkImage* image, const SkIRect& center,
331 const SkRect& dst, const SkPaint* paint);
332 void execute(SkCanvas* canvas) const override;
333 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500334 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
Brian Osmanc25e2692018-03-12 10:57:28 -0400335
336private:
337 sk_sp<const SkImage> fImage;
338 SkIRect fCenter;
339 SkRect fDst;
Brian Osman8363be12018-05-29 13:38:07 -0400340 SkTLazy<SkPaint> fPaint;
Brian Osmanc25e2692018-03-12 10:57:28 -0400341
342 typedef SkDrawCommand INHERITED;
343};
344
fmalita651c9202015-07-22 10:23:01 -0700345class SkDrawImageRectCommand : public SkDrawCommand {
346public:
347 SkDrawImageRectCommand(const SkImage* image, const SkRect* src, const SkRect& dst,
348 const SkPaint* paint, SkCanvas::SrcRectConstraint constraint);
349 void execute(SkCanvas* canvas) const override;
350 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500351 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800352
fmalita651c9202015-07-22 10:23:01 -0700353private:
Hal Canary1b612a82016-11-03 16:26:13 -0400354 sk_sp<const SkImage> fImage;
fmalita651c9202015-07-22 10:23:01 -0700355 SkTLazy<SkRect> fSrc;
356 SkRect fDst;
357 SkTLazy<SkPaint> fPaint;
358 SkCanvas::SrcRectConstraint fConstraint;
359
360 typedef SkDrawCommand INHERITED;
361};
362
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000363class SkDrawOvalCommand : public SkDrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000364public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000365 SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700366 void execute(SkCanvas* canvas) const override;
367 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500368 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800369
robertphillips@google.com67baba42013-01-02 20:20:31 +0000370private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000371 SkRect fOval;
372 SkPaint fPaint;
373
374 typedef SkDrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000375};
376
bsalomonac3aa242016-08-19 11:25:19 -0700377class SkDrawArcCommand : public SkDrawCommand {
378public:
379 SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, bool useCenter,
380 const SkPaint& paint);
381 void execute(SkCanvas* canvas) const override;
382 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500383 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
bsalomonac3aa242016-08-19 11:25:19 -0700384
385private:
386 SkRect fOval;
387 SkScalar fStartAngle;
388 SkScalar fSweepAngle;
389 bool fUseCenter;
390 SkPaint fPaint;
391
392 typedef SkDrawCommand INHERITED;
393};
394
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000395class SkDrawPaintCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000396public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000397 SkDrawPaintCommand(const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700398 void execute(SkCanvas* canvas) const override;
399 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500400 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800401
chudy@google.com902ebe52012-06-29 14:21:22 +0000402private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000403 SkPaint fPaint;
404
405 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000406};
407
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000408class SkDrawPathCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000409public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000410 SkDrawPathCommand(const SkPath& path, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700411 void execute(SkCanvas* canvas) const override;
412 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500413 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000414
chudy@google.com902ebe52012-06-29 14:21:22 +0000415private:
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000416 SkPath fPath;
417 SkPaint fPaint;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000418
419 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000420};
421
fmalita160ebb22015-04-01 20:58:37 -0700422class SkBeginDrawPictureCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000423public:
fmalita160ebb22015-04-01 20:58:37 -0700424 SkBeginDrawPictureCommand(const SkPicture* picture,
425 const SkMatrix* matrix,
426 const SkPaint* paint);
427
mtklein36352bf2015-03-25 18:17:31 -0700428 void execute(SkCanvas* canvas) const override;
429 bool render(SkCanvas* canvas) const override;
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +0000430
chudy@google.com902ebe52012-06-29 14:21:22 +0000431private:
Hal Canary1b612a82016-11-03 16:26:13 -0400432 sk_sp<const SkPicture> fPicture;
433 SkTLazy<SkMatrix> fMatrix;
434 SkTLazy<SkPaint> fPaint;
fmalita160ebb22015-04-01 20:58:37 -0700435
436 typedef SkDrawCommand INHERITED;
437};
438
439class SkEndDrawPictureCommand : public SkDrawCommand {
440public:
441 SkEndDrawPictureCommand(bool restore);
442
443 void execute(SkCanvas* canvas) const override;
444
445private:
446 bool fRestore;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000447
448 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000449};
450
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000451class SkDrawPointsCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000452public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000453 SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, const SkPoint pts[],
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000454 const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700455 void execute(SkCanvas* canvas) const override;
456 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500457 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800458
chudy@google.com902ebe52012-06-29 14:21:22 +0000459private:
chudy@google.com902ebe52012-06-29 14:21:22 +0000460 SkCanvas::PointMode fMode;
Brian Osman8363be12018-05-29 13:38:07 -0400461 SkTDArray<SkPoint> fPts;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000462 SkPaint fPaint;
463
464 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000465};
466
Brian Osmanc25e2692018-03-12 10:57:28 -0400467class SkDrawRegionCommand : public SkDrawCommand {
468public:
469 SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint);
470 void execute(SkCanvas* canvas) const override;
471 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500472 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
Brian Osmanc25e2692018-03-12 10:57:28 -0400473
474private:
475 SkRegion fRegion;
476 SkPaint fPaint;
477
478 typedef SkDrawCommand INHERITED;
479};
480
fmalitab7425172014-08-26 07:56:44 -0700481class SkDrawTextBlobCommand : public SkDrawCommand {
482public:
fmalita37283c22016-09-13 10:00:23 -0700483 SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y, const SkPaint& paint);
fmalitab7425172014-08-26 07:56:44 -0700484
mtklein36352bf2015-03-25 18:17:31 -0700485 void execute(SkCanvas* canvas) const override;
486 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500487 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
fmalitab7425172014-08-26 07:56:44 -0700488
489private:
fmalita37283c22016-09-13 10:00:23 -0700490 sk_sp<SkTextBlob> fBlob;
491 SkScalar fXPos;
492 SkScalar fYPos;
493 SkPaint fPaint;
fmalitab7425172014-08-26 07:56:44 -0700494
495 typedef SkDrawCommand INHERITED;
496};
497
robertphillips9bafc302015-02-13 11:13:00 -0800498class SkDrawPatchCommand : public SkDrawCommand {
499public:
500 SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -0400501 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -0800502 const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700503 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500504 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips9bafc302015-02-13 11:13:00 -0800505
506private:
507 SkPoint fCubics[12];
ethannicholas1446a9a2016-02-10 14:05:02 -0800508 SkColor* fColorsPtr;
509 SkColor fColors[4];
510 SkPoint* fTexCoordsPtr;
511 SkPoint fTexCoords[4];
Mike Reed7d954ad2016-10-28 15:42:34 -0400512 SkBlendMode fBlendMode;
robertphillips9bafc302015-02-13 11:13:00 -0800513 SkPaint fPaint;
514
515 typedef SkDrawCommand INHERITED;
516};
517
518
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000519class SkDrawRectCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000520public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000521 SkDrawRectCommand(const SkRect& rect, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700522 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500523 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000524
chudy@google.com902ebe52012-06-29 14:21:22 +0000525private:
robertphillips@google.com91217d02013-03-17 18:33:46 +0000526 SkRect fRect;
527 SkPaint fPaint;
528
529 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000530};
531
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000532class SkDrawRRectCommand : public SkDrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000533public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000534 SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700535 void execute(SkCanvas* canvas) const override;
536 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500537 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800538
robertphillips@google.com67baba42013-01-02 20:20:31 +0000539private:
540 SkRRect fRRect;
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000541 SkPaint fPaint;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000542
543 typedef SkDrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000544};
545
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000546class SkDrawDRRectCommand : public SkDrawCommand {
547public:
548 SkDrawDRRectCommand(const SkRRect& outer, const SkRRect& inner,
549 const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700550 void execute(SkCanvas* canvas) const override;
551 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500552 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800553
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000554private:
555 SkRRect fOuter;
556 SkRRect fInner;
557 SkPaint fPaint;
558
559 typedef SkDrawCommand INHERITED;
560};
561
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000562class SkDrawVerticesCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000563public:
Mike Reedfed9cfd2017-03-17 12:09:04 -0400564 SkDrawVerticesCommand(sk_sp<SkVertices>, SkBlendMode, const SkPaint&);
565
mtklein36352bf2015-03-25 18:17:31 -0700566 void execute(SkCanvas* canvas) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800567
chudy@google.com902ebe52012-06-29 14:21:22 +0000568private:
Mike Reedfed9cfd2017-03-17 12:09:04 -0400569 sk_sp<SkVertices> fVertices;
570 SkBlendMode fBlendMode;
571 SkPaint fPaint;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000572
573 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000574};
575
Brian Osman616f1cb2018-05-29 11:23:35 -0400576class SkDrawAtlasCommand : public SkDrawCommand {
577public:
578 SkDrawAtlasCommand(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int,
579 SkBlendMode, const SkRect*, const SkPaint*);
580
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
592 typedef SkDrawCommand INHERITED;
593};
594
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000595class SkSaveCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000596public:
Florin Malita5f6102d2014-06-30 10:13:28 -0400597 SkSaveCommand();
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:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000601 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000602};
603
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000604class SkSaveLayerCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000605public:
reed4960eee2015-12-18 07:09:18 -0800606 SkSaveLayerCommand(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
616 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000617};
618
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000619class SkSetMatrixCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000620public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000621 SkSetMatrixCommand(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
628 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000629};
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400630
631class SkDrawShadowCommand : public SkDrawCommand {
632public:
633 SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec);
634 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:
639 SkPath fPath;
640 SkDrawShadowRec fShadowRec;
641
642 typedef SkDrawCommand INHERITED;
643};
vjiaoblacke6f5d562016-08-25 06:30:23 -0700644
Brian Osmanc7611082018-05-29 14:55:50 -0400645class SkDrawDrawableCommand : public SkDrawCommand {
646public:
647 SkDrawDrawableCommand(SkDrawable*, const SkMatrix*);
648 void execute(SkCanvas* canvas) const override;
649
650private:
651 sk_sp<SkDrawable> fDrawable;
652 SkTLazy<SkMatrix> fMatrix;
653
654 typedef SkDrawCommand INHERITED;
655};
Michael Ludwig390f0cc2019-03-19 09:16:38 -0400656
657class SkDrawEdgeAAQuadCommand : public SkDrawCommand {
658public:
659 SkDrawEdgeAAQuadCommand(const SkRect& rect, const SkPoint clip[4],
660 SkCanvas::QuadAAFlags aa, SkColor color, SkBlendMode mode);
661 void execute(SkCanvas* canvas) const override;
662
663private:
664 SkRect fRect;
665 SkPoint fClip[4];
666 int fHasClip;
667 SkCanvas::QuadAAFlags fAA;
668 SkColor fColor;
669 SkBlendMode fMode;
670
671 typedef SkDrawCommand INHERITED;
672};
673
674class SkDrawEdgeAAImageSetCommand : public SkDrawCommand {
675public:
676 SkDrawEdgeAAImageSetCommand(const SkCanvas::ImageSetEntry[], int count, const SkPoint[],
677 const SkMatrix[], const SkPaint*, SkCanvas::SrcRectConstraint);
678 void execute(SkCanvas* canvas) const override;
679
680private:
681 SkAutoTArray<SkCanvas::ImageSetEntry> fSet;
682 int fCount;
683 SkAutoTArray<SkPoint> fDstClips;
684 SkAutoTArray<SkMatrix> fPreViewMatrices;
685 SkTLazy<SkPaint> fPaint;
686 SkCanvas::SrcRectConstraint fConstraint;
687
688 typedef SkDrawCommand INHERITED;
689};
Brian Osmanc7611082018-05-29 14:55:50 -0400690#endif