summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2018-01-17 21:54:20 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2018-01-17 21:54:20 +0000
commita06be3277a39dd0a6feaebe5cd2f170a59ea800a (patch)
tree3f44fb8aaca27cc0e3a142d3f2d8fee29509da6b
parente5e7844bb9daaba59a1f7cc7eab7d4754e9702de (diff)
parentea978db1f86b8c6fae3683eafe6621fd958308d7 (diff)
Merge "Switch to SkAndroidCodec::computeSampleSize"
-rw-r--r--core/jni/android/graphics/ImageDecoder.cpp40
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()) {