1#include "SkBlitRow.h" 2#include "SkColorPriv.h" 3#include "SkUtils.h" 4 5static void S32_Opaque_BlitRow32(SkPMColor* SK_RESTRICT dst, 6 const SkPMColor* SK_RESTRICT src, 7 int count, U8CPU alpha) { 8 SkASSERT(255 == alpha); 9 memcpy(dst, src, count * sizeof(SkPMColor)); 10} 11 12static void S32_Blend_BlitRow32(SkPMColor* SK_RESTRICT dst, 13 const SkPMColor* SK_RESTRICT src, 14 int count, U8CPU alpha) { 15 SkASSERT(alpha <= 255); 16 if (count > 0) { 17 unsigned src_scale = SkAlpha255To256(alpha); 18 unsigned dst_scale = 256 - src_scale; 19 do { 20 *dst = SkAlphaMulQ(*src, src_scale) + SkAlphaMulQ(*dst, dst_scale); 21 src += 1; 22 dst += 1; 23 } while (--count > 0); 24 } 25} 26 27//#define TEST_SRC_ALPHA 28 29static void S32A_Opaque_BlitRow32(SkPMColor* SK_RESTRICT dst, 30 const SkPMColor* SK_RESTRICT src, 31 int count, U8CPU alpha) { 32 SkASSERT(255 == alpha); 33 if (count > 0) { 34 do { 35#ifdef TEST_SRC_ALPHA 36 SkPMColor sc = *src; 37 if (sc) { 38 unsigned srcA = SkGetPackedA32(sc); 39 SkPMColor result = sc; 40 if (srcA != 255) { 41 result = SkPMSrcOver(sc, *dst); 42 } 43 *dst = result; 44 } 45#else 46 *dst = SkPMSrcOver(*src, *dst); 47#endif 48 src += 1; 49 dst += 1; 50 } while (--count > 0); 51 } 52} 53 54static void S32A_Blend_BlitRow32(SkPMColor* SK_RESTRICT dst, 55 const SkPMColor* SK_RESTRICT src, 56 int count, U8CPU alpha) { 57 SkASSERT(alpha <= 255); 58 if (count > 0) { 59 do { 60 *dst = SkBlendARGB32(*src, *dst, alpha); 61 src += 1; 62 dst += 1; 63 } while (--count > 0); 64 } 65} 66 67/////////////////////////////////////////////////////////////////////////////// 68 69static const SkBlitRow::Proc32 gDefault_Procs32[] = { 70 S32_Opaque_BlitRow32, 71 S32_Blend_BlitRow32, 72 S32A_Opaque_BlitRow32, 73 S32A_Blend_BlitRow32 74}; 75 76SkBlitRow::Proc32 SkBlitRow::Factory32(unsigned flags) { 77 SkASSERT(flags < SK_ARRAY_COUNT(gDefault_Procs32)); 78 // just so we don't crash 79 flags &= kFlags32_Mask; 80 81 SkBlitRow::Proc32 proc = PlatformProcs32(flags); 82 if (NULL == proc) { 83 proc = gDefault_Procs32[flags]; 84 } 85 SkASSERT(proc); 86 return proc; 87} 88 89void SkBlitRow::Color32(SkPMColor dst[], const SkPMColor src[], int count, 90 SkPMColor color) { 91 if (count > 0) { 92 if (0 == color) { 93 if (src != dst) { 94 memcpy(dst, src, count * sizeof(SkPMColor)); 95 } 96 } 97 unsigned colorA = SkGetPackedA32(color); 98 if (255 == colorA) { 99 sk_memset32(dst, color, count); 100 } else { 101 unsigned scale = 256 - SkAlpha255To256(colorA); 102 do { 103 *dst = color + SkAlphaMulQ(*src, scale); 104 src += 1; 105 dst += 1; 106 } while (--count); 107 } 108 } 109} 110 111 112 113