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

Commit 90b93b67 authored by Leon Scroggins's avatar Leon Scroggins Committed by Android (Google) Code Review
Browse files

Merge "ImageDecoder: use kYes_ZeroInitialized memory" into sc-dev

parents 9b28cb67 368a7a51
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -45,7 +45,8 @@ sk_sp<SkColorSpace> ImageDecoder::getDefaultColorSpace() const {
    return SkColorSpace::MakeSRGB();
}

ImageDecoder::ImageDecoder(std::unique_ptr<SkAndroidCodec> codec, sk_sp<SkPngChunkReader> peeker)
ImageDecoder::ImageDecoder(std::unique_ptr<SkAndroidCodec> codec, sk_sp<SkPngChunkReader> peeker,
                           SkCodec::ZeroInitialized zeroInit)
    : mCodec(std::move(codec))
    , mPeeker(std::move(peeker))
    , mDecodeSize(mCodec->codec()->dimensions())
@@ -57,6 +58,7 @@ ImageDecoder::ImageDecoder(std::unique_ptr<SkAndroidCodec> codec, sk_sp<SkPngChu
    mTargetSize = swapWidthHeight() ? SkISize { mDecodeSize.height(), mDecodeSize.width() }
                                    : mDecodeSize;
    this->rewind();
    mOptions.fZeroInitialized = zeroInit;
}

ImageDecoder::~ImageDecoder() = default;
@@ -446,10 +448,17 @@ SkCodec::Result ImageDecoder::decode(void* pixels, size_t rowBytes) {
                ALOGE("Failed to invert matrix!");
            }
        }

        // Even if the client did not provide zero initialized memory, the
        // memory we decode into is.
        mOptions.fZeroInitialized = SkCodec::kYes_ZeroInitialized;
    }

    auto result = mCodec->getAndroidPixels(decodeInfo, decodePixels, decodeRowBytes, &mOptions);

    // The next call to decode() may not provide zero initialized memory.
    mOptions.fZeroInitialized = SkCodec::kNo_ZeroInitialized;

    if (scale || handleOrigin || mCropRect) {
        SkBitmap scaledBm;
        if (!scaledBm.installPixels(outputInfo, pixels, rowBytes)) {
+2 −2
Original line number Diff line number Diff line
@@ -34,8 +34,8 @@ public:
    std::unique_ptr<SkAndroidCodec> mCodec;
    sk_sp<SkPngChunkReader> mPeeker;

    ImageDecoder(std::unique_ptr<SkAndroidCodec> codec,
                 sk_sp<SkPngChunkReader> peeker = nullptr);
    ImageDecoder(std::unique_ptr<SkAndroidCodec> codec, sk_sp<SkPngChunkReader> peeker = nullptr,
                 SkCodec::ZeroInitialized zeroInit = SkCodec::kNo_ZeroInitialized);
    ~ImageDecoder();

    SkISize getSampledDimensions(int sampleSize) const;
+2 −1
Original line number Diff line number Diff line
@@ -141,7 +141,8 @@ static jobject native_create(JNIEnv* env, std::unique_ptr<SkStream> stream,
    }

    const bool isNinePatch = peeker->mPatch != nullptr;
    ImageDecoder* decoder = new ImageDecoder(std::move(androidCodec), std::move(peeker));
    ImageDecoder* decoder = new ImageDecoder(std::move(androidCodec), std::move(peeker),
                                             SkCodec::kYes_ZeroInitialized);
    return env->NewObject(gImageDecoder_class, gImageDecoder_constructorMethodID,
                          reinterpret_cast<jlong>(decoder), decoder->width(), decoder->height(),
                          animated, isNinePatch);