OLD | NEW |
| (Empty) |
1 /* libs/graphics/sgl/SkFilterProc.cpp | |
2 ** | |
3 ** Copyright 2006, The Android Open Source Project | |
4 ** | |
5 ** Licensed under the Apache License, Version 2.0 (the "License"); | |
6 ** you may not use this file except in compliance with the License. | |
7 ** You may obtain a copy of the License at | |
8 ** | |
9 ** http://www.apache.org/licenses/LICENSE-2.0 | |
10 ** | |
11 ** Unless required by applicable law or agreed to in writing, software | |
12 ** distributed under the License is distributed on an "AS IS" BASIS, | |
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 ** See the License for the specific language governing permissions and | |
15 ** limitations under the License. | |
16 */ | |
17 | |
18 #include "SkFilterProc.h" | |
19 | |
20 /* [1-x 1-y] [x 1-y] | |
21 [1-x y] [x y] | |
22 */ | |
23 | |
24 static unsigned bilerp00(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return a00; } | |
25 static unsigned bilerp01(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (3 * a00 + a01) >> 2; } | |
26 static unsigned bilerp02(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (a00 + a01) >> 1; } | |
27 static unsigned bilerp03(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (a00 + 3 * a01) >> 2; } | |
28 | |
29 static unsigned bilerp10(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (3 * a00 + a10) >> 2; } | |
30 static unsigned bilerp11(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (9 * a00 + 3 * (a01 + a10) + a11) >> 4; } | |
31 static unsigned bilerp12(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (3 * (a00 + a01) + a10 + a11) >> 3; } | |
32 static unsigned bilerp13(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (9 * a01 + 3 * (a00 + a11) + a10) >> 4; } | |
33 | |
34 static unsigned bilerp20(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (a00 + a10) >> 1; } | |
35 static unsigned bilerp21(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (3 * (a00 + a10) + a01 + a11) >> 3; } | |
36 static unsigned bilerp22(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (a00 + a01 + a10 + a11) >> 2; } | |
37 static unsigned bilerp23(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (3 * (a01 + a11) + a00 + a10) >> 3; } | |
38 | |
39 static unsigned bilerp30(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (a00 + 3 * a10) >> 2; } | |
40 static unsigned bilerp31(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (9 * a10 + 3 * (a00 + a11) + a01) >> 4; } | |
41 static unsigned bilerp32(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (3 * (a10 + a11) + a00 + a01) >> 3; } | |
42 static unsigned bilerp33(unsigned a00, unsigned a01, unsigned a10, unsigned a11)
{ return (9 * a11 + 3 * (a01 + a10) + a00) >> 4; } | |
43 | |
44 static const SkFilterProc gBilerpProcs[4 * 4] = { | |
45 bilerp00, bilerp01, bilerp02, bilerp03, | |
46 bilerp10, bilerp11, bilerp12, bilerp13, | |
47 bilerp20, bilerp21, bilerp22, bilerp23, | |
48 bilerp30, bilerp31, bilerp32, bilerp33 | |
49 }; | |
50 | |
51 const SkFilterProc* SkGetBilinearFilterProcTable() | |
52 { | |
53 return gBilerpProcs; | |
54 } | |
55 | |
56 /////////////////////////////////////////////////////////////////////////////// | |
57 /////////////////////////////////////////////////////////////////////////////// | |
58 | |
59 #define MASK 0xFF00FF | |
60 #define LO_PAIR(x) ((x) & MASK) | |
61 #define HI_PAIR(x) (((x) >> 8) & MASK) | |
62 #define COMBINE(lo, hi) (((lo) & ~0xFF00) | (((hi) & ~0xFF00) << 8)) | |
63 | |
64 /////////////////////////////////////////////////////////////////////////////// | |
65 | |
66 static unsigned bilerp4_00(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
67 return c00; | |
68 } | |
69 static unsigned bilerp4_01(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
70 uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c01)) >> 2; | |
71 uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c01)) >> 2; | |
72 return COMBINE(lo, hi); | |
73 } | |
74 static unsigned bilerp4_02(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
75 uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01)) >> 1; | |
76 uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01)) >> 1; | |
77 return COMBINE(lo, hi); | |
78 } | |
79 static unsigned bilerp4_03(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
80 uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c01)) >> 2; | |
81 uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c01)) >> 2; | |
82 return COMBINE(lo, hi); | |
83 } | |
84 | |
85 static unsigned bilerp4_10(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
86 uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c10)) >> 2; | |
87 uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c10)) >> 2; | |
88 return COMBINE(lo, hi); | |
89 } | |
90 static unsigned bilerp4_11(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
91 uint32_t lo = (9 * LO_PAIR(c00) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAI
R(c11)) >> 4; | |
92 uint32_t hi = (9 * HI_PAIR(c00) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAI
R(c11)) >> 4; | |
93 return COMBINE(lo, hi); | |
94 } | |
95 static unsigned bilerp4_12(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
96 uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c01)) + LO_PAIR(c10) + LO_PAIR(c1
1)) >> 3; | |
97 uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c01)) + HI_PAIR(c10) + HI_PAIR(c1
1)) >> 3; | |
98 return COMBINE(lo, hi); | |
99 } | |
100 static unsigned bilerp4_13(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
101 uint32_t lo = (9 * LO_PAIR(c01) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAI
R(c10)) >> 4; | |
102 uint32_t hi = (9 * HI_PAIR(c01) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAI
R(c10)) >> 4; | |
103 return COMBINE(lo, hi); | |
104 } | |
105 | |
106 static unsigned bilerp4_20(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
107 uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c10)) >> 1; | |
108 uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c10)) >> 1; | |
109 return COMBINE(lo, hi); | |
110 } | |
111 static unsigned bilerp4_21(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
112 uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c10)) + LO_PAIR(c01) + LO_PAIR(c1
1)) >> 3; | |
113 uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c10)) + HI_PAIR(c01) + HI_PAIR(c1
1)) >> 3; | |
114 return COMBINE(lo, hi); | |
115 } | |
116 static unsigned bilerp4_22(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
117 uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01) + LO_PAIR(c10) + LO_PAIR(c11)) >>
2; | |
118 uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01) + HI_PAIR(c10) + HI_PAIR(c11)) >>
2; | |
119 return COMBINE(lo, hi); | |
120 } | |
121 static unsigned bilerp4_23(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
122 uint32_t lo = (3 * (LO_PAIR(c01) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c1
0)) >> 3; | |
123 uint32_t hi = (3 * (HI_PAIR(c01) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c1
0)) >> 3; | |
124 return COMBINE(lo, hi); | |
125 } | |
126 | |
127 static unsigned bilerp4_30(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
128 uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c10)) >> 2; | |
129 uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c10)) >> 2; | |
130 return COMBINE(lo, hi); | |
131 } | |
132 static unsigned bilerp4_31(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
133 uint32_t lo = (9 * LO_PAIR(c10) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAI
R(c01)) >> 4; | |
134 uint32_t hi = (9 * HI_PAIR(c10) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAI
R(c01)) >> 4; | |
135 return COMBINE(lo, hi); | |
136 } | |
137 static unsigned bilerp4_32(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
138 uint32_t lo = (3 * (LO_PAIR(c10) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c0
1)) >> 3; | |
139 uint32_t hi = (3 * (HI_PAIR(c10) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c0
1)) >> 3; | |
140 return COMBINE(lo, hi); | |
141 } | |
142 static unsigned bilerp4_33(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c1
1) { | |
143 uint32_t lo = (9 * LO_PAIR(c11) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAI
R(c00)) >> 4; | |
144 uint32_t hi = (9 * HI_PAIR(c11) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAI
R(c00)) >> 4; | |
145 return COMBINE(lo, hi); | |
146 } | |
147 | |
148 static const SkFilter32Proc gBilerp32Procs[4 * 4] = { | |
149 bilerp4_00, bilerp4_01, bilerp4_02, bilerp4_03, | |
150 bilerp4_10, bilerp4_11, bilerp4_12, bilerp4_13, | |
151 bilerp4_20, bilerp4_21, bilerp4_22, bilerp4_23, | |
152 bilerp4_30, bilerp4_31, bilerp4_32, bilerp4_33 | |
153 }; | |
154 | |
155 const SkFilter32Proc* SkGetFilter32ProcTable() | |
156 { | |
157 return gBilerp32Procs; | |
158 } | |
159 | |
160 /////////////////////////////////////////////////////////////////////////////// | |
161 | |
162 static unsigned bilerptr00(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
163 return *a00; | |
164 } | |
165 static unsigned bilerptr01(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
166 uint32_t c00 = *a00; | |
167 uint32_t c01 = *a01; | |
168 uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c01)) >> 2; | |
169 uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c01)) >> 2; | |
170 return COMBINE(lo, hi); | |
171 } | |
172 static unsigned bilerptr02(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
173 uint32_t c00 = *a00; | |
174 uint32_t c01 = *a01; | |
175 uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01)) >> 1; | |
176 uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01)) >> 1; | |
177 return COMBINE(lo, hi); | |
178 } | |
179 static unsigned bilerptr03(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
180 uint32_t c00 = *a00; | |
181 uint32_t c01 = *a01; | |
182 uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c01)) >> 2; | |
183 uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c01)) >> 2; | |
184 return COMBINE(lo, hi); | |
185 } | |
186 | |
187 static unsigned bilerptr10(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
188 uint32_t c00 = *a00; | |
189 uint32_t c10 = *a10; | |
190 uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c10)) >> 2; | |
191 uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c10)) >> 2; | |
192 return COMBINE(lo, hi); | |
193 } | |
194 static unsigned bilerptr11(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
195 uint32_t c00 = *a00; | |
196 uint32_t c01 = *a01; | |
197 uint32_t c10 = *a10; | |
198 uint32_t c11 = *a11; | |
199 uint32_t lo = (9 * LO_PAIR(c00) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAI
R(c11)) >> 4; | |
200 uint32_t hi = (9 * HI_PAIR(c00) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAI
R(c11)) >> 4; | |
201 return COMBINE(lo, hi); | |
202 } | |
203 static unsigned bilerptr12(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
204 uint32_t c00 = *a00; | |
205 uint32_t c01 = *a01; | |
206 uint32_t c10 = *a10; | |
207 uint32_t c11 = *a11; | |
208 uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c01)) + LO_PAIR(c10) + LO_PAIR(c1
1)) >> 3; | |
209 uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c01)) + HI_PAIR(c10) + HI_PAIR(c1
1)) >> 3; | |
210 return COMBINE(lo, hi); | |
211 } | |
212 static unsigned bilerptr13(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
213 uint32_t c00 = *a00; | |
214 uint32_t c01 = *a01; | |
215 uint32_t c10 = *a10; | |
216 uint32_t c11 = *a11; | |
217 uint32_t lo = (9 * LO_PAIR(c01) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAI
R(c10)) >> 4; | |
218 uint32_t hi = (9 * HI_PAIR(c01) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAI
R(c10)) >> 4; | |
219 return COMBINE(lo, hi); | |
220 } | |
221 | |
222 static unsigned bilerptr20(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
223 uint32_t c00 = *a00; | |
224 uint32_t c10 = *a10; | |
225 uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c10)) >> 1; | |
226 uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c10)) >> 1; | |
227 return COMBINE(lo, hi); | |
228 } | |
229 static unsigned bilerptr21(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
230 uint32_t c00 = *a00; | |
231 uint32_t c01 = *a01; | |
232 uint32_t c10 = *a10; | |
233 uint32_t c11 = *a11; | |
234 uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c10)) + LO_PAIR(c01) + LO_PAIR(c1
1)) >> 3; | |
235 uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c10)) + HI_PAIR(c01) + HI_PAIR(c1
1)) >> 3; | |
236 return COMBINE(lo, hi); | |
237 } | |
238 static unsigned bilerptr22(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
239 uint32_t c00 = *a00; | |
240 uint32_t c01 = *a01; | |
241 uint32_t c10 = *a10; | |
242 uint32_t c11 = *a11; | |
243 uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01) + LO_PAIR(c10) + LO_PAIR(c11)) >>
2; | |
244 uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01) + HI_PAIR(c10) + HI_PAIR(c11)) >>
2; | |
245 return COMBINE(lo, hi); | |
246 } | |
247 static unsigned bilerptr23(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
248 uint32_t c00 = *a00; | |
249 uint32_t c01 = *a01; | |
250 uint32_t c10 = *a10; | |
251 uint32_t c11 = *a11; | |
252 uint32_t lo = (3 * (LO_PAIR(c01) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c1
0)) >> 3; | |
253 uint32_t hi = (3 * (HI_PAIR(c01) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c1
0)) >> 3; | |
254 return COMBINE(lo, hi); | |
255 } | |
256 | |
257 static unsigned bilerptr30(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
258 uint32_t c00 = *a00; | |
259 uint32_t c10 = *a10; | |
260 uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c10)) >> 2; | |
261 uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c10)) >> 2; | |
262 return COMBINE(lo, hi); | |
263 } | |
264 static unsigned bilerptr31(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
265 uint32_t c00 = *a00; | |
266 uint32_t c01 = *a01; | |
267 uint32_t c10 = *a10; | |
268 uint32_t c11 = *a11; | |
269 uint32_t lo = (9 * LO_PAIR(c10) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAI
R(c01)) >> 4; | |
270 uint32_t hi = (9 * HI_PAIR(c10) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAI
R(c01)) >> 4; | |
271 return COMBINE(lo, hi); | |
272 } | |
273 static unsigned bilerptr32(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
274 uint32_t c00 = *a00; | |
275 uint32_t c01 = *a01; | |
276 uint32_t c10 = *a10; | |
277 uint32_t c11 = *a11; | |
278 uint32_t lo = (3 * (LO_PAIR(c10) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c0
1)) >> 3; | |
279 uint32_t hi = (3 * (HI_PAIR(c10) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c0
1)) >> 3; | |
280 return COMBINE(lo, hi); | |
281 } | |
282 static unsigned bilerptr33(const uint32_t* a00, const uint32_t* a01, const uint3
2_t* a10, const uint32_t* a11) { | |
283 uint32_t c00 = *a00; | |
284 uint32_t c01 = *a01; | |
285 uint32_t c10 = *a10; | |
286 uint32_t c11 = *a11; | |
287 uint32_t lo = (9 * LO_PAIR(c11) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAI
R(c00)) >> 4; | |
288 uint32_t hi = (9 * HI_PAIR(c11) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAI
R(c00)) >> 4; | |
289 return COMBINE(lo, hi); | |
290 } | |
291 | |
292 static const SkFilterPtrProc gBilerpPtrProcs[4 * 4] = { | |
293 bilerptr00, bilerptr01, bilerptr02, bilerptr03, | |
294 bilerptr10, bilerptr11, bilerptr12, bilerptr13, | |
295 bilerptr20, bilerptr21, bilerptr22, bilerptr23, | |
296 bilerptr30, bilerptr31, bilerptr32, bilerptr33 | |
297 }; | |
298 | |
299 const SkFilterPtrProc* SkGetBilinearFilterPtrProcTable() | |
300 { | |
301 return gBilerpPtrProcs; | |
302 } | |
303 | |
OLD | NEW |