| /* |
| * Copyright 2014 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SkPicturePlayback_DEFINED |
| #define SkPicturePlayback_DEFINED |
| |
| #include "SkPictureFlat.h" // for DrawType |
| #include "SkPictureStateTree.h" |
| |
| class SkBitmap; |
| class SkCanvas; |
| class SkDrawPictureCallback; |
| class SkPaint; |
| class SkPictureData; |
| |
| // The basic picture playback class replays the provided picture into a canvas. |
| // If the picture was generated with a BBH it is used to accelerate drawing |
| // unless disabled via setUseBBH. |
| class SkPicturePlayback : SkNoncopyable { |
| public: |
| SkPicturePlayback(const SkPicture* picture) |
| : fPictureData(picture->fData.get()) |
| , fCurOffset(0) |
| , fUseBBH(true) { |
| } |
| virtual ~SkPicturePlayback() { } |
| |
| virtual void draw(SkCanvas* canvas, SkDrawPictureCallback*); |
| |
| // TODO: remove the curOp calls after cleaning up GrGatherDevice |
| // Return the ID of the operation currently being executed when playing |
| // back. 0 indicates no call is active. |
| size_t curOpID() const { return fCurOffset; } |
| void resetOpID() { fCurOffset = 0; } |
| |
| // TODO: remove setUseBBH after cleaning up GrGatherCanvas |
| void setUseBBH(bool useBBH) { fUseBBH = useBBH; } |
| |
| protected: |
| const SkPictureData* fPictureData; |
| |
| // The offset of the current operation when within the draw method |
| size_t fCurOffset; |
| |
| bool fUseBBH; |
| |
| void handleOp(SkReader32* reader, |
| DrawType op, |
| uint32_t size, |
| SkCanvas* canvas, |
| const SkMatrix& initialMatrix); |
| |
| const SkPicture::OperationList* getActiveOps(const SkCanvas* canvas); |
| bool initIterator(SkPictureStateTree::Iterator* iter, |
| SkCanvas* canvas, |
| const SkPicture::OperationList *activeOpsList); |
| static void StepIterator(SkPictureStateTree::Iterator* iter, SkReader32* reader); |
| static void SkipIterTo(SkPictureStateTree::Iterator* iter, |
| SkReader32* reader, uint32_t skipTo); |
| |
| static DrawType ReadOpAndSize(SkReader32* reader, uint32_t* size); |
| |
| class AutoResetOpID { |
| public: |
| AutoResetOpID(SkPicturePlayback* playback) : fPlayback(playback) { } |
| ~AutoResetOpID() { |
| if (NULL != fPlayback) { |
| fPlayback->resetOpID(); |
| } |
| } |
| |
| private: |
| SkPicturePlayback* fPlayback; |
| }; |
| |
| private: |
| typedef SkNoncopyable INHERITED; |
| }; |
| |
| #endif |