4 * thing.pf.segenco.ppm \
5 * thing.p0.segenco.ppm \
6 * thing.p1.segenco.ppm \
7 * thing.p2.segenco.ppm \
11 * writes resulting composite encoding
22 #define FILES (MOVFEATPOS_BITS+1)
29 typedef unsigned char val;
31 static struct file f[FILES];
32 static int nf, fi, rows=-1, cols;
35 static void badformat(const char *m) {
36 fprintf(stderr,"bad format: %s: row=%d,col=%d:\n %s\n",
37 f[fi].fn, row,col, m);
41 int main(int argc, char **argv) {
43 int trows, tcols, informat;
47 if (!*argv || !*++argv || (*argv)[0]=='-') {
48 fprintf(stderr,"bad usage\n"); exit(12);
54 if (nf >= FILES) { fprintf(stderr,"too many files\n"); exit(12); }
57 f[fi].f= fopen(arg, "rb");
58 if (!f[fi].f) { perror(arg); exit(8); }
60 ppm_readppminit(f[fi].f, &tcols, &trows, &maxval, &informat);
61 if (maxval != 255) badformat("wrong maxval");
62 if (informat != RPPM_FORMAT) badformat("wrong format");
68 if (rows != trows || cols != tcols) badformat("wrong size");
72 ppm_writeppminit(stdout, cols, rows, 255, 0);
74 for (row=0; row<rows; row++)
75 for (col=0; col<cols; col++) {
76 int gotsegnum=-1, gotmovfeatpos=-1;
79 DATUM2ARY(ov, BACKGROUND);
81 for (fi=0; fi<nf; fi++) {
84 int segnum, movfeatpos;
86 if (fread(iv,1,3,f[fi].f)!=3) {
87 if (ferror(f[fi].f)) { perror(f[fi].fn); exit(16); }
88 else badformat("truncated file");
93 if (datum == BACKGROUND)
96 segnum= DATUM2(SEGNUM,datum);
97 movfeatpos= DATUM2(MOVFEATPOS,datum);
99 if (!!fi != !!movfeatpos)
100 badformat("moveable featureness disagrees with file index");
103 memcpy(ov,iv,sizeof(ov));
105 gotmovfeatpos= movfeatpos;
106 } else if (segnum!=gotsegnum || movfeatpos!=gotmovfeatpos) {
110 datum= ARY2DATUM(ov);
111 datum |= 1UL << (fi-1 + MOVFEATPOS_BASEBIT);
116 if (fwrite(ov,1,3,stdout)!=3) { perror("writing"); exit(16); }