| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef SkPicturePlayback_DEFINED | 8 #ifndef SkPicturePlayback_DEFINED |
| 9 #define SkPicturePlayback_DEFINED | 9 #define SkPicturePlayback_DEFINED |
| 10 | 10 |
| 11 #include "SkPictureFlat.h" // for DrawType | 11 #include "SkPictureFlat.h" // for DrawType |
| 12 #include "SkPictureStateTree.h" | 12 #include "SkPictureStateTree.h" |
| 13 | 13 |
| 14 class SkBitmap; | 14 class SkBitmap; |
| 15 class SkCanvas; | 15 class SkCanvas; |
| 16 class SkDrawPictureCallback; | 16 class SkDrawPictureCallback; |
| 17 class SkPaint; | 17 class SkPaint; |
| 18 class SkPictureData; | 18 class SkPictureData; |
| 19 | 19 |
| 20 // The basic picture playback class replays the provided picture into a canvas. |
| 21 // If the picture was generated with a BBH it is used to accelerate drawing |
| 22 // unless disabled via setUseBBH. |
| 20 class SkPicturePlayback : SkNoncopyable { | 23 class SkPicturePlayback : SkNoncopyable { |
| 21 public: | 24 public: |
| 22 SkPicturePlayback(const SkPicture* picture) | 25 SkPicturePlayback(const SkPicture* picture) |
| 23 : fPictureData(picture->fData.get()) | 26 : fPictureData(picture->fData.get()) |
| 24 , fCurOffset(0) | 27 , fCurOffset(0) |
| 25 , fUseBBH(true) | 28 , fUseBBH(true) { |
| 26 , fReplacements(NULL) { | |
| 27 } | 29 } |
| 28 virtual ~SkPicturePlayback() { } | 30 virtual ~SkPicturePlayback() { } |
| 29 | 31 |
| 30 virtual void draw(SkCanvas* canvas, SkDrawPictureCallback*); | 32 virtual void draw(SkCanvas* canvas, SkDrawPictureCallback*); |
| 31 | 33 |
| 34 // TODO: remove the curOp calls after cleaning up GrGatherDevice |
| 32 // Return the ID of the operation currently being executed when playing | 35 // Return the ID of the operation currently being executed when playing |
| 33 // back. 0 indicates no call is active. | 36 // back. 0 indicates no call is active. |
| 34 size_t curOpID() const { return fCurOffset; } | 37 size_t curOpID() const { return fCurOffset; } |
| 35 void resetOpID() { fCurOffset = 0; } | 38 void resetOpID() { fCurOffset = 0; } |
| 36 | 39 |
| 40 // TODO: remove setUseBBH after cleaning up GrGatherCanvas |
| 37 void setUseBBH(bool useBBH) { fUseBBH = useBBH; } | 41 void setUseBBH(bool useBBH) { fUseBBH = useBBH; } |
| 38 | 42 |
| 39 // PlaybackReplacements collects op ranges that can be replaced with | |
| 40 // a single drawBitmap call (using a precomputed bitmap). | |
| 41 class PlaybackReplacements { | |
| 42 public: | |
| 43 // All the operations between fStart and fStop (inclusive) will be repla
ced with | |
| 44 // a single drawBitmap call using fPos, fBM and fPaint. | |
| 45 // fPaint will be NULL if the picture's paint wasn't copyable | |
| 46 struct ReplacementInfo { | |
| 47 size_t fStart; | |
| 48 size_t fStop; | |
| 49 SkIPoint fPos; | |
| 50 SkBitmap* fBM; // fBM is allocated so ReplacementInfo can
remain POD | |
| 51 const SkPaint* fPaint; // Note: this object doesn't own the paint | |
| 52 | |
| 53 SkIRect fSrcRect; | |
| 54 }; | |
| 55 | |
| 56 ~PlaybackReplacements() { this->freeAll(); } | |
| 57 | |
| 58 // Add a new replacement range. The replacement ranges should be | |
| 59 // sorted in increasing order and non-overlapping (esp. no nested | |
| 60 // saveLayers). | |
| 61 ReplacementInfo* push(); | |
| 62 | |
| 63 private: | |
| 64 friend class SkPicturePlayback; // for access to lookupByStart | |
| 65 | |
| 66 // look up a replacement range by its start offset | |
| 67 ReplacementInfo* lookupByStart(size_t start); | |
| 68 | |
| 69 void freeAll(); | |
| 70 | |
| 71 #ifdef SK_DEBUG | |
| 72 void validate() const; | |
| 73 #endif | |
| 74 | |
| 75 SkTDArray<ReplacementInfo> fReplacements; | |
| 76 }; | |
| 77 | |
| 78 // Replace all the draw ops in the replacement ranges in 'replacements' with | |
| 79 // the associated drawBitmap call | |
| 80 // Draw replacing cannot be enabled at the same time as draw limiting | |
| 81 void setReplacements(PlaybackReplacements* replacements) { | |
| 82 fReplacements = replacements; | |
| 83 } | |
| 84 | |
| 85 protected: | 43 protected: |
| 86 const SkPictureData* fPictureData; | 44 const SkPictureData* fPictureData; |
| 87 | 45 |
| 88 // The offset of the current operation when within the draw method | 46 // The offset of the current operation when within the draw method |
| 89 size_t fCurOffset; | 47 size_t fCurOffset; |
| 90 | 48 |
| 91 bool fUseBBH; | 49 bool fUseBBH; |
| 92 PlaybackReplacements* fReplacements; | |
| 93 | 50 |
| 94 void handleOp(SkReader32* reader, | 51 void handleOp(SkReader32* reader, |
| 95 DrawType op, | 52 DrawType op, |
| 96 uint32_t size, | 53 uint32_t size, |
| 97 SkCanvas* canvas, | 54 SkCanvas* canvas, |
| 98 const SkMatrix& initialMatrix); | 55 const SkMatrix& initialMatrix); |
| 99 | 56 |
| 100 const SkPicture::OperationList* getActiveOps(const SkCanvas* canvas); | 57 const SkPicture::OperationList* getActiveOps(const SkCanvas* canvas); |
| 101 bool initIterator(SkPictureStateTree::Iterator* iter, | 58 bool initIterator(SkPictureStateTree::Iterator* iter, |
| 102 SkCanvas* canvas, | 59 SkCanvas* canvas, |
| 103 const SkPicture::OperationList *activeOpsList); | 60 const SkPicture::OperationList *activeOpsList); |
| 104 static void StepIterator(SkPictureStateTree::Iterator* iter, SkReader32* rea
der); | 61 static void StepIterator(SkPictureStateTree::Iterator* iter, SkReader32* rea
der); |
| 105 static void SkipIterTo(SkPictureStateTree::Iterator* iter, | 62 static void SkipIterTo(SkPictureStateTree::Iterator* iter, |
| 106 SkReader32* reader, uint32_t skipTo); | 63 SkReader32* reader, uint32_t skipTo); |
| 107 bool replaceOps(SkPictureStateTree::Iterator* iter, | |
| 108 SkReader32* reader, | |
| 109 SkCanvas* canvas, | |
| 110 const SkMatrix& initialMatrix); | |
| 111 | 64 |
| 112 static DrawType ReadOpAndSize(SkReader32* reader, uint32_t* size); | 65 static DrawType ReadOpAndSize(SkReader32* reader, uint32_t* size); |
| 113 | 66 |
| 114 class AutoResetOpID { | 67 class AutoResetOpID { |
| 115 public: | 68 public: |
| 116 AutoResetOpID(SkPicturePlayback* playback) : fPlayback(playback) { } | 69 AutoResetOpID(SkPicturePlayback* playback) : fPlayback(playback) { } |
| 117 ~AutoResetOpID() { | 70 ~AutoResetOpID() { |
| 118 if (NULL != fPlayback) { | 71 if (NULL != fPlayback) { |
| 119 fPlayback->resetOpID(); | 72 fPlayback->resetOpID(); |
| 120 } | 73 } |
| 121 } | 74 } |
| 122 | 75 |
| 123 private: | 76 private: |
| 124 SkPicturePlayback* fPlayback; | 77 SkPicturePlayback* fPlayback; |
| 125 }; | 78 }; |
| 126 | 79 |
| 127 private: | 80 private: |
| 128 typedef SkNoncopyable INHERITED; | 81 typedef SkNoncopyable INHERITED; |
| 129 }; | 82 }; |
| 130 | 83 |
| 131 #endif | 84 #endif |
| OLD | NEW |