summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/skia/src/images/SkImageRef_ashmem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/src/images/SkImageRef_ashmem.cpp')
-rw-r--r--chromium/third_party/skia/src/images/SkImageRef_ashmem.cpp233
1 files changed, 0 insertions, 233 deletions
diff --git a/chromium/third_party/skia/src/images/SkImageRef_ashmem.cpp b/chromium/third_party/skia/src/images/SkImageRef_ashmem.cpp
deleted file mode 100644
index 269199faf84..00000000000
--- a/chromium/third_party/skia/src/images/SkImageRef_ashmem.cpp
+++ /dev/null
@@ -1,233 +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 "SkFlattenableBuffers.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;
- }
-}
-
-void* SkImageRef_ashmem::onLockPixels(SkColorTable** ct) {
- 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 null result for failure
- if (ct) {
- *ct = NULL;
- }
- return NULL;
- }
- } else {
- // no FD, will create an ashmem region in allocator
- }
-
- return this->INHERITED::onLockPixels(ct);
-}
-
-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(SkFlattenableWriteBuffer& buffer) const {
- this->INHERITED::flatten(buffer);
- buffer.writeString(getURI());
-}
-
-SkImageRef_ashmem::SkImageRef_ashmem(SkFlattenableReadBuffer& 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);
-}