(A)ImageDecoder: fix sampled dimensions with exif

Test: I138ec784a77253c7ae94765d0670e5947d97caf5

Recently (Ib93b0ced09fa3cca4a6681745406355c48158fae), handling exif
moved from SkAndroidCodec to hwui/ImageDecoder. This missed
getSampledDimensions, which reports the sampled dimensions without
taking exif into account. Fix this for both
android.graphics.ImageDecoder and AImageDecoder. Note that in the Java
case, the method is private, and although the method was returning
swapped dimensions in some cases, it gets corrected by
getTargetDimension, so there is no user visible change.

Change-Id: I918328c39d6230ae6ba4cab0733fff0732b39888
This commit is contained in:
Leon Scroggins III
2021-01-15 14:09:13 -05:00
parent ba9a690d26
commit 5a5c2ce593
4 changed files with 8 additions and 2 deletions

View File

@@ -76,6 +76,11 @@ static bool requires_matrix_scaling(bool swapWidthHeight, const SkISize& decodeS
|| (!swapWidthHeight && decodeSize != targetSize);
}
SkISize ImageDecoder::getSampledDimensions(int sampleSize) const {
auto size = mCodec->getSampledDimensions(sampleSize);
return swapWidthHeight() ? swapped(size) : size;
}
bool ImageDecoder::setTargetSize(int width, int height) {
if (width <= 0 || height <= 0) {
return false;

View File

@@ -38,6 +38,7 @@ public:
sk_sp<SkPngChunkReader> peeker = nullptr);
~ImageDecoder();
SkISize getSampledDimensions(int sampleSize) const;
bool setTargetSize(int width, int height);
bool setCropRect(const SkIRect*);

View File

@@ -465,7 +465,7 @@ static jobject ImageDecoder_nDecodeBitmap(JNIEnv* env, jobject /*clazz*/, jlong
static jobject ImageDecoder_nGetSampledSize(JNIEnv* env, jobject /*clazz*/, jlong nativePtr,
jint sampleSize) {
auto* decoder = reinterpret_cast<ImageDecoder*>(nativePtr);
SkISize size = decoder->mCodec->getSampledDimensions(sampleSize);
SkISize size = decoder->getSampledDimensions(sampleSize);
return env->NewObject(gSize_class, gSize_constructorMethodID, size.width(), size.height());
}

View File

@@ -353,7 +353,7 @@ int AImageDecoder_computeSampledSize(const AImageDecoder* decoder, int sampleSiz
return ANDROID_IMAGE_DECODER_BAD_PARAMETER;
}
SkISize size = toDecoder(decoder)->mCodec->getSampledDimensions(sampleSize);
SkISize size = toDecoder(decoder)->getSampledDimensions(sampleSize);
*width = size.width();
*height = size.height();
return ANDROID_IMAGE_DECODER_SUCCESS;