diff options
author | Romain Guy <romainguy@google.com> | 2011-01-17 12:51:55 -0800 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2011-01-17 13:04:12 -0800 |
commit | 2361098da3b9d9c3eeed410dc72ba62c0e9177cf (patch) | |
tree | f3c5cb63e38bfb99ef76e10400cb846ecc21c812 | |
parent | 875862e3ec85153553ce50acc02863ea0720ccb6 (diff) | |
download | frameworks_base-2361098da3b9d9c3eeed410dc72ba62c0e9177cf.zip frameworks_base-2361098da3b9d9c3eeed410dc72ba62c0e9177cf.tar.gz frameworks_base-2361098da3b9d9c3eeed410dc72ba62c0e9177cf.tar.bz2 |
Add BitmapFactory.Options.inMutable to load mutable bitmaps.
Change-Id: Iaa222127520f3aa55072d44af12ee3477908b876
-rw-r--r-- | api/current.xml | 12 | ||||
-rw-r--r-- | core/jni/android/graphics/BitmapFactory.cpp | 14 | ||||
-rw-r--r-- | graphics/java/android/graphics/Bitmap.java | 1 | ||||
-rw-r--r-- | graphics/java/android/graphics/BitmapFactory.java | 10 | ||||
-rw-r--r-- | tests/HwAccelerationTest/src/com/android/test/hwui/BitmapsActivity.java | 9 |
5 files changed, 41 insertions, 5 deletions
diff --git a/api/current.xml b/api/current.xml index 86c47f5..d67a437 100644 --- a/api/current.xml +++ b/api/current.xml @@ -77064,6 +77064,16 @@ visibility="public" > </field> +<field name="inMutable" + type="boolean" + transient="false" + volatile="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="inPreferQualityOverSpeed" type="boolean" transient="false" @@ -260231,7 +260241,7 @@ deprecated="not deprecated" visibility="public" > -<parameter name="t" type="T"> +<parameter name="arg0" type="T"> </parameter> </method> </interface> diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index dac748d..e47d91c 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -23,6 +23,7 @@ jclass gOptions_class; jfieldID gOptions_justBoundsFieldID; jfieldID gOptions_sampleSizeFieldID; jfieldID gOptions_configFieldID; +jfieldID gOptions_mutableFieldID; jfieldID gOptions_ditherFieldID; jfieldID gOptions_purgeableFieldID; jfieldID gOptions_shareableFieldID; @@ -179,6 +180,7 @@ static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding, SkImageDecoder::Mode mode = SkImageDecoder::kDecodePixels_Mode; SkBitmap::Config prefConfig = SkBitmap::kNo_Config; bool doDither = true; + bool isMutable = false; bool isPurgeable = forcePurgeable || (allowPurgeable && optionsPurgeable(env, options)); bool preferQualityOverSpeed = false; @@ -196,6 +198,7 @@ static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding, jobject jconfig = env->GetObjectField(options, gOptions_configFieldID); prefConfig = GraphicsJNI::getNativeBitmapConfig(env, jconfig); + isMutable = env->GetBooleanField(options, gOptions_mutableFieldID); doDither = env->GetBooleanField(options, gOptions_ditherFieldID); preferQualityOverSpeed = env->GetBooleanField(options, gOptions_preferQualityOverSpeedFieldID); @@ -306,15 +309,19 @@ static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding, // already have a pixelref installed. pr = bitmap->pixelRef(); } - // promise we will never change our pixels (great for sharing and pictures) - pr->setImmutable(); + + if (!isMutable) { + // promise we will never change our pixels (great for sharing and pictures) + pr->setImmutable(); + } if (javaBitmap != NULL) { // If a java bitmap was passed in for reuse, pass it back return javaBitmap; } // now create the java bitmap - return GraphicsJNI::createBitmap(env, bitmap, javaAllocator.getStorageObj(), false, ninePatchChunk); + return GraphicsJNI::createBitmap(env, bitmap, javaAllocator.getStorageObj(), + isMutable, ninePatchChunk); } static jobject nativeDecodeStream(JNIEnv* env, jobject clazz, @@ -572,6 +579,7 @@ int register_android_graphics_BitmapFactory(JNIEnv* env) { gOptions_sampleSizeFieldID = getFieldIDCheck(env, gOptions_class, "inSampleSize", "I"); gOptions_configFieldID = getFieldIDCheck(env, gOptions_class, "inPreferredConfig", "Landroid/graphics/Bitmap$Config;"); + gOptions_mutableFieldID = getFieldIDCheck(env, gOptions_class, "inMutable", "Z"); gOptions_ditherFieldID = getFieldIDCheck(env, gOptions_class, "inDither", "Z"); gOptions_purgeableFieldID = getFieldIDCheck(env, gOptions_class, "inPurgeable", "Z"); gOptions_shareableFieldID = getFieldIDCheck(env, gOptions_class, "inInputShareable", "Z"); diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index a8efd00..e67ceed 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -53,6 +53,7 @@ public final class Bitmap implements Parcelable { */ public byte[] mBuffer; + @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"}) // Keep to finalize native resources private final BitmapFinalizer mFinalizer; private final boolean mIsMutable; diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java index 8309f7a..dd6bf19 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -64,6 +64,14 @@ public class BitmapFactory { public Bitmap inBitmap; /** + * If set, decode methods will always return a mutable Bitmap instead of + * an immutable one. This can be used for instance to programmatically apply + * effects to a Bitmap loaded through BitmapFactory. + */ + @SuppressWarnings({"UnusedDeclaration"}) // used in native code + public boolean inMutable; + + /** * If set to true, the decoder will return null (no bitmap), but * the out... fields will still be set, allowing the caller to query * the bitmap without having to allocate the memory for its pixels. @@ -523,7 +531,7 @@ public class BitmapFactory { } bm.setDensity(targetDensity); } - + return bm; } diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/BitmapsActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/BitmapsActivity.java index 4054353..607a173 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/BitmapsActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/BitmapsActivity.java @@ -25,6 +25,7 @@ import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.os.Bundle; +import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.animation.Animation; @@ -61,7 +62,15 @@ public class BitmapsActivity extends Activity { mBitmap1 = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1); mBitmap2 = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset2); + + Log.d("Bitmap", "mBitmap1.isMutable() = " + mBitmap1.isMutable()); + Log.d("Bitmap", "mBitmap2.isMutable() = " + mBitmap2.isMutable()); + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inMutable = true; + Bitmap bitmap = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1, opts); + Log.d("Bitmap", "bitmap.isMutable() = " + bitmap.isMutable()); + mBitmapPaint = new Paint(); mDstIn = new PorterDuffXfermode(PorterDuff.Mode.DST_IN); } |