summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yujie Qin <yujieqin@google.com> 2016-02-29 22:39:39 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2016-02-29 22:39:41 +0000
commit2a1d3cbc02d3a66f14ff5f52bc54ad781fe55620 (patch)
treed1d463f677aac320d1049a84c7368cb73509f221
parent6aeeb21b6bfa65b2a4857b23680e1502a076f3e4 (diff)
parentc1d7b7f71ce1a55548d7e8bb32d728190e2ffd47 (diff)
Merge "Use SkFILEStream directly when possible" into nyc-dev
-rw-r--r--core/jni/android/graphics/BitmapFactory.cpp8
-rw-r--r--core/jni/android/graphics/Utils.cpp4
-rw-r--r--core/jni/android/graphics/Utils.h4
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_