diff options
| author | 2018-01-17 21:54:20 +0000 | |
|---|---|---|
| committer | 2018-01-17 21:54:20 +0000 | |
| commit | a06be3277a39dd0a6feaebe5cd2f170a59ea800a (patch) | |
| tree | 3f44fb8aaca27cc0e3a142d3f2d8fee29509da6b | |
| parent | e5e7844bb9daaba59a1f7cc7eab7d4754e9702de (diff) | |
| parent | ea978db1f86b8c6fae3683eafe6621fd958308d7 (diff) | |
Merge "Switch to SkAndroidCodec::computeSampleSize"
| -rw-r--r-- | core/jni/android/graphics/ImageDecoder.cpp | 40 |
1 files changed, 8 insertions, 32 deletions
diff --git a/core/jni/android/graphics/ImageDecoder.cpp b/core/jni/android/graphics/ImageDecoder.cpp index 0f36827a9730..249202a117e1 100644 --- a/core/jni/android/graphics/ImageDecoder.cpp +++ b/core/jni/android/graphics/ImageDecoder.cpp @@ -176,11 +176,6 @@ static jobject ImageDecoder_nCreateByteArray(JNIEnv* env, jobject /*clazz*/, jby return native_create(env, std::move(stream)); } -static bool supports_any_down_scale(const SkAndroidCodec* codec) { - return codec->getEncodedFormat() == SkEncodedImageFormat::kWEBP; -} - -// This method should never return null. Instead, it should throw an exception. static jobject ImageDecoder_nDecodeBitmap(JNIEnv* env, jobject /*clazz*/, jlong nativePtr, jobject jcallback, jobject jpostProcess, jint desiredWidth, jint desiredHeight, jobject jsubset, @@ -189,33 +184,14 @@ static jobject ImageDecoder_nDecodeBitmap(JNIEnv* env, jobject /*clazz*/, jlong jboolean asAlphaMask) { auto* decoder = reinterpret_cast<ImageDecoder*>(nativePtr); SkAndroidCodec* codec = decoder->mCodec.get(); - SkImageInfo decodeInfo = codec->getInfo(); - bool scale = false; - int sampleSize = 1; - if (desiredWidth != decodeInfo.width() || desiredHeight != decodeInfo.height()) { - bool match = false; - if (desiredWidth < decodeInfo.width() && desiredHeight < decodeInfo.height()) { - if (supports_any_down_scale(codec)) { - match = true; - decodeInfo = decodeInfo.makeWH(desiredWidth, desiredHeight); - } else { - int sampleX = decodeInfo.width() / desiredWidth; - int sampleY = decodeInfo.height() / desiredHeight; - sampleSize = std::min(sampleX, sampleY); - SkISize sampledSize = codec->getSampledDimensions(sampleSize); - decodeInfo = decodeInfo.makeWH(sampledSize.width(), sampledSize.height()); - if (decodeInfo.width() == desiredWidth && decodeInfo.height() == desiredHeight) { - match = true; - } - } - } - if (!match) { - scale = true; - if (requireUnpremul && kOpaque_SkAlphaType != decodeInfo.alphaType()) { - doThrowISE(env, "Cannot scale unpremultiplied pixels!"); - return nullptr; - } - } + const SkISize desiredSize = SkISize::Make(desiredWidth, desiredHeight); + SkISize decodeSize = desiredSize; + const int sampleSize = codec->computeSampleSize(&decodeSize); + const bool scale = desiredSize != decodeSize; + SkImageInfo decodeInfo = codec->getInfo().makeWH(decodeSize.width(), decodeSize.height()); + if (scale && requireUnpremul && kOpaque_SkAlphaType != decodeInfo.alphaType()) { + doThrowISE(env, "Cannot scale unpremultiplied pixels!"); + return nullptr; } switch (decodeInfo.alphaType()) { |