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 12:55:47 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-03-09 12:55:47 +0000
commit981d4798007b91e2e19c13b171583927a56df63b (patch)
tree09912cf10a93a1605cca1a543ed8c0bdbe6ee2f6 /src/core/SkBlitRow_D32.cpp
parent0b50b2ed462505c452de8b6d978c4e522e0f9fe1 (diff)
Add blitmask procs (with optional platform acceleration) patch by yaojie.yan git-svn-id: http://skia.googlecode.com/svn/trunk@910 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkBlitRow_D32.cpp')
-rw-r--r--src/core/SkBlitRow_D32.cpp42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/core/SkBlitRow_D32.cpp b/src/core/SkBlitRow_D32.cpp
index f50077839e..7b9aabc1df 100644
--- a/src/core/SkBlitRow_D32.cpp
+++ b/src/core/SkBlitRow_D32.cpp
@@ -128,7 +128,7 @@ SkBlitRow::Proc32 SkBlitRow::Factory32(unsigned flags) {
SkASSERT(flags < SK_ARRAY_COUNT(gDefault_Procs32));
// just so we don't crash
flags &= kFlags32_Mask;
-
+
SkBlitRow::Proc32 proc = PlatformProcs32(flags);
if (NULL == proc) {
proc = gDefault_Procs32[flags];
@@ -146,7 +146,7 @@ SkBlitRow::Proc32 SkBlitRow::ColorProcFactory() {
return proc;
}
-void SkBlitRow::Color32(SkPMColor dst[], const SkPMColor src[],
+void SkBlitRow::Color32(SkPMColor dst[], const SkPMColor src[],
int count, SkPMColor color) {
if (count > 0) {
if (0 == color) {
@@ -168,5 +168,43 @@ 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) {
+ size_t dstOffset = dstRB - (width << 2);
+ size_t maskOffset = maskRB - width;
+ SkPMColor *device = (SkPMColor *)dst;
+ do {
+ int w = width;
+ do {
+ unsigned aa = *mask++;
+ *device = SkBlendARGB32(color, *device, aa);
+ device += 1;
+ } while (--w != 0);
+ device = (uint32_t*)((char*)device + dstOffset);
+ mask += maskOffset;
+ } while (--height != 0);
+}
+SkBlitMask::Proc SkBlitMask::Factory(SkBitmap::Config config, SkColor color) {
+ SkBlitMask::Proc proc = PlatformProcs(config, color);
+ 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;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ return proc;
+}