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
MAKENAME(_nofilter_DXDY)19 void 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
MAKENAME(_nofilter_DX)61 void 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
MAKENAME(_filter_DX)116 void 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 }
MAKENAME(_filter_DXDY)162 void 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