diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkBlitRow_D16.cpp | 67 | ||||
-rw-r--r-- | src/core/SkBlitter_RGB16.cpp | 15 | ||||
-rw-r--r-- | src/core/SkSpriteBlitter_RGB16.cpp | 6 |
3 files changed, 65 insertions, 23 deletions
diff --git a/src/core/SkBlitRow_D16.cpp b/src/core/SkBlitRow_D16.cpp index e052b3500a..6bf4cea997 100644 --- a/src/core/SkBlitRow_D16.cpp +++ b/src/core/SkBlitRow_D16.cpp @@ -203,9 +203,29 @@ static void S32A_D565_Blend_Dither(uint16_t* SK_RESTRICT dst, } /////////////////////////////////////////////////////////////////////////////// + +static uint32_t pmcolor_to_expand16(SkPMColor c) { + unsigned r = SkGetPackedR32(c); + unsigned g = SkGetPackedG32(c); + unsigned b = SkGetPackedB32(c); + return (g << 24) | (r << 13) | (b << 2); +} + +static void Color32A_D565(uint16_t dst[], SkPMColor src, int count, int x, int y) { + SkASSERT(count > 0); + uint32_t src_expand = pmcolor_to_expand16(src); + unsigned scale = SkAlpha255To256(0xFF - SkGetPackedA32(src)) >> 3; + do { + uint32_t dst_expand = SkExpand_rgb_16(*dst) * scale; + *dst = SkCompact_rgb_16((src_expand + dst_expand) >> 5); + dst += 1; + } while (--count != 0); +} + +/////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// -static const SkBlitRow::Proc gDefault_565_Procs[] = { +static const SkBlitRow::Proc16 gDefault_565_Procs[] = { // no dither S32_D565_Opaque, S32_D565_Blend, @@ -221,22 +241,45 @@ static const SkBlitRow::Proc gDefault_565_Procs[] = { S32A_D565_Blend_Dither }; -SkBlitRow::Proc SkBlitRow::Factory(unsigned flags, SkColorType ct) { +SkBlitRow::Proc16 SkBlitRow::Factory16(unsigned flags) { SkASSERT(flags < SK_ARRAY_COUNT(gDefault_565_Procs)); // just so we don't crash flags &= kFlags16_Mask; - SkBlitRow::Proc proc = NULL; + SkBlitRow::Proc16 proc = PlatformFactory565(flags); + if (NULL == proc) { + proc = gDefault_565_Procs[flags]; + } + return proc; +} + +static const SkBlitRow::ColorProc16 gDefault_565_ColorProcs[] = { +#if 0 + Color32_D565, + Color32A_D565, + Color32_D565_Dither, + Color32A_D565_Dither +#else + // TODO: stop cheating and fill in the above specializations! + Color32A_D565, + Color32A_D565, + Color32A_D565, + Color32A_D565, +#endif +}; + +SkBlitRow::ColorProc16 SkBlitRow::ColorFactory16(unsigned flags) { + SkASSERT((flags & ~kFlags16_Mask) == 0); + // just so we don't crash + flags &= kFlags16_Mask; + // we ignore kGlobalAlpha_Flag, so shift down + flags >>= 1; + + SkASSERT(flags < SK_ARRAY_COUNT(gDefault_565_ColorProcs)); - switch (ct) { - case kRGB_565_SkColorType: - proc = PlatformProcs565(flags); - if (NULL == proc) { - proc = gDefault_565_Procs[flags]; - } - break; - default: - break; + SkBlitRow::ColorProc16 proc = PlatformColorFactory565(flags); + if (NULL == proc) { + proc = gDefault_565_ColorProcs[flags]; } return proc; } diff --git a/src/core/SkBlitter_RGB16.cpp b/src/core/SkBlitter_RGB16.cpp index 7c30fb1ee0..d9193ecf8f 100644 --- a/src/core/SkBlitter_RGB16.cpp +++ b/src/core/SkBlitter_RGB16.cpp @@ -122,9 +122,9 @@ public: void blitRect(int x, int y, int width, int height) SK_OVERRIDE; protected: - SkPMColor* fBuffer; - SkBlitRow::Proc fOpaqueProc; - SkBlitRow::Proc fAlphaProc; + SkPMColor* fBuffer; + SkBlitRow::Proc16 fOpaqueProc; + SkBlitRow::Proc16 fAlphaProc; private: // illegal @@ -836,10 +836,9 @@ SkRGB16_Shader_Blitter::SkRGB16_Shader_Blitter(const SkBitmap& device, flags |= SkBlitRow::kDither_Flag; } // used when we know our global alpha is 0xFF - fOpaqueProc = SkBlitRow::Factory(flags, kRGB_565_SkColorType); + fOpaqueProc = SkBlitRow::Factory16(flags); // used when we know our global alpha is < 0xFF - fAlphaProc = SkBlitRow::Factory(flags | SkBlitRow::kGlobalAlpha_Flag, - kRGB_565_SkColorType); + fAlphaProc = SkBlitRow::Factory16(flags | SkBlitRow::kGlobalAlpha_Flag); } SkRGB16_Shader_Blitter::~SkRGB16_Shader_Blitter() { @@ -856,7 +855,7 @@ void SkRGB16_Shader_Blitter::blitH(int x, int y, int width) { void SkRGB16_Shader_Blitter::blitRect(int x, int y, int width, int height) { SkShader::Context* shaderContext = fShaderContext; - SkBlitRow::Proc proc = fOpaqueProc; + SkBlitRow::Proc16 proc = fOpaqueProc; SkPMColor* buffer = fBuffer; uint16_t* dst = fDevice.getAddr16(x, y); size_t dstRB = fDevice.rowBytes(); @@ -920,7 +919,7 @@ void SkRGB16_Shader_Blitter::blitAntiH(int x, int y, SkPMColor* localSpan = span; for (;;) { - SkBlitRow::Proc proc = (aa == 0xFF) ? fOpaqueProc : fAlphaProc; + SkBlitRow::Proc16 proc = (aa == 0xFF) ? fOpaqueProc : fAlphaProc; proc(device, localSpan, count, aa, x, y); x += count; diff --git a/src/core/SkSpriteBlitter_RGB16.cpp b/src/core/SkSpriteBlitter_RGB16.cpp index 2f257a0b0e..77073365e3 100644 --- a/src/core/SkSpriteBlitter_RGB16.cpp +++ b/src/core/SkSpriteBlitter_RGB16.cpp @@ -278,7 +278,7 @@ public: if (paint.isDither()) { flags |= SkBlitRow::kDither_Flag; } - fProc = SkBlitRow::Factory(flags, kRGB_565_SkColorType); + fProc = SkBlitRow::Factory16(flags); } void blitRect(int x, int y, int width, int height) SK_OVERRIDE { @@ -287,7 +287,7 @@ public: y - fTop); size_t dstRB = fDevice->rowBytes(); size_t srcRB = fSource->rowBytes(); - SkBlitRow::Proc proc = fProc; + SkBlitRow::Proc16 proc = fProc; U8CPU alpha = fPaint->getAlpha(); while (--height >= 0) { @@ -299,7 +299,7 @@ public: } private: - SkBlitRow::Proc fProc; + SkBlitRow::Proc16 fProc; typedef SkSpriteBlitter INHERITED; }; |