Merge "ImageDecoder: Use AssetFileDescriptor's length" am: efca2d56f1 am: 3a62413c4f
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1426968 Change-Id: I85afba6ce0d53370031c089f30e2af69df02f8c9
This commit is contained in:
@@ -308,7 +308,7 @@ public final class ImageDecoder implements AutoCloseable {
|
|||||||
|
|
||||||
ImageDecoder decoder = null;
|
ImageDecoder decoder = null;
|
||||||
try {
|
try {
|
||||||
decoder = nCreate(fd, preferAnimation, source);
|
decoder = nCreate(fd, AssetFileDescriptor.UNKNOWN_LENGTH, preferAnimation, source);
|
||||||
} finally {
|
} finally {
|
||||||
if (decoder == null) {
|
if (decoder == null) {
|
||||||
IoUtils.closeQuietly(stream);
|
IoUtils.closeQuietly(stream);
|
||||||
@@ -356,7 +356,7 @@ public final class ImageDecoder implements AutoCloseable {
|
|||||||
try {
|
try {
|
||||||
try {
|
try {
|
||||||
Os.lseek(fd, offset, SEEK_SET);
|
Os.lseek(fd, offset, SEEK_SET);
|
||||||
decoder = nCreate(fd, preferAnimation, source);
|
decoder = nCreate(fd, assetFd.getDeclaredLength(), preferAnimation, source);
|
||||||
} catch (ErrnoException e) {
|
} catch (ErrnoException e) {
|
||||||
decoder = createFromStream(new FileInputStream(fd), true, preferAnimation, source);
|
decoder = createFromStream(new FileInputStream(fd), true, preferAnimation, source);
|
||||||
}
|
}
|
||||||
@@ -1995,7 +1995,7 @@ public final class ImageDecoder implements AutoCloseable {
|
|||||||
private static native ImageDecoder nCreate(InputStream is, byte[] storage,
|
private static native ImageDecoder nCreate(InputStream is, byte[] storage,
|
||||||
boolean preferAnimation, Source src) throws IOException;
|
boolean preferAnimation, Source src) throws IOException;
|
||||||
// The fd must be seekable.
|
// The fd must be seekable.
|
||||||
private static native ImageDecoder nCreate(FileDescriptor fd,
|
private static native ImageDecoder nCreate(FileDescriptor fd, long length,
|
||||||
boolean preferAnimation, Source src) throws IOException;
|
boolean preferAnimation, Source src) throws IOException;
|
||||||
@NonNull
|
@NonNull
|
||||||
private static native Bitmap nDecodeBitmap(long nativePtr,
|
private static native Bitmap nDecodeBitmap(long nativePtr,
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ static jobject native_create(JNIEnv* env, std::unique_ptr<SkStream> stream,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static jobject ImageDecoder_nCreateFd(JNIEnv* env, jobject /*clazz*/,
|
static jobject ImageDecoder_nCreateFd(JNIEnv* env, jobject /*clazz*/,
|
||||||
jobject fileDescriptor, jboolean preferAnimation, jobject source) {
|
jobject fileDescriptor, jlong length, jboolean preferAnimation, jobject source) {
|
||||||
#ifndef __ANDROID__ // LayoutLib for Windows does not support F_DUPFD_CLOEXEC
|
#ifndef __ANDROID__ // LayoutLib for Windows does not support F_DUPFD_CLOEXEC
|
||||||
return throw_exception(env, kSourceException, "Only supported on Android", nullptr, source);
|
return throw_exception(env, kSourceException, "Only supported on Android", nullptr, source);
|
||||||
#else
|
#else
|
||||||
@@ -172,7 +172,14 @@ static jobject ImageDecoder_nCreateFd(JNIEnv* env, jobject /*clazz*/,
|
|||||||
nullptr, source);
|
nullptr, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<SkFILEStream> fileStream(new SkFILEStream(file));
|
std::unique_ptr<SkFILEStream> fileStream;
|
||||||
|
if (length == -1) {
|
||||||
|
// -1 corresponds to AssetFileDescriptor.UNKNOWN_LENGTH. Pass no length
|
||||||
|
// so SkFILEStream will figure out the size of the file on its own.
|
||||||
|
fileStream.reset(new SkFILEStream(file));
|
||||||
|
} else {
|
||||||
|
fileStream.reset(new SkFILEStream(file, length));
|
||||||
|
}
|
||||||
return native_create(env, std::move(fileStream), source, preferAnimation);
|
return native_create(env, std::move(fileStream), source, preferAnimation);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -494,7 +501,7 @@ static const JNINativeMethod gImageDecoderMethods[] = {
|
|||||||
{ "nCreate", "(Ljava/nio/ByteBuffer;IIZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteBuffer },
|
{ "nCreate", "(Ljava/nio/ByteBuffer;IIZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteBuffer },
|
||||||
{ "nCreate", "([BIIZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteArray },
|
{ "nCreate", "([BIIZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteArray },
|
||||||
{ "nCreate", "(Ljava/io/InputStream;[BZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateInputStream },
|
{ "nCreate", "(Ljava/io/InputStream;[BZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateInputStream },
|
||||||
{ "nCreate", "(Ljava/io/FileDescriptor;ZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateFd },
|
{ "nCreate", "(Ljava/io/FileDescriptor;JZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateFd },
|
||||||
{ "nDecodeBitmap", "(JLandroid/graphics/ImageDecoder;ZIILandroid/graphics/Rect;ZIZZZJZ)Landroid/graphics/Bitmap;",
|
{ "nDecodeBitmap", "(JLandroid/graphics/ImageDecoder;ZIILandroid/graphics/Rect;ZIZZZJZ)Landroid/graphics/Bitmap;",
|
||||||
(void*) ImageDecoder_nDecodeBitmap },
|
(void*) ImageDecoder_nDecodeBitmap },
|
||||||
{ "nGetSampledSize","(JI)Landroid/util/Size;", (void*) ImageDecoder_nGetSampledSize },
|
{ "nGetSampledSize","(JI)Landroid/util/Size;", (void*) ImageDecoder_nGetSampledSize },
|
||||||
|
|||||||
Reference in New Issue
Block a user