Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b26247e authored by Owen Lin's avatar Owen Lin Committed by Android (Google) Code Review
Browse files

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

parents f46013b6 a9d0d470
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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[] = {
@@ -546,6 +551,11 @@ static JNINativeMethod gMethods[] = {
    },

    {   "nativeSetDefaultConfig", "(I)V", (void*)nativeSetDefaultConfig },

    {   "nativeIsSeekable",
        "(Ljava/io/FileDescriptor;)Z",
        (void*)nativeIsSeekable
    },
};

static JNINativeMethod gOptionsMethods[] = {
+16 −4
Original line number Diff line number Diff line
@@ -564,11 +564,22 @@ public class BitmapFactory {
     * @return the decoded bitmap, or null
     */
    public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) {
        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 */}
            }
        }
    }

    /**
@@ -615,4 +626,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);
}