Fix three PyChecker-detected gotchas.
[python/dscho.git] / Demo / sgi / video / squash.c
blobd5ea94692495541c590fb6dfe15e303fc12ddd0b
1 #include <stdio.h>
3 long *bm;
4 long h, w;
5 long factor;
7 #define OC(x,xi) ((x)*factor+(xi))
8 #define BM(x,xi,y,yi) bm[OC(y,yi)*w+OC(x,xi)]
10 #define COMP(r,g,b) ((r) | ((g)<<8) | ((b) << 16))
12 #define R(comp) ((comp) & 0xff)
13 #define G(comp) (((comp)>>8) & 0xff)
14 #define B(comp) (((comp)>>16) & 0xff)
16 main(argc, argv)
17 char **argv;
19 char lbuf[100];
20 int nh, nw;
21 int x, y, xi, yi;
22 int num;
23 int r, g, b;
24 long data;
25 long *nbm, *nbmp;
26 int i;
27 int bits, mask, roundbit, addbit;
28 int pf;
29 int newfmt = 0;
31 if( argc != 2 && argc != 3) {
32 fprintf(stderr, "Usage: squash factor [bits]\n");
33 exit(1);
35 factor = atoi(argv[1]);
36 if ( argc > 2 ) {
37 bits = atoi(argv[2]);
38 mask = (1 << bits) - 1;
39 mask <<= (8-bits);
40 roundbit = 1 << (7-bits);
41 addbit = 1 << (8-bits);
42 fprintf(stderr, "%x %x %x\n", mask, roundbit, addbit);
43 } else {
44 mask = 0xff;
45 roundbit = 0;
46 addbit = 0;
48 gets(lbuf);
49 if ( strncmp( lbuf, "CMIF", 4) == 0 ) {
50 newfmt = 1;
51 gets(lbuf);
52 if( sscanf(lbuf, "(%d,%d,%d)", &w, &h, &pf) != 3) {
53 fprintf(stderr, "%s: bad size spec: %s\n", argv[0], lbuf);
54 exit(1);
56 if ( pf != 0 ) {
57 fprintf(stderr, "%s: packed file\n", argv[0]);
58 exit(1);
60 } else {
61 if ( sscanf(lbuf, "(%d,%d)", &w, &h) != 2) {
62 fprintf(stderr, "%s: bad size spec: %s\n", argv[0], lbuf);
63 exit(1);
66 nh = h / factor;
67 nw = w / factor;
68 if ( newfmt )
69 printf("CMIF video 1.0\n(%d,%d,%d)\n", nw, nh, 0);
70 else
71 printf("(%d,%d)\n", nw, nh);
72 if ( (bm = (long *)malloc(h*w*sizeof(long))) == 0) {
73 fprintf(stderr, "%s: No memory\n", argv[0]);
74 exit(1);
76 if ( (nbm = (long *)malloc(nh*nw*sizeof(long))) == 0) {
77 fprintf(stderr, "%s: No memory\n", argv[0]);
78 exit(1);
80 while( !feof(stdin) ) {
81 { int t, s;
82 gets(lbuf);
83 if ( feof(stdin) ) break;
84 if ( sscanf(lbuf, "%d,%d", &t,&s) == 2) {
85 if ( s != h*w*4 ) {
86 fprintf(stderr, "Size changed from %d to %d: %s\n",4*h*w,s, lbuf);
87 exit(1);
89 printf("%d, %d\n", t, nh*nw*4);
90 } else {
91 puts(lbuf);
94 fprintf(stderr, "Reading %d\n", h*w*sizeof(long));
95 if ( (i=fread(bm, 1, h*w*sizeof(long), stdin)) != h*w*sizeof(long)) {
96 fprintf(stderr, "%s: short read, %d wanted %d\n", argv[0],
97 i, h*w*sizeof(long));
98 exit(1);
100 nbmp = nbm;
101 for( y=0; y<nh; y++) {
102 for ( x=0; x<nw; x++) {
103 r = g = b = 0;
104 num = 0;
105 for( xi=0; xi<factor; xi++ ) {
106 for(yi=0; yi<factor; yi++) {
107 if ( y*factor+yi < h && x*factor+xi < w ) {
108 num++;
109 data = BM(x,xi,y,yi);
110 r += R(data);
111 g += G(data);
112 b += B(data);
114 else fprintf(stderr, "skip %d %d %d %d\n", x, xi, y, yi);
117 r = r/num; g = g/num; b = b/num;
118 if ( (r & mask) != mask && ( r & roundbit) ) r += addbit;
119 if ( (g & mask) != mask && ( g & roundbit) ) g += addbit;
120 if ( (b & mask) != mask && ( b & roundbit) ) b += addbit;
121 data = COMP(r, g, b);
122 *nbmp++ = data;
125 if (nbmp - nbm != nh * nw ) fprintf(stderr, "%d %d\n", nbmp-nbm, nh*nw);
126 fprintf(stderr, "Writing %d\n", (nbmp-nbm)*sizeof(long));
127 fwrite(nbm, 1, (nbmp-nbm)*sizeof(long), stdout);
129 exit(0);