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