From 2590a91b643347ce39cc40bdb599537fcf433645 Mon Sep 17 00:00:00 2001 From: "reed@google.com" Date: Mon, 21 Oct 2013 18:58:17 +0000 Subject: [PATCH] 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 --- src/lazy/SkLazyPixelRef.cpp | 31 +++++++++++++++++++++---------- 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 22d4b11..ad60892 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 c51675d..8f7a751 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; }; -- 2.7.4