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