• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
bilerp00(unsigned a00,unsigned a01,unsigned a10,unsigned a11)24 static unsigned bilerp00(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return a00; }
bilerp01(unsigned a00,unsigned a01,unsigned a10,unsigned a11)25 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)26 static unsigned bilerp02(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + a01) >> 1; }
bilerp03(unsigned a00,unsigned a01,unsigned a10,unsigned a11)27 static unsigned bilerp03(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + 3 * a01) >> 2; }
28 
bilerp10(unsigned a00,unsigned a01,unsigned a10,unsigned a11)29 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)30 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)31 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)32 static unsigned bilerp13(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (9 * a01 + 3 * (a00 + a11) + a10) >> 4; }
33 
bilerp20(unsigned a00,unsigned a01,unsigned a10,unsigned a11)34 static unsigned bilerp20(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + a10) >> 1; }
bilerp21(unsigned a00,unsigned a01,unsigned a10,unsigned a11)35 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)36 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)37 static unsigned bilerp23(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a01 + a11) + a00 + a10) >> 3; }
38 
bilerp30(unsigned a00,unsigned a01,unsigned a10,unsigned a11)39 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)40 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)41 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)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 
SkGetBilinearFilterProcTable()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 
bilerp4_00(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)66 static unsigned bilerp4_00(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
67     return c00;
68 }
bilerp4_01(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)69 static unsigned bilerp4_01(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
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 }
bilerp4_02(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)74 static unsigned bilerp4_02(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
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 }
bilerp4_03(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)79 static unsigned bilerp4_03(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
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 
bilerp4_10(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)85 static unsigned bilerp4_10(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
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 }
bilerp4_11(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)90 static unsigned bilerp4_11(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
91     uint32_t lo = (9 * LO_PAIR(c00) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c11)) >> 4;
92     uint32_t hi = (9 * HI_PAIR(c00) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c11)) >> 4;
93     return COMBINE(lo, hi);
94 }
bilerp4_12(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)95 static unsigned bilerp4_12(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
96     uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c01)) + LO_PAIR(c10) + LO_PAIR(c11)) >> 3;
97     uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c01)) + HI_PAIR(c10) + HI_PAIR(c11)) >> 3;
98     return COMBINE(lo, hi);
99 }
bilerp4_13(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)100 static unsigned bilerp4_13(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
101     uint32_t lo = (9 * LO_PAIR(c01) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c10)) >> 4;
102     uint32_t hi = (9 * HI_PAIR(c01) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c10)) >> 4;
103     return COMBINE(lo, hi);
104 }
105 
bilerp4_20(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)106 static unsigned bilerp4_20(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
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 }
bilerp4_21(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)111 static unsigned bilerp4_21(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
112     uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c10)) + LO_PAIR(c01) + LO_PAIR(c11)) >> 3;
113     uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c10)) + HI_PAIR(c01) + HI_PAIR(c11)) >> 3;
114     return COMBINE(lo, hi);
115 }
bilerp4_22(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)116 static unsigned bilerp4_22(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
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 }
bilerp4_23(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)121 static unsigned bilerp4_23(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
122     uint32_t lo = (3 * (LO_PAIR(c01) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c10)) >> 3;
123     uint32_t hi = (3 * (HI_PAIR(c01) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c10)) >> 3;
124     return COMBINE(lo, hi);
125 }
126 
bilerp4_30(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)127 static unsigned bilerp4_30(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
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 }
bilerp4_31(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)132 static unsigned bilerp4_31(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
133     uint32_t lo = (9 * LO_PAIR(c10) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c01)) >> 4;
134     uint32_t hi = (9 * HI_PAIR(c10) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c01)) >> 4;
135     return COMBINE(lo, hi);
136 }
bilerp4_32(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)137 static unsigned bilerp4_32(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
138     uint32_t lo = (3 * (LO_PAIR(c10) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c01)) >> 3;
139     uint32_t hi = (3 * (HI_PAIR(c10) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c01)) >> 3;
140     return COMBINE(lo, hi);
141 }
bilerp4_33(uint32_t c00,uint32_t c01,uint32_t c10,uint32_t c11)142 static unsigned bilerp4_33(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
143     uint32_t lo = (9 * LO_PAIR(c11) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c00)) >> 4;
144     uint32_t hi = (9 * HI_PAIR(c11) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(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 
SkGetFilter32ProcTable()155 const SkFilter32Proc* SkGetFilter32ProcTable()
156 {
157     return gBilerp32Procs;
158 }
159 
160 ///////////////////////////////////////////////////////////////////////////////
161 
bilerptr00(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)162 static unsigned bilerptr00(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
163     return *a00;
164 }
bilerptr01(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)165 static unsigned bilerptr01(const uint32_t* a00, const uint32_t* a01, const uint32_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 }
bilerptr02(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)172 static unsigned bilerptr02(const uint32_t* a00, const uint32_t* a01, const uint32_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 }
bilerptr03(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)179 static unsigned bilerptr03(const uint32_t* a00, const uint32_t* a01, const uint32_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 
bilerptr10(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)187 static unsigned bilerptr10(const uint32_t* a00, const uint32_t* a01, const uint32_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 }
bilerptr11(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)194 static unsigned bilerptr11(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 = (9 * LO_PAIR(c00) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c11)) >> 4;
200     uint32_t hi = (9 * HI_PAIR(c00) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c11)) >> 4;
201     return COMBINE(lo, hi);
202 }
bilerptr12(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)203 static unsigned bilerptr12(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 = (3 * (LO_PAIR(c00) + LO_PAIR(c01)) + LO_PAIR(c10) + LO_PAIR(c11)) >> 3;
209     uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c01)) + HI_PAIR(c10) + HI_PAIR(c11)) >> 3;
210     return COMBINE(lo, hi);
211 }
bilerptr13(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)212 static unsigned bilerptr13(const uint32_t* a00, const uint32_t* a01, const uint32_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_PAIR(c10)) >> 4;
218     uint32_t hi = (9 * HI_PAIR(c01) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c10)) >> 4;
219     return COMBINE(lo, hi);
220 }
221 
bilerptr20(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)222 static unsigned bilerptr20(const uint32_t* a00, const uint32_t* a01, const uint32_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 }
bilerptr21(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)229 static unsigned bilerptr21(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 = (3 * (LO_PAIR(c00) + LO_PAIR(c10)) + LO_PAIR(c01) + LO_PAIR(c11)) >> 3;
235     uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c10)) + HI_PAIR(c01) + HI_PAIR(c11)) >> 3;
236     return COMBINE(lo, hi);
237 }
bilerptr22(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)238 static unsigned bilerptr22(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 = (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 }
bilerptr23(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)247 static unsigned bilerptr23(const uint32_t* a00, const uint32_t* a01, const uint32_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(c10)) >> 3;
253     uint32_t hi = (3 * (HI_PAIR(c01) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c10)) >> 3;
254     return COMBINE(lo, hi);
255 }
256 
bilerptr30(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)257 static unsigned bilerptr30(const uint32_t* a00, const uint32_t* a01, const uint32_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 }
bilerptr31(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)264 static unsigned bilerptr31(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 = (9 * LO_PAIR(c10) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c01)) >> 4;
270     uint32_t hi = (9 * HI_PAIR(c10) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c01)) >> 4;
271     return COMBINE(lo, hi);
272 }
bilerptr32(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)273 static unsigned bilerptr32(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 = (3 * (LO_PAIR(c10) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c01)) >> 3;
279     uint32_t hi = (3 * (HI_PAIR(c10) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c01)) >> 3;
280     return COMBINE(lo, hi);
281 }
bilerptr33(const uint32_t * a00,const uint32_t * a01,const uint32_t * a10,const uint32_t * a11)282 static unsigned bilerptr33(const uint32_t* a00, const uint32_t* a01, const uint32_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_PAIR(c00)) >> 4;
288     uint32_t hi = (9 * HI_PAIR(c11) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(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 
SkGetBilinearFilterPtrProcTable()299 const SkFilterPtrProc* SkGetBilinearFilterPtrProcTable()
300 {
301     return gBilerpPtrProcs;
302 }
303 
304