| Index: src/core/SkPictureFlat.h
|
| ===================================================================
|
| --- src/core/SkPictureFlat.h (revision 12980)
|
| +++ src/core/SkPictureFlat.h (working copy)
|
| @@ -376,10 +376,10 @@
|
| public:
|
| explicit SkFlatDictionary(SkFlatController* controller)
|
| : fController(SkRef(controller))
|
| - , fScratchSize(kScratchSizeGuess)
|
| - , fScratch(AllocScratch(fScratchSize))
|
| + , fScratchSize(0)
|
| + , fScratch(NULL)
|
| , fWriteBuffer(kWriteBufferGrowthBytes)
|
| - , fWriteBufferReady(false) {
|
| + , fReady(false) {
|
| this->reset();
|
| }
|
|
|
| @@ -515,18 +515,24 @@
|
| }
|
|
|
| // We have to delay fWriteBuffer's initialization until its first use; fController might not
|
| - // be fully set up by the time we get it in the constructor.
|
| - void lazyWriteBufferInit() {
|
| - if (fWriteBufferReady) {
|
| + // be fully set up by the time we get it in the constructor. We also delay allocating fScratch
|
| + // to avoid unnecessary heap allocations, since we're paying the price of the conditional
|
| + // anyway.
|
| + void lazyInit() {
|
| + if (fReady) {
|
| return;
|
| }
|
| +
|
| + fScratchSize = kScratchSizeGuess;
|
| + fScratch = AllocScratch(fScratchSize);
|
| +
|
| // Without a bitmap heap, we'll flatten bitmaps into paints. That's never what you want.
|
| SkASSERT(fController->getBitmapHeap() != NULL);
|
| fWriteBuffer.setBitmapHeap(fController->getBitmapHeap());
|
| fWriteBuffer.setTypefaceRecorder(fController->getTypefaceSet());
|
| fWriteBuffer.setNamedFactoryRecorder(fController->getNamedFactorySet());
|
| fWriteBuffer.setFlags(fController->getWriteBufferFlags());
|
| - fWriteBufferReady = true;
|
| + fReady = true;
|
| }
|
|
|
| // As findAndReturnFlat, but returns a mutable pointer for internal use.
|
| @@ -546,7 +552,7 @@
|
|
|
| // This reference is valid only until the next call to resetScratch() or detachScratch().
|
| const SkFlatData& resetScratch(const T& element, int index) {
|
| - this->lazyWriteBufferInit();
|
| + this->lazyInit();
|
|
|
| // Flatten element into fWriteBuffer (using fScratch as storage).
|
| fWriteBuffer.reset(fScratch->data(), fScratchSize);
|
| @@ -577,6 +583,7 @@
|
| // Allocate a new SkFlatData exactly big enough to hold our current scratch.
|
| // We use the controller for this allocation to extend the allocation's lifetime and allow
|
| // the controller to do whatever memory management it wants.
|
| + SkASSERT(fScratch != NULL);
|
| const size_t paddedSize = SizeWithPadding(fScratch->flatSize());
|
| SkFlatData* detached = (SkFlatData*)fController->allocThrow(paddedSize);
|
|
|
| @@ -596,9 +603,9 @@
|
| // All SkFlatData* stored in fIndexedData and fHash are owned by the controller.
|
| SkAutoTUnref<SkFlatController> fController;
|
| size_t fScratchSize; // How many bytes fScratch has allocated for data itself.
|
| - SkFlatData* fScratch; // Owned, must be freed with sk_free.
|
| + SkFlatData* fScratch; // Owned, lazily allocated, must be freed with sk_free.
|
| SkOrderedWriteBuffer fWriteBuffer;
|
| - bool fWriteBufferReady;
|
| + bool fReady;
|
|
|
| // We map between SkFlatData and a 1-based integer index.
|
| int fNextIndex;
|
|
|