diff options
author | reed <reed@google.com> | 2015-01-13 13:51:00 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-01-13 13:51:00 -0800 |
commit | a7f11918d92621507f35b228a290f05dcaf0f4b6 (patch) | |
tree | c8a731156f2e2a84a5a5da6a7994ae930a2b7e0f /src | |
parent | e55fb177e9435daa7db88614fe181717002689fc (diff) |
rename blitrow::proc and add (uncalled) hook for colorproc16
BUG=skia:3302
Review URL: https://codereview.chromium.org/847443003
Diffstat (limited to 'src')
-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 | ||||
-rw-r--r-- | src/opts/SkBlitRow_opts_arm.cpp | 8 | ||||
-rw-r--r-- | src/opts/SkBlitRow_opts_arm_neon.cpp | 2 | ||||
-rw-r--r-- | src/opts/SkBlitRow_opts_arm_neon.h | 2 | ||||
-rw-r--r-- | src/opts/SkBlitRow_opts_mips_dsp.cpp | 8 | ||||
-rw-r--r-- | src/opts/SkBlitRow_opts_none.cpp | 6 | ||||
-rw-r--r-- | src/opts/opts_check_x86.cpp | 8 |
9 files changed, 90 insertions, 32 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; }; diff --git a/src/opts/SkBlitRow_opts_arm.cpp b/src/opts/SkBlitRow_opts_arm.cpp index 473a3e91b1..9a8cfc4b77 100644 --- a/src/opts/SkBlitRow_opts_arm.cpp +++ b/src/opts/SkBlitRow_opts_arm.cpp @@ -347,7 +347,7 @@ void S32A_Blend_BlitRow32_arm(SkPMColor* SK_RESTRICT dst, /////////////////////////////////////////////////////////////////////////////// -static const SkBlitRow::Proc sk_blitrow_platform_565_procs_arm[] = { +static const SkBlitRow::Proc16 sk_blitrow_platform_565_procs_arm[] = { // no dither // NOTE: For the functions below, we don't have a special version // that assumes that each source pixel is opaque. But our S32A is @@ -373,10 +373,14 @@ static const SkBlitRow::Proc32 sk_blitrow_platform_32_procs_arm[] = { #endif // USE_ARM_CODE -SkBlitRow::Proc SkBlitRow::PlatformProcs565(unsigned flags) { +SkBlitRow::Proc16 SkBlitRow::PlatformFactory565(unsigned flags) { return SK_ARM_NEON_WRAP(sk_blitrow_platform_565_procs_arm)[flags]; } +SkBlitRow::ColorProc16 SkBlitRow::PlatformColorFactory565(unsigned flags) { + return NULL; +} + SkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) { return SK_ARM_NEON_WRAP(sk_blitrow_platform_32_procs_arm)[flags]; } diff --git a/src/opts/SkBlitRow_opts_arm_neon.cpp b/src/opts/SkBlitRow_opts_arm_neon.cpp index b372d16e2f..a1ff1722b5 100644 --- a/src/opts/SkBlitRow_opts_arm_neon.cpp +++ b/src/opts/SkBlitRow_opts_arm_neon.cpp @@ -1646,7 +1646,7 @@ void Color32_arm_neon(SkPMColor* dst, const SkPMColor* src, int count, /////////////////////////////////////////////////////////////////////////////// -const SkBlitRow::Proc sk_blitrow_platform_565_procs_arm_neon[] = { +const SkBlitRow::Proc16 sk_blitrow_platform_565_procs_arm_neon[] = { // no dither S32_D565_Opaque_neon, S32_D565_Blend_neon, diff --git a/src/opts/SkBlitRow_opts_arm_neon.h b/src/opts/SkBlitRow_opts_arm_neon.h index 80b875419a..95825f781b 100644 --- a/src/opts/SkBlitRow_opts_arm_neon.h +++ b/src/opts/SkBlitRow_opts_arm_neon.h @@ -9,7 +9,7 @@ #include "SkBlitRow.h" -extern const SkBlitRow::Proc sk_blitrow_platform_565_procs_arm_neon[]; +extern const SkBlitRow::Proc16 sk_blitrow_platform_565_procs_arm_neon[]; extern const SkBlitRow::Proc32 sk_blitrow_platform_32_procs_arm_neon[]; extern void Color32_arm_neon(SkPMColor* dst, const SkPMColor* src, int count, diff --git a/src/opts/SkBlitRow_opts_mips_dsp.cpp b/src/opts/SkBlitRow_opts_mips_dsp.cpp index 3d4a3a06cd..1db38baf5f 100644 --- a/src/opts/SkBlitRow_opts_mips_dsp.cpp +++ b/src/opts/SkBlitRow_opts_mips_dsp.cpp @@ -921,7 +921,7 @@ void blitmask_d565_opaque_mips(int width, int height, uint16_t* device, /////////////////////////////////////////////////////////////////////////////////////////////////// -const SkBlitRow::Proc platform_565_procs_mips_dsp[] = { +const SkBlitRow::Proc16 platform_565_procs_mips_dsp[] = { // no dither NULL, S32_D565_Blend_mips_dsp, @@ -942,10 +942,14 @@ static const SkBlitRow::Proc32 platform_32_procs_mips_dsp[] = { NULL, // S32A_Blend, }; -SkBlitRow::Proc SkBlitRow::PlatformProcs565(unsigned flags) { +SkBlitRow::Proc16 SkBlitRow::PlatformFactory565(unsigned flags) { return platform_565_procs_mips_dsp[flags]; } +SkBlitRow::ColorProc16 SkBlitRow::PlatformColorFactory565(unsigned flags) { + return NULL; +} + SkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) { return platform_32_procs_mips_dsp[flags]; } diff --git a/src/opts/SkBlitRow_opts_none.cpp b/src/opts/SkBlitRow_opts_none.cpp index 64066f2047..9558f14337 100644 --- a/src/opts/SkBlitRow_opts_none.cpp +++ b/src/opts/SkBlitRow_opts_none.cpp @@ -9,7 +9,11 @@ // Platform impl of Platform_procs with no overrides -SkBlitRow::Proc SkBlitRow::PlatformProcs565(unsigned flags) { +SkBlitRow::Proc16 SkBlitRow::PlatformFactory565(unsigned flags) { + return NULL; +} + +SkBlitRow::ColorProc16 SkBlitRow::PlatformColorFactory565(unsigned flags) { return NULL; } diff --git a/src/opts/opts_check_x86.cpp b/src/opts/opts_check_x86.cpp index 84041d05b0..a19ebfa285 100644 --- a/src/opts/opts_check_x86.cpp +++ b/src/opts/opts_check_x86.cpp @@ -206,7 +206,7 @@ void SkBitmapProcState::platformProcs() { //////////////////////////////////////////////////////////////////////////////// -static SkBlitRow::Proc platform_16_procs[] = { +static SkBlitRow::Proc16 platform_16_procs[] = { S32_D565_Opaque_SSE2, // S32_D565_Opaque NULL, // S32_D565_Blend S32A_D565_Opaque_SSE2, // S32A_D565_Opaque @@ -217,7 +217,7 @@ static SkBlitRow::Proc platform_16_procs[] = { NULL, // S32A_D565_Blend_Dither }; -SkBlitRow::Proc SkBlitRow::PlatformProcs565(unsigned flags) { +SkBlitRow::Proc16 SkBlitRow::PlatformFactory565(unsigned flags) { if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) { return platform_16_procs[flags]; } else { @@ -225,6 +225,10 @@ SkBlitRow::Proc SkBlitRow::PlatformProcs565(unsigned flags) { } } +SkBlitRow::ColorProc16 SkBlitRow::PlatformColorFactory565(unsigned flags) { + return NULL; +} + static SkBlitRow::Proc32 platform_32_procs_SSE2[] = { NULL, // S32_Opaque, S32_Blend_BlitRow32_SSE2, // S32_Blend, |