(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:
@@ -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;
|
||||
|
||||
@@ -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*);
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user