diff options
Diffstat (limited to 'src/images')
-rw-r--r-- | src/images/SkImageRef.cpp | 212 | ||||
-rw-r--r-- | src/images/SkImageRefPool.cpp | 192 | ||||
-rw-r--r-- | src/images/SkImageRefPool.h | 49 | ||||
-rw-r--r-- | src/images/SkImageRef_GlobalPool.cpp | 100 | ||||
-rw-r--r-- | src/images/SkImageRef_ashmem.cpp | 230 | ||||
-rw-r--r-- | src/images/SkImageRef_ashmem.h | 47 | ||||
-rw-r--r-- | src/images/SkImages.cpp | 21 |
7 files changed, 0 insertions, 851 deletions
diff --git a/src/images/SkImageRef.cpp b/src/images/SkImageRef.cpp deleted file mode 100644 index 2cb8ec82ba..0000000000 --- a/src/images/SkImageRef.cpp +++ /dev/null @@ -1,212 +0,0 @@ - -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ -#include "SkImageRef.h" -#include "SkBitmap.h" -#include "SkReadBuffer.h" -#include "SkWriteBuffer.h" -#include "SkImageDecoder.h" -#include "SkStream.h" -#include "SkTemplates.h" -#include "SkThread.h" - -//#define DUMP_IMAGEREF_LIFECYCLE - -/////////////////////////////////////////////////////////////////////////////// - -SkImageRef::SkImageRef(const SkImageInfo& info, SkStreamRewindable* stream, - int sampleSize, SkBaseMutex* mutex) - : INHERITED(info, mutex), fErrorInDecoding(false) -{ - SkASSERT(stream); - stream->ref(); - fStream = stream; - fSampleSize = sampleSize; - fDoDither = true; - fPrev = fNext = NULL; - fFactory = NULL; - - // This sets the colortype/alphatype to exactly match our info, so that this - // can get communicated down to the codec. - fBitmap.setInfo(info); - -#ifdef DUMP_IMAGEREF_LIFECYCLE - SkDebugf("add ImageRef %p [%d] data=%d\n", - this, this->info().fColorType, (int)stream->getLength()); -#endif -} - -SkImageRef::~SkImageRef() { - -#ifdef DUMP_IMAGEREF_LIFECYCLE - SkDebugf("delete ImageRef %p [%d] data=%d\n", - this, this->info().fColorType, (int)fStream->getLength()); -#endif - - fStream->unref(); - SkSafeUnref(fFactory); -} - -bool SkImageRef::getInfo(SkBitmap* bitmap) { - SkAutoMutexAcquire ac(this->mutex()); - - 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::isOpaque(SkBitmap* bitmap) { - if (bitmap && bitmap->pixelRef() == this) { - bitmap->lockPixels(); - // what about colortables?????? - bitmap->setAlphaType(fBitmap.alphaType()); - bitmap->unlockPixels(); - return true; - } - return false; -} - -SkImageDecoderFactory* SkImageRef::setDecoderFactory( - SkImageDecoderFactory* fact) { - SkRefCnt_SafeAssign(fFactory, fact); - return fact; -} - -/////////////////////////////////////////////////////////////////////////////// - -bool SkImageRef::onDecode(SkImageDecoder* codec, SkStreamRewindable* stream, - SkBitmap* bitmap, SkBitmap::Config config, - SkImageDecoder::Mode mode) { - return codec->decode(stream, bitmap, config, mode); -} - -bool SkImageRef::prepareBitmap(SkImageDecoder::Mode mode) { - - if (fErrorInDecoding) { - return false; - } - - if (NULL != fBitmap.getPixels() || - (SkBitmap::kNo_Config != fBitmap.config() && - SkImageDecoder::kDecodeBounds_Mode == mode)) { - return true; - } - - SkASSERT(fBitmap.getPixels() == NULL); - - if (!fStream->rewind()) { - SkDEBUGF(("Failed to rewind SkImageRef stream!")); - return false; - } - - SkImageDecoder* codec; - if (fFactory) { - codec = fFactory->newDecoder(fStream); - } else { - codec = SkImageDecoder::Factory(fStream); - } - - if (codec) { - SkAutoTDelete<SkImageDecoder> ad(codec); - - codec->setSampleSize(fSampleSize); - codec->setDitherImage(fDoDither); - codec->setRequireUnpremultipliedColors(this->info().fAlphaType == kUnpremul_SkAlphaType); - if (this->onDecode(codec, fStream, &fBitmap, fBitmap.config(), mode)) { - if (kOpaque_SkAlphaType == fBitmap.alphaType()) { - this->changeAlphaType(kOpaque_SkAlphaType); - } - SkASSERT(this->info() == fBitmap.info()); - return true; - } - } - -#ifdef DUMP_IMAGEREF_LIFECYCLE - if (NULL == codec) { - SkDebugf("--- ImageRef: <%s> failed to find codec\n", this->getURI()); - } else { - SkDebugf("--- ImageRef: <%s> failed in codec for %d mode\n", - this->getURI(), mode); - } -#endif - fErrorInDecoding = true; - fBitmap.reset(); - return false; -} - -bool SkImageRef::onNewLockPixels(LockRec* rec) { - if (NULL == fBitmap.getPixels()) { - (void)this->prepareBitmap(SkImageDecoder::kDecodePixels_Mode); - } - - if (NULL == fBitmap.getPixels()) { - return false; - } - rec->fPixels = fBitmap.getPixels(); - rec->fColorTable = NULL; - rec->fRowBytes = fBitmap.rowBytes(); - return true; -} - -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(SkReadBuffer& buffer, SkBaseMutex* mutex) - : INHERITED(buffer, mutex), fErrorInDecoding(false) { - fSampleSize = buffer.readInt(); - fDoDither = buffer.readBool(); - - size_t length = buffer.getArrayCount(); - if (buffer.validateAvailable(length)) { - fStream = SkNEW_ARGS(SkMemoryStream, (length)); - buffer.readByteArray((void*)fStream->getMemoryBase(), length); - } else { - fStream = NULL; - } - - fPrev = fNext = NULL; - fFactory = NULL; - - // This sets the colortype/alphatype to exactly match our info, so that this - // can get communicated down to the codec. - fBitmap.setInfo(this->info()); -} - -void SkImageRef::flatten(SkWriteBuffer& buffer) const { - this->INHERITED::flatten(buffer); - - buffer.writeInt(fSampleSize); - buffer.writeBool(fDoDither); - // FIXME: Consider moving this logic should go into writeStream itself. - // writeStream currently has no other callers, so this may be fine for - // now. - if (!fStream->rewind()) { - SkDEBUGF(("Failed to rewind SkImageRef stream!")); - buffer.write32(0); - } else { - // FIXME: Handle getLength properly here. Perhaps this class should - // take an SkStreamAsset. - buffer.writeStream(fStream, fStream->getLength()); - } -} diff --git a/src/images/SkImageRefPool.cpp b/src/images/SkImageRefPool.cpp deleted file mode 100644 index 0a3d7bf8cc..0000000000 --- a/src/images/SkImageRefPool.cpp +++ /dev/null @@ -1,192 +0,0 @@ - -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ -#include "SkImageRefPool.h" -#include "SkImageRef.h" -#include "SkThread.h" - -SkImageRefPool::SkImageRefPool() { - fRAMBudget = 0; // means no explicit limit - fRAMUsed = 0; - fCount = 0; - fHead = fTail = NULL; -} - -SkImageRefPool::~SkImageRefPool() { - // SkASSERT(NULL == fHead); -} - -void SkImageRefPool::setRAMBudget(size_t size) { - if (fRAMBudget != size) { - fRAMBudget = size; - this->purgeIfNeeded(); - } -} - -void SkImageRefPool::justAddedPixels(SkImageRef* ref) { -#ifdef DUMP_IMAGEREF_LIFECYCLE - SkDebugf("=== ImagePool: add pixels %s [%d %d %d] bytes=%d heap=%d\n", - ref->getURI(), - ref->fBitmap.width(), ref->fBitmap.height(), - ref->fBitmap.bytesPerPixel(), - ref->fBitmap.getSize(), (int)fRAMUsed); -#endif - fRAMUsed += ref->ramUsed(); - this->purgeIfNeeded(); -} - -void SkImageRefPool::canLosePixels(SkImageRef* ref) { - // the refs near fHead have recently been released (used) - // if we purge, we purge from the tail - this->detach(ref); - this->addToHead(ref); - this->purgeIfNeeded(); -} - -void SkImageRefPool::purgeIfNeeded() { - // do nothing if we have a zero-budget (i.e. unlimited) - if (fRAMBudget != 0) { - this->setRAMUsed(fRAMBudget); - } -} - -void SkImageRefPool::setRAMUsed(size_t limit) { - SkImageRef* ref = fTail; - - while (NULL != ref && fRAMUsed > limit) { - // only purge it if its pixels are unlocked - if (!ref->isLocked() && ref->fBitmap.getPixels()) { - size_t size = ref->ramUsed(); - SkASSERT(size <= fRAMUsed); - fRAMUsed -= size; - -#ifdef DUMP_IMAGEREF_LIFECYCLE - SkDebugf("=== ImagePool: purge %s [%d %d %d] bytes=%d heap=%d\n", - ref->getURI(), - ref->fBitmap.width(), ref->fBitmap.height(), - ref->fBitmap.bytesPerPixel(), - (int)size, (int)fRAMUsed); -#endif - - // remember the bitmap config (don't call reset), - // just clear the pixel memory - ref->fBitmap.setPixels(NULL); - SkASSERT(NULL == ref->fBitmap.getPixels()); - } - ref = ref->fPrev; - } -} - -/////////////////////////////////////////////////////////////////////////////// - -void SkImageRefPool::addToHead(SkImageRef* ref) { - ref->fNext = fHead; - ref->fPrev = NULL; - - if (fHead) { - SkASSERT(NULL == fHead->fPrev); - fHead->fPrev = ref; - } - fHead = ref; - - if (NULL == fTail) { - fTail = ref; - } - fCount += 1; - SkASSERT(computeCount() == fCount); - - fRAMUsed += ref->ramUsed(); -} - -void SkImageRefPool::addToTail(SkImageRef* ref) { - ref->fNext = NULL; - ref->fPrev = fTail; - - if (fTail) { - SkASSERT(NULL == fTail->fNext); - fTail->fNext = ref; - } - fTail = ref; - - if (NULL == fHead) { - fHead = ref; - } - fCount += 1; - SkASSERT(computeCount() == fCount); - - fRAMUsed += ref->ramUsed(); -} - -void SkImageRefPool::detach(SkImageRef* ref) { - SkASSERT(fCount > 0); - - if (fHead == ref) { - fHead = ref->fNext; - } - if (fTail == ref) { - fTail = ref->fPrev; - } - if (ref->fPrev) { - ref->fPrev->fNext = ref->fNext; - } - if (ref->fNext) { - ref->fNext->fPrev = ref->fPrev; - } - - ref->fNext = ref->fPrev = NULL; - - fCount -= 1; - SkASSERT(computeCount() == fCount); - - SkASSERT(fRAMUsed >= ref->ramUsed()); - fRAMUsed -= ref->ramUsed(); -} - -int SkImageRefPool::computeCount() const { - SkImageRef* ref = fHead; - int count = 0; - - while (ref != NULL) { - count += 1; - ref = ref->fNext; - } - -#ifdef SK_DEBUG - ref = fTail; - int count2 = 0; - - while (ref != NULL) { - count2 += 1; - ref = ref->fPrev; - } - SkASSERT(count2 == count); -#endif - - return count; -} - -/////////////////////////////////////////////////////////////////////////////// - -#include "SkStream.h" - -void SkImageRefPool::dump() const { -#if defined(SK_DEBUG) || defined(DUMP_IMAGEREF_LIFECYCLE) - SkDebugf("ImagePool dump: bugdet: %d used: %d count: %d\n", - (int)fRAMBudget, (int)fRAMUsed, fCount); - - SkImageRef* ref = fHead; - - while (ref != NULL) { - SkDebugf(" [%3d %3d %d] ram=%d data=%d locked=%d %s\n", ref->fBitmap.width(), - ref->fBitmap.height(), ref->fBitmap.config(), - ref->ramUsed(), (int)ref->fStream->getLength(), - ref->isLocked(), ref->getURI()); - - ref = ref->fNext; - } -#endif -} diff --git a/src/images/SkImageRefPool.h b/src/images/SkImageRefPool.h deleted file mode 100644 index 1e74a6d077..0000000000 --- a/src/images/SkImageRefPool.h +++ /dev/null @@ -1,49 +0,0 @@ - -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ -#ifndef SkImageRefPool_DEFINED -#define SkImageRefPool_DEFINED - -#include "SkTypes.h" - -class SkImageRef; -class SkImageRef_GlobalPool; - -class SkImageRefPool { -public: - SkImageRefPool(); - ~SkImageRefPool(); - - size_t getRAMBudget() const { return fRAMBudget; } - void setRAMBudget(size_t); - - size_t getRAMUsed() const { return fRAMUsed; } - void setRAMUsed(size_t limit); - - void addToHead(SkImageRef*); - void addToTail(SkImageRef*); - void detach(SkImageRef*); - - void dump() const; - -private: - size_t fRAMBudget; - size_t fRAMUsed; - - int fCount; - SkImageRef* fHead, *fTail; - - int computeCount() const; - - friend class SkImageRef_GlobalPool; - - void justAddedPixels(SkImageRef*); - void canLosePixels(SkImageRef*); - void purgeIfNeeded(); -}; - -#endif diff --git a/src/images/SkImageRef_GlobalPool.cpp b/src/images/SkImageRef_GlobalPool.cpp deleted file mode 100644 index 2659e8b471..0000000000 --- a/src/images/SkImageRef_GlobalPool.cpp +++ /dev/null @@ -1,100 +0,0 @@ - -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ -#include "SkImageRef_GlobalPool.h" -#include "SkImageRefPool.h" -#include "SkThread.h" - -SK_DECLARE_STATIC_MUTEX(gGlobalPoolMutex); - -/* - * This returns the lazily-allocated global pool. It must be called - * from inside the guard mutex, so we safely only ever allocate 1. - */ -static SkImageRefPool* GetGlobalPool() { - static SkImageRefPool* gPool; - if (NULL == gPool) { - gPool = SkNEW(SkImageRefPool); - // call sk_atexit(...) when we have that, to free the global pool - } - return gPool; -} - -SkImageRef_GlobalPool::SkImageRef_GlobalPool(const SkImageInfo& info, - SkStreamRewindable* stream, - int sampleSize) - : SkImageRef(info, stream, sampleSize, &gGlobalPoolMutex) { - SkASSERT(&gGlobalPoolMutex == this->mutex()); - SkAutoMutexAcquire ac(gGlobalPoolMutex); - GetGlobalPool()->addToHead(this); -} - -SkImageRef_GlobalPool::~SkImageRef_GlobalPool() { - SkASSERT(&gGlobalPoolMutex == this->mutex()); - SkAutoMutexAcquire ac(gGlobalPoolMutex); - GetGlobalPool()->detach(this); -} - -/* By design, onUnlockPixels() already is inside the mutex-lock, - * and it is the (indirect) caller of onDecode(), therefore we can assume - * that we also are already inside the mutex. Hence, we can reference - * the global-pool directly. - */ -bool SkImageRef_GlobalPool::onDecode(SkImageDecoder* codec, SkStreamRewindable* stream, - SkBitmap* bitmap, SkBitmap::Config config, - SkImageDecoder::Mode mode) { - if (!this->INHERITED::onDecode(codec, stream, bitmap, config, mode)) { - return false; - } - if (mode == SkImageDecoder::kDecodePixels_Mode) { - // no need to grab the mutex here, it has already been acquired. - GetGlobalPool()->justAddedPixels(this); - } - return true; -} - -void SkImageRef_GlobalPool::onUnlockPixels() { - this->INHERITED::onUnlockPixels(); - - // by design, onUnlockPixels() already is inside the mutex-lock - GetGlobalPool()->canLosePixels(this); -} - -SkImageRef_GlobalPool::SkImageRef_GlobalPool(SkReadBuffer& buffer) - : INHERITED(buffer, &gGlobalPoolMutex) { - SkASSERT(&gGlobalPoolMutex == this->mutex()); - SkAutoMutexAcquire ac(gGlobalPoolMutex); - GetGlobalPool()->addToHead(this); -} - -/////////////////////////////////////////////////////////////////////////////// -// global imagerefpool wrappers - -size_t SkImageRef_GlobalPool::GetRAMBudget() { - SkAutoMutexAcquire ac(gGlobalPoolMutex); - return GetGlobalPool()->getRAMBudget(); -} - -void SkImageRef_GlobalPool::SetRAMBudget(size_t size) { - SkAutoMutexAcquire ac(gGlobalPoolMutex); - GetGlobalPool()->setRAMBudget(size); -} - -size_t SkImageRef_GlobalPool::GetRAMUsed() { - SkAutoMutexAcquire ac(gGlobalPoolMutex); - return GetGlobalPool()->getRAMUsed(); -} - -void SkImageRef_GlobalPool::SetRAMUsed(size_t usage) { - SkAutoMutexAcquire ac(gGlobalPoolMutex); - GetGlobalPool()->setRAMUsed(usage); -} - -void SkImageRef_GlobalPool::DumpPool() { - SkAutoMutexAcquire ac(gGlobalPoolMutex); - GetGlobalPool()->dump(); -} diff --git a/src/images/SkImageRef_ashmem.cpp b/src/images/SkImageRef_ashmem.cpp deleted file mode 100644 index 3c7d5c1bbf..0000000000 --- a/src/images/SkImageRef_ashmem.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "SkImageRef_ashmem.h" -#include "SkImageDecoder.h" -#include "SkReadBuffer.h" -#include "SkWriteBuffer.h" -#include "SkThread.h" - -#include "android/ashmem.h" - -#include <sys/mman.h> -#include <unistd.h> - -//#define TRACE_ASH_PURGE // just trace purges - -#ifdef DUMP_IMAGEREF_LIFECYCLE - #define DUMP_ASHMEM_LIFECYCLE -#else -// #define DUMP_ASHMEM_LIFECYCLE -#endif - -// ashmem likes lengths on page boundaries -static size_t roundToPageSize(size_t size) { - const size_t mask = getpagesize() - 1; - size_t newsize = (size + mask) & ~mask; -// SkDebugf("---- oldsize %d newsize %d\n", size, newsize); - return newsize; -} - -SkImageRef_ashmem::SkImageRef_ashmem(const SkImageInfo& info, - SkStreamRewindable* stream, - int sampleSize) - : SkImageRef(info, stream, sampleSize) -{ - fRec.fFD = -1; - fRec.fAddr = NULL; - fRec.fSize = 0; - fRec.fPinned = false; - - fCT = NULL; -} - -SkImageRef_ashmem::~SkImageRef_ashmem() { - SkSafeUnref(fCT); - this->closeFD(); -} - -void SkImageRef_ashmem::closeFD() { - if (-1 != fRec.fFD) { -#ifdef DUMP_ASHMEM_LIFECYCLE - SkDebugf("=== ashmem close %d\n", fRec.fFD); -#endif - SkASSERT(fRec.fAddr); - SkASSERT(fRec.fSize); - munmap(fRec.fAddr, fRec.fSize); - close(fRec.fFD); - fRec.fFD = -1; - } -} - -/////////////////////////////////////////////////////////////////////////////// - -class AshmemAllocator : public SkBitmap::Allocator { -public: - AshmemAllocator(SkAshmemRec* rec, const char name[]) - : fRec(rec), fName(name) {} - - virtual bool allocPixelRef(SkBitmap* bm, SkColorTable* ct) { - const size_t size = roundToPageSize(bm->getSize()); - int fd = fRec->fFD; - void* addr = fRec->fAddr; - - SkASSERT(!fRec->fPinned); - - if (-1 == fd) { - SkASSERT(NULL == addr); - SkASSERT(0 == fRec->fSize); - - fd = ashmem_create_region(fName, size); -#ifdef DUMP_ASHMEM_LIFECYCLE - SkDebugf("=== ashmem_create_region %s size=%d fd=%d\n", fName, size, fd); -#endif - if (-1 == fd) { - SkDebugf("------- imageref_ashmem create failed <%s> %d\n", - fName, size); - return false; - } - - int err = ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE); - if (err) { - SkDebugf("------ ashmem_set_prot_region(%d) failed %d\n", - fd, err); - close(fd); - return false; - } - - addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); - if (-1 == (long)addr) { - SkDebugf("---------- mmap failed for imageref_ashmem size=%d\n", - size); - close(fd); - return false; - } - - fRec->fFD = fd; - fRec->fAddr = addr; - fRec->fSize = size; - } else { - SkASSERT(addr); - SkASSERT(size == fRec->fSize); - (void)ashmem_pin_region(fd, 0, 0); - } - - bm->setPixels(addr, ct); - fRec->fPinned = true; - return true; - } - -private: - // we just point to our caller's memory, these are not copies - SkAshmemRec* fRec; - const char* fName; -}; - -bool SkImageRef_ashmem::onDecode(SkImageDecoder* codec, SkStreamRewindable* stream, - SkBitmap* bitmap, SkBitmap::Config config, - SkImageDecoder::Mode mode) { - - if (SkImageDecoder::kDecodeBounds_Mode == mode) { - return this->INHERITED::onDecode(codec, stream, bitmap, config, mode); - } - - // Ashmem memory is guaranteed to be initialized to 0. - codec->setSkipWritingZeroes(true); - - AshmemAllocator alloc(&fRec, this->getURI()); - - codec->setAllocator(&alloc); - bool success = this->INHERITED::onDecode(codec, stream, bitmap, config, - mode); - // remove the allocator, since its on the stack - codec->setAllocator(NULL); - - if (success) { - // remember the colortable (if any) - SkRefCnt_SafeAssign(fCT, bitmap->getColorTable()); - return true; - } else { - if (fRec.fPinned) { - ashmem_unpin_region(fRec.fFD, 0, 0); - fRec.fPinned = false; - } - this->closeFD(); - return false; - } -} - -bool SkImageRef_ashmem::onNewLockPixels(LockRec* rec) { - SkASSERT(fBitmap.getPixels() == NULL); - SkASSERT(fBitmap.getColorTable() == NULL); - - // fast case: check if we can just pin and get the cached data - if (-1 != fRec.fFD) { - SkASSERT(fRec.fAddr); - SkASSERT(!fRec.fPinned); - int pin = ashmem_pin_region(fRec.fFD, 0, 0); - - if (ASHMEM_NOT_PURGED == pin) { // yea, fast case! - fBitmap.setPixels(fRec.fAddr, fCT); - fRec.fPinned = true; - } else if (ASHMEM_WAS_PURGED == pin) { - ashmem_unpin_region(fRec.fFD, 0, 0); - // let go of our colortable if we lost the pixels. Well get it back - // again when we re-decode - if (fCT) { - fCT->unref(); - fCT = NULL; - } -#if defined(DUMP_ASHMEM_LIFECYCLE) || defined(TRACE_ASH_PURGE) - SkDebugf("===== ashmem purged %d\n", fBitmap.getSize()); -#endif - } else { - SkDebugf("===== ashmem pin_region(%d) returned %d\n", fRec.fFD, pin); - return false; - } - } else { - // no FD, will create an ashmem region in allocator - } - - return this->INHERITED::onNewLockPixels(rec); -} - -void SkImageRef_ashmem::onUnlockPixels() { - this->INHERITED::onUnlockPixels(); - - if (-1 != fRec.fFD) { - SkASSERT(fRec.fAddr); - SkASSERT(fRec.fPinned); - - ashmem_unpin_region(fRec.fFD, 0, 0); - fRec.fPinned = false; - } - - // we clear this with or without an error, since we've either closed or - // unpinned the region - fBitmap.setPixels(NULL, NULL); -} - -void SkImageRef_ashmem::flatten(SkWriteBuffer& buffer) const { - this->INHERITED::flatten(buffer); - buffer.writeString(getURI()); -} - -SkImageRef_ashmem::SkImageRef_ashmem(SkReadBuffer& buffer) - : INHERITED(buffer) { - fRec.fFD = -1; - fRec.fAddr = NULL; - fRec.fSize = 0; - fRec.fPinned = false; - fCT = NULL; - - SkString uri; - buffer.readString(&uri); - this->setURI(uri); -} diff --git a/src/images/SkImageRef_ashmem.h b/src/images/SkImageRef_ashmem.h deleted file mode 100644 index cf6e903837..0000000000 --- a/src/images/SkImageRef_ashmem.h +++ /dev/null @@ -1,47 +0,0 @@ - -/* - * Copyright 2011 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ -#ifndef SkImageRef_ashmem_DEFINED -#define SkImageRef_ashmem_DEFINED - -#include "SkImageRef.h" - -struct SkAshmemRec { - int fFD; - void* fAddr; - size_t fSize; - bool fPinned; -}; - -class SkImageRef_ashmem : public SkImageRef { -public: - SkImageRef_ashmem(const SkImageInfo&, SkStreamRewindable*, int sampleSize = 1); - virtual ~SkImageRef_ashmem(); - - SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkImageRef_ashmem) - -protected: - SkImageRef_ashmem(SkReadBuffer&); - virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; - - virtual bool onDecode(SkImageDecoder* codec, SkStreamRewindable* stream, - SkBitmap* bitmap, SkBitmap::Config config, - SkImageDecoder::Mode mode); - - virtual bool onNewLockPixels(LockRec*) SK_OVERRIDE; - virtual void onUnlockPixels() SK_OVERRIDE; - -private: - void closeFD(); - - SkColorTable* fCT; - SkAshmemRec fRec; - - typedef SkImageRef INHERITED; -}; - -#endif diff --git a/src/images/SkImages.cpp b/src/images/SkImages.cpp deleted file mode 100644 index 5b6bf6b7ce..0000000000 --- a/src/images/SkImages.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "SkFlattenable.h" -#include "SkImageRef_GlobalPool.h" -#include "SkImages.h" - -#ifdef SK_BUILD_FOR_ANDROID -#include "SkImageRef_ashmem.h" -#endif - -void SkImages::InitializeFlattenables() { - SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkImageRef_GlobalPool) -#ifdef SK_BUILD_FOR_ANDROID - SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkImageRef_ashmem) -#endif -} |