Merge "Change to stream decoding mode if the file descriptor cannot support seek." into honeycomb

This commit is contained in:
Owen Lin
2011-01-18 04:13:13 -08:00
committed by Android (Google) Code Review
2 changed files with 26 additions and 4 deletions

View File

@@ -517,6 +517,11 @@ static void nativeSetDefaultConfig(JNIEnv* env, jobject, int nativeConfig) {
} }
} }
static jboolean nativeIsSeekable(JNIEnv* env, jobject, jobject fileDescriptor) {
jint descriptor = env->GetIntField(fileDescriptor, gFileDescriptor_descriptor);
return ::lseek64(descriptor, 0, SEEK_CUR) != -1 ? JNI_TRUE : JNI_FALSE;
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
static JNINativeMethod gMethods[] = { static JNINativeMethod gMethods[] = {
@@ -546,6 +551,11 @@ static JNINativeMethod gMethods[] = {
}, },
{ "nativeSetDefaultConfig", "(I)V", (void*)nativeSetDefaultConfig }, { "nativeSetDefaultConfig", "(I)V", (void*)nativeSetDefaultConfig },
{ "nativeIsSeekable",
"(Ljava/io/FileDescriptor;)Z",
(void*)nativeIsSeekable
},
}; };
static JNINativeMethod gOptionsMethods[] = { static JNINativeMethod gOptionsMethods[] = {

View File

@@ -564,11 +564,22 @@ public class BitmapFactory {
* @return the decoded bitmap, or null * @return the decoded bitmap, or null
*/ */
public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) { public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) {
Bitmap bm = nativeDecodeFileDescriptor(fd, outPadding, opts); if (nativeIsSeekable(fd)) {
if (bm == null && opts != null && opts.inBitmap != null) { Bitmap bm = nativeDecodeFileDescriptor(fd, outPadding, opts);
throw new IllegalArgumentException("Problem decoding into existing bitmap"); 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);
} }
/** /**
@@ -615,4 +626,5 @@ public class BitmapFactory {
private static native Bitmap nativeDecodeByteArray(byte[] data, int offset, private static native Bitmap nativeDecodeByteArray(byte[] data, int offset,
int length, Options opts); int length, Options opts);
private static native byte[] nativeScaleNinePatch(byte[] chunk, float scale, Rect pad); private static native byte[] nativeScaleNinePatch(byte[] chunk, float scale, Rect pad);
private static native boolean nativeIsSeekable(FileDescriptor fd);
} }