Merge "ImageDecoder: use kYes_ZeroInitialized memory" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
90b93b671f
@@ -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)) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user