aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar caryclark@google.com <caryclark@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-08-05 14:17:12 +0000
committerGravatar caryclark@google.com <caryclark@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-08-05 14:17:12 +0000
commit53d11e0655c11101e5e8a1be7d48d049d5d316a1 (patch)
tree89c8f6ce1a27cdd4b3951f4412c7281c5f7fe748 /src/core
parenta5a1da81d0bed4a65e9d8956e2e2b2b226d4b05d (diff)
submit LCD alpha support
http://codereview.appspot.com/4851042/ M src/core/SkBlitter_ARGB32.cpp git-svn-id: http://skia.googlecode.com/svn/trunk@2047 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkBlitter_ARGB32.cpp48
1 files changed, 31 insertions, 17 deletions
diff --git a/src/core/SkBlitter_ARGB32.cpp b/src/core/SkBlitter_ARGB32.cpp
index 053f3e7432..c895480d56 100644
--- a/src/core/SkBlitter_ARGB32.cpp
+++ b/src/core/SkBlitter_ARGB32.cpp
@@ -28,10 +28,13 @@ static inline int blend32(int src, int dst, int scale) {
}
static void blit_lcd16_opaque(SkPMColor dst[], const uint16_t src[],
- SkPMColor color, int width) {
- int srcR = SkGetPackedR32(color);
- int srcG = SkGetPackedG32(color);
- int srcB = SkGetPackedB32(color);
+ SkColor color, int width) {
+ int srcA = SkColorGetA(color);
+ int srcR = SkColorGetR(color);
+ int srcG = SkColorGetG(color);
+ int srcB = SkColorGetB(color);
+
+ srcA = SkAlpha255To256(srcA);
for (int i = 0; i < width; i++) {
uint16_t mask = src[i];
@@ -48,11 +51,15 @@ static void blit_lcd16_opaque(SkPMColor dst[], const uint16_t src[],
int maskG = SkGetPackedG16(mask) >> (SK_G16_BITS - 5);
int maskB = SkGetPackedB16(mask) >> (SK_B16_BITS - 5);
- // Now upscale them to 0..256, so we can use SkAlphaBlend
+ // Now upscale them to 0..32, so we can use blend32
maskR = upscale31To32(maskR);
maskG = upscale31To32(maskG);
maskB = upscale31To32(maskB);
+ maskR = maskR * srcA >> 8;
+ maskG = maskG * srcA >> 8;
+ maskB = maskB * srcA >> 8;
+
int maskA = SkMax32(SkMax32(maskR, maskG), maskB);
int dstA = SkGetPackedA32(d);
@@ -68,10 +75,13 @@ static void blit_lcd16_opaque(SkPMColor dst[], const uint16_t src[],
}
static void blit_lcd32_opaque(SkPMColor dst[], const uint32_t src[],
- SkPMColor color, int width) {
- int srcR = SkGetPackedR32(color);
- int srcG = SkGetPackedG32(color);
- int srcB = SkGetPackedB32(color);
+ SkColor color, int width) {
+ int srcA = SkColorGetA(color);
+ int srcR = SkColorGetR(color);
+ int srcG = SkColorGetG(color);
+ int srcB = SkColorGetB(color);
+
+ srcA = SkAlpha255To256(srcA);
for (int i = 0; i < width; i++) {
uint32_t mask = src[i];
@@ -90,6 +100,10 @@ static void blit_lcd32_opaque(SkPMColor dst[], const uint32_t src[],
maskG = SkAlpha255To256(maskG);
maskB = SkAlpha255To256(maskB);
+ maskR = maskR * srcA >> 8;
+ maskG = maskG * srcA >> 8;
+ maskB = maskB * srcA >> 8;
+
int maskA = SkMax32(SkMax32(maskR, maskG), maskB);
int dstA = SkGetPackedA32(d);
@@ -105,7 +119,7 @@ static void blit_lcd32_opaque(SkPMColor dst[], const uint32_t src[],
}
static void blitmask_lcd16(const SkBitmap& device, const SkMask& mask,
- const SkIRect& clip, SkPMColor srcColor) {
+ const SkIRect& clip, SkColor srcColor) {
int x = clip.fLeft;
int y = clip.fTop;
int width = clip.width();
@@ -122,7 +136,7 @@ static void blitmask_lcd16(const SkBitmap& device, const SkMask& mask,
}
static void blitmask_lcd32(const SkBitmap& device, const SkMask& mask,
- const SkIRect& clip, SkPMColor srcColor) {
+ const SkIRect& clip, SkColor srcColor) {
int x = clip.fLeft;
int y = clip.fTop;
int width = clip.width();
@@ -290,10 +304,10 @@ void SkARGB32_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) {
SkARGB32_Blit32(fDevice, mask, clip, fPMColor);
return;
} else if (SkMask::kLCD16_Format == mask.fFormat) {
- blitmask_lcd16(fDevice, mask, clip, fPMColor);
+ blitmask_lcd16(fDevice, mask, clip, fColor);
return;
} else if (SkMask::kLCD32_Format == mask.fFormat) {
- blitmask_lcd32(fDevice, mask, clip, fPMColor);
+ blitmask_lcd32(fDevice, mask, clip, fColor);
return;
}
@@ -317,10 +331,10 @@ void SkARGB32_Opaque_Blitter::blitMask(const SkMask& mask,
SkARGB32_Blit32(fDevice, mask, clip, fPMColor);
return;
} else if (SkMask::kLCD16_Format == mask.fFormat) {
- blitmask_lcd16(fDevice, mask, clip, fPMColor);
+ blitmask_lcd16(fDevice, mask, clip, fColor);
return;
} else if (SkMask::kLCD32_Format == mask.fFormat) {
- blitmask_lcd32(fDevice, mask, clip, fPMColor);
+ blitmask_lcd32(fDevice, mask, clip, fColor);
return;
}
@@ -396,9 +410,9 @@ void SkARGB32_Black_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) {
} else if (SkMask::kARGB32_Format == mask.fFormat) {
SkARGB32_Blit32(fDevice, mask, clip, fPMColor);
} else if (SkMask::kLCD16_Format == mask.fFormat) {
- blitmask_lcd16(fDevice, mask, clip, fPMColor);
+ blitmask_lcd16(fDevice, mask, clip, fColor);
} else if (SkMask::kLCD32_Format == mask.fFormat) {
- blitmask_lcd32(fDevice, mask, clip, fPMColor);
+ blitmask_lcd32(fDevice, mask, clip, fColor);
} else {
fBlitMaskProc(fDevice.getAddr32(clip.fLeft, clip.fTop),
fDevice.rowBytes(),