blob: 7c386bcbc836964e77ee921517c14b6a27d9d008 [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,
Brian Salomond7065e72018-10-12 11:42:02 -040046 kDrawImageSet_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080047 kDrawOval_OpType,
Brian Osmanc25e2692018-03-12 10:57:28 -040048 kDrawArc_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080049 kDrawPaint_OpType,
50 kDrawPatch_OpType,
51 kDrawPath_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080052 kDrawPoints_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080053 kDrawRect_OpType,
Michael Ludwig75451902019-01-23 11:14:29 -050054 kDrawEdgeAARect_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080055 kDrawRRect_OpType,
Brian Osmanc25e2692018-03-12 10:57:28 -040056 kDrawRegion_OpType,
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -040057 kDrawShadow_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080058 kDrawTextBlob_OpType,
robertphillips9bafc302015-02-13 11:13:00 -080059 kDrawVertices_OpType,
Brian Osman616f1cb2018-05-29 11:23:35 -040060 kDrawAtlas_OpType,
Brian Osmanc7611082018-05-29 14:55:50 -040061 kDrawDrawable_OpType,
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
Brian Salomond7065e72018-10-12 11:42:02 -0400363class SkDrawImageSetCommand : public SkDrawCommand {
364public:
Brian Salomond003d222018-11-26 13:25:05 -0500365 SkDrawImageSetCommand(const SkCanvas::ImageSetEntry[], int count, SkFilterQuality, SkBlendMode);
Brian Salomond7065e72018-10-12 11:42:02 -0400366 void execute(SkCanvas* canvas) const override;
367
368private:
369 SkAutoTArray<SkCanvas::ImageSetEntry> fSet;
370 int fCount;
Brian Salomond7065e72018-10-12 11:42:02 -0400371 SkFilterQuality fFilterQuality;
372 SkBlendMode fMode;
373
374 typedef SkDrawCommand INHERITED;
375};
376
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000377class SkDrawOvalCommand : public SkDrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000378public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000379 SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700380 void execute(SkCanvas* canvas) const override;
381 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500382 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800383
robertphillips@google.com67baba42013-01-02 20:20:31 +0000384private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000385 SkRect fOval;
386 SkPaint fPaint;
387
388 typedef SkDrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000389};
390
bsalomonac3aa242016-08-19 11:25:19 -0700391class SkDrawArcCommand : public SkDrawCommand {
392public:
393 SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, bool useCenter,
394 const SkPaint& paint);
395 void execute(SkCanvas* canvas) const override;
396 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500397 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
bsalomonac3aa242016-08-19 11:25:19 -0700398
399private:
400 SkRect fOval;
401 SkScalar fStartAngle;
402 SkScalar fSweepAngle;
403 bool fUseCenter;
404 SkPaint fPaint;
405
406 typedef SkDrawCommand INHERITED;
407};
408
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000409class SkDrawPaintCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000410public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000411 SkDrawPaintCommand(const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700412 void execute(SkCanvas* canvas) const override;
413 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500414 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800415
chudy@google.com902ebe52012-06-29 14:21:22 +0000416private:
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000417 SkPaint fPaint;
418
419 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000420};
421
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000422class SkDrawPathCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000423public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000424 SkDrawPathCommand(const SkPath& path, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700425 void execute(SkCanvas* canvas) const override;
426 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500427 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000428
chudy@google.com902ebe52012-06-29 14:21:22 +0000429private:
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000430 SkPath fPath;
431 SkPaint fPaint;
robertphillips@google.com91217d02013-03-17 18:33:46 +0000432
433 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000434};
435
fmalita160ebb22015-04-01 20:58:37 -0700436class SkBeginDrawPictureCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000437public:
fmalita160ebb22015-04-01 20:58:37 -0700438 SkBeginDrawPictureCommand(const SkPicture* picture,
439 const SkMatrix* matrix,
440 const SkPaint* paint);
441
mtklein36352bf2015-03-25 18:17:31 -0700442 void execute(SkCanvas* canvas) const override;
443 bool render(SkCanvas* canvas) const override;
commit-bot@chromium.orge898e9c2013-11-21 17:08:12 +0000444
chudy@google.com902ebe52012-06-29 14:21:22 +0000445private:
Hal Canary1b612a82016-11-03 16:26:13 -0400446 sk_sp<const SkPicture> fPicture;
447 SkTLazy<SkMatrix> fMatrix;
448 SkTLazy<SkPaint> fPaint;
fmalita160ebb22015-04-01 20:58:37 -0700449
450 typedef SkDrawCommand INHERITED;
451};
452
453class SkEndDrawPictureCommand : public SkDrawCommand {
454public:
455 SkEndDrawPictureCommand(bool restore);
456
457 void execute(SkCanvas* canvas) const override;
458
459private:
460 bool fRestore;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000461
462 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000463};
464
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000465class SkDrawPointsCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000466public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000467 SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, const SkPoint pts[],
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000468 const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700469 void execute(SkCanvas* canvas) const override;
470 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500471 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800472
chudy@google.com902ebe52012-06-29 14:21:22 +0000473private:
chudy@google.com902ebe52012-06-29 14:21:22 +0000474 SkCanvas::PointMode fMode;
Brian Osman8363be12018-05-29 13:38:07 -0400475 SkTDArray<SkPoint> fPts;
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000476 SkPaint fPaint;
477
478 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000479};
480
Brian Osmanc25e2692018-03-12 10:57:28 -0400481class SkDrawRegionCommand : public SkDrawCommand {
482public:
483 SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint);
484 void execute(SkCanvas* canvas) const override;
485 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500486 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
Brian Osmanc25e2692018-03-12 10:57:28 -0400487
488private:
489 SkRegion fRegion;
490 SkPaint fPaint;
491
492 typedef SkDrawCommand INHERITED;
493};
494
fmalitab7425172014-08-26 07:56:44 -0700495class SkDrawTextBlobCommand : public SkDrawCommand {
496public:
fmalita37283c22016-09-13 10:00:23 -0700497 SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y, const SkPaint& paint);
fmalitab7425172014-08-26 07:56:44 -0700498
mtklein36352bf2015-03-25 18:17:31 -0700499 void execute(SkCanvas* canvas) const override;
500 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500501 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
fmalitab7425172014-08-26 07:56:44 -0700502
503private:
fmalita37283c22016-09-13 10:00:23 -0700504 sk_sp<SkTextBlob> fBlob;
505 SkScalar fXPos;
506 SkScalar fYPos;
507 SkPaint fPaint;
fmalitab7425172014-08-26 07:56:44 -0700508
509 typedef SkDrawCommand INHERITED;
510};
511
robertphillips9bafc302015-02-13 11:13:00 -0800512class SkDrawPatchCommand : public SkDrawCommand {
513public:
514 SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
Mike Reed7d954ad2016-10-28 15:42:34 -0400515 const SkPoint texCoords[4], SkBlendMode bmode,
robertphillips9bafc302015-02-13 11:13:00 -0800516 const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700517 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500518 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips9bafc302015-02-13 11:13:00 -0800519
520private:
521 SkPoint fCubics[12];
ethannicholas1446a9a2016-02-10 14:05:02 -0800522 SkColor* fColorsPtr;
523 SkColor fColors[4];
524 SkPoint* fTexCoordsPtr;
525 SkPoint fTexCoords[4];
Mike Reed7d954ad2016-10-28 15:42:34 -0400526 SkBlendMode fBlendMode;
robertphillips9bafc302015-02-13 11:13:00 -0800527 SkPaint fPaint;
528
529 typedef SkDrawCommand INHERITED;
530};
531
532
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000533class SkDrawRectCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000534public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000535 SkDrawRectCommand(const SkRect& rect, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700536 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500537 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000538
chudy@google.com902ebe52012-06-29 14:21:22 +0000539private:
robertphillips@google.com91217d02013-03-17 18:33:46 +0000540 SkRect fRect;
541 SkPaint fPaint;
542
543 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000544};
545
Michael Ludwig75451902019-01-23 11:14:29 -0500546class SkDrawEdgeAARectCommand : public SkDrawCommand {
547public:
548 SkDrawEdgeAARectCommand(const SkRect& rect, SkCanvas::QuadAAFlags aa, SkColor color,
549 SkBlendMode mode);
550 void execute(SkCanvas* canvas) const override;
551
552private:
553 SkRect fRect;
554 SkCanvas::QuadAAFlags fAA;
555 SkColor fColor;
556 SkBlendMode fMode;
557
558 typedef SkDrawCommand INHERITED;
559};
560
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000561class SkDrawRRectCommand : public SkDrawCommand {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000562public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000563 SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700564 void execute(SkCanvas* canvas) const override;
565 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500566 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800567
robertphillips@google.com67baba42013-01-02 20:20:31 +0000568private:
569 SkRRect fRRect;
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000570 SkPaint fPaint;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000571
572 typedef SkDrawCommand INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000573};
574
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000575class SkDrawDRRectCommand : public SkDrawCommand {
576public:
577 SkDrawDRRectCommand(const SkRRect& outer, const SkRRect& inner,
578 const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -0700579 void execute(SkCanvas* canvas) const override;
580 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500581 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800582
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000583private:
584 SkRRect fOuter;
585 SkRRect fInner;
586 SkPaint fPaint;
587
588 typedef SkDrawCommand INHERITED;
589};
590
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000591class SkDrawVerticesCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000592public:
Mike Reedfed9cfd2017-03-17 12:09:04 -0400593 SkDrawVerticesCommand(sk_sp<SkVertices>, SkBlendMode, const SkPaint&);
594
mtklein36352bf2015-03-25 18:17:31 -0700595 void execute(SkCanvas* canvas) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800596
chudy@google.com902ebe52012-06-29 14:21:22 +0000597private:
Mike Reedfed9cfd2017-03-17 12:09:04 -0400598 sk_sp<SkVertices> fVertices;
599 SkBlendMode fBlendMode;
600 SkPaint fPaint;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000601
602 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000603};
604
Brian Osman616f1cb2018-05-29 11:23:35 -0400605class SkDrawAtlasCommand : public SkDrawCommand {
606public:
607 SkDrawAtlasCommand(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int,
608 SkBlendMode, const SkRect*, const SkPaint*);
609
610 void execute(SkCanvas* canvas) const override;
611
612private:
613 sk_sp<const SkImage> fImage;
614 SkTDArray<SkRSXform> fXform;
615 SkTDArray<SkRect> fTex;
616 SkTDArray<SkColor> fColors;
617 SkBlendMode fBlendMode;
618 SkTLazy<SkRect> fCull;
619 SkTLazy<SkPaint> fPaint;
620
621 typedef SkDrawCommand INHERITED;
622};
623
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000624class SkSaveCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000625public:
Florin Malita5f6102d2014-06-30 10:13:28 -0400626 SkSaveCommand();
mtklein36352bf2015-03-25 18:17:31 -0700627 void execute(SkCanvas* canvas) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800628
chudy@google.com902ebe52012-06-29 14:21:22 +0000629private:
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000630 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000631};
632
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000633class SkSaveLayerCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000634public:
reed4960eee2015-12-18 07:09:18 -0800635 SkSaveLayerCommand(const SkCanvas::SaveLayerRec&);
mtklein36352bf2015-03-25 18:17:31 -0700636 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500637 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000638
chudy@google.com902ebe52012-06-29 14:21:22 +0000639private:
Brian Osman8363be12018-05-29 13:38:07 -0400640 SkTLazy<SkRect> fBounds;
641 SkTLazy<SkPaint> fPaint;
642 sk_sp<const SkImageFilter> fBackdrop;
643 uint32_t fSaveLayerFlags;
robertphillips@google.com24bfdac2013-03-22 16:33:31 +0000644
645 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000646};
647
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000648class SkSetMatrixCommand : public SkDrawCommand {
chudy@google.com902ebe52012-06-29 14:21:22 +0000649public:
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000650 SkSetMatrixCommand(const SkMatrix& matrix);
mtklein36352bf2015-03-25 18:17:31 -0700651 void execute(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500652 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
ethannicholas50a8dd02016-02-10 05:40:46 -0800653
chudy@google.com902ebe52012-06-29 14:21:22 +0000654private:
robertphillips@google.comb94b1e72013-02-19 21:00:26 +0000655 SkMatrix fMatrix;
robertphillips@google.com0df2a9a2013-03-25 11:50:42 +0000656
657 typedef SkDrawCommand INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000658};
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400659
660class SkDrawShadowCommand : public SkDrawCommand {
661public:
662 SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec);
663 void execute(SkCanvas* canvas) const override;
664 bool render(SkCanvas* canvas) const override;
Brian Osmand8a90f92019-01-28 13:41:19 -0500665 void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
Derek Sollenberger6aab2ab2018-04-12 12:45:58 -0400666
667private:
668 SkPath fPath;
669 SkDrawShadowRec fShadowRec;
670
671 typedef SkDrawCommand INHERITED;
672};
vjiaoblacke6f5d562016-08-25 06:30:23 -0700673
Brian Osmanc7611082018-05-29 14:55:50 -0400674class SkDrawDrawableCommand : public SkDrawCommand {
675public:
676 SkDrawDrawableCommand(SkDrawable*, const SkMatrix*);
677 void execute(SkCanvas* canvas) const override;
678
679private:
680 sk_sp<SkDrawable> fDrawable;
681 SkTLazy<SkMatrix> fMatrix;
682
683 typedef SkDrawCommand INHERITED;
684};
685#endif