4 struct pam inpam, outpam;
9 row_fill_black(struct pam *p, tuple *row)
13 for(i=0; i<p->width; i++)
19 is_black(unsigned int row, unsigned int column)
22 sample *s = inrows[row][column];
23 if(s[0]==0 && s[1]==0 && s[2]==0) return ~0;
28 is_edge(unsigned int column)
31 if(is_black(0,column)) n++;
32 if(is_black(2,column)) n++;
33 if(column == 0 || is_black(1, column-1)) n++;
34 if(column == outpam.width-1 || is_black(1, column+1)) n++;
39 set_black(unsigned int column)
41 sample *s = outrow[column];
42 s[0]=0; s[1]=0; s[2]=0;
46 set_white(unsigned int column)
48 sample *s = outrow[column];
49 s[0]=255; s[1]=255; s[2]=255;
53 copy_tuple(sample *dest, sample *src)
61 copy_row(struct pam *p, tuple *dest, tuple *src)
65 for(i=0; i<p->width; i++) copy_tuple(dest[i], src[i]);
69 next_row(unsigned int read)
71 copy_row(&outpam, inrows[0], inrows[1]);
72 copy_row(&outpam, inrows[1], inrows[2]);
74 memcpy(inrows[0], inrows[1], outpam.width*sizeof(sample)*3);
75 memcpy(inrows[1], inrows[2], outpam.width*sizeof(sample)*3);
77 if(read) pnm_readpamrow(&inpam, inrows[2]+1);
78 else row_fill_black(&outpam, inrows[2]);
83 main(int argc, char **argv)
85 unsigned int row,column,i;
87 pnm_init(&argc, argv);
88 pnm_readpaminit(stdin, &inpam, sizeof(struct pam));
91 outpam.width+=2; outpam.height+=2;
93 pnm_writepaminit(&outpam);
96 inrows[i] = pnm_allocpamrow(&outpam);
97 row_fill_black(&outpam, inrows[i]);
100 outrow = pnm_allocpamrow(&outpam);
102 for(row=0; row < outpam.height; row++) {
103 next_row(row < inpam.height);
104 for(column=0; column<outpam.width; column++) {
105 if(is_black(1,column)) {
106 if(is_edge(column)) set_black(column);
107 else set_white(column);
108 } else copy_tuple(outrow[column], inrows[1][column]);
110 pnm_writepamrow(&outpam, outrow);
113 pnm_freepamrow(outrow);
114 for(i=0; i<3; i++) pnm_freepamrow(inrows[i]);