• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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