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

This commit is contained in:
Leon Scroggins
2021-03-24 17:36:21 +00:00
committed by Android (Google) Code Review
3 changed files with 14 additions and 4 deletions

View File

@@ -45,7 +45,8 @@ sk_sp<SkColorSpace> ImageDecoder::getDefaultColorSpace() const {
return SkColorSpace::MakeSRGB(); 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)) : mCodec(std::move(codec))
, mPeeker(std::move(peeker)) , mPeeker(std::move(peeker))
, mDecodeSize(mCodec->codec()->dimensions()) , 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() } mTargetSize = swapWidthHeight() ? SkISize { mDecodeSize.height(), mDecodeSize.width() }
: mDecodeSize; : mDecodeSize;
this->rewind(); this->rewind();
mOptions.fZeroInitialized = zeroInit;
} }
ImageDecoder::~ImageDecoder() = default; ImageDecoder::~ImageDecoder() = default;
@@ -446,10 +448,17 @@ SkCodec::Result ImageDecoder::decode(void* pixels, size_t rowBytes) {
ALOGE("Failed to invert matrix!"); 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); 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) { if (scale || handleOrigin || mCropRect) {
SkBitmap scaledBm; SkBitmap scaledBm;
if (!scaledBm.installPixels(outputInfo, pixels, rowBytes)) { if (!scaledBm.installPixels(outputInfo, pixels, rowBytes)) {

View File

@@ -34,8 +34,8 @@ public:
std::unique_ptr<SkAndroidCodec> mCodec; std::unique_ptr<SkAndroidCodec> mCodec;
sk_sp<SkPngChunkReader> mPeeker; sk_sp<SkPngChunkReader> mPeeker;
ImageDecoder(std::unique_ptr<SkAndroidCodec> codec, ImageDecoder(std::unique_ptr<SkAndroidCodec> codec, sk_sp<SkPngChunkReader> peeker = nullptr,
sk_sp<SkPngChunkReader> peeker = nullptr); SkCodec::ZeroInitialized zeroInit = SkCodec::kNo_ZeroInitialized);
~ImageDecoder(); ~ImageDecoder();
SkISize getSampledDimensions(int sampleSize) const; SkISize getSampledDimensions(int sampleSize) const;

View File

@@ -141,7 +141,8 @@ static jobject native_create(JNIEnv* env, std::unique_ptr<SkStream> stream,
} }
const bool isNinePatch = peeker->mPatch != nullptr; 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, return env->NewObject(gImageDecoder_class, gImageDecoder_constructorMethodID,
reinterpret_cast<jlong>(decoder), decoder->width(), decoder->height(), reinterpret_cast<jlong>(decoder), decoder->width(), decoder->height(),
animated, isNinePatch); animated, isNinePatch);