SkDrawCommand.h revision 1446a9a67ab30cd93e3e9c6210daec86b062e234
1 2/* 3 * Copyright 2012 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9#ifndef SKDRAWCOMMAND_H_ 10#define SKDRAWCOMMAND_H_ 11 12#include "SkCanvas.h" 13#include "SkTLazy.h" 14#include "SkPath.h" 15#include "SkRRect.h" 16#include "SkString.h" 17#include "SkTDArray.h" 18#include "SkJSONCPP.h" 19 20class SK_API SkDrawCommand { 21public: 22 enum OpType { 23 kBeginDrawPicture_OpType, 24 kClipPath_OpType, 25 kClipRegion_OpType, 26 kClipRect_OpType, 27 kClipRRect_OpType, 28 kConcat_OpType, 29 kDrawBitmap_OpType, 30 kDrawBitmapNine_OpType, 31 kDrawBitmapRect_OpType, 32 kDrawClear_OpType, 33 kDrawDRRect_OpType, 34 kDrawImage_OpType, 35 kDrawImageRect_OpType, 36 kDrawOval_OpType, 37 kDrawPaint_OpType, 38 kDrawPatch_OpType, 39 kDrawPath_OpType, 40 kDrawPoints_OpType, 41 kDrawPosText_OpType, 42 kDrawPosTextH_OpType, 43 kDrawRect_OpType, 44 kDrawRRect_OpType, 45 kDrawText_OpType, 46 kDrawTextBlob_OpType, 47 kDrawTextOnPath_OpType, 48 kDrawVertices_OpType, 49 kEndDrawPicture_OpType, 50 kRestore_OpType, 51 kSave_OpType, 52 kSaveLayer_OpType, 53 kSetMatrix_OpType, 54 55 kLast_OpType = kSetMatrix_OpType 56 }; 57 58 static const int kOpTypeCount = kLast_OpType + 1; 59 60 SkDrawCommand(OpType opType); 61 62 virtual ~SkDrawCommand(); 63 64 virtual SkString toString() const; 65 66 virtual const char* toCString() const { 67 return GetCommandString(fOpType); 68 } 69 70 bool isVisible() const { 71 return fVisible; 72 } 73 74 void setVisible(bool toggle) { 75 fVisible = toggle; 76 } 77 78 const SkTDArray<SkString*>* Info() const { return &fInfo; } 79 virtual void execute(SkCanvas*) const = 0; 80 virtual void vizExecute(SkCanvas*) const {} 81 82 virtual void setUserMatrix(const SkMatrix&) {} 83 84 // The next "active" system is only used by save, saveLayer, and restore. 85 // It is used to determine which saveLayers are currently active (at a 86 // given point in the rendering). 87 // saves just return a kPushLayer action but don't track active state 88 // restores just return a kPopLayer action 89 // saveLayers return kPushLayer but also track the active state 90 enum Action { 91 kNone_Action, 92 kPopLayer_Action, 93 kPushLayer_Action, 94 }; 95 virtual Action action() const { return kNone_Action; } 96 virtual void setActive(bool active) {} 97 virtual bool active() const { return false; } 98 99 OpType getType() const { return fOpType; } 100 101 virtual bool render(SkCanvas* canvas) const { return false; } 102 103 virtual Json::Value toJSON() const; 104 105 /* Converts a JSON representation of a command into a newly-allocated SkDrawCommand object. It 106 * is the caller's responsibility to delete this object. This method may return null if an error 107 * occurs. 108 */ 109 static SkDrawCommand* fromJSON(Json::Value& command); 110 111 static const char* GetCommandString(OpType type); 112 113protected: 114 SkTDArray<SkString*> fInfo; 115 116private: 117 OpType fOpType; 118 bool fVisible; 119}; 120 121class SkRestoreCommand : public SkDrawCommand { 122public: 123 SkRestoreCommand(); 124 void execute(SkCanvas* canvas) const override; 125 Action action() const override { return kPopLayer_Action; } 126 static SkRestoreCommand* fromJSON(Json::Value& command); 127 128private: 129 typedef SkDrawCommand INHERITED; 130}; 131 132class SkClearCommand : public SkDrawCommand { 133public: 134 SkClearCommand(SkColor color); 135 void execute(SkCanvas* canvas) const override; 136 Json::Value toJSON() const override; 137 static SkClearCommand* fromJSON(Json::Value& command); 138 139private: 140 SkColor fColor; 141 142 typedef SkDrawCommand INHERITED; 143}; 144 145class SkClipPathCommand : public SkDrawCommand { 146public: 147 SkClipPathCommand(const SkPath& path, SkRegion::Op op, bool doAA); 148 void execute(SkCanvas* canvas) const override; 149 bool render(SkCanvas* canvas) const override; 150 Json::Value toJSON() const override; 151 static SkClipPathCommand* fromJSON(Json::Value& command); 152 153private: 154 SkPath fPath; 155 SkRegion::Op fOp; 156 bool fDoAA; 157 158 typedef SkDrawCommand INHERITED; 159}; 160 161class SkClipRegionCommand : public SkDrawCommand { 162public: 163 SkClipRegionCommand(const SkRegion& region, SkRegion::Op op); 164 void execute(SkCanvas* canvas) const override; 165 Json::Value toJSON() const override; 166 static SkClipRegionCommand* fromJSON(Json::Value& command); 167 168private: 169 SkRegion fRegion; 170 SkRegion::Op fOp; 171 172 typedef SkDrawCommand INHERITED; 173}; 174 175class SkClipRectCommand : public SkDrawCommand { 176public: 177 SkClipRectCommand(const SkRect& rect, SkRegion::Op op, bool doAA); 178 void execute(SkCanvas* canvas) const override; 179 Json::Value toJSON() const override; 180 static SkClipRectCommand* fromJSON(Json::Value& command); 181 182 const SkRect& rect() const { return fRect; } 183 SkRegion::Op op() const { return fOp; } 184 bool doAA() const { return fDoAA; } 185 186private: 187 SkRect fRect; 188 SkRegion::Op fOp; 189 bool fDoAA; 190 191 typedef SkDrawCommand INHERITED; 192}; 193 194class SkClipRRectCommand : public SkDrawCommand { 195public: 196 SkClipRRectCommand(const SkRRect& rrect, SkRegion::Op op, bool doAA); 197 void execute(SkCanvas* canvas) const override; 198 bool render(SkCanvas* canvas) const override; 199 Json::Value toJSON() const override; 200 static SkClipRRectCommand* fromJSON(Json::Value& command); 201 202 const SkRRect& rrect() const { return fRRect; } 203 SkRegion::Op op() const { return fOp; } 204 bool doAA() const { return fDoAA; } 205 206private: 207 SkRRect fRRect; 208 SkRegion::Op fOp; 209 bool fDoAA; 210 211 typedef SkDrawCommand INHERITED; 212}; 213 214class SkConcatCommand : public SkDrawCommand { 215public: 216 SkConcatCommand(const SkMatrix& matrix); 217 void execute(SkCanvas* canvas) const override; 218 Json::Value toJSON() const override; 219 static SkConcatCommand* fromJSON(Json::Value& command); 220 221private: 222 SkMatrix fMatrix; 223 224 typedef SkDrawCommand INHERITED; 225}; 226 227class SkDrawBitmapCommand : public SkDrawCommand { 228public: 229 SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top, 230 const SkPaint* paint); 231 void execute(SkCanvas* canvas) const override; 232 bool render(SkCanvas* canvas) const override; 233 Json::Value toJSON() const override; 234 static SkDrawBitmapCommand* fromJSON(Json::Value& command); 235 236private: 237 SkBitmap fBitmap; 238 SkScalar fLeft; 239 SkScalar fTop; 240 SkPaint fPaint; 241 SkPaint* fPaintPtr; 242 243 typedef SkDrawCommand INHERITED; 244}; 245 246class SkDrawBitmapNineCommand : public SkDrawCommand { 247public: 248 SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center, 249 const SkRect& dst, const SkPaint* paint); 250 void execute(SkCanvas* canvas) const override; 251 bool render(SkCanvas* canvas) const override; 252 Json::Value toJSON() const override; 253 static SkDrawBitmapNineCommand* fromJSON(Json::Value& command); 254 255private: 256 SkBitmap fBitmap; 257 SkIRect fCenter; 258 SkRect fDst; 259 SkPaint fPaint; 260 SkPaint* fPaintPtr; 261 262 typedef SkDrawCommand INHERITED; 263}; 264 265class SkDrawBitmapRectCommand : public SkDrawCommand { 266public: 267 SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src, 268 const SkRect& dst, const SkPaint* paint, 269 SkCanvas::SrcRectConstraint); 270 void execute(SkCanvas* canvas) const override; 271 bool render(SkCanvas* canvas) const override; 272 Json::Value toJSON() const override; 273 static SkDrawBitmapRectCommand* fromJSON(Json::Value& command); 274 275 const SkBitmap& bitmap() const { return fBitmap; } 276 277 // The non-const 'paint' method allows modification of this object's 278 // SkPaint. For this reason the ctor and setPaint method make a local copy. 279 // The 'fPaintPtr' member acts a signal that the local SkPaint is valid 280 // (since only an SkPaint* is passed into the ctor). 281 const SkPaint* paint() const { return fPaintPtr; } 282 SkPaint* paint() { return fPaintPtr; } 283 284 void setPaint(const SkPaint& paint) { fPaint = paint; fPaintPtr = &fPaint; } 285 286 const SkRect* srcRect() const { return fSrc.isEmpty() ? nullptr : &fSrc; } 287 void setSrcRect(const SkRect& src) { fSrc = src; } 288 289 const SkRect& dstRect() const { return fDst; } 290 void setDstRect(const SkRect& dst) { fDst = dst; } 291 292 SkCanvas::SrcRectConstraint constraint() const { return fConstraint; } 293 void setConstraint(SkCanvas::SrcRectConstraint constraint) { fConstraint = constraint; } 294 295private: 296 SkBitmap fBitmap; 297 SkRect fSrc; 298 SkRect fDst; 299 SkPaint fPaint; 300 SkPaint* fPaintPtr; 301 SkCanvas::SrcRectConstraint fConstraint; 302 303 typedef SkDrawCommand INHERITED; 304}; 305 306class SkDrawImageCommand : public SkDrawCommand { 307public: 308 SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top, const SkPaint* paint); 309 void execute(SkCanvas* canvas) const override; 310 bool render(SkCanvas* canvas) const override; 311 Json::Value toJSON() const override; 312 static SkDrawImageCommand* fromJSON(Json::Value& command); 313 314private: 315 SkAutoTUnref<const SkImage> fImage; 316 SkScalar fLeft; 317 SkScalar fTop; 318 SkTLazy<SkPaint> fPaint; 319 320 typedef SkDrawCommand INHERITED; 321}; 322 323class SkDrawImageRectCommand : public SkDrawCommand { 324public: 325 SkDrawImageRectCommand(const SkImage* image, const SkRect* src, const SkRect& dst, 326 const SkPaint* paint, SkCanvas::SrcRectConstraint constraint); 327 void execute(SkCanvas* canvas) const override; 328 bool render(SkCanvas* canvas) const override; 329 Json::Value toJSON() const override; 330 static SkDrawImageRectCommand* fromJSON(Json::Value& command); 331 332private: 333 SkAutoTUnref<const SkImage> fImage; 334 SkTLazy<SkRect> fSrc; 335 SkRect fDst; 336 SkTLazy<SkPaint> fPaint; 337 SkCanvas::SrcRectConstraint fConstraint; 338 339 typedef SkDrawCommand INHERITED; 340}; 341 342class SkDrawOvalCommand : public SkDrawCommand { 343public: 344 SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint); 345 void execute(SkCanvas* canvas) const override; 346 bool render(SkCanvas* canvas) const override; 347 Json::Value toJSON() const override; 348 static SkDrawOvalCommand* fromJSON(Json::Value& command); 349 350private: 351 SkRect fOval; 352 SkPaint fPaint; 353 354 typedef SkDrawCommand INHERITED; 355}; 356 357class SkDrawPaintCommand : public SkDrawCommand { 358public: 359 SkDrawPaintCommand(const SkPaint& paint); 360 void execute(SkCanvas* canvas) const override; 361 bool render(SkCanvas* canvas) const override; 362 Json::Value toJSON() const override; 363 static SkDrawPaintCommand* fromJSON(Json::Value& command); 364 365private: 366 SkPaint fPaint; 367 368 typedef SkDrawCommand INHERITED; 369}; 370 371class SkDrawPathCommand : public SkDrawCommand { 372public: 373 SkDrawPathCommand(const SkPath& path, const SkPaint& paint); 374 void execute(SkCanvas* canvas) const override; 375 bool render(SkCanvas* canvas) const override; 376 Json::Value toJSON() const override; 377 static SkDrawPathCommand* fromJSON(Json::Value& command); 378 379private: 380 SkPath fPath; 381 SkPaint fPaint; 382 383 typedef SkDrawCommand INHERITED; 384}; 385 386class SkBeginDrawPictureCommand : public SkDrawCommand { 387public: 388 SkBeginDrawPictureCommand(const SkPicture* picture, 389 const SkMatrix* matrix, 390 const SkPaint* paint); 391 392 void execute(SkCanvas* canvas) const override; 393 bool render(SkCanvas* canvas) const override; 394 395private: 396 SkAutoTUnref<const SkPicture> fPicture; 397 SkTLazy<SkMatrix> fMatrix; 398 SkTLazy<SkPaint> fPaint; 399 400 typedef SkDrawCommand INHERITED; 401}; 402 403class SkEndDrawPictureCommand : public SkDrawCommand { 404public: 405 SkEndDrawPictureCommand(bool restore); 406 407 void execute(SkCanvas* canvas) const override; 408 409private: 410 bool fRestore; 411 412 typedef SkDrawCommand INHERITED; 413}; 414 415class SkDrawPointsCommand : public SkDrawCommand { 416public: 417 SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, const SkPoint pts[], 418 const SkPaint& paint); 419 virtual ~SkDrawPointsCommand() { delete [] fPts; } 420 void execute(SkCanvas* canvas) const override; 421 bool render(SkCanvas* canvas) const override; 422 Json::Value toJSON() const override; 423 static SkDrawPointsCommand* fromJSON(Json::Value& command); 424 425private: 426 SkCanvas::PointMode fMode; 427 size_t fCount; 428 SkPoint* fPts; 429 SkPaint fPaint; 430 431 typedef SkDrawCommand INHERITED; 432}; 433 434class SkDrawTextCommand : public SkDrawCommand { 435public: 436 SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y, 437 const SkPaint& paint); 438 virtual ~SkDrawTextCommand() { delete [] fText; } 439 void execute(SkCanvas* canvas) const override; 440 Json::Value toJSON() const override; 441 static SkDrawTextCommand* fromJSON(Json::Value& command); 442 443private: 444 char* fText; 445 size_t fByteLength; 446 SkScalar fX; 447 SkScalar fY; 448 SkPaint fPaint; 449 450 typedef SkDrawCommand INHERITED; 451}; 452 453class SkDrawPosTextCommand : public SkDrawCommand { 454public: 455 SkDrawPosTextCommand(const void* text, size_t byteLength, const SkPoint pos[], 456 const SkPaint& paint); 457 virtual ~SkDrawPosTextCommand() { delete [] fPos; delete [] fText; } 458 void execute(SkCanvas* canvas) const override; 459 Json::Value toJSON() const override; 460 static SkDrawPosTextCommand* fromJSON(Json::Value& command); 461 462private: 463 char* fText; 464 size_t fByteLength; 465 SkPoint* fPos; 466 SkPaint fPaint; 467 468 typedef SkDrawCommand INHERITED; 469}; 470 471class SkDrawTextOnPathCommand : public SkDrawCommand { 472public: 473 SkDrawTextOnPathCommand(const void* text, size_t byteLength, const SkPath& path, 474 const SkMatrix* matrix, const SkPaint& paint); 475 virtual ~SkDrawTextOnPathCommand() { delete [] fText; } 476 void execute(SkCanvas* canvas) const override; 477 Json::Value toJSON() const override; 478 static SkDrawTextOnPathCommand* fromJSON(Json::Value& command); 479 480private: 481 char* fText; 482 size_t fByteLength; 483 SkPath fPath; 484 SkMatrix fMatrix; 485 SkPaint fPaint; 486 487 typedef SkDrawCommand INHERITED; 488}; 489 490class SkDrawPosTextHCommand : public SkDrawCommand { 491public: 492 SkDrawPosTextHCommand(const void* text, size_t byteLength, const SkScalar xpos[], 493 SkScalar constY, const SkPaint& paint); 494 virtual ~SkDrawPosTextHCommand() { delete [] fXpos; delete [] fText; } 495 void execute(SkCanvas* canvas) const override; 496 497private: 498 SkScalar* fXpos; 499 char* fText; 500 size_t fByteLength; 501 SkScalar fConstY; 502 SkPaint fPaint; 503 504 typedef SkDrawCommand INHERITED; 505}; 506 507class SkDrawTextBlobCommand : public SkDrawCommand { 508public: 509 SkDrawTextBlobCommand(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPaint& paint); 510 511 void execute(SkCanvas* canvas) const override; 512 bool render(SkCanvas* canvas) const override; 513 Json::Value toJSON() const override; 514 static SkDrawTextBlobCommand* fromJSON(Json::Value& command); 515 516private: 517 SkAutoTUnref<const SkTextBlob> fBlob; 518 SkScalar fXPos; 519 SkScalar fYPos; 520 SkPaint fPaint; 521 522 typedef SkDrawCommand INHERITED; 523}; 524 525class SkDrawPatchCommand : public SkDrawCommand { 526public: 527 SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4], 528 const SkPoint texCoords[4], SkXfermode* xmode, 529 const SkPaint& paint); 530 void execute(SkCanvas* canvas) const override; 531 Json::Value toJSON() const override; 532 static SkDrawPatchCommand* fromJSON(Json::Value& command); 533 534private: 535 SkPoint fCubics[12]; 536 SkColor* fColorsPtr; 537 SkColor fColors[4]; 538 SkPoint* fTexCoordsPtr; 539 SkPoint fTexCoords[4]; 540 SkAutoTUnref<SkXfermode> fXfermode; 541 SkPaint fPaint; 542 543 typedef SkDrawCommand INHERITED; 544}; 545 546 547class SkDrawRectCommand : public SkDrawCommand { 548public: 549 SkDrawRectCommand(const SkRect& rect, const SkPaint& paint); 550 void execute(SkCanvas* canvas) const override; 551 Json::Value toJSON() const override; 552 static SkDrawRectCommand* fromJSON(Json::Value& command); 553 554 const SkRect& rect() const { return fRect; } 555 const SkPaint& paint() const { return fPaint; } 556private: 557 SkRect fRect; 558 SkPaint fPaint; 559 560 typedef SkDrawCommand INHERITED; 561}; 562 563class SkDrawRRectCommand : public SkDrawCommand { 564public: 565 SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint); 566 void execute(SkCanvas* canvas) const override; 567 bool render(SkCanvas* canvas) const override; 568 Json::Value toJSON() const override; 569 static SkDrawRRectCommand* fromJSON(Json::Value& command); 570 571private: 572 SkRRect fRRect; 573 SkPaint fPaint; 574 575 typedef SkDrawCommand INHERITED; 576}; 577 578class SkDrawDRRectCommand : public SkDrawCommand { 579public: 580 SkDrawDRRectCommand(const SkRRect& outer, const SkRRect& inner, 581 const SkPaint& paint); 582 void execute(SkCanvas* canvas) const override; 583 bool render(SkCanvas* canvas) const override; 584 Json::Value toJSON() const override; 585 static SkDrawDRRectCommand* fromJSON(Json::Value& command); 586 587private: 588 SkRRect fOuter; 589 SkRRect fInner; 590 SkPaint fPaint; 591 592 typedef SkDrawCommand INHERITED; 593}; 594 595class SkDrawVerticesCommand : public SkDrawCommand { 596public: 597 SkDrawVerticesCommand(SkCanvas::VertexMode vmode, int vertexCount, 598 const SkPoint vertices[], const SkPoint texs[], 599 const SkColor colors[], SkXfermode* xfermode, 600 const uint16_t indices[], int indexCount, 601 const SkPaint& paint); 602 virtual ~SkDrawVerticesCommand(); 603 void execute(SkCanvas* canvas) const override; 604 605private: 606 SkCanvas::VertexMode fVmode; 607 int fVertexCount; 608 SkPoint* fVertices; 609 SkPoint* fTexs; 610 SkColor* fColors; 611 SkXfermode* fXfermode; 612 uint16_t* fIndices; 613 int fIndexCount; 614 SkPaint fPaint; 615 616 typedef SkDrawCommand INHERITED; 617}; 618 619class SkSaveCommand : public SkDrawCommand { 620public: 621 SkSaveCommand(); 622 void execute(SkCanvas* canvas) const override; 623 Action action() const override { return kPushLayer_Action; } 624 static SkSaveCommand* fromJSON(Json::Value& command); 625 626private: 627 typedef SkDrawCommand INHERITED; 628}; 629 630class SkSaveLayerCommand : public SkDrawCommand { 631public: 632 SkSaveLayerCommand(const SkCanvas::SaveLayerRec&); 633 virtual ~SkSaveLayerCommand(); 634 void execute(SkCanvas* canvas) const override; 635 Json::Value toJSON() const override; 636 static SkSaveLayerCommand* fromJSON(Json::Value& command); 637 void vizExecute(SkCanvas* canvas) const override; 638 Action action() const override{ return kPushLayer_Action; } 639 void setActive(bool active) override { fActive = active; } 640 bool active() const override { return fActive; } 641 642 const SkPaint* paint() const { return fPaintPtr; } 643 644private: 645 SkRect fBounds; 646 SkPaint fPaint; 647 SkPaint* fPaintPtr; 648 const SkImageFilter* fBackdrop; 649 uint32_t fSaveLayerFlags; 650 651 bool fActive; 652 653 typedef SkDrawCommand INHERITED; 654}; 655 656class SkSetMatrixCommand : public SkDrawCommand { 657public: 658 SkSetMatrixCommand(const SkMatrix& matrix); 659 void setUserMatrix(const SkMatrix&) override; 660 void execute(SkCanvas* canvas) const override; 661 Json::Value toJSON() const override; 662 static SkSetMatrixCommand* fromJSON(Json::Value& command); 663 664private: 665 SkMatrix fUserMatrix; 666 SkMatrix fMatrix; 667 668 typedef SkDrawCommand INHERITED; 669}; 670 671#endif 672