Loading core/jni/android/graphics/Bitmap.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -261,14 +261,14 @@ static void Bitmap_destructor(JNIEnv* env, jobject, SkBitmap* bitmap) { delete bitmap; } static void Bitmap_recycle(JNIEnv* env, jobject, SkBitmap* bitmap) { static jboolean Bitmap_recycle(JNIEnv* env, jobject, SkBitmap* bitmap) { #ifdef USE_OPENGL_RENDERER if (android::uirenderer::Caches::hasInstance()) { android::uirenderer::Caches::getInstance().resourceCache.recycle(bitmap); return; return android::uirenderer::Caches::getInstance().resourceCache.recycle(bitmap); } #endif // USE_OPENGL_RENDERER bitmap->setPixels(NULL, NULL); return true; } // These must match the int values in Bitmap.java Loading Loading @@ -665,7 +665,7 @@ static JNINativeMethod gBitmapMethods[] = { { "nativeCopy", "(IIZ)Landroid/graphics/Bitmap;", (void*)Bitmap_copy }, { "nativeDestructor", "(I)V", (void*)Bitmap_destructor }, { "nativeRecycle", "(I)V", (void*)Bitmap_recycle }, { "nativeRecycle", "(I)Z", (void*)Bitmap_recycle }, { "nativeCompress", "(IIILjava/io/OutputStream;[B)Z", (void*)Bitmap_compress }, { "nativeErase", "(II)V", (void*)Bitmap_erase }, Loading graphics/java/android/graphics/Bitmap.java +9 −4 Original line number Diff line number Diff line Loading @@ -201,9 +201,14 @@ public final class Bitmap implements Parcelable { */ public void recycle() { if (!mRecycled) { if (nativeRecycle(mNativeBitmap)) { // return value indicates whether native pixel object was actually recycled. // false indicates that it is still in use at the native level and these // objects should not be collected now. They will be collected later when the // Bitmap itself is collected. mBuffer = null; nativeRecycle(mNativeBitmap); mNinePatchChunk = null; } mRecycled = true; } } Loading Loading @@ -1391,7 +1396,7 @@ public final class Bitmap implements Parcelable { private static native Bitmap nativeCopy(int srcBitmap, int nativeConfig, boolean isMutable); private static native void nativeDestructor(int nativeBitmap); private static native void nativeRecycle(int nativeBitmap); private static native boolean nativeRecycle(int nativeBitmap); private static native boolean nativeCompress(int nativeBitmap, int format, int quality, OutputStream stream, Loading libs/hwui/ResourceCache.cpp +16 −5 Original line number Diff line number Diff line Loading @@ -265,27 +265,38 @@ void ResourceCache::destructorLocked(SkiaColorFilter* resource) { } } void ResourceCache::recycle(SkBitmap* resource) { /** * Return value indicates whether resource was actually recycled, which happens when RefCnt * reaches 0. */ bool ResourceCache::recycle(SkBitmap* resource) { Mutex::Autolock _l(mLock); recycleLocked(resource); return recycleLocked(resource); } void ResourceCache::recycleLocked(SkBitmap* resource) { /** * Return value indicates whether resource was actually recycled, which happens when RefCnt * reaches 0. */ bool ResourceCache::recycleLocked(SkBitmap* resource) { ssize_t index = mCache->indexOfKey(resource); if (index < 0) { // not tracking this resource; just recycle the pixel data resource->setPixels(NULL, NULL); return; return true; } ResourceReference* ref = mCache->valueAt(index); if (ref == NULL) { // Should not get here - shouldn't get a call to recycle if we're not yet tracking it return; return true; } ref->recycled = true; if (ref->refCount == 0) { deleteResourceReferenceLocked(resource, ref); return true; } // Still referring to resource, don't recycle yet return false; } /** Loading libs/hwui/ResourceCache.h +2 −2 Original line number Diff line number Diff line Loading @@ -99,8 +99,8 @@ public: void destructorLocked(SkiaShader* resource); void destructorLocked(SkiaColorFilter* resource); void recycle(SkBitmap* resource); void recycleLocked(SkBitmap* resource); bool recycle(SkBitmap* resource); bool recycleLocked(SkBitmap* resource); private: void deleteResourceReferenceLocked(void* resource, ResourceReference* ref); Loading Loading
core/jni/android/graphics/Bitmap.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -261,14 +261,14 @@ static void Bitmap_destructor(JNIEnv* env, jobject, SkBitmap* bitmap) { delete bitmap; } static void Bitmap_recycle(JNIEnv* env, jobject, SkBitmap* bitmap) { static jboolean Bitmap_recycle(JNIEnv* env, jobject, SkBitmap* bitmap) { #ifdef USE_OPENGL_RENDERER if (android::uirenderer::Caches::hasInstance()) { android::uirenderer::Caches::getInstance().resourceCache.recycle(bitmap); return; return android::uirenderer::Caches::getInstance().resourceCache.recycle(bitmap); } #endif // USE_OPENGL_RENDERER bitmap->setPixels(NULL, NULL); return true; } // These must match the int values in Bitmap.java Loading Loading @@ -665,7 +665,7 @@ static JNINativeMethod gBitmapMethods[] = { { "nativeCopy", "(IIZ)Landroid/graphics/Bitmap;", (void*)Bitmap_copy }, { "nativeDestructor", "(I)V", (void*)Bitmap_destructor }, { "nativeRecycle", "(I)V", (void*)Bitmap_recycle }, { "nativeRecycle", "(I)Z", (void*)Bitmap_recycle }, { "nativeCompress", "(IIILjava/io/OutputStream;[B)Z", (void*)Bitmap_compress }, { "nativeErase", "(II)V", (void*)Bitmap_erase }, Loading
graphics/java/android/graphics/Bitmap.java +9 −4 Original line number Diff line number Diff line Loading @@ -201,9 +201,14 @@ public final class Bitmap implements Parcelable { */ public void recycle() { if (!mRecycled) { if (nativeRecycle(mNativeBitmap)) { // return value indicates whether native pixel object was actually recycled. // false indicates that it is still in use at the native level and these // objects should not be collected now. They will be collected later when the // Bitmap itself is collected. mBuffer = null; nativeRecycle(mNativeBitmap); mNinePatchChunk = null; } mRecycled = true; } } Loading Loading @@ -1391,7 +1396,7 @@ public final class Bitmap implements Parcelable { private static native Bitmap nativeCopy(int srcBitmap, int nativeConfig, boolean isMutable); private static native void nativeDestructor(int nativeBitmap); private static native void nativeRecycle(int nativeBitmap); private static native boolean nativeRecycle(int nativeBitmap); private static native boolean nativeCompress(int nativeBitmap, int format, int quality, OutputStream stream, Loading
libs/hwui/ResourceCache.cpp +16 −5 Original line number Diff line number Diff line Loading @@ -265,27 +265,38 @@ void ResourceCache::destructorLocked(SkiaColorFilter* resource) { } } void ResourceCache::recycle(SkBitmap* resource) { /** * Return value indicates whether resource was actually recycled, which happens when RefCnt * reaches 0. */ bool ResourceCache::recycle(SkBitmap* resource) { Mutex::Autolock _l(mLock); recycleLocked(resource); return recycleLocked(resource); } void ResourceCache::recycleLocked(SkBitmap* resource) { /** * Return value indicates whether resource was actually recycled, which happens when RefCnt * reaches 0. */ bool ResourceCache::recycleLocked(SkBitmap* resource) { ssize_t index = mCache->indexOfKey(resource); if (index < 0) { // not tracking this resource; just recycle the pixel data resource->setPixels(NULL, NULL); return; return true; } ResourceReference* ref = mCache->valueAt(index); if (ref == NULL) { // Should not get here - shouldn't get a call to recycle if we're not yet tracking it return; return true; } ref->recycled = true; if (ref->refCount == 0) { deleteResourceReferenceLocked(resource, ref); return true; } // Still referring to resource, don't recycle yet return false; } /** Loading
libs/hwui/ResourceCache.h +2 −2 Original line number Diff line number Diff line Loading @@ -99,8 +99,8 @@ public: void destructorLocked(SkiaShader* resource); void destructorLocked(SkiaColorFilter* resource); void recycle(SkBitmap* resource); void recycleLocked(SkBitmap* resource); bool recycle(SkBitmap* resource); bool recycleLocked(SkBitmap* resource); private: void deleteResourceReferenceLocked(void* resource, ResourceReference* ref); Loading