diff options
author | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-27 00:09:42 +0000 |
---|---|---|
committer | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-27 00:09:42 +0000 |
commit | ae2c20f398933a9e86c387dcc465ec0f71065ffc (patch) | |
tree | de668b1411e2ee0b4e49b6d8f8b68183134ac990 /skia/images/SkImageRef.cpp | |
parent | 09911bf300f1a419907a9412154760efd0b7abc3 (diff) | |
download | chromium_src-ae2c20f398933a9e86c387dcc465ec0f71065ffc.zip chromium_src-ae2c20f398933a9e86c387dcc465ec0f71065ffc.tar.gz chromium_src-ae2c20f398933a9e86c387dcc465ec0f71065ffc.tar.bz2 |
Add skia to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'skia/images/SkImageRef.cpp')
-rw-r--r-- | skia/images/SkImageRef.cpp | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/skia/images/SkImageRef.cpp b/skia/images/SkImageRef.cpp new file mode 100644 index 0000000..05960a2 --- /dev/null +++ b/skia/images/SkImageRef.cpp @@ -0,0 +1,157 @@ +#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->onDecode(stream, bitmap, config, mode); +} + +bool SkImageRef::prepareBitmap(SkImageDecoder::Mode mode) { + SkASSERT(&gImageRefMutex == this->mutex()); + + if (fErrorInDecoding) { + return false; + } + + 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); +} + |