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