Index: skia/images/SkImageRef.cpp |
=================================================================== |
--- skia/images/SkImageRef.cpp (revision 16859) |
+++ skia/images/SkImageRef.cpp (working copy) |
@@ -1,165 +0,0 @@ |
-#include "SkImageRef.h" |
-#include "SkBitmap.h" |
-#include "SkFlattenable.h" |
-#include "SkImageDecoder.h" |
-#include "SkStream.h" |
-#include "SkTemplates.h" |
-#include "SkThread.h" |
- |
-// can't be static, as SkImageRef_Pool needs to see it |
-SkMutex gImageRefMutex; |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-SkImageRef::SkImageRef(SkStream* stream, SkBitmap::Config config, |
- int sampleSize) |
- : SkPixelRef(&gImageRefMutex), fErrorInDecoding(false) { |
- SkASSERT(stream); |
- SkASSERT(1 == stream->getRefCnt()); |
- |
- fStream = stream; |
- fConfig = config; |
- fSampleSize = sampleSize; |
- fPrev = fNext = NULL; |
- |
-#ifdef DUMP_IMAGEREF_LIFECYCLE |
- SkDebugf("add ImageRef %p [%d] data=%d\n", |
- this, config, (int)stream->getLength()); |
-#endif |
-} |
- |
-SkImageRef::~SkImageRef() { |
- SkASSERT(&gImageRefMutex == this->mutex()); |
- |
-#ifdef DUMP_IMAGEREF_LIFECYCLE |
- SkDebugf("delete ImageRef %p [%d] data=%d\n", |
- this, fConfig, (int)fStream->getLength()); |
-#endif |
- |
- delete fStream; |
-} |
- |
-bool SkImageRef::getInfo(SkBitmap* bitmap) { |
- SkAutoMutexAcquire ac(gImageRefMutex); |
- |
- if (!this->prepareBitmap(SkImageDecoder::kDecodeBounds_Mode)) { |
- return false; |
- } |
- |
- SkASSERT(SkBitmap::kNo_Config != fBitmap.config()); |
- if (bitmap) { |
- bitmap->setConfig(fBitmap.config(), fBitmap.width(), fBitmap.height()); |
- } |
- return true; |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-bool SkImageRef::onDecode(SkImageDecoder* codec, SkStream* stream, |
- SkBitmap* bitmap, SkBitmap::Config config, |
- SkImageDecoder::Mode mode) { |
- return codec->decode(stream, bitmap, config, mode); |
-} |
- |
-bool SkImageRef::prepareBitmap(SkImageDecoder::Mode mode) { |
- SkASSERT(&gImageRefMutex == this->mutex()); |
- |
- if (fErrorInDecoding) { |
- return false; |
- } |
- |
- /* As soon as we really know our config, we record it, so that on |
- subsequent calls to the codec, we are sure we will always get the same |
- result. |
- */ |
- if (SkBitmap::kNo_Config != fBitmap.config()) { |
- fConfig = fBitmap.config(); |
- } |
- |
- if (NULL != fBitmap.getPixels() || |
- (SkBitmap::kNo_Config != fBitmap.config() && |
- SkImageDecoder::kDecodeBounds_Mode == mode)) { |
- return true; |
- } |
- |
- SkASSERT(fBitmap.getPixels() == NULL); |
- |
- fStream->rewind(); |
- |
- SkImageDecoder* codec = SkImageDecoder::Factory(fStream); |
- if (codec) { |
- SkAutoTDelete<SkImageDecoder> ad(codec); |
- |
- codec->setSampleSize(fSampleSize); |
- if (this->onDecode(codec, fStream, &fBitmap, fConfig, mode)) { |
- return true; |
- } |
- } |
- |
-#ifdef DUMP_IMAGEREF_LIFECYCLE |
- if (NULL == codec) { |
- SkDebugf("--- ImageRef: <%s> failed to find codec\n", fName.c_str()); |
- } else { |
- SkDebugf("--- ImageRef: <%s> failed in codec for %d mode\n", |
- fName.c_str(), mode); |
- } |
-#endif |
- fErrorInDecoding = true; |
- fBitmap.reset(); |
- return false; |
-} |
- |
-void* SkImageRef::onLockPixels(SkColorTable** ct) { |
- SkASSERT(&gImageRefMutex == this->mutex()); |
- |
- if (NULL == fBitmap.getPixels()) { |
- (void)this->prepareBitmap(SkImageDecoder::kDecodePixels_Mode); |
- } |
- |
- if (ct) { |
- *ct = fBitmap.getColorTable(); |
- } |
- return fBitmap.getPixels(); |
-} |
- |
-void SkImageRef::onUnlockPixels() { |
- // we're already have the mutex locked |
- SkASSERT(&gImageRefMutex == this->mutex()); |
-} |
- |
-size_t SkImageRef::ramUsed() const { |
- size_t size = 0; |
- |
- if (fBitmap.getPixels()) { |
- size = fBitmap.getSize(); |
- if (fBitmap.getColorTable()) { |
- size += fBitmap.getColorTable()->count() * sizeof(SkPMColor); |
- } |
- } |
- return size; |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-SkImageRef::SkImageRef(SkFlattenableReadBuffer& buffer) |
- : INHERITED(buffer, &gImageRefMutex), fErrorInDecoding(false) { |
- fConfig = (SkBitmap::Config)buffer.readU8(); |
- fSampleSize = buffer.readU8(); |
- size_t length = buffer.readU32(); |
- fStream = SkNEW_ARGS(SkMemoryStream, (length)); |
- buffer.read((void*)fStream->getMemoryBase(), length); |
- |
- fPrev = fNext = NULL; |
-} |
- |
-void SkImageRef::flatten(SkFlattenableWriteBuffer& buffer) const { |
- this->INHERITED::flatten(buffer); |
- |
- buffer.write8(fConfig); |
- buffer.write8(fSampleSize); |
- size_t length = fStream->getLength(); |
- buffer.write32(length); |
- fStream->rewind(); |
- buffer.readFromStream(fStream, length); |
-} |
- |