diff options
| author | Romain Guy <romainguy@google.com> | 2010-08-19 14:41:16 -0700 |
|---|---|---|
| committer | Romain Guy <romainguy@google.com> | 2010-08-19 14:41:16 -0700 |
| commit | 207b3ab604bcbe47fa55f26f358cde60cf8a784d (patch) | |
| tree | 4588d0268e51d3cb5ec079b368ec004fe296e22b | |
| parent | 4b7cc6402892a92b820423561d1443d18e25b755 (diff) | |
| download | frameworks_base-207b3ab604bcbe47fa55f26f358cde60cf8a784d.zip frameworks_base-207b3ab604bcbe47fa55f26f358cde60cf8a784d.tar.gz frameworks_base-207b3ab604bcbe47fa55f26f358cde60cf8a784d.tar.bz2 | |
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
| -rw-r--r-- | core/jni/android/graphics/BitmapFactory.cpp | 6 | ||||
| -rw-r--r-- | graphics/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 21b2e3b..f572477 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<Asset*>(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 afea767..5dbbd70 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; |
