aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkPixmap.cpp
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-06-09 09:54:55 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-09 14:27:44 +0000
commit9466bf56946973475831005c96f18c170411b70b (patch)
treeb73af6f2bb1ef994661696507b247befe75252d5 /src/core/SkPixmap.cpp
parent39afa1226f71d09bbdb21cc3c86cb23539d8311b (diff)
Make SkPixmap::getColor support kUnpremul pixels
Bug: skia:6319 Change-Id: Id5ad27b4e85516dfdad0c127655e6272bc0a39ac Reviewed-on: https://skia-review.googlesource.com/19089 Commit-Queue: Matt Sarett <msarett@google.com> Reviewed-by: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'src/core/SkPixmap.cpp')
-rw-r--r--src/core/SkPixmap.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp
index 6425b29f92..9646d7c433 100644
--- a/src/core/SkPixmap.cpp
+++ b/src/core/SkPixmap.cpp
@@ -257,6 +257,13 @@ SkColor SkPixmap::getColor(int x, int y) const {
SkASSERT(this->addr());
SkASSERT((unsigned)x < (unsigned)this->width());
SkASSERT((unsigned)y < (unsigned)this->height());
+
+ const bool needsUnpremul = (kPremul_SkAlphaType == fInfo.alphaType());
+ auto toColor = [needsUnpremul](uint32_t maybePremulColor) {
+ return needsUnpremul ? SkUnPreMultiply::PMColorToColor(maybePremulColor)
+ : SkSwizzle_BGRA_to_PMColor(maybePremulColor);
+ };
+
switch (this->colorType()) {
case kGray_8_SkColorType: {
uint8_t value = *this->addr8(x, y);
@@ -267,8 +274,8 @@ SkColor SkPixmap::getColor(int x, int y) const {
}
case kIndex_8_SkColorType: {
SkASSERT(this->ctable());
- SkPMColor pmColor = (*this->ctable())[*this->addr8(x, y)];
- return SkUnPreMultiply::PMColorToColor(pmColor);
+ SkPMColor c = (*this->ctable())[*this->addr8(x, y)];
+ return toColor(c);
}
case kRGB_565_SkColorType: {
return SkPixel16ToColor(*this->addr16(x, y));
@@ -276,23 +283,23 @@ SkColor SkPixmap::getColor(int x, int y) const {
case kARGB_4444_SkColorType: {
uint16_t value = *this->addr16(x, y);
SkPMColor c = SkPixel4444ToPixel32(value);
- return SkUnPreMultiply::PMColorToColor(c);
+ return toColor(c);
}
case kBGRA_8888_SkColorType: {
uint32_t value = *this->addr32(x, y);
SkPMColor c = SkSwizzle_BGRA_to_PMColor(value);
- return SkUnPreMultiply::PMColorToColor(c);
+ return toColor(c);
}
case kRGBA_8888_SkColorType: {
uint32_t value = *this->addr32(x, y);
SkPMColor c = SkSwizzle_RGBA_to_PMColor(value);
- return SkUnPreMultiply::PMColorToColor(c);
+ return toColor(c);
}
case kRGBA_F16_SkColorType: {
const uint64_t* addr =
(const uint64_t*)fPixels + y * (fRowBytes >> 3) + x;
Sk4f p4 = SkHalfToFloat_finite_ftz(*addr);
- if (p4[3]) {
+ if (p4[3] && needsUnpremul) {
float inva = 1 / p4[3];
p4 = p4 * Sk4f(inva, inva, inva, 1);
}