From b1cc8e64374832c8b296f609bebabff068ded460 Mon Sep 17 00:00:00 2001 From: Leon Scroggins III Date: Fri, 22 Dec 2017 11:56:59 -0500 Subject: [PATCH] Additions and cleanups for ImageDecoder API Bug: 63909536 Test: CTS: I0f36ce34c968fd7fae4d8edebabea3a421859615 Add overloads for null listener, byte[] without offset + length Clean up comments Change-Id: I3dd1dae94cf1fe977d96fcae9b36cbed0adfe749 --- .../java/android/graphics/ImageDecoder.java | 52 ++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java index 97ce886063316..400c928b6fc28 100644 --- a/graphics/java/android/graphics/ImageDecoder.java +++ b/graphics/java/android/graphics/ImageDecoder.java @@ -20,6 +20,7 @@ import static android.system.OsConstants.SEEK_SET; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.RawRes; import android.content.ContentResolver; import android.content.res.AssetFileDescriptor; @@ -359,7 +360,6 @@ public final class ImageDecoder implements AutoCloseable { * @throws ArrayIndexOutOfBoundsException if offset and length are * not within data. */ - // TODO: Overloads that don't use offset, length public static Source createSource(@NonNull byte[] data, int offset, int length) throws ArrayIndexOutOfBoundsException { if (data == null) { @@ -373,6 +373,13 @@ public final class ImageDecoder implements AutoCloseable { return new ByteArraySource(data, offset, length); } + /** + * See {@link #createSource(byte[], int, int). + */ + public static Source createSource(@NonNull byte[] data) { + return createSource(data, 0, data.length); + } + /** * Create a new {@link Source} from a {@link java.nio.ByteBuffer}. * @@ -648,13 +655,20 @@ public final class ImageDecoder implements AutoCloseable { } /** - * Create a {@link Drawable}. + * Create a {@link Drawable} from a {@code Source}. + * + * @param src representing the encoded image. + * @param listener for learning the {@link ImageInfo} and changing any + * default settings on the {@code ImageDecoder}. If not {@code null}, + * this will be called on the same thread as {@code decodeDrawable} + * before that method returns. + * @return Drawable for displaying the image. * @throws IOException if {@code src} is not found, is an unsupported * format, or cannot be decoded for any reason. */ @NonNull - public static Drawable decodeDrawable(Source src, OnHeaderDecodedListener listener) - throws IOException { + public static Drawable decodeDrawable(@NonNull Source src, + @Nullable OnHeaderDecodedListener listener) throws IOException { try (ImageDecoder decoder = src.createImageDecoder()) { if (listener != null) { ImageInfo info = new ImageInfo(decoder.mWidth, decoder.mHeight); @@ -714,13 +728,29 @@ public final class ImageDecoder implements AutoCloseable { } /** - * Create a {@link Bitmap}. + * See {@link #decodeDrawable(Source, OnHeaderDecodedListener)}. + */ + @NonNull + public static Drawable decodeDrawable(@NonNull Source src) + throws IOException { + return decodeDrawable(src, null); + } + + /** + * Create a {@link Bitmap} from a {@code Source}. + * + * @param src representing the encoded image. + * @param listener for learning the {@link ImageInfo} and changing any + * default settings on the {@code ImageDecoder}. If not {@code null}, + * this will be called on the same thread as {@code decodeBitmap} + * before that method returns. + * @return Bitmap containing the image. * @throws IOException if {@code src} is not found, is an unsupported * format, or cannot be decoded for any reason. */ @NonNull - public static Bitmap decodeBitmap(Source src, OnHeaderDecodedListener listener) - throws IOException { + public static Bitmap decodeBitmap(@NonNull Source src, + @Nullable OnHeaderDecodedListener listener) throws IOException { try (ImageDecoder decoder = src.createImageDecoder()) { if (listener != null) { ImageInfo info = new ImageInfo(decoder.mWidth, decoder.mHeight); @@ -743,6 +773,14 @@ public final class ImageDecoder implements AutoCloseable { } } + /** + * See {@link #decodeBitmap(Source, OnHeaderDecodedListener)}. + */ + @NonNull + public static Bitmap decodeBitmap(@NonNull Source src) throws IOException { + return decodeBitmap(src, null); + } + private static native ImageDecoder nCreate(long asset) throws IOException; private static native ImageDecoder nCreate(ByteBuffer buffer, int position,