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
bilerp00(unsigned a00,unsigned a01,unsigned a10,unsigned a11)15 static unsigned bilerp00(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return a00; }
bilerp01(unsigned a00,unsigned a01,unsigned a10,unsigned a11)16 static unsigned bilerp01(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * a00 + a01) >> 2; }
bilerp02(unsigned a00,unsigned a01,unsigned a10,unsigned a11)17 static unsigned bilerp02(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + a01) >> 1; }
bilerp03(unsigned a00,unsigned a01,unsigned a10,unsigned a11)18 static unsigned bilerp03(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + 3 * a01) >> 2; }
19
bilerp10(unsigned a00,unsigned a01,unsigned a10,unsigned a11)20 static unsigned bilerp10(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * a00 + a10) >> 2; }
bilerp11(unsigned a00,unsigned a01,unsigned a10,unsigned a11)21 static unsigned bilerp11(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (9 * a00 + 3 * (a01 + a10) + a11) >> 4; }
bilerp12(unsigned a00,unsigned a01,unsigned a10,unsigned a11)22 static unsigned bilerp12(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a00 + a01) + a10 + a11) >> 3; }
bilerp13(unsigned a00,unsigned a01,unsigned a10,unsigned a11)23 static unsigned bilerp13(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (9 * a01 + 3 * (a00 + a11) + a10) >> 4; }
24
bilerp20(unsigned a00,unsigned a01,unsigned a10,unsigned a11)25 static unsigned bilerp20(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + a10) >> 1; }
bilerp21(unsigned a00,unsigned a01,unsigned a10,unsigned a11)26 static unsigned bilerp21(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a00 + a10) + a01 + a11) >> 3; }
bilerp22(unsigned a00,unsigned a01,unsigned a10,unsigned a11)27 static unsigned bilerp22(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + a01 + a10 + a11) >> 2; }
bilerp23(unsigned a00,unsigned a01,unsigned a10,unsigned a11)28 static unsigned bilerp23(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a01 + a11) + a00 + a10) >> 3; }
29
bilerp30(unsigned a00,unsigned a01,unsigned a10,unsigned a11)30 static unsigned bilerp30(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + 3 * a10) >> 2; }
bilerp31(unsigned a00,unsigned a01,unsigned a10,unsigned a11)31 static unsigned bilerp31(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (9 * a10 + 3 * (a00 + a11) + a01) >> 4; }
bilerp32(unsigned a00,unsigned a01,unsigned a10,unsigned a11)32 static unsigned bilerp32(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a10 + a11) + a00 + a01) >> 3; }
bilerp33(unsigned a00,unsigned a01,unsigned a10,unsigned a11)33 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
SkGetBilinearFilterProcTable()42 const SkFilterProc* SkGetBilinearFilterProcTable()
43 {
44 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
bilerp4_00(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)57 static unsigned bilerp4_00(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
58 return c00;
59 }
bilerp4_01(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)60 static unsigned bilerp4_01(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
61 uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c01)) >> 2;
62 uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c01)) >> 2;
63 return COMBINE(lo, hi);
64 }
bilerp4_02(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)65 static unsigned bilerp4_02(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
66 uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01)) >> 1;
67 uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01)) >> 1;
68 return COMBINE(lo, hi);
69 }
bilerp4_03(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)70 static unsigned bilerp4_03(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
71 uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c01)) >> 2;
72 uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c01)) >> 2;
73 return COMBINE(lo, hi);
74 }
75
bilerp4_10(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)76 static unsigned bilerp4_10(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
77 uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c10)) >> 2;
78 uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c10)) >> 2;
79 return COMBINE(lo, hi);
80 }
bilerp4_11(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)81 static unsigned bilerp4_11(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
82 uint32_t lo = (9 * LO_PAIR(c00) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c11)) >> 4;
83 uint32_t hi = (9 * HI_PAIR(c00) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c11)) >> 4;
84 return COMBINE(lo, hi);
85 }
bilerp4_12(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)86 static unsigned bilerp4_12(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
87 uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c01)) + LO_PAIR(c10) + LO_PAIR(c11)) >> 3;
88 uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c01)) + HI_PAIR(c10) + HI_PAIR(c11)) >> 3;
89 return COMBINE(lo, hi);
90 }
bilerp4_13(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)91 static unsigned bilerp4_13(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
92 uint32_t lo = (9 * LO_PAIR(c01) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c10)) >> 4;
93 uint32_t hi = (9 * HI_PAIR(c01) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c10)) >> 4;
94 return COMBINE(lo, hi);
95 }
96
bilerp4_20(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)97 static unsigned bilerp4_20(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
98 uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c10)) >> 1;
99 uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c10)) >> 1;
100 return COMBINE(lo, hi);
101 }
bilerp4_21(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)102 static unsigned bilerp4_21(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
103 uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c10)) + LO_PAIR(c01) + LO_PAIR(c11)) >> 3;
104 uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c10)) + HI_PAIR(c01) + HI_PAIR(c11)) >> 3;
105 return COMBINE(lo, hi);
106 }
bilerp4_22(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)107 static unsigned bilerp4_22(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
108 uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01) + LO_PAIR(c10) + LO_PAIR(c11)) >> 2;
109 uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01) + HI_PAIR(c10) + HI_PAIR(c11)) >> 2;
110 return COMBINE(lo, hi);
111 }
bilerp4_23(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)112 static unsigned bilerp4_23(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
113 uint32_t lo = (3 * (LO_PAIR(c01) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c10)) >> 3;
114 uint32_t hi = (3 * (HI_PAIR(c01) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c10)) >> 3;
115 return COMBINE(lo, hi);
116 }
117
bilerp4_30(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)118 static unsigned bilerp4_30(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
119 uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c10)) >> 2;
120 uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c10)) >> 2;
121 return COMBINE(lo, hi);
122 }
bilerp4_31(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)123 static unsigned bilerp4_31(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
124 uint32_t lo = (9 * LO_PAIR(c10) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c01)) >> 4;
125 uint32_t hi = (9 * HI_PAIR(c10) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c01)) >> 4;
126 return COMBINE(lo, hi);
127 }
bilerp4_32(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)128 static unsigned bilerp4_32(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
129 uint32_t lo = (3 * (LO_PAIR(c10) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c01)) >> 3;
130 uint32_t hi = (3 * (HI_PAIR(c10) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c01)) >> 3;
131 return COMBINE(lo, hi);
132 }
bilerp4_33(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)133 static unsigned bilerp4_33(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
134 uint32_t lo = (9 * LO_PAIR(c11) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c00)) >> 4;
135 uint32_t hi = (9 * HI_PAIR(c11) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c00)) >> 4;
136 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
SkGetFilter32ProcTable()146 const SkFilter32Proc* SkGetFilter32ProcTable()
147 {
148 return gBilerp32Procs;
149 }
150
151 ///////////////////////////////////////////////////////////////////////////////
152
bilerptr00(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)153 static uint32_t bilerptr00(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
154 return *a00;
155 }
bilerptr01(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)156 static uint32_t bilerptr01(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
157 uint32_t c00 = *a00;
158 uint32_t c01 = *a01;
159 uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c01)) >> 2;
160 uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c01)) >> 2;
161 return COMBINE(lo, hi);
162 }
bilerptr02(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)163 static uint32_t bilerptr02(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
164 uint32_t c00 = *a00;
165 uint32_t c01 = *a01;
166 uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01)) >> 1;
167 uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01)) >> 1;
168 return COMBINE(lo, hi);
169 }
bilerptr03(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)170 static uint32_t bilerptr03(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
171 uint32_t c00 = *a00;
172 uint32_t c01 = *a01;
173 uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c01)) >> 2;
174 uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c01)) >> 2;
175 return COMBINE(lo, hi);
176 }
177
bilerptr10(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)178 static uint32_t bilerptr10(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
179 uint32_t c00 = *a00;
180 uint32_t c10 = *a10;
181 uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c10)) >> 2;
182 uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c10)) >> 2;
183 return COMBINE(lo, hi);
184 }
bilerptr11(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)185 static uint32_t bilerptr11(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
186 uint32_t c00 = *a00;
187 uint32_t c01 = *a01;
188 uint32_t c10 = *a10;
189 uint32_t c11 = *a11;
190 uint32_t lo = (9 * LO_PAIR(c00) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c11)) >> 4;
191 uint32_t hi = (9 * HI_PAIR(c00) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c11)) >> 4;
192 return COMBINE(lo, hi);
193 }
bilerptr12(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)194 static uint32_t bilerptr12(const uint32_t* a00, const uint32_t* a01, const uint32_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 = (3 * (LO_PAIR(c00) + LO_PAIR(c01)) + LO_PAIR(c10) + LO_PAIR(c11)) >> 3;
200 uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c01)) + HI_PAIR(c10) + HI_PAIR(c11)) >> 3;
201 return COMBINE(lo, hi);
202 }
bilerptr13(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)203 static uint32_t bilerptr13(const uint32_t* a00, const uint32_t* a01, const uint32_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 = (9 * LO_PAIR(c01) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c10)) >> 4;
209 uint32_t hi = (9 * HI_PAIR(c01) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c10)) >> 4;
210 return COMBINE(lo, hi);
211 }
212
bilerptr20(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)213 static uint32_t bilerptr20(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
214 uint32_t c00 = *a00;
215 uint32_t c10 = *a10;
216 uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c10)) >> 1;
217 uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c10)) >> 1;
218 return COMBINE(lo, hi);
219 }
bilerptr21(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)220 static uint32_t bilerptr21(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
221 uint32_t c00 = *a00;
222 uint32_t c01 = *a01;
223 uint32_t c10 = *a10;
224 uint32_t c11 = *a11;
225 uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c10)) + LO_PAIR(c01) + LO_PAIR(c11)) >> 3;
226 uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c10)) + HI_PAIR(c01) + HI_PAIR(c11)) >> 3;
227 return COMBINE(lo, hi);
228 }
bilerptr22(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)229 static uint32_t bilerptr22(const uint32_t* a00, const uint32_t* a01, const uint32_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 = (LO_PAIR(c00) + LO_PAIR(c01) + LO_PAIR(c10) + LO_PAIR(c11)) >> 2;
235 uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01) + HI_PAIR(c10) + HI_PAIR(c11)) >> 2;
236 return COMBINE(lo, hi);
237 }
bilerptr23(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)238 static uint32_t bilerptr23(const uint32_t* a00, const uint32_t* a01, const uint32_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 = (3 * (LO_PAIR(c01) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c10)) >> 3;
244 uint32_t hi = (3 * (HI_PAIR(c01) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c10)) >> 3;
245 return COMBINE(lo, hi);
246 }
247
bilerptr30(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)248 static uint32_t bilerptr30(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
249 uint32_t c00 = *a00;
250 uint32_t c10 = *a10;
251 uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c10)) >> 2;
252 uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c10)) >> 2;
253 return COMBINE(lo, hi);
254 }
bilerptr31(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)255 static uint32_t bilerptr31(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
256 uint32_t c00 = *a00;
257 uint32_t c01 = *a01;
258 uint32_t c10 = *a10;
259 uint32_t c11 = *a11;
260 uint32_t lo = (9 * LO_PAIR(c10) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c01)) >> 4;
261 uint32_t hi = (9 * HI_PAIR(c10) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c01)) >> 4;
262 return COMBINE(lo, hi);
263 }
bilerptr32(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)264 static uint32_t bilerptr32(const uint32_t* a00, const uint32_t* a01, const uint32_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 = (3 * (LO_PAIR(c10) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c01)) >> 3;
270 uint32_t hi = (3 * (HI_PAIR(c10) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c01)) >> 3;
271 return COMBINE(lo, hi);
272 }
bilerptr33(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)273 static uint32_t bilerptr33(const uint32_t* a00, const uint32_t* a01, const uint32_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 = (9 * LO_PAIR(c11) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c00)) >> 4;
279 uint32_t hi = (9 * HI_PAIR(c11) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c00)) >> 4;
280 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
SkGetBilinearFilterPtrProcTable()290 const SkFilterPtrProc* SkGetBilinearFilterPtrProcTable()
291 {
292 return gBilerpPtrProcs;
293 }
294