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