aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/images
diff options
context:
space:
mode:
Diffstat (limited to 'src/images')
-rw-r--r--src/images/SkImageDecoder.cpp3
-rw-r--r--src/images/SkImageDecoder_libbmp.cpp4
-rw-r--r--src/images/SkImageDecoder_libjpeg.cpp20
-rw-r--r--src/images/SkImageDecoder_libpng.cpp21
-rw-r--r--src/images/SkImageDecoder_libwebp.cpp7
-rw-r--r--src/images/SkImageDecoder_wbmp.cpp4
-rw-r--r--src/images/SkImageRef.cpp3
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;
}