diff options
Diffstat (limited to 'src/images')
-rw-r--r-- | src/images/SkImageDecoder.cpp | 3 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libbmp.cpp | 4 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libjpeg.cpp | 20 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libpng.cpp | 21 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libwebp.cpp | 7 | ||||
-rw-r--r-- | src/images/SkImageDecoder_wbmp.cpp | 4 | ||||
-rw-r--r-- | src/images/SkImageRef.cpp | 3 |
7 files changed, 38 insertions, 24 deletions
diff --git a/src/images/SkImageDecoder.cpp b/src/images/SkImageDecoder.cpp index 15cd1a60c0..3ee41124c0 100644 --- a/src/images/SkImageDecoder.cpp +++ b/src/images/SkImageDecoder.cpp @@ -245,8 +245,7 @@ bool SkImageDecoder::cropBitmap(SkBitmap *dst, SkBitmap *src, int sampleSize, } // if the destination has no pixels then we must allocate them. if (dst->isNull()) { - dst->setConfig(src->getConfig(), w, h); - dst->setIsOpaque(src->isOpaque()); + dst->setConfig(src->getConfig(), w, h, 0, src->alphaType()); if (!this->allocPixelRef(dst, NULL)) { SkDEBUGF(("failed to allocate pixels needed to crop the bitmap")); diff --git a/src/images/SkImageDecoder_libbmp.cpp b/src/images/SkImageDecoder_libbmp.cpp index 2283dbf51d..34a88ac6b0 100644 --- a/src/images/SkImageDecoder_libbmp.cpp +++ b/src/images/SkImageDecoder_libbmp.cpp @@ -133,8 +133,8 @@ bool SkBMPImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { SkScaledBitmapSampler sampler(width, height, getSampleSize()); - bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight()); - bm->setIsOpaque(true); + bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight(), 0, + kOpaque_SkAlphaType); if (justBounds) { return true; diff --git a/src/images/SkImageDecoder_libjpeg.cpp b/src/images/SkImageDecoder_libjpeg.cpp index 52c7483d7c..67b17823e2 100644 --- a/src/images/SkImageDecoder_libjpeg.cpp +++ b/src/images/SkImageDecoder_libjpeg.cpp @@ -543,9 +543,9 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { #endif if (1 == sampleSize && SkImageDecoder::kDecodeBounds_Mode == mode) { - bm->setConfig(config, cinfo.image_width, cinfo.image_height); - bm->setIsOpaque(config != SkBitmap::kA8_Config); - return true; + return bm->setConfig(config, cinfo.image_width, cinfo.image_height, 0, + SkBitmap::kA8_Config == config ? + kPremul_SkAlphaType : kOpaque_SkAlphaType); } /* image_width and image_height are the original dimensions, available @@ -565,9 +565,9 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { if (SkImageDecoder::kDecodeBounds_Mode == mode && valid_output_dimensions(cinfo)) { SkScaledBitmapSampler smpl(cinfo.output_width, cinfo.output_height, recompute_sampleSize(sampleSize, cinfo)); - bm->setConfig(config, smpl.scaledWidth(), smpl.scaledHeight()); - bm->setIsOpaque(config != SkBitmap::kA8_Config); - return true; + return bm->setConfig(config, smpl.scaledWidth(), smpl.scaledHeight(), + 0, SkBitmap::kA8_Config == config ? + kPremul_SkAlphaType : kOpaque_SkAlphaType); } else { return return_false(cinfo, *bm, "start_decompress"); } @@ -580,8 +580,8 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { } SkScaledBitmapSampler sampler(cinfo.output_width, cinfo.output_height, sampleSize); - bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight()); - bm->setIsOpaque(config != SkBitmap::kA8_Config); + bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight(), 0, + SkBitmap::kA8_Config != config ? kOpaque_SkAlphaType : kPremul_SkAlphaType); if (SkImageDecoder::kDecodeBounds_Mode == mode) { return true; } @@ -801,8 +801,8 @@ bool SkJPEGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) { SkScaledBitmapSampler sampler(width, height, skiaSampleSize); SkBitmap bitmap; - bitmap.setConfig(config, sampler.scaledWidth(), sampler.scaledHeight()); - bitmap.setIsOpaque(true); + bitmap.setConfig(config, sampler.scaledWidth(), sampler.scaledHeight(), 0, + kOpaque_SkAlphaType); // Check ahead of time if the swap(dest, src) is possible or not. // If yes, then we will stick to AllocPixelRef since it's cheaper with the diff --git a/src/images/SkImageDecoder_libpng.cpp b/src/images/SkImageDecoder_libpng.cpp index 5fc9350b51..e54387af34 100644 --- a/src/images/SkImageDecoder_libpng.cpp +++ b/src/images/SkImageDecoder_libpng.cpp @@ -466,7 +466,16 @@ bool SkPNGImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* decodedBitmap, if (SkBitmap::kA8_Config == decodedBitmap->config()) { reallyHasAlpha = true; } - decodedBitmap->setIsOpaque(!reallyHasAlpha); + + SkAlphaType alphaType = kOpaque_SkAlphaType; + if (reallyHasAlpha) { + if (this->getRequireUnpremultipliedColors()) { + alphaType = kUnpremul_SkAlphaType; + } else { + alphaType = kPremul_SkAlphaType; + } + } + decodedBitmap->setAlphaType(alphaType); return true; } @@ -939,7 +948,15 @@ bool SkPNGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) { if (SkBitmap::kA8_Config == decodedBitmap.config()) { reallyHasAlpha = true; } - decodedBitmap.setIsOpaque(!reallyHasAlpha); + SkAlphaType alphaType = kOpaque_SkAlphaType; + if (reallyHasAlpha) { + if (this->getRequireUnpremultipliedColors()) { + alphaType = kUnpremul_SkAlphaType; + } else { + alphaType = kPremul_SkAlphaType; + } + } + decodedBitmap.setAlphaType(alphaType); if (swapOnly) { bm->swap(decodedBitmap); diff --git a/src/images/SkImageDecoder_libwebp.cpp b/src/images/SkImageDecoder_libwebp.cpp index 8bb716bae8..68014dd392 100644 --- a/src/images/SkImageDecoder_libwebp.cpp +++ b/src/images/SkImageDecoder_libwebp.cpp @@ -293,11 +293,8 @@ bool SkWEBPImageDecoder::setDecodeConfig(SkBitmap* decodedBitmap, return false; } - decodedBitmap->setConfig(config, width, height, 0); - - decodedBitmap->setIsOpaque(!fHasAlpha); - - return true; + return decodedBitmap->setConfig(config, width, height, 0, + fHasAlpha ? kPremul_SkAlphaType : kOpaque_SkAlphaType); } bool SkWEBPImageDecoder::onBuildTileIndex(SkStreamRewindable* stream, diff --git a/src/images/SkImageDecoder_wbmp.cpp b/src/images/SkImageDecoder_wbmp.cpp index 4a9944dbcd..8dce62cdf0 100644 --- a/src/images/SkImageDecoder_wbmp.cpp +++ b/src/images/SkImageDecoder_wbmp.cpp @@ -111,8 +111,8 @@ bool SkWBMPImageDecoder::onDecode(SkStream* stream, SkBitmap* decodedBitmap, int width = head.fWidth; int height = head.fHeight; - decodedBitmap->setConfig(SkBitmap::kIndex8_Config, width, height); - decodedBitmap->setIsOpaque(true); + decodedBitmap->setConfig(SkBitmap::kIndex8_Config, width, height, 0, + kOpaque_SkAlphaType); if (SkImageDecoder::kDecodeBounds_Mode == mode) { return true; diff --git a/src/images/SkImageRef.cpp b/src/images/SkImageRef.cpp index 9093b05156..ead835f7ab 100644 --- a/src/images/SkImageRef.cpp +++ b/src/images/SkImageRef.cpp @@ -64,7 +64,8 @@ bool SkImageRef::getInfo(SkBitmap* bitmap) { bool SkImageRef::isOpaque(SkBitmap* bitmap) { if (bitmap && bitmap->pixelRef() == this) { bitmap->lockPixels(); - bitmap->setIsOpaque(fBitmap.isOpaque()); + // what about colortables?????? + bitmap->setAlphaType(fBitmap.alphaType()); bitmap->unlockPixels(); return true; } |