summaryrefslogtreecommitdiffstats
path: root/core/jni
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2011-09-23 21:17:56 -0700
committerJeff Brown <jeffbrown@google.com>2011-09-23 21:20:47 -0700
commit56c58f66b97d22fe7e7de1f7d9548bcbe1973029 (patch)
tree55ab40fcdfe77696388886aed84e33372de51192 /core/jni
parent4c253119db0ce753e46ec3809b54b9e357d363db (diff)
downloadframeworks_base-56c58f66b97d22fe7e7de1f7d9548bcbe1973029.zip
frameworks_base-56c58f66b97d22fe7e7de1f7d9548bcbe1973029.tar.gz
frameworks_base-56c58f66b97d22fe7e7de1f7d9548bcbe1973029.tar.bz2
Transfer large bitmaps using ashmem.
Bug: 5224703 Change-Id: Ic7481dd9f173986f085a8bbdcc59bbe9830d7a44
Diffstat (limited to 'core/jni')
-rw-r--r--core/jni/android/graphics/Bitmap.cpp29
1 files changed, 23 insertions, 6 deletions
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 18bd754..da055fc 100644
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -392,10 +392,20 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
SkSafeUnref(ctable);
size_t size = bitmap->getSize();
+
+ android::Parcel::ReadableBlob blob;
+ android::status_t status = p->readBlob(size, &blob);
+ if (status) {
+ doThrowRE(env, "Could not read bitmap from parcel blob.");
+ delete bitmap;
+ return NULL;
+ }
+
bitmap->lockPixels();
- memcpy(bitmap->getPixels(), p->readInplace(size), size);
+ memcpy(bitmap->getPixels(), blob.data(), size);
bitmap->unlockPixels();
+ blob.release();
return GraphicsJNI::createBitmap(env, bitmap, buffer, isMutable, NULL, density);
}
@@ -431,17 +441,24 @@ static jboolean Bitmap_writeToParcel(JNIEnv* env, jobject,
}
size_t size = bitmap->getSize();
- bitmap->lockPixels();
- void* pDst = p->writeInplace(size);
- const void* pSrc = bitmap->getPixels();
+ android::Parcel::WritableBlob blob;
+ android::status_t status = p->writeBlob(size, &blob);
+ if (status) {
+ doThrowRE(env, "Could not write bitmap to parcel blob.");
+ return false;
+ }
+ bitmap->lockPixels();
+ const void* pSrc = bitmap->getPixels();
if (pSrc == NULL) {
- memset(pDst, 0, size);
+ memset(blob.data(), 0, size);
} else {
- memcpy(pDst, pSrc, size);
+ memcpy(blob.data(), pSrc, size);
}
bitmap->unlockPixels();
+
+ blob.release();
return true;
}