1 #include "SkBlitRow.h"
2 #include "SkColorPriv.h"
3 #include "SkUtils.h"
4
S32_Opaque_BlitRow32(SkPMColor * SK_RESTRICT dst,const SkPMColor * SK_RESTRICT src,int count,U8CPU alpha)5 static 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
S32_Blend_BlitRow32(SkPMColor * SK_RESTRICT dst,const SkPMColor * SK_RESTRICT src,int count,U8CPU alpha)12 static 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
S32A_Opaque_BlitRow32(SkPMColor * SK_RESTRICT dst,const SkPMColor * SK_RESTRICT src,int count,U8CPU alpha)29 static 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
S32A_Blend_BlitRow32(SkPMColor * SK_RESTRICT dst,const SkPMColor * SK_RESTRICT src,int count,U8CPU alpha)54 static 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
69 static const SkBlitRow::Proc32 gDefault_Procs32[] = {
70 S32_Opaque_BlitRow32,
71 S32_Blend_BlitRow32,
72 S32A_Opaque_BlitRow32,
73 S32A_Blend_BlitRow32
74 };
75
Factory32(unsigned flags)76 SkBlitRow::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
Color32(SkPMColor dst[],const SkPMColor src[],int count,SkPMColor color)89 void 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