From 207b3ab604bcbe47fa55f26f358cde60cf8a784d Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Thu, 19 Aug 2010 14:41:16 -0700 Subject: [PATCH] Load assets in place instead of deferring until draw. Before this change, all framework assets would be decoded at drawing time outside of zygote. This was forcing all apps to re-decode the assets and zygote to keep an in-memory copy of each asset. This behavior is now opt-in by setting the inPurgeable flag on BitmapFactory.Options. Change-Id: Ic703f57adb26b2a701ecff0a653d35a93e26d47c --- core/jni/android/graphics/BitmapFactory.cpp | 6 ++--- .../java/android/graphics/BitmapFactory.java | 24 +++++++++---------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 21b2e3bde902a..f572477ce9794 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -218,6 +218,7 @@ static SkPixelRef* installPixelRef(SkBitmap* bitmap, SkStream* stream, } pr->setDitherImage(ditherImage); bitmap->setPixelRef(pr)->unref(); + pr->isOpaque(bitmap); return pr; } @@ -464,10 +465,7 @@ static jobject nativeDecodeAsset(JNIEnv* env, jobject clazz, jobject options) { // BitmapFactory$Options SkStream* stream; Asset* asset = reinterpret_cast(native_asset); - // assets can always be rebuilt, so force this - bool forcePurgeable = true; - - if (forcePurgeable || optionsPurgeable(env, options)) { + if (optionsPurgeable(env, options)) { // if we could "ref/reopen" the asset, we may not need to copy it here // and we could assume optionsShareable, since assets are always RO stream = copyAssetToStream(asset); diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java index afea76723f736..5dbbd70d2802b 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -26,7 +26,6 @@ import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.io.FileNotFoundException; /** * Creates Bitmap objects from various sources, including files, streams, @@ -39,7 +38,7 @@ public class BitmapFactory { * the same result from the decoder as if null were passed. */ public Options() { - inDither = true; + inDither = false; inScaled = true; } @@ -69,8 +68,11 @@ public class BitmapFactory { * the decoder will try to pick the best matching config based on the * system's screen depth, and characteristics of the original image such * as if it has per-pixel alpha (requiring a config that also does). + * + * Image are loaded with the {@link Bitmap.Config#ARGB_8888} config by + * default. */ - public Bitmap.Config inPreferredConfig; + public Bitmap.Config inPreferredConfig = Bitmap.Config.ARGB_8888; /** * If dither is true, the decoder will attempt to dither the decoded @@ -452,10 +454,8 @@ public class BitmapFactory { // into is.read(...) This number is not related to the value passed // to mark(...) above. byte [] tempStorage = null; - if (opts != null) - tempStorage = opts.inTempStorage; - if (tempStorage == null) - tempStorage = new byte[16 * 1024]; + if (opts != null) tempStorage = opts.inTempStorage; + if (tempStorage == null) tempStorage = new byte[16 * 1024]; bm = nativeDecodeStream(is, tempStorage, outPadding, opts); } @@ -474,8 +474,7 @@ public class BitmapFactory { bm.setDensity(density); final int targetDensity = opts.inTargetDensity; - if (targetDensity == 0 || density == targetDensity - || density == opts.inScreenDensity) { + if (targetDensity == 0 || density == targetDensity || density == opts.inScreenDensity) { return bm; } @@ -652,8 +651,7 @@ public class BitmapFactory { // pass some temp storage down to the native code. 1024 is made up, // but should be large enough to avoid too many small calls back // into is.read(...). - byte [] tempStorage = null; - tempStorage = new byte[16 * 1024]; + byte [] tempStorage = new byte[16 * 1024]; return nativeCreateLargeBitmap(is, tempStorage, isShareable); } } @@ -674,8 +672,8 @@ public class BitmapFactory { * @throws IOException if the image format is not supported or can not be decoded. * @hide */ - public static LargeBitmap createLargeBitmap(String pathName, - boolean isShareable) throws FileNotFoundException, IOException { + public static LargeBitmap createLargeBitmap(String pathName, boolean isShareable) + throws IOException { LargeBitmap bm = null; InputStream stream = null;