aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar djsollen@google.com <djsollen@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-19 21:45:35 +0000
committerGravatar djsollen@google.com <djsollen@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-19 21:45:35 +0000
commit446cf71426745b5e367e951c467058764882429d (patch)
treecfbeb4d1707e334396e8edd00e0f1512136f7645 /src
parentd58c9c8b813eb7c441bd2dcf2f36f50bf99670a4 (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.cpp15
-rw-r--r--src/images/SkImageRef.cpp14
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 {