summaryrefslogtreecommitdiffstats
path: root/graphics
diff options
context:
space:
mode:
authorOwen Lin <owenlin@google.com>2011-01-18 17:39:15 +0800
committerOwen Lin <owenlin@google.com>2011-01-18 18:25:32 +0800
commita9d0d47076ecf2d1739bb3534abc9deead8ebebd (patch)
treee1c3290a850d079f59cb07e603acaeddd1d4a5d7 /graphics
parent92cd4d0296cc8936fcccd97cdbc7a13b724efab4 (diff)
downloadframeworks_base-a9d0d47076ecf2d1739bb3534abc9deead8ebebd.zip
frameworks_base-a9d0d47076ecf2d1739bb3534abc9deead8ebebd.tar.gz
frameworks_base-a9d0d47076ecf2d1739bb3534abc9deead8ebebd.tar.bz2
Change to stream decoding mode if the file descriptor cannot support seek.
bug: 3298498 Change-Id: Id7ae46bf8e885a417753edbd6648332052fee469
Diffstat (limited to 'graphics')
-rw-r--r--graphics/java/android/graphics/BitmapFactory.java20
1 files changed, 16 insertions, 4 deletions
diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java
index 8309f7a..3f76a10 100644
--- a/graphics/java/android/graphics/BitmapFactory.java
+++ b/graphics/java/android/graphics/BitmapFactory.java
@@ -556,11 +556,22 @@ public class BitmapFactory {
* @return the decoded bitmap, or null
*/
public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) {
- Bitmap bm = nativeDecodeFileDescriptor(fd, outPadding, opts);
- if (bm == null && opts != null && opts.inBitmap != null) {
- throw new IllegalArgumentException("Problem decoding into existing bitmap");
+ if (nativeIsSeekable(fd)) {
+ Bitmap bm = nativeDecodeFileDescriptor(fd, outPadding, opts);
+ if (bm == null && opts != null && opts.inBitmap != null) {
+ throw new IllegalArgumentException("Problem decoding into existing bitmap");
+ }
+ return finishDecode(bm, outPadding, opts);
+ } else {
+ FileInputStream fis = new FileInputStream(fd);
+ try {
+ return decodeStream(fis, outPadding, opts);
+ } finally {
+ try {
+ fis.close();
+ } catch (Throwable t) {/* ignore */}
+ }
}
- return finishDecode(bm, outPadding, opts);
}
/**
@@ -607,4 +618,5 @@ public class BitmapFactory {
private static native Bitmap nativeDecodeByteArray(byte[] data, int offset,
int length, Options opts);
private static native byte[] nativeScaleNinePatch(byte[] chunk, float scale, Rect pad);
+ private static native boolean nativeIsSeekable(FileDescriptor fd);
}