diff options
Diffstat (limited to 'src/lazy/SkLazyPixelRef.cpp')
-rw-r--r-- | src/lazy/SkLazyPixelRef.cpp | 31 |
1 files changed, 10 insertions, 21 deletions
diff --git a/src/lazy/SkLazyPixelRef.cpp b/src/lazy/SkLazyPixelRef.cpp index ad60892ad1..22d4b112f1 100644 --- a/src/lazy/SkLazyPixelRef.cpp +++ b/src/lazy/SkLazyPixelRef.cpp @@ -37,10 +37,6 @@ 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(); } @@ -67,18 +63,6 @@ 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; @@ -107,15 +91,20 @@ void* SkLazyPixelRef::onLockPixels(SkColorTable**) { sk_atomic_inc(&gCacheMisses); #endif } - + SkImage::Info info; SkASSERT(fData != NULL && fData->size() > 0); if (NULL == target.fAddr) { - const SkImage::Info* info = this->getCachedInfo(); - if (NULL == info) { + // 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. 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. @@ -132,7 +121,7 @@ void* SkLazyPixelRef::onLockPixels(SkColorTable**) { } SkASSERT(target.fAddr != NULL); SkASSERT(SkImageCache::UNINITIALIZED_ID != fCacheId); - fErrorInDecoding = !fDecodeProc(fData->data(), fData->size(), NULL, &target); + fErrorInDecoding = !fDecodeProc(fData->data(), fData->size(), &info, &target); if (fErrorInDecoding) { fImageCache->throwAwayCache(fCacheId); fCacheId = SkImageCache::UNINITIALIZED_ID; |