diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-10-21 18:58:17 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-10-21 18:58:17 +0000 |
commit | 2590a91b643347ce39cc40bdb599537fcf433645 (patch) | |
tree | a735e0a5dd0b2b4bf6312b22ea33927e50299d24 /src | |
parent | 0d00976bd3fb926f772a47cd0bc4af413b9587ed (diff) |
cache SkImage::Info calculation in lazypixelref
BUG=
R=scroggo@google.com
Review URL: https://codereview.chromium.org/28493003
git-svn-id: http://skia.googlecode.com/svn/trunk@11893 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/lazy/SkLazyPixelRef.cpp | 31 | ||||
-rw-r--r-- | src/lazy/SkLazyPixelRef.h | 4 |
2 files changed, 25 insertions, 10 deletions
diff --git a/src/lazy/SkLazyPixelRef.cpp b/src/lazy/SkLazyPixelRef.cpp index 22d4b112f1..ad60892ad1 100644 --- a/src/lazy/SkLazyPixelRef.cpp +++ b/src/lazy/SkLazyPixelRef.cpp @@ -37,6 +37,10 @@ SkLazyPixelRef::SkLazyPixelRef(SkData* data, SkBitmapFactory::DecodeProc proc, S } SkASSERT(cache != NULL); cache->ref(); + + // mark as uninitialized -- all fields are -1 + memset(&fLazilyCachedInfo, 0xFF, sizeof(fLazilyCachedInfo)); + // Since this pixel ref bases its data on encoded data, it should never change. this->setImmutable(); } @@ -63,6 +67,18 @@ static size_t ComputeMinRowBytesAndSize(const SkImage::Info& info, size_t* rowBy return safeSize.is32() ? safeSize.get32() : 0; } +const SkImage::Info* SkLazyPixelRef::getCachedInfo() { + if (fLazilyCachedInfo.fWidth < 0) { + SkImage::Info info; + fErrorInDecoding = !fDecodeProc(fData->data(), fData->size(), &info, NULL); + if (fErrorInDecoding) { + return NULL; + } + fLazilyCachedInfo = info; + } + return &fLazilyCachedInfo; +} + void* SkLazyPixelRef::onLockPixels(SkColorTable**) { if (fErrorInDecoding) { return NULL; @@ -91,20 +107,15 @@ void* SkLazyPixelRef::onLockPixels(SkColorTable**) { sk_atomic_inc(&gCacheMisses); #endif } - SkImage::Info info; + SkASSERT(fData != NULL && fData->size() > 0); if (NULL == target.fAddr) { - // Determine the size of the image in order to determine how much memory to allocate. - // FIXME: As an optimization, only do this part once. - fErrorInDecoding = !fDecodeProc(fData->data(), fData->size(), &info, NULL); - if (fErrorInDecoding) { - // We can only reach here if fCacheId was already set to UNINITIALIZED_ID, or if - // pinCache returned NULL, in which case it was reset to UNINITIALIZED_ID. + const SkImage::Info* info = this->getCachedInfo(); + if (NULL == info) { SkASSERT(SkImageCache::UNINITIALIZED_ID == fCacheId); return NULL; } - - size_t bytes = ComputeMinRowBytesAndSize(info, &target.fRowBytes); + size_t bytes = ComputeMinRowBytesAndSize(*info, &target.fRowBytes); target.fAddr = fImageCache->allocAndPinCache(bytes, &fCacheId); if (NULL == target.fAddr) { // Space could not be allocated. @@ -121,7 +132,7 @@ void* SkLazyPixelRef::onLockPixels(SkColorTable**) { } SkASSERT(target.fAddr != NULL); SkASSERT(SkImageCache::UNINITIALIZED_ID != fCacheId); - fErrorInDecoding = !fDecodeProc(fData->data(), fData->size(), &info, &target); + fErrorInDecoding = !fDecodeProc(fData->data(), fData->size(), NULL, &target); if (fErrorInDecoding) { fImageCache->throwAwayCache(fCacheId); fCacheId = SkImageCache::UNINITIALIZED_ID; diff --git a/src/lazy/SkLazyPixelRef.h b/src/lazy/SkLazyPixelRef.h index c51675dd5f..8f7a751e95 100644 --- a/src/lazy/SkLazyPixelRef.h +++ b/src/lazy/SkLazyPixelRef.h @@ -71,12 +71,16 @@ private: SkImageCache* fImageCache; intptr_t fCacheId; size_t fRowBytes; + SkImage::Info fLazilyCachedInfo; #if LAZY_CACHE_STATS static int32_t gCacheHits; static int32_t gCacheMisses; #endif + // lazily initialized our cached info. Returns NULL on failure. + const SkImage::Info* getCachedInfo(); + typedef SkPixelRef INHERITED; }; |