SkDrawCommand.h revision 86681b37bd20204e47a492119b345c01d00bc939
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 "SkPictureFlat.h" 13#include "SkCanvas.h" 14#include "SkString.h" 15 16class SK_API SkDrawCommand { 17public: 18 /* TODO(chudy): Remove subclasses. */ 19 SkDrawCommand(DrawType drawType); 20 SkDrawCommand(); 21 22 virtual ~SkDrawCommand(); 23 24 virtual SkString toString(); 25 26 virtual const char* toCString() { 27 return GetCommandString(fDrawType); 28 } 29 30 bool isVisible() const { 31 return fVisible; 32 } 33 34 void setVisible(bool toggle) { 35 fVisible = toggle; 36 } 37 38 SkTDArray<SkString*>* Info() {return &fInfo; }; 39 virtual void execute(SkCanvas* canvas)=0; 40 /** Does nothing by default, but used by save() and restore()-type 41 subclassse to track unresolved save() calls. */ 42 virtual void trackSaveState(int* state) { }; 43 DrawType getType() { return fDrawType; }; 44 45 virtual bool render(SkCanvas* canvas) const { return false; } 46 47 static const char* GetCommandString(DrawType type); 48 49protected: 50 DrawType fDrawType; 51 SkTDArray<SkString*> fInfo; 52 53private: 54 bool fVisible; 55}; 56 57class Restore : public SkDrawCommand { 58public: 59 Restore(); 60 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 61 virtual void trackSaveState(int* state) SK_OVERRIDE; 62 63private: 64 typedef SkDrawCommand INHERITED; 65}; 66 67class Clear : public SkDrawCommand { 68public: 69 Clear(SkColor color); 70 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 71private: 72 SkColor fColor; 73 74 typedef SkDrawCommand INHERITED; 75}; 76 77class ClipPath : public SkDrawCommand { 78public: 79 ClipPath(const SkPath& path, SkRegion::Op op, bool doAA); 80 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 81 virtual bool render(SkCanvas* canvas) const SK_OVERRIDE; 82private: 83 SkPath fPath; 84 SkRegion::Op fOp; 85 bool fDoAA; 86 87 typedef SkDrawCommand INHERITED; 88}; 89 90class ClipRegion : public SkDrawCommand { 91public: 92 ClipRegion(const SkRegion& region, SkRegion::Op op); 93 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 94private: 95 SkRegion fRegion; 96 SkRegion::Op fOp; 97 98 typedef SkDrawCommand INHERITED; 99}; 100 101class ClipRect : public SkDrawCommand { 102public: 103 ClipRect(const SkRect& rect, SkRegion::Op op, bool doAA); 104 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 105 106 const SkRect& rect() const { return fRect; } 107 SkRegion::Op op() const { return fOp; } 108 bool doAA() const { return fDoAA; } 109 110private: 111 SkRect fRect; 112 SkRegion::Op fOp; 113 bool fDoAA; 114 115 typedef SkDrawCommand INHERITED; 116}; 117 118class ClipRRect : public SkDrawCommand { 119public: 120 ClipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA); 121 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 122 virtual bool render(SkCanvas* canvas) const SK_OVERRIDE; 123 124 const SkRRect& rrect() const { return fRRect; } 125 SkRegion::Op op() const { return fOp; } 126 bool doAA() const { return fDoAA; } 127 128private: 129 SkRRect fRRect; 130 SkRegion::Op fOp; 131 bool fDoAA; 132 133 typedef SkDrawCommand INHERITED; 134}; 135 136class Concat : public SkDrawCommand { 137public: 138 Concat(const SkMatrix& matrix); 139 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 140private: 141 SkMatrix fMatrix; 142 143 typedef SkDrawCommand INHERITED; 144}; 145 146class DrawBitmap : public SkDrawCommand { 147public: 148 DrawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top, 149 const SkPaint* paint); 150 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 151 virtual bool render(SkCanvas* canvas) const SK_OVERRIDE; 152private: 153 SkBitmap fBitmap; 154 SkScalar fLeft; 155 SkScalar fTop; 156 SkPaint fPaint; 157 SkPaint* fPaintPtr; 158 159 typedef SkDrawCommand INHERITED; 160}; 161 162class DrawBitmapMatrix : public SkDrawCommand { 163public: 164 DrawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& matrix, 165 const SkPaint* paint); 166 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 167 virtual bool render(SkCanvas* canvas) const SK_OVERRIDE; 168private: 169 SkBitmap fBitmap; 170 SkMatrix fMatrix; 171 SkPaint fPaint; 172 SkPaint* fPaintPtr; 173 174 typedef SkDrawCommand INHERITED; 175}; 176 177class DrawBitmapNine : public SkDrawCommand { 178public: 179 DrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 180 const SkRect& dst, const SkPaint* paint); 181 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 182 virtual bool render(SkCanvas* canvas) const SK_OVERRIDE; 183private: 184 SkBitmap fBitmap; 185 SkIRect fCenter; 186 SkRect fDst; 187 SkPaint fPaint; 188 SkPaint* fPaintPtr; 189 190 typedef SkDrawCommand INHERITED; 191}; 192 193class DrawBitmapRect : public SkDrawCommand { 194public: 195 DrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, 196 const SkRect& dst, const SkPaint* paint); 197 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 198 virtual bool render(SkCanvas* canvas) const SK_OVERRIDE; 199 200 const SkBitmap& bitmap() const { return fBitmap; } 201 202 // The non-const 'paint' method allows modification of this object's 203 // SkPaint. For this reason the ctor and setPaint method make a local copy. 204 // The 'fPaintPtr' member acts a signal that the local SkPaint is valid 205 // (since only an SkPaint* is passed into the ctor). 206 const SkPaint* paint() const { return fPaintPtr; } 207 SkPaint* paint() { return fPaintPtr; } 208 209 void setPaint(const SkPaint& paint) { fPaint = paint; fPaintPtr = &fPaint; } 210 211 const SkRect* srcRect() const { return fSrc.isEmpty() ? NULL : &fSrc; } 212 const SkRect& dstRect() const { return fDst; } 213 214 void setSrcRect(const SkRect& src) { fSrc = src; } 215 void setDstRect(const SkRect& dst) { fDst = dst; } 216 217private: 218 SkBitmap fBitmap; 219 SkRect fSrc; 220 SkRect fDst; 221 SkPaint fPaint; 222 SkPaint* fPaintPtr; 223 224 typedef SkDrawCommand INHERITED; 225}; 226 227class DrawData : public SkDrawCommand { 228public: 229 DrawData(const void* data, size_t length); 230 virtual ~DrawData() { delete [] fData; } 231 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 232private: 233 char* fData; 234 size_t fLength; 235 236 typedef SkDrawCommand INHERITED; 237}; 238 239class BeginCommentGroup : public SkDrawCommand { 240public: 241 BeginCommentGroup(const char* description); 242 virtual void execute(SkCanvas* canvas) SK_OVERRIDE { 243 canvas->beginCommentGroup(fDescription.c_str()); 244 }; 245private: 246 SkString fDescription; 247 248 typedef SkDrawCommand INHERITED; 249}; 250 251class Comment : public SkDrawCommand { 252public: 253 Comment(const char* kywd, const char* value); 254 virtual void execute(SkCanvas* canvas) SK_OVERRIDE { 255 canvas->addComment(fKywd.c_str(), fValue.c_str()); 256 }; 257private: 258 SkString fKywd; 259 SkString fValue; 260 261 typedef SkDrawCommand INHERITED; 262}; 263 264class EndCommentGroup : public SkDrawCommand { 265public: 266 EndCommentGroup(); 267 virtual void execute(SkCanvas* canvas) SK_OVERRIDE { 268 canvas->endCommentGroup(); 269 }; 270private: 271 typedef SkDrawCommand INHERITED; 272}; 273 274class DrawOval : public SkDrawCommand { 275public: 276 DrawOval(const SkRect& oval, const SkPaint& paint); 277 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 278 virtual bool render(SkCanvas* canvas) const SK_OVERRIDE; 279private: 280 SkRect fOval; 281 SkPaint fPaint; 282 283 typedef SkDrawCommand INHERITED; 284}; 285 286class DrawPaint : public SkDrawCommand { 287public: 288 DrawPaint(const SkPaint& paint); 289 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 290 virtual bool render(SkCanvas* canvas) const SK_OVERRIDE; 291private: 292 SkPaint fPaint; 293 294 typedef SkDrawCommand INHERITED; 295}; 296 297class DrawPath : public SkDrawCommand { 298public: 299 DrawPath(const SkPath& path, const SkPaint& paint); 300 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 301 virtual bool render(SkCanvas* canvas) const SK_OVERRIDE; 302 303private: 304 SkPath fPath; 305 SkPaint fPaint; 306 307 typedef SkDrawCommand INHERITED; 308}; 309 310class DrawPicture : public SkDrawCommand { 311public: 312 DrawPicture(SkPicture& picture); 313 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 314private: 315 SkPicture fPicture; 316 317 typedef SkDrawCommand INHERITED; 318}; 319 320class DrawPoints : public SkDrawCommand { 321public: 322 DrawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint pts[], 323 const SkPaint& paint); 324 virtual ~DrawPoints() { delete [] fPts; } 325 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 326 virtual bool render(SkCanvas* canvas) const SK_OVERRIDE; 327private: 328 SkCanvas::PointMode fMode; 329 size_t fCount; 330 SkPoint* fPts; 331 SkPaint fPaint; 332 333 typedef SkDrawCommand INHERITED; 334}; 335 336/* TODO(chudy): DrawText is a predefined macro and was breaking something 337 * in the windows build of the debugger. 338 */ 339class DrawTextC : public SkDrawCommand { 340public: 341 DrawTextC(const void* text, size_t byteLength, SkScalar x, SkScalar y, 342 const SkPaint& paint); 343 virtual ~DrawTextC() { delete [] fText; } 344 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 345private: 346 char* fText; 347 size_t fByteLength; 348 SkScalar fX; 349 SkScalar fY; 350 SkPaint fPaint; 351 352 typedef SkDrawCommand INHERITED; 353}; 354 355class DrawPosText : public SkDrawCommand { 356public: 357 DrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 358 const SkPaint& paint); 359 virtual ~DrawPosText() { delete [] fPos; delete [] fText; } 360 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 361private: 362 char* fText; 363 size_t fByteLength; 364 SkPoint* fPos; 365 SkPaint fPaint; 366 367 typedef SkDrawCommand INHERITED; 368}; 369 370class DrawTextOnPath : public SkDrawCommand { 371public: 372 DrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 373 const SkMatrix* matrix, const SkPaint& paint); 374 virtual ~DrawTextOnPath() { delete [] fText; } 375 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 376private: 377 char* fText; 378 size_t fByteLength; 379 SkPath fPath; 380 SkMatrix fMatrix; 381 SkPaint fPaint; 382 383 typedef SkDrawCommand INHERITED; 384}; 385 386class DrawPosTextH : public SkDrawCommand { 387public: 388 DrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 389 SkScalar constY, const SkPaint& paint); 390 virtual ~DrawPosTextH() { delete [] fXpos; delete [] fText; } 391 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 392private: 393 SkScalar* fXpos; 394 char* fText; 395 size_t fByteLength; 396 SkScalar fConstY; 397 SkPaint fPaint; 398 399 typedef SkDrawCommand INHERITED; 400}; 401 402class DrawRectC : public SkDrawCommand { 403public: 404 DrawRectC(const SkRect& rect, const SkPaint& paint); 405 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 406 407 const SkRect& rect() const { return fRect; } 408 const SkPaint& paint() const { return fPaint; } 409private: 410 SkRect fRect; 411 SkPaint fPaint; 412 413 typedef SkDrawCommand INHERITED; 414}; 415 416class DrawRRect : public SkDrawCommand { 417public: 418 DrawRRect(const SkRRect& rrect, const SkPaint& paint); 419 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 420 virtual bool render(SkCanvas* canvas) const SK_OVERRIDE; 421private: 422 SkRRect fRRect; 423 SkPaint fPaint; 424 425 typedef SkDrawCommand INHERITED; 426}; 427 428class DrawSprite : public SkDrawCommand { 429public: 430 DrawSprite(const SkBitmap& bitmap, int left, int top, const SkPaint* paint); 431 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 432 virtual bool render(SkCanvas* canvas) const SK_OVERRIDE; 433private: 434 SkBitmap fBitmap; 435 int fLeft; 436 int fTop; 437 SkPaint fPaint; 438 SkPaint* fPaintPtr; 439 440 typedef SkDrawCommand INHERITED; 441}; 442 443class DrawVertices : public SkDrawCommand { 444public: 445 DrawVertices(SkCanvas::VertexMode vmode, int vertexCount, 446 const SkPoint vertices[], const SkPoint texs[], 447 const SkColor colors[], SkXfermode* xfermode, 448 const uint16_t indices[], int indexCount, 449 const SkPaint& paint); 450 virtual ~DrawVertices(); 451 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 452private: 453 SkCanvas::VertexMode fVmode; 454 int fVertexCount; 455 SkPoint* fVertices; 456 SkPoint* fTexs; 457 SkColor* fColors; 458 SkXfermode* fXfermode; 459 uint16_t* fIndices; 460 int fIndexCount; 461 SkPaint fPaint; 462 463 typedef SkDrawCommand INHERITED; 464}; 465 466class Rotate : public SkDrawCommand { 467public: 468 Rotate(SkScalar degrees); 469 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 470private: 471 SkScalar fDegrees; 472 473 typedef SkDrawCommand INHERITED; 474}; 475 476class Save : public SkDrawCommand { 477public: 478 Save(SkCanvas::SaveFlags flags); 479 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 480 virtual void trackSaveState(int* state) SK_OVERRIDE; 481private: 482 SkCanvas::SaveFlags fFlags; 483 484 typedef SkDrawCommand INHERITED; 485}; 486 487class SaveLayer : public SkDrawCommand { 488public: 489 SaveLayer(const SkRect* bounds, const SkPaint* paint, 490 SkCanvas::SaveFlags flags); 491 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 492 virtual void trackSaveState(int* state) SK_OVERRIDE; 493 494 const SkPaint* paint() const { return fPaintPtr; } 495 496private: 497 SkRect fBounds; 498 SkPaint fPaint; 499 SkPaint* fPaintPtr; 500 SkCanvas::SaveFlags fFlags; 501 502 typedef SkDrawCommand INHERITED; 503}; 504 505class Scale : public SkDrawCommand { 506public: 507 Scale(SkScalar sx, SkScalar sy); 508 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 509 510 SkScalar x() const { return fSx; } 511 SkScalar y() const { return fSy; } 512 513private: 514 SkScalar fSx; 515 SkScalar fSy; 516 517 typedef SkDrawCommand INHERITED; 518}; 519 520class SetMatrix : public SkDrawCommand { 521public: 522 SetMatrix(const SkMatrix& matrix); 523 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 524private: 525 SkMatrix fMatrix; 526 527 typedef SkDrawCommand INHERITED; 528}; 529 530class Skew : public SkDrawCommand { 531public: 532 Skew(SkScalar sx, SkScalar sy); 533 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 534private: 535 SkScalar fSx; 536 SkScalar fSy; 537 538 typedef SkDrawCommand INHERITED; 539}; 540 541class Translate : public SkDrawCommand { 542public: 543 Translate(SkScalar dx, SkScalar dy); 544 virtual void execute(SkCanvas* canvas) SK_OVERRIDE; 545 546 SkScalar x() const { return fDx; } 547 SkScalar y() const { return fDy; } 548 549private: 550 SkScalar fDx; 551 SkScalar fDy; 552 553 typedef SkDrawCommand INHERITED; 554}; 555 556#endif 557