diff options
author | 2014-02-19 21:45:35 +0000 | |
---|---|---|
committer | 2014-02-19 21:45:35 +0000 | |
commit | 446cf71426745b5e367e951c467058764882429d (patch) | |
tree | cfbeb4d1707e334396e8edd00e0f1512136f7645 /src | |
parent | d58c9c8b813eb7c441bd2dcf2f36f50bf99670a4 (diff) |
Fix issue in image decoders where the bitmap config was not properly set.
R=scroggo@google.com
Review URL: https://codereview.chromium.org/167763003
git-svn-id: http://skia.googlecode.com/svn/trunk@13503 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/images/SkImageDecoder_libpng.cpp | 15 | ||||
-rw-r--r-- | src/images/SkImageRef.cpp | 14 |
2 files changed, 21 insertions, 8 deletions
diff --git a/src/images/SkImageDecoder_libpng.cpp b/src/images/SkImageDecoder_libpng.cpp index 3cc41e3f59..cd09f5f980 100644 --- a/src/images/SkImageDecoder_libpng.cpp +++ b/src/images/SkImageDecoder_libpng.cpp @@ -333,6 +333,11 @@ bool SkPNGImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* decodedBitmap, SkScaledBitmapSampler sampler(origWidth, origHeight, sampleSize); decodedBitmap->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight()); + // we should communicate alphaType, even if we early-return in bounds-only-mode. + if (this->getRequireUnpremultipliedColors()) { + decodedBitmap->setAlphaType(kUnpremul_SkAlphaType); + } + if (SkImageDecoder::kDecodeBounds_Mode == mode) { return true; } @@ -478,15 +483,9 @@ bool SkPNGImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* decodedBitmap, } } - SkAlphaType alphaType = kOpaque_SkAlphaType; - if (reallyHasAlpha) { - if (this->getRequireUnpremultipliedColors()) { - alphaType = kUnpremul_SkAlphaType; - } else { - alphaType = kPremul_SkAlphaType; - } + if (!reallyHasAlpha) { + decodedBitmap->setAlphaType(kOpaque_SkAlphaType); } - decodedBitmap->setAlphaType(alphaType); return true; } diff --git a/src/images/SkImageRef.cpp b/src/images/SkImageRef.cpp index ea129642db..f3cc9e5590 100644 --- a/src/images/SkImageRef.cpp +++ b/src/images/SkImageRef.cpp @@ -30,6 +30,10 @@ SkImageRef::SkImageRef(const SkImageInfo& info, SkStreamRewindable* stream, fPrev = fNext = NULL; fFactory = NULL; + // This sets the colortype/alphatype to exactly match our info, so that this + // can get communicated down to the codec. + fBitmap.setConfig(info); + #ifdef DUMP_IMAGEREF_LIFECYCLE SkDebugf("add ImageRef %p [%d] data=%d\n", this, this->info().fColorType, (int)stream->getLength()); @@ -118,6 +122,12 @@ bool SkImageRef::prepareBitmap(SkImageDecoder::Mode mode) { codec->setSampleSize(fSampleSize); codec->setDitherImage(fDoDither); if (this->onDecode(codec, fStream, &fBitmap, fBitmap.config(), mode)) { + if (kOpaque_SkAlphaType == fBitmap.alphaType()) { + this->changeAlphaType(kOpaque_SkAlphaType); + } + SkASSERT(this->info().fColorType == fBitmap.colorType()); + SkASSERT(this->info().fWidth == fBitmap.width()); + SkASSERT(this->info().fHeight == fBitmap.height()); return true; } } @@ -178,6 +188,10 @@ SkImageRef::SkImageRef(SkReadBuffer& buffer, SkBaseMutex* mutex) fPrev = fNext = NULL; fFactory = NULL; + + // This sets the colortype/alphatype to exactly match our info, so that this + // can get communicated down to the codec. + fBitmap.setConfig(this->info()); } void SkImageRef::flatten(SkWriteBuffer& buffer) const { |