diff options
| -rw-r--r-- | core/jni/android/graphics/ImageDecoder.cpp | 7 | ||||
| -rw-r--r-- | graphics/java/android/graphics/ImageDecoder.java | 47 |
2 files changed, 46 insertions, 8 deletions
diff --git a/core/jni/android/graphics/ImageDecoder.cpp b/core/jni/android/graphics/ImageDecoder.cpp index 5bdad08e3e1e..c2375641bc65 100644 --- a/core/jni/android/graphics/ImageDecoder.cpp +++ b/core/jni/android/graphics/ImageDecoder.cpp @@ -15,6 +15,7 @@ */ #include "Bitmap.h" +#include "BitmapFactory.h" #include "ByteBufferStreamAdaptor.h" #include "CreateJavaOutputStreamAdaptor.h" #include "GraphicsJNI.h" @@ -500,6 +501,11 @@ static void ImageDecoder_nClose(JNIEnv* /*env*/, jobject /*clazz*/, jlong native delete reinterpret_cast<ImageDecoder*>(nativePtr); } +static jstring ImageDecoder_nGetMimeType(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) { + auto* decoder = reinterpret_cast<ImageDecoder*>(nativePtr); + return encodedFormatToString(env, decoder->mCodec->getEncodedFormat()); +} + static const JNINativeMethod gImageDecoderMethods[] = { { "nCreate", "(J)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateAsset }, { "nCreate", "(Ljava/nio/ByteBuffer;II)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteBuffer }, @@ -511,6 +517,7 @@ static const JNINativeMethod gImageDecoderMethods[] = { { "nGetSampledSize","(JI)Landroid/graphics/Point;", (void*) ImageDecoder_nGetSampledSize }, { "nGetPadding", "(JLandroid/graphics/Rect;)V", (void*) ImageDecoder_nGetPadding }, { "nClose", "(J)V", (void*) ImageDecoder_nClose}, + { "nGetMimeType", "(J)Ljava/lang/String;", (void*) ImageDecoder_nGetMimeType }, }; int register_android_graphics_ImageDecoder(JNIEnv* env) { diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java index 400c928b6fc2..94b219abaf0e 100644 --- a/graphics/java/android/graphics/ImageDecoder.java +++ b/graphics/java/android/graphics/ImageDecoder.java @@ -210,13 +210,31 @@ public final class ImageDecoder implements AutoCloseable { * Contains information about the encoded image. */ public static class ImageInfo { + /** + * Width of the image, without scaling or cropping. + */ public final int width; + + /** + * Height of the image, without scaling or cropping. + */ public final int height; - // TODO?: Add more info? mimetype, ninepatch etc? - ImageInfo(int width, int height) { - this.width = width; - this.height = height; + /* @hide */ + ImageDecoder decoder; + + /* @hide */ + ImageInfo(ImageDecoder decoder) { + this.width = decoder.mWidth; + this.height = decoder.mHeight; + this.decoder = decoder; + } + + /** + * The mimeType of the image, if known. + */ + public String getMimeType() { + return decoder.getMimeType(); } }; @@ -671,8 +689,12 @@ public final class ImageDecoder implements AutoCloseable { @Nullable OnHeaderDecodedListener listener) throws IOException { try (ImageDecoder decoder = src.createImageDecoder()) { if (listener != null) { - ImageInfo info = new ImageInfo(decoder.mWidth, decoder.mHeight); - listener.onHeaderDecoded(info, decoder); + ImageInfo info = new ImageInfo(decoder); + try { + listener.onHeaderDecoded(info, decoder); + } finally { + info.decoder = null; + } } decoder.checkState(); @@ -753,8 +775,12 @@ public final class ImageDecoder implements AutoCloseable { @Nullable OnHeaderDecodedListener listener) throws IOException { try (ImageDecoder decoder = src.createImageDecoder()) { if (listener != null) { - ImageInfo info = new ImageInfo(decoder.mWidth, decoder.mHeight); - listener.onHeaderDecoded(info, decoder); + ImageInfo info = new ImageInfo(decoder); + try { + listener.onHeaderDecoded(info, decoder); + } finally { + info.decoder = null; + } } decoder.checkState(); @@ -773,6 +799,10 @@ public final class ImageDecoder implements AutoCloseable { } } + private String getMimeType() { + return nGetMimeType(mNativePtr); + } + /** * See {@link #decodeBitmap(Source, OnHeaderDecodedListener)}. */ @@ -802,4 +832,5 @@ public final class ImageDecoder implements AutoCloseable { int sampleSize); private static native void nGetPadding(long nativePtr, Rect outRect); private static native void nClose(long nativePtr); + private static native String nGetMimeType(long nativePtr); } |