~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Open Mash Cross Reference
mash/codec/p64/addblkf.cc

Component: ~ [ mash ] ~ [ apps ] ~ [ gsm ] ~ [ lib ] ~ [ otcl ] ~ [ srm ] ~ [ tcl8.3 ] ~ [ tclcl ] ~ [ tk8.3 ] ~ [ tutorials ] ~

  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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.