diff options
| -rw-r--r-- | core/jni/android/graphics/BitmapFactory.cpp | 8 | ||||
| -rw-r--r-- | core/jni/android/graphics/Utils.cpp | 4 | ||||
| -rw-r--r-- | core/jni/android/graphics/Utils.h | 4 |
3 files changed, 15 insertions, 1 deletions
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 8b248b07a07d..29c1075a3420 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -555,6 +555,12 @@ static jobject nativeDecodeFileDescriptor(JNIEnv* env, jobject clazz, jobject fi std::unique_ptr<SkFILEStream> fileStream(new SkFILEStream(file, SkFILEStream::kCallerPasses_Ownership)); + // If there is no offset for the file descriptor, we use SkFILEStream directly. + if (::lseek(descriptor, 0, SEEK_CUR) == 0) { + assert(isSeekable(dupDescriptor)); + return doDecode(env, fileStream.release(), padding, bitmapFactoryOptions); + } + // Use a buffered stream. Although an SkFILEStream can be rewound, this // ensures that SkImageDecoder::Factory never rewinds beyond the // current position of the file descriptor. @@ -584,7 +590,7 @@ static jobject nativeDecodeByteArray(JNIEnv* env, jobject, jbyteArray byteArray, static jboolean nativeIsSeekable(JNIEnv* env, jobject, jobject fileDescriptor) { jint descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor); - return ::lseek64(descriptor, 0, SEEK_CUR) != -1 ? JNI_TRUE : JNI_FALSE; + return isSeekable(descriptor) ? JNI_TRUE : JNI_FALSE; } jobject decodeBitmap(JNIEnv* env, void* data, size_t size) { diff --git a/core/jni/android/graphics/Utils.cpp b/core/jni/android/graphics/Utils.cpp index 4f9ce8bfcef7..5fa445e256fe 100644 --- a/core/jni/android/graphics/Utils.cpp +++ b/core/jni/android/graphics/Utils.cpp @@ -116,3 +116,7 @@ jobject android::nullObjectReturn(const char msg[]) { } return NULL; } + +bool android::isSeekable(int descriptor) { + return ::lseek64(descriptor, 0, SEEK_CUR) != -1; +} diff --git a/core/jni/android/graphics/Utils.h b/core/jni/android/graphics/Utils.h index c0b941004758..d1a74a0adf6c 100644 --- a/core/jni/android/graphics/Utils.h +++ b/core/jni/android/graphics/Utils.h @@ -68,6 +68,10 @@ private: jobject nullObjectReturn(const char msg[]); +/** Check if the file descriptor is seekable. + */ +bool isSeekable(int descriptor); + }; // namespace android #endif // _ANDROID_GRAPHICS_UTILS_H_ |