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