diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 79aa5acac4ee1..685fcaf152119 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -237,10 +237,22 @@ static jobject doDecode(JNIEnv* env, std::unique_ptr stream, // Create the codec. NinePatchPeeker peeker; - std::unique_ptr codec = SkAndroidCodec::MakeFromStream( - std::move(stream), &peeker); - if (!codec.get()) { - return nullObjectReturn("SkAndroidCodec::MakeFromStream returned null"); + std::unique_ptr codec; + { + SkCodec::Result result; + std::unique_ptr c = SkCodec::MakeFromStream(std::move(stream), &result, + &peeker); + if (!c) { + SkString msg; + msg.printf("Failed to create image decoder with message '%s'", + SkCodec::ResultToString(result)); + return nullObjectReturn(msg.c_str()); + } + + codec = SkAndroidCodec::MakeFromCodec(std::move(c)); + if (!codec) { + return nullObjectReturn("SkAndroidCodec::MakeFromCodec returned null"); + } } // Do not allow ninepatch decodes to 565. In the past, decodes to 565 diff --git a/core/jni/android/graphics/ImageDecoder.cpp b/core/jni/android/graphics/ImageDecoder.cpp index a0a4be4590be9..0f36827a9730a 100644 --- a/core/jni/android/graphics/ImageDecoder.cpp +++ b/core/jni/android/graphics/ImageDecoder.cpp @@ -77,11 +77,27 @@ static jobject native_create(JNIEnv* env, std::unique_ptr stream) { return nullptr; } std::unique_ptr decoder(new ImageDecoder); - decoder->mCodec = SkAndroidCodec::MakeFromStream(std::move(stream), &decoder->mPeeker); + SkCodec::Result result; + auto codec = SkCodec::MakeFromStream(std::move(stream), &result, &decoder->mPeeker); + if (!codec) { + switch (result) { + case SkCodec::kIncompleteInput: + env->ThrowNew(gIncomplete_class, "Incomplete input"); + break; + default: + SkString msg; + msg.printf("Failed to create image decoder with message '%s'", + SkCodec::ResultToString(result)); + doThrowIOE(env, msg.c_str()); + break; + } + + return nullptr; + } + + decoder->mCodec = SkAndroidCodec::MakeFromCodec(std::move(codec)); if (!decoder->mCodec.get()) { - // FIXME: (b/71578461) Use the error message from - // SkCodec::MakeFromStream to report a more informative error message. - doThrowIOE(env, "Failed to create an SkCodec"); + doThrowIOE(env, "Could not create AndroidCodec"); return nullptr; } diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java index 419e2b7e48182..d13e05c22509c 100644 --- a/graphics/java/android/graphics/ImageDecoder.java +++ b/graphics/java/android/graphics/ImageDecoder.java @@ -239,11 +239,12 @@ public final class ImageDecoder implements AutoCloseable { }; /** - * Supplied to onPartialImage if the provided data is incomplete. + * Used if the provided data is incomplete. * - * Will never be thrown by ImageDecoder. + * May be thrown if there is nothing to display. * - * There may be a partial image to display. + * If supplied to onPartialImage, there may be a correct partial image to + * display. */ public static class IncompleteException extends IOException {};