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)
27 int bits
, mask
, roundbit
, addbit
;
31 if( argc
!= 2 && argc
!= 3) {
32 fprintf(stderr
, "Usage: squash factor [bits]\n");
35 factor
= atoi(argv
[1]);
38 mask
= (1 << bits
) - 1;
40 roundbit
= 1 << (7-bits
);
41 addbit
= 1 << (8-bits
);
42 fprintf(stderr
, "%x %x %x\n", mask
, roundbit
, addbit
);
49 if ( strncmp( lbuf
, "CMIF", 4) == 0 ) {
52 if( sscanf(lbuf
, "(%d,%d,%d)", &w
, &h
, &pf
) != 3) {
53 fprintf(stderr
, "%s: bad size spec: %s\n", argv
[0], lbuf
);
57 fprintf(stderr
, "%s: packed file\n", argv
[0]);
61 if ( sscanf(lbuf
, "(%d,%d)", &w
, &h
) != 2) {
62 fprintf(stderr
, "%s: bad size spec: %s\n", argv
[0], lbuf
);
69 printf("CMIF video 1.0\n(%d,%d,%d)\n", nw
, nh
, 0);
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]);
76 if ( (nbm
= (long *)malloc(nh
*nw
*sizeof(long))) == 0) {
77 fprintf(stderr
, "%s: No memory\n", argv
[0]);
80 while( !feof(stdin
) ) {
83 if ( feof(stdin
) ) break;
84 if ( sscanf(lbuf
, "%d,%d", &t
,&s
) == 2) {
86 fprintf(stderr
, "Size changed from %d to %d: %s\n",4*h
*w
,s
, lbuf
);
89 printf("%d, %d\n", t
, nh
*nw
*4);
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],
101 for( y
=0; y
<nh
; y
++) {
102 for ( x
=0; x
<nw
; x
++) {
105 for( xi
=0; xi
<factor
; xi
++ ) {
106 for(yi
=0; yi
<factor
; yi
++) {
107 if ( y
*factor
+yi
< h
&& x
*factor
+xi
< w
) {
109 data
= BM(x
,xi
,y
,yi
);
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
);
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
);