aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkBlitRow_D32.cpp
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-03-09 13:23:57 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-03-09 13:23:57 +0000
commitee467ee79d449ebe6ae7f7946e613cc70a479c69 (patch)
tree50192c7d4723cd2a31fd86087b5adc9152fb828a /src/core/SkBlitRow_D32.cpp
parent981d4798007b91e2e19c13b171583927a56df63b (diff)
Correct blitmask procs to recognize that we pass them an SkColor, and if they
want a SkPMColor, they need to call SkPreMultiplyColor() Add Opaque and Black optimizations for blitmask_d32 git-svn-id: http://skia.googlecode.com/svn/trunk@911 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkBlitRow_D32.cpp')
-rw-r--r--src/core/SkBlitRow_D32.cpp61
1 files changed, 51 insertions, 10 deletions
diff --git a/src/core/SkBlitRow_D32.cpp b/src/core/SkBlitRow_D32.cpp
index 7b9aabc1df..642fe7f8e0 100644
--- a/src/core/SkBlitRow_D32.cpp
+++ b/src/core/SkBlitRow_D32.cpp
@@ -170,11 +170,10 @@ void SkBlitRow::Color32(SkPMColor dst[], const SkPMColor src[],
///////////////////////////////////////////////////////////////////////////////
-static void SkARGB32_BlitMask_portable(void* dst, size_t dstRB,
- SkBitmap::Config dstConfig,
- const uint8_t* mask,
- size_t maskRB, SkColor color,
- int width, int height) {
+static void D32_Mask_Color(void* dst, size_t dstRB, SkBitmap::Config,
+ const uint8_t* mask, size_t maskRB, SkColor color,
+ int width, int height) {
+ SkPMColor pmc = SkPreMultiplyColor(color);
size_t dstOffset = dstRB - (width << 2);
size_t maskOffset = maskRB - width;
SkPMColor *device = (SkPMColor *)dst;
@@ -182,7 +181,7 @@ static void SkARGB32_BlitMask_portable(void* dst, size_t dstRB,
int w = width;
do {
unsigned aa = *mask++;
- *device = SkBlendARGB32(color, *device, aa);
+ *device = SkBlendARGB32(pmc, *device, aa);
device += 1;
} while (--w != 0);
device = (uint32_t*)((char*)device + dstOffset);
@@ -190,15 +189,57 @@ static void SkARGB32_BlitMask_portable(void* dst, size_t dstRB,
} while (--height != 0);
}
+static void D32_Mask_Opaque(void* dst, size_t dstRB, SkBitmap::Config,
+ const uint8_t* mask, size_t maskRB, SkColor color,
+ int width, int height) {
+ SkPMColor pmc = SkPreMultiplyColor(color);
+ uint32_t* device = (uint32_t*)dst;
+
+ maskRB -= width;
+ dstRB -= (width << 2);
+ do {
+ int w = width;
+ do {
+ unsigned aa = *mask++;
+ *device = SkAlphaMulQ(pmc, SkAlpha255To256(aa)) + SkAlphaMulQ(*device, SkAlpha255To256(255 - aa));
+ device += 1;
+ } while (--w != 0);
+ device = (uint32_t*)((char*)device + dstRB);
+ mask += maskRB;
+ } while (--height != 0);
+}
+
+static void D32_Mask_Black(void* dst, size_t dstRB, SkBitmap::Config,
+ const uint8_t* mask, size_t maskRB, SkColor,
+ int width, int height) {
+ uint32_t* device = (uint32_t*)dst;
+
+ maskRB -= width;
+ dstRB -= (width << 2);
+ do {
+ int w = width;
+ do {
+ unsigned aa = *mask++;
+ *device = (aa << SK_A32_SHIFT) + SkAlphaMulQ(*device, SkAlpha255To256(255 - aa));
+ device += 1;
+ } while (--w != 0);
+ device = (uint32_t*)((char*)device + dstRB);
+ mask += maskRB;
+ } while (--height != 0);
+}
+
SkBlitMask::Proc SkBlitMask::Factory(SkBitmap::Config config, SkColor color) {
SkBlitMask::Proc proc = PlatformProcs(config, color);
+ proc = NULL;
if (NULL == proc) {
switch (config) {
case SkBitmap::kARGB_8888_Config:
- if ( SK_ColorBLACK != color && 0xFF != SkColorGetA(color) ) {
- //TODO: blitmask for black;
- //TODO: blitmask for opaque;
- proc = SkARGB32_BlitMask_portable;
+ if (SK_ColorBLACK == color) {
+ proc = D32_Mask_Black;
+ } else if (0xFF == SkColorGetA(color)) {
+ proc = D32_Mask_Opaque;
+ } else {
+ proc = D32_Mask_Color;
}
break;
default: