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