From ce4dd3de38cd7c29bf5b9d8a8efb55c08ec9be47 Mon Sep 17 00:00:00 2001 From: robertphillips Date: Mon, 7 Jul 2014 13:46:35 -0700 Subject: Split SkPicturePlayback out of SkPictureData This splits the playback functionality out of SkPictureData. The old SkPictureData::draw method is pulled out along with its supporting functions as verbatim as possible. Some follow on CLs will be required to: re-enable profiling in the debugger (and remove the vestiges of SkTimedPicture) re-enable display of command offsets in the picture (this should probably wait until we've switched to SkRecord though) Clean up CachedOperationList (maybe fuse with SkPicture::OperationList) Split SkPicturePlayback into a base class and two derived classes Implement parallel version of GatherGPUInfo for SkRecord Landing this is blocked on removing Android's use of the abortPlayback entry point. R=mtklein@google.com, reed@google.com Author: robertphillips@google.com Review URL: https://codereview.chromium.org/377623002 --- src/core/SkPictureData.h | 164 ++++------------------------------------------- 1 file changed, 12 insertions(+), 152 deletions(-) (limited to 'src/core/SkPictureData.h') diff --git a/src/core/SkPictureData.h b/src/core/SkPictureData.h index f798e7c923..408d6358c3 100644 --- a/src/core/SkPictureData.h +++ b/src/core/SkPictureData.h @@ -1,4 +1,3 @@ - /* * Copyright 2011 Google Inc. * @@ -14,10 +13,6 @@ #include "SkPicture.h" #include "SkPictureFlat.h" -#ifdef SK_BUILD_FOR_ANDROID -#include "SkThread.h" -#endif - class SkData; class SkPictureRecord; class SkReader32; @@ -136,25 +131,19 @@ struct SkPictCopyInfo { class SkPictureData { public: #ifdef SK_SUPPORT_LEGACY_PICTURE_CLONE - SkPictureData(const SkPictureData& src, - SkPictCopyInfo* deepCopyInfo = NULL); + SkPictureData(const SkPictureData& src, SkPictCopyInfo* deepCopyInfo = NULL); #else SkPictureData(const SkPictureData& src); #endif SkPictureData(const SkPictureRecord& record, const SkPictInfo&, bool deepCopyOps); static SkPictureData* CreateFromStream(SkStream*, - const SkPictInfo&, - SkPicture::InstallPixelRefProc); - static SkPictureData* CreateFromBuffer(SkReadBuffer&, - const SkPictInfo&); + const SkPictInfo&, + SkPicture::InstallPixelRefProc); + static SkPictureData* CreateFromBuffer(SkReadBuffer&, const SkPictInfo&); virtual ~SkPictureData(); - const SkPicture::OperationList& getActiveOps(const SkIRect& queryRect); - - void setUseBBH(bool useBBH) { fUseBBH = useBBH; } - - void draw(SkCanvas& canvas, SkDrawPictureCallback*); + const SkPicture::OperationList* getActiveOps(const SkIRect& queryRect) const; void serialize(SkWStream*, SkPicture::EncodeBitmap) const; void flatten(SkWriteBuffer&) const; @@ -163,35 +152,15 @@ public: bool containsBitmaps() const; -#ifdef SK_BUILD_FOR_ANDROID - // Can be called in the middle of playback (the draw() call). WIll abort the - // drawing and return from draw() after the "current" op code is done - void abort() { fAbortCurrentPlayback = true; } -#endif - - size_t curOpID() const { return fCurOffset; } - void resetOpID() { fCurOffset = 0; } - protected: explicit SkPictureData(const SkPictInfo& info); bool parseStream(SkStream*, SkPicture::InstallPixelRefProc); bool parseBuffer(SkReadBuffer& buffer); -#ifdef SK_DEVELOPER - virtual bool preDraw(int opIndex, int type); - virtual void postDraw(int opIndex); -#endif private: - class TextContainer { - public: - size_t length() { return fByteLength; } - const void* text() { return (const void*) fText; } - size_t fByteLength; - const char* fText; - }; - const SkBitmap& getBitmap(SkReader32& reader) { + const SkBitmap& getBitmap(SkReader32& reader) const { const int index = reader.readInt(); if (SkBitmapHeap::INVALID_SLOT == index) { #ifdef SK_DEBUG @@ -202,22 +171,18 @@ private: return (*fBitmaps)[index]; } - void getMatrix(SkReader32& reader, SkMatrix* matrix) { - reader.readMatrix(matrix); - } - - const SkPath& getPath(SkReader32& reader) { + const SkPath& getPath(SkReader32& reader) const { int index = reader.readInt() - 1; return (*fPathHeap.get())[index]; } - const SkPicture* getPicture(SkReader32& reader) { + const SkPicture* getPicture(SkReader32& reader) const { int index = reader.readInt(); SkASSERT(index > 0 && index <= fPictureCount); return fPictureRefs[index - 1]; } - const SkPaint* getPaint(SkReader32& reader) { + const SkPaint* getPaint(SkReader32& reader) const { int index = reader.readInt(); if (index == 0) { return NULL; @@ -225,31 +190,6 @@ private: return &(*fPaints)[index - 1]; } - const SkRect* getRectPtr(SkReader32& reader) { - if (reader.readBool()) { - return &reader.skipT(); - } else { - return NULL; - } - } - - const SkIRect* getIRectPtr(SkReader32& reader) { - if (reader.readBool()) { - return &reader.skipT(); - } else { - return NULL; - } - } - - void getRegion(SkReader32& reader, SkRegion* region) { - reader.readRegion(region); - } - - void getText(SkReader32& reader, TextContainer* text) { - size_t length = text->fByteLength = reader.readInt(); - text->fText = (const char*)reader.skip(length); - } - void init(); #ifdef SK_DEBUG_SIZE @@ -306,7 +246,7 @@ private: // these help us with reading/writing private: friend class SkPicture; - friend class SkGpuDevice; // for access to setDrawLimits & setReplacements + friend class SkPicturePlayback; // Only used by getBitmap() if the passed in index is SkBitmapHeap::INVALID_SLOT. This empty // bitmap allows playback to draw nothing and move on. @@ -329,83 +269,13 @@ private: SkPictureContentInfo fContentInfo; - // Limit the opcode playback to be between the offsets 'start' and 'stop'. - // The opcode at 'start' should be a saveLayer while the opcode at - // 'stop' should be a restore. Neither of those commands will be issued. - // Set both start & stop to 0 to disable draw limiting - // Draw limiting cannot be enabled at the same time as draw replacing - void setDrawLimits(size_t start, size_t stop) { - SkASSERT(NULL == fReplacements); - fStart = start; - fStop = stop; - } - - // PlaybackReplacements collects op ranges that can be replaced with - // a single drawBitmap call (using a precomputed bitmap). - class PlaybackReplacements { - public: - // All the operations between fStart and fStop (inclusive) will be replaced with - // a single drawBitmap call using fPos, fBM and fPaint. - // fPaint will be NULL if the picture's paint wasn't copyable - struct ReplacementInfo { - size_t fStart; - size_t fStop; - SkIPoint fPos; - SkBitmap* fBM; // fBM is allocated so ReplacementInfo can remain POD - const SkPaint* fPaint; // Note: this object doesn't own the paint - - SkIRect fSrcRect; - }; - - ~PlaybackReplacements() { this->freeAll(); } - - // Add a new replacement range. The replacement ranges should be - // sorted in increasing order and non-overlapping (esp. no nested - // saveLayers). - ReplacementInfo* push(); - - private: - friend class SkPictureData; // for access to lookupByStart - - // look up a replacement range by its start offset - ReplacementInfo* lookupByStart(size_t start); - - void freeAll(); - -#ifdef SK_DEBUG - void validate() const; -#endif - - SkTDArray fReplacements; - }; - - // Replace all the draw ops in the replacement ranges in 'replacements' with - // the associated drawBitmap call - // Draw replacing cannot be enabled at the same time as draw limiting - void setReplacements(PlaybackReplacements* replacements) { - SkASSERT(fStart == 0 && fStop == 0); - fReplacements = replacements; - } - - bool fUseBBH; - size_t fStart; - size_t fStop; - PlaybackReplacements* fReplacements; - - class CachedOperationList : public SkPicture::OperationList { + class OperationList : public SkPicture::OperationList { public: - CachedOperationList() { - fCacheQueryRect.setEmpty(); - } - - virtual bool valid() const { return true; } + OperationList() { } virtual int numOps() const SK_OVERRIDE { return fOps.count(); } virtual uint32_t offset(int index) const SK_OVERRIDE; virtual const SkMatrix& matrix(int index) const SK_OVERRIDE; - // The query rect for which the cached active ops are valid - SkIRect fCacheQueryRect; - // The operations which are active within 'fCachedQueryRect' SkTDArray fOps; @@ -413,25 +283,15 @@ private: typedef SkPicture::OperationList INHERITED; }; - CachedOperationList* fCachedActiveOps; - SkTypefacePlayback fTFPlayback; SkFactoryPlayback* fFactoryPlayback; - // The offset of the current operation when within the draw method - size_t fCurOffset; - const SkPictInfo fInfo; static void WriteFactories(SkWStream* stream, const SkFactorySet& rec); static void WriteTypefaces(SkWStream* stream, const SkRefCntSet& rec); void initForPlayback() const; - -#ifdef SK_BUILD_FOR_ANDROID - SkMutex fDrawMutex; - bool fAbortCurrentPlayback; -#endif }; #endif -- cgit v1.2.3