DrawCommand.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728
  1. /*
  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. #ifndef SKDRAWCOMMAND_H_
  8. #define SKDRAWCOMMAND_H_
  9. #include "include/core/SkBitmap.h"
  10. #include "include/core/SkCanvas.h"
  11. #include "include/core/SkFlattenable.h"
  12. #include "include/core/SkPath.h"
  13. #include "include/core/SkRRect.h"
  14. #include "include/core/SkRSXform.h"
  15. #include "include/core/SkRegion.h"
  16. #include "include/core/SkString.h"
  17. #include "include/core/SkVertices.h"
  18. #include "include/private/SkTDArray.h"
  19. #include "src/core/SkDrawShadowInfo.h"
  20. #include "src/core/SkTLazy.h"
  21. #include "src/utils/SkJSONWriter.h"
  22. #include "tools/UrlDataManager.h"
  23. class DrawCommand {
  24. public:
  25. enum OpType {
  26. kBeginDrawPicture_OpType,
  27. kClear_OpType,
  28. kClipPath_OpType,
  29. kClipRegion_OpType,
  30. kClipRect_OpType,
  31. kClipRRect_OpType,
  32. kConcat_OpType,
  33. kDrawAnnotation_OpType,
  34. kDrawBitmap_OpType,
  35. kDrawBitmapLattice_OpType,
  36. kDrawBitmapNine_OpType,
  37. kDrawBitmapRect_OpType,
  38. kDrawDRRect_OpType,
  39. kDrawImage_OpType,
  40. kDrawImageLattice_OpType,
  41. kDrawImageNine_OpType,
  42. kDrawImageRect_OpType,
  43. kDrawOval_OpType,
  44. kDrawArc_OpType,
  45. kDrawPaint_OpType,
  46. kDrawPatch_OpType,
  47. kDrawPath_OpType,
  48. kDrawPoints_OpType,
  49. kDrawRect_OpType,
  50. kDrawRRect_OpType,
  51. kDrawRegion_OpType,
  52. kDrawShadow_OpType,
  53. kDrawTextBlob_OpType,
  54. kDrawVertices_OpType,
  55. kDrawAtlas_OpType,
  56. kDrawDrawable_OpType,
  57. kDrawEdgeAAQuad_OpType,
  58. kDrawEdgeAAImageSet_OpType,
  59. kEndDrawPicture_OpType,
  60. kRestore_OpType,
  61. kSave_OpType,
  62. kSaveLayer_OpType,
  63. kSetMatrix_OpType,
  64. kLast_OpType = kSetMatrix_OpType
  65. };
  66. static const int kOpTypeCount = kLast_OpType + 1;
  67. static void WritePNG(SkBitmap bitmap, SkWStream& out);
  68. DrawCommand(OpType opType);
  69. virtual ~DrawCommand() {}
  70. bool isVisible() const { return fVisible; }
  71. void setVisible(bool toggle) { fVisible = toggle; }
  72. virtual void execute(SkCanvas*) const = 0;
  73. virtual bool render(SkCanvas* canvas) const { return false; }
  74. virtual void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const;
  75. static const char* GetCommandString(OpType type);
  76. // Helper methods for converting things to JSON
  77. static void MakeJsonColor(SkJSONWriter&, const SkColor color);
  78. static void MakeJsonColor4f(SkJSONWriter&, const SkColor4f& color);
  79. static void MakeJsonPoint(SkJSONWriter&, const SkPoint& point);
  80. static void MakeJsonPoint(SkJSONWriter&, SkScalar x, SkScalar y);
  81. static void MakeJsonPoint3(SkJSONWriter&, const SkPoint3& point);
  82. static void MakeJsonRect(SkJSONWriter&, const SkRect& rect);
  83. static void MakeJsonIRect(SkJSONWriter&, const SkIRect&);
  84. static void MakeJsonMatrix(SkJSONWriter&, const SkMatrix&);
  85. static void MakeJsonPath(SkJSONWriter&, const SkPath& path);
  86. static void MakeJsonRegion(SkJSONWriter&, const SkRegion& region);
  87. static void MakeJsonPaint(SkJSONWriter&, const SkPaint& paint, UrlDataManager& urlDataManager);
  88. static void MakeJsonLattice(SkJSONWriter&, const SkCanvas::Lattice& lattice);
  89. static void flatten(const SkFlattenable* flattenable,
  90. SkJSONWriter& writer,
  91. UrlDataManager& urlDataManager);
  92. static bool flatten(const SkImage& image, SkJSONWriter& writer, UrlDataManager& urlDataManager);
  93. static bool flatten(const SkBitmap& bitmap,
  94. SkJSONWriter& writer,
  95. UrlDataManager& urlDataManager);
  96. private:
  97. OpType fOpType;
  98. bool fVisible;
  99. };
  100. class RestoreCommand : public DrawCommand {
  101. public:
  102. RestoreCommand();
  103. void execute(SkCanvas* canvas) const override;
  104. private:
  105. typedef DrawCommand INHERITED;
  106. };
  107. class ClearCommand : public DrawCommand {
  108. public:
  109. ClearCommand(SkColor color);
  110. void execute(SkCanvas* canvas) const override;
  111. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  112. private:
  113. SkColor fColor;
  114. typedef DrawCommand INHERITED;
  115. };
  116. class ClipPathCommand : public DrawCommand {
  117. public:
  118. ClipPathCommand(const SkPath& path, SkClipOp op, bool doAA);
  119. void execute(SkCanvas* canvas) const override;
  120. bool render(SkCanvas* canvas) const override;
  121. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  122. private:
  123. SkPath fPath;
  124. SkClipOp fOp;
  125. bool fDoAA;
  126. typedef DrawCommand INHERITED;
  127. };
  128. class ClipRegionCommand : public DrawCommand {
  129. public:
  130. ClipRegionCommand(const SkRegion& region, SkClipOp op);
  131. void execute(SkCanvas* canvas) const override;
  132. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  133. private:
  134. SkRegion fRegion;
  135. SkClipOp fOp;
  136. typedef DrawCommand INHERITED;
  137. };
  138. class ClipRectCommand : public DrawCommand {
  139. public:
  140. ClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA);
  141. void execute(SkCanvas* canvas) const override;
  142. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  143. private:
  144. SkRect fRect;
  145. SkClipOp fOp;
  146. bool fDoAA;
  147. typedef DrawCommand INHERITED;
  148. };
  149. class ClipRRectCommand : public DrawCommand {
  150. public:
  151. ClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA);
  152. void execute(SkCanvas* canvas) const override;
  153. bool render(SkCanvas* canvas) const override;
  154. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  155. private:
  156. SkRRect fRRect;
  157. SkClipOp fOp;
  158. bool fDoAA;
  159. typedef DrawCommand INHERITED;
  160. };
  161. class ConcatCommand : public DrawCommand {
  162. public:
  163. ConcatCommand(const SkMatrix& matrix);
  164. void execute(SkCanvas* canvas) const override;
  165. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  166. private:
  167. SkMatrix fMatrix;
  168. typedef DrawCommand INHERITED;
  169. };
  170. class DrawAnnotationCommand : public DrawCommand {
  171. public:
  172. DrawAnnotationCommand(const SkRect&, const char key[], sk_sp<SkData> value);
  173. void execute(SkCanvas* canvas) const override;
  174. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  175. private:
  176. SkRect fRect;
  177. SkString fKey;
  178. sk_sp<SkData> fValue;
  179. typedef DrawCommand INHERITED;
  180. };
  181. class DrawBitmapCommand : public DrawCommand {
  182. public:
  183. DrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top, const SkPaint* paint);
  184. void execute(SkCanvas* canvas) const override;
  185. bool render(SkCanvas* canvas) const override;
  186. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  187. private:
  188. SkBitmap fBitmap;
  189. SkScalar fLeft;
  190. SkScalar fTop;
  191. SkTLazy<SkPaint> fPaint;
  192. typedef DrawCommand INHERITED;
  193. };
  194. class DrawBitmapLatticeCommand : public DrawCommand {
  195. public:
  196. DrawBitmapLatticeCommand(const SkBitmap& bitmap,
  197. const SkCanvas::Lattice& lattice,
  198. const SkRect& dst,
  199. const SkPaint* paint);
  200. void execute(SkCanvas* canvas) const override;
  201. bool render(SkCanvas* canvas) const override;
  202. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  203. private:
  204. SkBitmap fBitmap;
  205. SkCanvas::Lattice fLattice;
  206. SkRect fDst;
  207. SkTLazy<SkPaint> fPaint;
  208. typedef DrawCommand INHERITED;
  209. };
  210. class DrawBitmapNineCommand : public DrawCommand {
  211. public:
  212. DrawBitmapNineCommand(const SkBitmap& bitmap,
  213. const SkIRect& center,
  214. const SkRect& dst,
  215. const SkPaint* paint);
  216. void execute(SkCanvas* canvas) const override;
  217. bool render(SkCanvas* canvas) const override;
  218. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  219. private:
  220. SkBitmap fBitmap;
  221. SkIRect fCenter;
  222. SkRect fDst;
  223. SkTLazy<SkPaint> fPaint;
  224. typedef DrawCommand INHERITED;
  225. };
  226. class DrawBitmapRectCommand : public DrawCommand {
  227. public:
  228. DrawBitmapRectCommand(const SkBitmap& bitmap,
  229. const SkRect* src,
  230. const SkRect& dst,
  231. const SkPaint* paint,
  232. SkCanvas::SrcRectConstraint);
  233. void execute(SkCanvas* canvas) const override;
  234. bool render(SkCanvas* canvas) const override;
  235. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  236. private:
  237. SkBitmap fBitmap;
  238. SkTLazy<SkRect> fSrc;
  239. SkRect fDst;
  240. SkTLazy<SkPaint> fPaint;
  241. SkCanvas::SrcRectConstraint fConstraint;
  242. typedef DrawCommand INHERITED;
  243. };
  244. class DrawImageCommand : public DrawCommand {
  245. public:
  246. DrawImageCommand(const SkImage* image, SkScalar left, SkScalar top, const SkPaint* paint);
  247. void execute(SkCanvas* canvas) const override;
  248. bool render(SkCanvas* canvas) const override;
  249. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  250. private:
  251. sk_sp<const SkImage> fImage;
  252. SkScalar fLeft;
  253. SkScalar fTop;
  254. SkTLazy<SkPaint> fPaint;
  255. typedef DrawCommand INHERITED;
  256. };
  257. class DrawImageLatticeCommand : public DrawCommand {
  258. public:
  259. DrawImageLatticeCommand(const SkImage* image,
  260. const SkCanvas::Lattice& lattice,
  261. const SkRect& dst,
  262. const SkPaint* paint);
  263. void execute(SkCanvas* canvas) const override;
  264. bool render(SkCanvas* canvas) const override;
  265. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  266. private:
  267. sk_sp<const SkImage> fImage;
  268. SkCanvas::Lattice fLattice;
  269. SkRect fDst;
  270. SkTLazy<SkPaint> fPaint;
  271. typedef DrawCommand INHERITED;
  272. };
  273. class DrawImageNineCommand : public DrawCommand {
  274. public:
  275. DrawImageNineCommand(const SkImage* image,
  276. const SkIRect& center,
  277. const SkRect& dst,
  278. const SkPaint* paint);
  279. void execute(SkCanvas* canvas) const override;
  280. bool render(SkCanvas* canvas) const override;
  281. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  282. private:
  283. sk_sp<const SkImage> fImage;
  284. SkIRect fCenter;
  285. SkRect fDst;
  286. SkTLazy<SkPaint> fPaint;
  287. typedef DrawCommand INHERITED;
  288. };
  289. class DrawImageRectCommand : public DrawCommand {
  290. public:
  291. DrawImageRectCommand(const SkImage* image,
  292. const SkRect* src,
  293. const SkRect& dst,
  294. const SkPaint* paint,
  295. SkCanvas::SrcRectConstraint constraint);
  296. void execute(SkCanvas* canvas) const override;
  297. bool render(SkCanvas* canvas) const override;
  298. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  299. private:
  300. sk_sp<const SkImage> fImage;
  301. SkTLazy<SkRect> fSrc;
  302. SkRect fDst;
  303. SkTLazy<SkPaint> fPaint;
  304. SkCanvas::SrcRectConstraint fConstraint;
  305. typedef DrawCommand INHERITED;
  306. };
  307. class DrawOvalCommand : public DrawCommand {
  308. public:
  309. DrawOvalCommand(const SkRect& oval, const SkPaint& paint);
  310. void execute(SkCanvas* canvas) const override;
  311. bool render(SkCanvas* canvas) const override;
  312. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  313. private:
  314. SkRect fOval;
  315. SkPaint fPaint;
  316. typedef DrawCommand INHERITED;
  317. };
  318. class DrawArcCommand : public DrawCommand {
  319. public:
  320. DrawArcCommand(const SkRect& oval,
  321. SkScalar startAngle,
  322. SkScalar sweepAngle,
  323. bool useCenter,
  324. const SkPaint& paint);
  325. void execute(SkCanvas* canvas) const override;
  326. bool render(SkCanvas* canvas) const override;
  327. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  328. private:
  329. SkRect fOval;
  330. SkScalar fStartAngle;
  331. SkScalar fSweepAngle;
  332. bool fUseCenter;
  333. SkPaint fPaint;
  334. typedef DrawCommand INHERITED;
  335. };
  336. class DrawPaintCommand : public DrawCommand {
  337. public:
  338. DrawPaintCommand(const SkPaint& paint);
  339. void execute(SkCanvas* canvas) const override;
  340. bool render(SkCanvas* canvas) const override;
  341. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  342. private:
  343. SkPaint fPaint;
  344. typedef DrawCommand INHERITED;
  345. };
  346. class DrawBehindCommand : public DrawCommand {
  347. public:
  348. DrawBehindCommand(const SkPaint& paint);
  349. void execute(SkCanvas* canvas) const override;
  350. bool render(SkCanvas* canvas) const override;
  351. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  352. private:
  353. SkPaint fPaint;
  354. typedef DrawCommand INHERITED;
  355. };
  356. class DrawPathCommand : public DrawCommand {
  357. public:
  358. DrawPathCommand(const SkPath& path, const SkPaint& paint);
  359. void execute(SkCanvas* canvas) const override;
  360. bool render(SkCanvas* canvas) const override;
  361. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  362. private:
  363. SkPath fPath;
  364. SkPaint fPaint;
  365. typedef DrawCommand INHERITED;
  366. };
  367. class BeginDrawPictureCommand : public DrawCommand {
  368. public:
  369. BeginDrawPictureCommand(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint);
  370. void execute(SkCanvas* canvas) const override;
  371. bool render(SkCanvas* canvas) const override;
  372. private:
  373. sk_sp<const SkPicture> fPicture;
  374. SkTLazy<SkMatrix> fMatrix;
  375. SkTLazy<SkPaint> fPaint;
  376. typedef DrawCommand INHERITED;
  377. };
  378. class EndDrawPictureCommand : public DrawCommand {
  379. public:
  380. EndDrawPictureCommand(bool restore);
  381. void execute(SkCanvas* canvas) const override;
  382. private:
  383. bool fRestore;
  384. typedef DrawCommand INHERITED;
  385. };
  386. class DrawPointsCommand : public DrawCommand {
  387. public:
  388. DrawPointsCommand(SkCanvas::PointMode mode,
  389. size_t count,
  390. const SkPoint pts[],
  391. const SkPaint& paint);
  392. void execute(SkCanvas* canvas) const override;
  393. bool render(SkCanvas* canvas) const override;
  394. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  395. private:
  396. SkCanvas::PointMode fMode;
  397. SkTDArray<SkPoint> fPts;
  398. SkPaint fPaint;
  399. typedef DrawCommand INHERITED;
  400. };
  401. class DrawRegionCommand : public DrawCommand {
  402. public:
  403. DrawRegionCommand(const SkRegion& region, const SkPaint& paint);
  404. void execute(SkCanvas* canvas) const override;
  405. bool render(SkCanvas* canvas) const override;
  406. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  407. private:
  408. SkRegion fRegion;
  409. SkPaint fPaint;
  410. typedef DrawCommand INHERITED;
  411. };
  412. class DrawTextBlobCommand : public DrawCommand {
  413. public:
  414. DrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y, const SkPaint& paint);
  415. void execute(SkCanvas* canvas) const override;
  416. bool render(SkCanvas* canvas) const override;
  417. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  418. private:
  419. sk_sp<SkTextBlob> fBlob;
  420. SkScalar fXPos;
  421. SkScalar fYPos;
  422. SkPaint fPaint;
  423. typedef DrawCommand INHERITED;
  424. };
  425. class DrawPatchCommand : public DrawCommand {
  426. public:
  427. DrawPatchCommand(const SkPoint cubics[12],
  428. const SkColor colors[4],
  429. const SkPoint texCoords[4],
  430. SkBlendMode bmode,
  431. const SkPaint& paint);
  432. void execute(SkCanvas* canvas) const override;
  433. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  434. private:
  435. SkPoint fCubics[12];
  436. SkColor* fColorsPtr;
  437. SkColor fColors[4];
  438. SkPoint* fTexCoordsPtr;
  439. SkPoint fTexCoords[4];
  440. SkBlendMode fBlendMode;
  441. SkPaint fPaint;
  442. typedef DrawCommand INHERITED;
  443. };
  444. class DrawRectCommand : public DrawCommand {
  445. public:
  446. DrawRectCommand(const SkRect& rect, const SkPaint& paint);
  447. void execute(SkCanvas* canvas) const override;
  448. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  449. private:
  450. SkRect fRect;
  451. SkPaint fPaint;
  452. typedef DrawCommand INHERITED;
  453. };
  454. class DrawRRectCommand : public DrawCommand {
  455. public:
  456. DrawRRectCommand(const SkRRect& rrect, const SkPaint& paint);
  457. void execute(SkCanvas* canvas) const override;
  458. bool render(SkCanvas* canvas) const override;
  459. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  460. private:
  461. SkRRect fRRect;
  462. SkPaint fPaint;
  463. typedef DrawCommand INHERITED;
  464. };
  465. class DrawDRRectCommand : public DrawCommand {
  466. public:
  467. DrawDRRectCommand(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint);
  468. void execute(SkCanvas* canvas) const override;
  469. bool render(SkCanvas* canvas) const override;
  470. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  471. private:
  472. SkRRect fOuter;
  473. SkRRect fInner;
  474. SkPaint fPaint;
  475. typedef DrawCommand INHERITED;
  476. };
  477. class DrawVerticesCommand : public DrawCommand {
  478. public:
  479. DrawVerticesCommand(sk_sp<SkVertices>, SkBlendMode, const SkPaint&);
  480. void execute(SkCanvas* canvas) const override;
  481. private:
  482. sk_sp<SkVertices> fVertices;
  483. SkBlendMode fBlendMode;
  484. SkPaint fPaint;
  485. typedef DrawCommand INHERITED;
  486. };
  487. class DrawAtlasCommand : public DrawCommand {
  488. public:
  489. DrawAtlasCommand(const SkImage*,
  490. const SkRSXform[],
  491. const SkRect[],
  492. const SkColor[],
  493. int,
  494. SkBlendMode,
  495. const SkRect*,
  496. const SkPaint*);
  497. void execute(SkCanvas* canvas) const override;
  498. private:
  499. sk_sp<const SkImage> fImage;
  500. SkTDArray<SkRSXform> fXform;
  501. SkTDArray<SkRect> fTex;
  502. SkTDArray<SkColor> fColors;
  503. SkBlendMode fBlendMode;
  504. SkTLazy<SkRect> fCull;
  505. SkTLazy<SkPaint> fPaint;
  506. typedef DrawCommand INHERITED;
  507. };
  508. class SaveCommand : public DrawCommand {
  509. public:
  510. SaveCommand();
  511. void execute(SkCanvas* canvas) const override;
  512. private:
  513. typedef DrawCommand INHERITED;
  514. };
  515. class SaveLayerCommand : public DrawCommand {
  516. public:
  517. SaveLayerCommand(const SkCanvas::SaveLayerRec&);
  518. void execute(SkCanvas* canvas) const override;
  519. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  520. private:
  521. SkTLazy<SkRect> fBounds;
  522. SkTLazy<SkPaint> fPaint;
  523. sk_sp<const SkImageFilter> fBackdrop;
  524. uint32_t fSaveLayerFlags;
  525. typedef DrawCommand INHERITED;
  526. };
  527. class SetMatrixCommand : public DrawCommand {
  528. public:
  529. SetMatrixCommand(const SkMatrix& matrix);
  530. void execute(SkCanvas* canvas) const override;
  531. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  532. private:
  533. SkMatrix fMatrix;
  534. typedef DrawCommand INHERITED;
  535. };
  536. class DrawShadowCommand : public DrawCommand {
  537. public:
  538. DrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec);
  539. void execute(SkCanvas* canvas) const override;
  540. bool render(SkCanvas* canvas) const override;
  541. void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
  542. private:
  543. SkPath fPath;
  544. SkDrawShadowRec fShadowRec;
  545. typedef DrawCommand INHERITED;
  546. };
  547. class DrawDrawableCommand : public DrawCommand {
  548. public:
  549. DrawDrawableCommand(SkDrawable*, const SkMatrix*);
  550. void execute(SkCanvas* canvas) const override;
  551. private:
  552. sk_sp<SkDrawable> fDrawable;
  553. SkTLazy<SkMatrix> fMatrix;
  554. typedef DrawCommand INHERITED;
  555. };
  556. class DrawEdgeAAQuadCommand : public DrawCommand {
  557. public:
  558. DrawEdgeAAQuadCommand(const SkRect& rect,
  559. const SkPoint clip[4],
  560. SkCanvas::QuadAAFlags aa,
  561. SkColor color,
  562. SkBlendMode mode);
  563. void execute(SkCanvas* canvas) const override;
  564. private:
  565. SkRect fRect;
  566. SkPoint fClip[4];
  567. int fHasClip;
  568. SkCanvas::QuadAAFlags fAA;
  569. SkColor fColor;
  570. SkBlendMode fMode;
  571. typedef DrawCommand INHERITED;
  572. };
  573. class DrawEdgeAAImageSetCommand : public DrawCommand {
  574. public:
  575. DrawEdgeAAImageSetCommand(const SkCanvas::ImageSetEntry[],
  576. int count,
  577. const SkPoint[],
  578. const SkMatrix[],
  579. const SkPaint*,
  580. SkCanvas::SrcRectConstraint);
  581. void execute(SkCanvas* canvas) const override;
  582. private:
  583. SkAutoTArray<SkCanvas::ImageSetEntry> fSet;
  584. int fCount;
  585. SkAutoTArray<SkPoint> fDstClips;
  586. SkAutoTArray<SkMatrix> fPreViewMatrices;
  587. SkTLazy<SkPaint> fPaint;
  588. SkCanvas::SrcRectConstraint fConstraint;
  589. typedef DrawCommand INHERITED;
  590. };
  591. #endif