Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a5c2ce5 authored by Leon Scroggins III's avatar Leon Scroggins III
Browse files

(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
parent ba9a690d
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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*);

+1 −1
Original line number Diff line number Diff line
@@ -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());
}

+1 −1
Original line number Diff line number Diff line
@@ -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;