diff options
author | Chris Craik <ccraik@google.com> | 2013-09-06 14:40:30 -0700 |
---|---|---|
committer | Chris Craik <ccraik@google.com> | 2013-09-09 14:08:11 -0700 |
commit | cd0ba71aa942f35fcdb26808b86f20073b8aff92 (patch) | |
tree | 204a43a0bb152f2712c51aab0bf717804d8c1a27 /core/jni/android/graphics/Graphics.cpp | |
parent | b8b017cb6879352aee015ba24e9bfd05cc094e74 (diff) | |
download | frameworks_base-cd0ba71aa942f35fcdb26808b86f20073b8aff92.zip frameworks_base-cd0ba71aa942f35fcdb26808b86f20073b8aff92.tar.gz frameworks_base-cd0ba71aa942f35fcdb26808b86f20073b8aff92.tar.bz2 |
Create a pixelref wrapper for reused bitmaps
Reused bitmaps may gain a color table when reused, so we wrap a new
AndroidPixelRef that holds the color table around the old.
bug:10608305
Change-Id: I35288edf3158cfda21c500360ad1abdf5654af8d
Diffstat (limited to 'core/jni/android/graphics/Graphics.cpp')
-rw-r--r-- | core/jni/android/graphics/Graphics.cpp | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index ef5b7c9..1ff0d63 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -414,7 +414,8 @@ static JNIEnv* vm2env(JavaVM* vm) /////////////////////////////////////////////////////////////////////////////// AndroidPixelRef::AndroidPixelRef(JNIEnv* env, void* storage, size_t size, jbyteArray storageObj, - SkColorTable* ctable) : SkMallocPixelRef(storage, size, ctable, (storageObj == NULL)) { + SkColorTable* ctable) : SkMallocPixelRef(storage, size, ctable, (storageObj == NULL)), + fWrappedPixelRef(NULL) { SkASSERT(storage); SkASSERT(env); @@ -431,8 +432,25 @@ AndroidPixelRef::AndroidPixelRef(JNIEnv* env, void* storage, size_t size, jbyteA } +AndroidPixelRef::AndroidPixelRef(AndroidPixelRef& wrappedPixelRef, SkColorTable* ctable) : + SkMallocPixelRef(wrappedPixelRef.getAddr(), wrappedPixelRef.getSize(), ctable, false), + fWrappedPixelRef(wrappedPixelRef.fWrappedPixelRef ? + wrappedPixelRef.fWrappedPixelRef : &wrappedPixelRef) +{ + SkASSERT(fWrappedPixelRef); + SkSafeRef(fWrappedPixelRef); + + // don't need to initialize these, as all the relevant logic delegates to the wrapped ref + fStorageObj = NULL; + fHasGlobalRef = false; + fGlobalRefCnt = 0; + fOnJavaHeap = false; +} + AndroidPixelRef::~AndroidPixelRef() { - if (fOnJavaHeap) { + if (fWrappedPixelRef) { + SkSafeUnref(fWrappedPixelRef); + } else if (fOnJavaHeap) { JNIEnv* env = vm2env(fVM); if (fStorageObj && fHasGlobalRef) { @@ -441,15 +459,27 @@ AndroidPixelRef::~AndroidPixelRef() { fStorageObj = NULL; } } +jbyteArray AndroidPixelRef::getStorageObj() { + if (fWrappedPixelRef) { + return fWrappedPixelRef->fStorageObj; + } + return fStorageObj; +} void AndroidPixelRef::setLocalJNIRef(jbyteArray arr) { - if (!fHasGlobalRef) { + if (fWrappedPixelRef) { + // delegate java obj management to the wrapped ref + fWrappedPixelRef->setLocalJNIRef(arr); + } else if (!fHasGlobalRef) { fStorageObj = arr; } } void AndroidPixelRef::globalRef(void* localref) { - if (fOnJavaHeap && sk_atomic_inc(&fGlobalRefCnt) == 0) { + if (fWrappedPixelRef) { + // delegate java obj management to the wrapped ref + fWrappedPixelRef->globalRef(localref); + } else if (fOnJavaHeap && sk_atomic_inc(&fGlobalRefCnt) == 0) { JNIEnv *env = vm2env(fVM); // If JNI ref was passed, it is always used @@ -473,7 +503,10 @@ void AndroidPixelRef::globalRef(void* localref) { } void AndroidPixelRef::globalUnref() { - if (fOnJavaHeap && sk_atomic_dec(&fGlobalRefCnt) == 1) { + if (fWrappedPixelRef) { + // delegate java obj management to the wrapped ref + fWrappedPixelRef->globalUnref(); + } else if (fOnJavaHeap && sk_atomic_dec(&fGlobalRefCnt) == 1) { JNIEnv *env = vm2env(fVM); if (!fHasGlobalRef) { SkDebugf("We don't have a global ref!"); |