1 /*
2 * addblkf.cc --
3 *
4 * FIXME: This file needs a description here.
5 *
6 * Copyright (c) 1996-2002 The Regents of the University of California.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 * A. Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
14 * B. Redistributions in binary form must reproduce the above copyright notice,
15 * this list of conditions and the following disclaimer in the documentation
16 * and/or other materials provided with the distribution.
17 * C. Neither the names of the copyright holders nor the names of its
18 * contributors may be used to endorse or promote products derived from this
19 * software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
22 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 #include <osfcn.h>
35 #include <sys/types.h>
36 #include "endian.h"
37 #define UCLIMIT(x) ((t = (x)), (t &= ~(t>>31)), (t | ~((t-256) >> 31)))
38 #if BYTE_ORDER == LITTLE_ENDIAN
39 #define SPLICE_PIXEL(o, pix, pos) ((o) |= (pix) << (24 - (pos)))
40 #else
41 #define SPLICE_PIXEL(o, pix, pos) ((o) |= (pix) << (pos))
42 #endif
43
44 void addblkf_good(int dc, short* blk, u_char* in,
45 u_char* out, u_int stride)
46 {
47 int t[64];
48 /* corners */
49 t[0] = in[0] << 4;
50 t[7] = in[7] << 4;
51 t[56] = in[7 * stride] << 4;
52 t[63] = in[7 * stride + 7] << 4;
53 /* edges */
54 for (int i = 1; i < 7; ++i) {
55 t[i] = (in[i - 1] + (in[i] << 1) + in[i + 1]) << 2;
56 t[i * 8] = (in[(i - 1) * stride] +
57 (in[i * stride] << 1) +
58 in[(i + 1) * stride]) << 2;
59 t[7 * 8 + i] = (in[7 * stride + i - 1] +
60 (in[7 * stride + i] << 1) +
61 in[7 * stride + i + 1]) << 2;
62 t[i * 8 + 7] = (in[(i - 1) * stride + 7] +
63 (in[i * stride + 7] << 1) +
64 in[(i + 1) * stride + 7]) << 2;
65 }
66 /* internal */
67 for (i = 1; i < 7; ++i) {
68 for (int j = 1; j < 7; ++j) {
69 t[i * 8 + j] =
70 in[(i - 1) * stride + j - 1] +
71 (in[(i - 1) * stride + j] << 1) +
72 in[(i - 1) * stride + j + 1] +
73 (in[i * stride + j - 1] << 1) +
74 (in[i * stride + j] << 2) +
75 (in[i * stride + j + 1] << 1) +
76 in[(i + 1) * stride + j - 1] +
77 (in[(i + 1) * stride + j] << 1) +
78 in[(i + 1) * stride + j + 1];
79 }
80 }
81 int* p = t;
82 for (i = 0; i < 8; i++) {
83 for (int j = 0; j < 8; j++) {
84 int t;
85 int v = *p++;
86 v += 8;
87 v >>= 4;
88 v += *blk++ + dc;
89 out[j] = UCLIMIT(v);
90 }
91 out += stride;
92 }
93 }
94
95 void addblkf(int dc, short* blk, u_char* in,
96 u_char* out, u_int stride)
97 {
98 int t;
99
100 /* Corner pixel has filter coef 1 */
101 u_int s = in[0];
102 u_int o = 0;
103 SPLICE_PIXEL(o, UCLIMIT(s + blk[0] + dc) & 0xff, 24);
104
105 u_int r00 = s << 24 | in[1] << 16 | in[2] << 8 | in[3];
106 u_int r01 = in[4] << 24 | in[5] << 16 | in[6] << 8 | in[7];
107 in += stride;
108
109 /*
110 * First row.
111 */
112 s += (r00 >> 15) & 0x1fe;
113 s += (r00 >> 8) & 0xff;
114 /* round */
115 s += 2;
116 s >>= 2;
117 s = UCLIMIT(s + blk[1] + dc) & 0xff;
118 SPLICE_PIXEL(o, s, 16);
119
120 s = (r00 >> 16) & 0xff;
121 s += (r00 >> 7) & 0x1fe;
122 s += r00 & 0xff;
123 /* round */
124 s += 2;
125 s >>= 2;
126 s = UCLIMIT(s + blk[2] + dc) & 0xff;
127 SPLICE_PIXEL(o, s, 8);
128
129 s = (r00 >> 8) & 0xff;
130 s += (r00 & 0xff) << 1;
131 s += r01 >> 24;
132 /* round */
133 s += 2;
134 s >>= 2;
135 s = UCLIMIT(s + blk[3] + dc) & 0xff;
136 SPLICE_PIXEL(o, s, 0);
137 *(u_int*)out = o;
138
139 s = r00 & 0xff;
140 s += (r01 >> 23) & 0x1fe;
141 s += (r01 >> 16) & 0xff;
142 /* round */
143 s += 2;
144 s >>= 2;
145 s = UCLIMIT(s + blk[4] + dc) & 0xff;
146 o = 0;
147 SPLICE_PIXEL(o, s, 24);
148
149 s = r01 >> 24;
150 s += (r01 >> 15) & 0x1fe;
151 s += (r01 >> 8) & 0xff;
152 /* round */
153 s += 2;
154 s >>= 2;
155 s = UCLIMIT(s + blk[5] + dc) & 0xff;
156 SPLICE_PIXEL(o, s, 16);
157
158 s = (r01 >> 16) & 0xff;
159 s += (r01 >> 7) & 0x1fe;
160 s += r01 & 0xff;
161 /* round */
162 s += 2;
163 s >>= 2;
164 s = UCLIMIT(s + blk[6] + dc) & 0xff;
165 SPLICE_PIXEL(o, s, 8);
166
167 /* corner has filter coef 1 */
168 s = r01 & 0xff;
169 s = UCLIMIT(s + blk[7] + dc) & 0xff;
170 SPLICE_PIXEL(o, s, 0);
171 *(u_int*)(out + 4) = o;
172 out += stride;
173 blk += 8;
174
175 /* load next rows into cache */
176 u_int r10 = in[0] << 24 | in[1] << 16 | in[2] << 8 | in[3];
177 u_int r11 = in[4] << 24 | in[5] << 16 | in[6] << 8 | in[7];
178 in += stride;
179
180 u_int r20, r21;
181 u_int mask = 0xff00ff;
182 for (int k = 6; --k >= 0; ) {
183 /* load next row */
184 r20 = in[0] << 24 | in[1] << 16 | in[2] << 8 | in[3];
185 r21 = in[4] << 24 | in[5] << 16 | in[6] << 8 | in[7];
186 in += stride;
187
188 /* columns 0,2 */
189 u_int v = (r00 >> 8) & mask;
190 v += ((r10 >> 8) & mask) << 1;
191 v += (r20 >> 8) & mask;
192
193 /* first pixel */
194 s = v >> 16;
195 /* round */
196 s += 2;
197 s >>= 2;
198 s = UCLIMIT(s + blk[0] + dc) & 0xff;
199 o = 0;
200 SPLICE_PIXEL(o, s, 24);
201
202 /* columns 1,3 */
203 u_int w = r00 & mask;
204 w += (r10 & mask) << 1;
205 w += r20 & mask;
206
207 /* row */
208 s = v >> 16;
209 s += v & 0xffff;
210 s += w >> (16-1);
211 /* round */
212 s += 8;
213 s >>= 4;
214 s = UCLIMIT(s + blk[1] + dc) & 0xff;
215 SPLICE_PIXEL(o, s, 16);
216
217 s = w >> 16;
218 s += w & 0xffff;
219 s += (v & 0xffff) << 1;
220 /* round */
221 s += 8;
222 s >>= 4;
223 s = UCLIMIT(s + blk[2] + dc) & 0xff;
224 SPLICE_PIXEL(o, s, 8);
225
226 /* start next row */
227 s = v & 0xffff;
228 s += (w & 0xffff) << 1;
229 /* but first do columns 4,6 */
230 v = (r01 >> 8) & mask;
231 v += ((r11 >> 8) & mask) << 1;
232 v += (r21 >> 8) & mask;
233 /* finish row */
234 s += v >> 16;
235 /* round */
236 s += 8;
237 s >>= 4;
238 s = UCLIMIT(s + blk[3] + dc) & 0xff;
239 SPLICE_PIXEL(o, s, 0);
240 *(u_int*)out = o;
241
242 /* start next row */
243 s = w & 0xffff;
244 s += (v >> 16) << 1;
245 /* but first do columns 5,7 */
246 w = r01 & mask;
247 w += (r11 & mask) << 1;
248 w += r21 & mask;
249 /* finish row */
250 s += w >> 16;
251 /* round */
252 s += 8;
253 s >>= 4;
254 s = UCLIMIT(s + blk[4] + dc) & 0xff;
255 o = 0;
256 SPLICE_PIXEL(o, s, 24);
257
258 s = v >> 16;
259 s += v & 0xffff;
260 s += w >> (16-1);
261 /* round */
262 s += 8;
263 s >>= 4;
264 s = UCLIMIT(s + blk[5] + dc) & 0xff;
265 SPLICE_PIXEL(o, s, 16);
266
267 s = w >> 16;
268 s += w & 0xffff;
269 s += (v & 0xffff) << 1;
270 /* round */
271 s += 8;
272 s >>= 4;
273 s = UCLIMIT(s + blk[6] + dc) & 0xff;
274 SPLICE_PIXEL(o, s, 8);
275
276 s = w & 0xffff;
277 /* round */
278 s += 2;
279 s >>= 2;
280 s = UCLIMIT(s + blk[7] + dc) & 0xff;
281 SPLICE_PIXEL(o, s, 0);
282 *(u_int*)(out + 4) = o;
283
284 out += stride;
285 blk += 8;
286
287 /* roll lines up cache */
288 r00 = r10;
289 r01 = r11;
290 r10 = r20;
291 r11 = r21;
292 }
293 /*
294 * last row
295 */
296 s = r20 >> 24;
297 o = 0;
298 SPLICE_PIXEL(o, UCLIMIT(s + blk[0] + dc) & 0xff, 24);
299
300 s += (r20 >> 15) & 0x1fe;
301 s += (r20 >> 8) & 0xff;
302 /* round */
303 s += 2;
304 s >>= 2;
305 s = UCLIMIT(s + blk[1] + dc) & 0xff;
306 SPLICE_PIXEL(o, s, 16);
307
308 s = (r20 >> 16) & 0xff;
309 s += (r20 >> 7) & 0x1fe;
310 s += r20 & 0xff;
311 /* round */
312 s += 2;
313 s >>= 2;
314 s = UCLIMIT(s + blk[2] + dc) & 0xff;
315 SPLICE_PIXEL(o, s, 8);
316
317 s = (r20 >> 8) & 0xff;
318 s += (r20 & 0xff) << 1;
319 s += r21 >> 24;
320 /* round */
321 s += 2;
322 s >>= 2;
323 s = UCLIMIT(s + blk[3] + dc) & 0xff;
324 SPLICE_PIXEL(o, s, 0);
325 *(u_int*)out = o;
326
327 s = r20 & 0xff;
328 s += (r21 >> 23) & 0x1fe;
329 s += (r21 >> 16) & 0xff;
330 /* round */
331 s += 2;
332 s >>= 2;
333 s = UCLIMIT(s + blk[4] + dc) & 0xff;
334 o = 0;
335 SPLICE_PIXEL(o, s, 24);
336
337 s = r21 >> 24;
338 s += (r21 >> 15) & 0x1fe;
339 s += (r21 >> 8) & 0xff;
340 /* round */
341 s += 2;
342 s >>= 2;
343 s = UCLIMIT(s + blk[5] + dc) & 0xff;
344 SPLICE_PIXEL(o, s, 16);
345
346 s = (r21 >> 16) & 0xff;
347 s += (r21 >> 7) & 0x1fe;
348 s += r21 & 0xff;
349 /* round */
350 s += 2;
351 s >>= 2;
352 s = UCLIMIT(s + blk[6] + dc) & 0xff;
353 SPLICE_PIXEL(o, s, 8);
354
355 /* corner has filter coef 1 */
356 s = r21 & 0xff;
357 s = UCLIMIT(s + blk[7] + dc) & 0xff;
358 SPLICE_PIXEL(o, s, 0);
359 *(u_int*)(out + 4) = o;
360 }
361
362 main(int argc, char** argv)
363 {
364 u_char in[64];
365 u_char out[64];
366 short blk[64];
367
368 if (argc != 2)
369 exit(1);
370
371 for (int i = 0; i < 64; ++i) {
372 in[i] = 10;
373 out[i] = 255;
374 blk[i] = 10;
375 }
376 if (argv[1][0] == 'w')
377 addblkf_good(0, blk, in, out, 8);
378 else
379 addblkf(0, blk, in, out, 8);
380
381 u_char* p = out;
382 for (i = 0; i < 8; ++i) {
383 for (int j = 0; j < 8; ++j)
384 printf("%d\t", *p++);
385 printf("\n");
386 }
387 return (0);
388 }
389
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.