summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorLeon Scroggins <scroggo@google.com>2018-02-16 11:25:23 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2018-02-16 11:25:23 +0000
commit299b0e4b4eb330723be4fa4df3cfd2dcadb3be44 (patch)
treee9220edd8f161f58474434fe0a90fc3e037f4076 /core/java/android
parent1cfc06a1e501f60f2573306f48d6fcff3f85c237 (diff)
parent513031d15b78579e39d59b71ab5a1b0afabc5544 (diff)
Merge "Reland "Call ImageDecoder directly in ResourcesImpl""
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/content/res/ResourcesImpl.java26
1 files changed, 24 insertions, 2 deletions
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index cf0145123b87..424fa833cd48 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -27,9 +27,11 @@ import android.annotation.StyleRes;
import android.annotation.StyleableRes;
import android.content.pm.ActivityInfo;
import android.content.pm.ActivityInfo.Config;
+import android.content.res.AssetManager.AssetInputStream;
import android.content.res.Configuration.NativeConfig;
import android.content.res.Resources.NotFoundException;
import android.graphics.Bitmap;
+import android.graphics.ImageDecoder;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
@@ -752,6 +754,26 @@ public class ResourcesImpl {
}
/**
+ * Loads a Drawable from an encoded image stream, or null.
+ *
+ * This call will handle closing ais.
+ */
+ private Drawable decodeImageDrawable(@NonNull AssetInputStream ais,
+ @NonNull Resources wrapper, @NonNull TypedValue value) {
+ ImageDecoder.Source src = new ImageDecoder.AssetInputStreamSource(ais,
+ wrapper, value);
+ try {
+ return ImageDecoder.decodeDrawable(src, (decoder, info, s) -> {
+ decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE);
+ });
+ } catch (IOException ioe) {
+ // This is okay. This may be something that ImageDecoder does not
+ // support, like SVG.
+ return null;
+ }
+ }
+
+ /**
* Loads a drawable from XML or resources stream.
*/
@NonNull
@@ -811,8 +833,8 @@ public class ResourcesImpl {
} else {
final InputStream is = mAssets.openNonAsset(
value.assetCookie, file, AssetManager.ACCESS_STREAMING);
- dr = Drawable.createFromResourceStream(wrapper, value, is, file, null);
- is.close();
+ AssetInputStream ais = (AssetInputStream) is;
+ dr = decodeImageDrawable(ais, wrapper, value);
}
} finally {
stack.pop();