SkBitmapProcState_sample.h revision 1960ff67bdba330841214d8b2c9464ad0ba56cf3
1#include "SkUtils.h"
2
3#if DSTSIZE==32
4    #define DSTTYPE SkPMColor
5#elif DSTSIZE==16
6    #define DSTTYPE uint16_t
7#else
8    #error "need DSTSIZE to be 32 or 16"
9#endif
10
11#if (DSTSIZE == 32)
12    #define BITMAPPROC_MEMSET(ptr, value, n) sk_memset32(ptr, value, n)
13#elif (DSTSIZE == 16)
14    #define BITMAPPROC_MEMSET(ptr, value, n) sk_memset16(ptr, value, n)
15#else
16    #error "unsupported DSTSIZE"
17#endif
18
19void MAKENAME(_nofilter_DXDY)(const SkBitmapProcState& s,
20                              const uint32_t* SK_RESTRICT xy,
21                              int count, DSTTYPE* SK_RESTRICT colors) {
22    SkASSERT(count > 0 && colors != NULL);
23    SkASSERT(s.fDoFilter == false);
24    SkDEBUGCODE(CHECKSTATE(s);)
25
26#ifdef PREAMBLE
27    PREAMBLE(s);
28#endif
29    const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
30    int i, rb = s.fBitmap->rowBytes();
31
32    uint32_t XY;
33    SRCTYPE src;
34
35    for (i = (count >> 1); i > 0; --i) {
36        XY = *xy++;
37        SkASSERT((XY >> 16) < (unsigned)s.fBitmap->height() &&
38                 (XY & 0xFFFF) < (unsigned)s.fBitmap->width());
39        src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF];
40        *colors++ = RETURNDST(src);
41
42        XY = *xy++;
43        SkASSERT((XY >> 16) < (unsigned)s.fBitmap->height() &&
44                 (XY & 0xFFFF) < (unsigned)s.fBitmap->width());
45        src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF];
46        *colors++ = RETURNDST(src);
47    }
48    if (count & 1) {
49        XY = *xy++;
50        SkASSERT((XY >> 16) < (unsigned)s.fBitmap->height() &&
51                 (XY & 0xFFFF) < (unsigned)s.fBitmap->width());
52        src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF];
53        *colors++ = RETURNDST(src);
54    }
55
56#ifdef POSTAMBLE
57    POSTAMBLE(s);
58#endif
59}
60
61void MAKENAME(_nofilter_DX)(const SkBitmapProcState& s,
62                            const uint32_t* SK_RESTRICT xy,
63                            int count, DSTTYPE* SK_RESTRICT colors) {
64    SkASSERT(count > 0 && colors != NULL);
65    SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask));
66    SkASSERT(s.fDoFilter == false);
67    SkDEBUGCODE(CHECKSTATE(s);)
68
69#ifdef PREAMBLE
70    PREAMBLE(s);
71#endif
72    const SRCTYPE* SK_RESTRICT srcAddr = (const SRCTYPE*)s.fBitmap->getPixels();
73
74    // buffer is y32, x16, x16, x16, x16, x16
75    // bump srcAddr to the proper row, since we're told Y never changes
76    SkASSERT((unsigned)xy[0] < (unsigned)s.fBitmap->height());
77    srcAddr = (const SRCTYPE*)((const char*)srcAddr +
78                                                xy[0] * s.fBitmap->rowBytes());
79    xy += 1;
80
81    SRCTYPE src;
82
83    if (1 == s.fBitmap->width()) {
84        src = srcAddr[0];
85        DSTTYPE dstValue = RETURNDST(src);
86        BITMAPPROC_MEMSET(colors, dstValue, count);
87    } else {
88        int i;
89        for (i = (count >> 2); i > 0; --i) {
90            uint32_t xx0 = *xy++;
91            uint32_t xx1 = *xy++;
92            SRCTYPE x0 = srcAddr[UNPACK_PRIMARY_SHORT(xx0)];
93            SRCTYPE x1 = srcAddr[UNPACK_SECONDARY_SHORT(xx0)];
94            SRCTYPE x2 = srcAddr[UNPACK_PRIMARY_SHORT(xx1)];
95            SRCTYPE x3 = srcAddr[UNPACK_SECONDARY_SHORT(xx1)];
96
97            *colors++ = RETURNDST(x0);
98            *colors++ = RETURNDST(x1);
99            *colors++ = RETURNDST(x2);
100            *colors++ = RETURNDST(x3);
101        }
102        const uint16_t* SK_RESTRICT xx = (const uint16_t*)(xy);
103        for (i = (count & 3); i > 0; --i) {
104            SkASSERT(*xx < (unsigned)s.fBitmap->width());
105            src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
106        }
107    }
108
109#ifdef POSTAMBLE
110    POSTAMBLE(s);
111#endif
112}
113
114///////////////////////////////////////////////////////////////////////////////
115
116void MAKENAME(_filter_DX)(const SkBitmapProcState& s,
117                          const uint32_t* SK_RESTRICT xy,
118                           int count, DSTTYPE* SK_RESTRICT colors) {
119    SkASSERT(count > 0 && colors != NULL);
120    SkASSERT(s.fDoFilter);
121    SkDEBUGCODE(CHECKSTATE(s);)
122
123#ifdef PREAMBLE
124    PREAMBLE(s);
125#endif
126    const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
127    unsigned rb = s.fBitmap->rowBytes();
128    unsigned subY;
129    const SRCTYPE* SK_RESTRICT row0;
130    const SRCTYPE* SK_RESTRICT row1;
131
132    // setup row ptrs and update proc_table
133    {
134        uint32_t XY = *xy++;
135        unsigned y0 = XY >> 14;
136        row0 = (const SRCTYPE*)(srcAddr + (y0 >> 4) * rb);
137        row1 = (const SRCTYPE*)(srcAddr + (XY & 0x3FFF) * rb);
138        subY = y0 & 0xF;
139    }
140
141    do {
142        uint32_t XX = *xy++;    // x0:14 | 4 | x1:14
143        unsigned x0 = XX >> 14;
144        unsigned x1 = XX & 0x3FFF;
145        unsigned subX = x0 & 0xF;
146        x0 >>= 4;
147
148        FILTER_PROC(subX, subY,
149                    SRC_TO_FILTER(row0[x0]),
150                    SRC_TO_FILTER(row0[x1]),
151                    SRC_TO_FILTER(row1[x0]),
152                    SRC_TO_FILTER(row1[x1]),
153                    colors);
154        colors += 1;
155
156    } while (--count != 0);
157
158#ifdef POSTAMBLE
159    POSTAMBLE(s);
160#endif
161}
162void MAKENAME(_filter_DXDY)(const SkBitmapProcState& s,
163                            const uint32_t* SK_RESTRICT xy,
164                            int count, DSTTYPE* SK_RESTRICT colors) {
165    SkASSERT(count > 0 && colors != NULL);
166    SkASSERT(s.fDoFilter);
167    SkDEBUGCODE(CHECKSTATE(s);)
168
169#ifdef PREAMBLE
170        PREAMBLE(s);
171#endif
172    const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
173    int rb = s.fBitmap->rowBytes();
174
175    do {
176        uint32_t data = *xy++;
177        unsigned y0 = data >> 14;
178        unsigned y1 = data & 0x3FFF;
179        unsigned subY = y0 & 0xF;
180        y0 >>= 4;
181
182        data = *xy++;
183        unsigned x0 = data >> 14;
184        unsigned x1 = data & 0x3FFF;
185        unsigned subX = x0 & 0xF;
186        x0 >>= 4;
187
188        const SRCTYPE* SK_RESTRICT row0 = (const SRCTYPE*)(srcAddr + y0 * rb);
189        const SRCTYPE* SK_RESTRICT row1 = (const SRCTYPE*)(srcAddr + y1 * rb);
190
191        FILTER_PROC(subX, subY,
192                    SRC_TO_FILTER(row0[x0]),
193                    SRC_TO_FILTER(row0[x1]),
194                    SRC_TO_FILTER(row1[x0]),
195                    SRC_TO_FILTER(row1[x1]),
196                    colors);
197        colors += 1;
198    } while (--count != 0);
199
200#ifdef POSTAMBLE
201    POSTAMBLE(s);
202#endif
203}
204
205#undef MAKENAME
206#undef DSTSIZE
207#undef DSTTYPE
208#undef SRCTYPE
209#undef CHECKSTATE
210#undef RETURNDST
211#undef SRC_TO_FILTER
212#undef FILTER_TO_DST
213
214#ifdef PREAMBLE
215    #undef PREAMBLE
216#endif
217#ifdef POSTAMBLE
218    #undef POSTAMBLE
219#endif
220
221#undef FILTER_PROC_TYPE
222#undef GET_FILTER_TABLE
223#undef GET_FILTER_ROW
224#undef GET_FILTER_ROW_PROC
225#undef GET_FILTER_PROC
226#undef BITMAPPROC_MEMSET
227