4 struct pam inpam, outpam;
9 clear_inrow(struct pam *p, tuple *row)
13 for(i=0; i<p->width; i++)
19 clear_outrow(struct pam *p, tuple *row)
23 for(i=0; i<p->width; i++)
29 is_black(unsigned int row, unsigned int column)
32 sample *s = inrows[row][column];
33 if(s[0]==0 && s[1]==0 && s[2]==0) return ~0;
38 is_edge(unsigned int column)
41 if(is_black(0,column)) n++;
42 if(is_black(2,column)) n++;
43 if(is_black(1,column-1)) n++;
44 if(is_black(1,column+1)) n++;
49 set_white(unsigned int column)
51 sample *s = outrow[column];
52 s[0]=255; s[1]=255; s[2]=255;
56 set_black(unsigned int column)
58 sample *s = outrow[column];
59 s[0]=0; s[1]=0; s[2]=0;
63 copy_tuple(unsigned int column)
67 src = inrows[1][column];
68 dest = outrow[column];
75 read_row(unsigned int q)
77 memcpy(inrows[0], inrows[1], outpam.width*sizeof(sample)*3);
78 memcpy(inrows[1], inrows[2], outpam.width*sizeof(sample)*3);
79 if(q) pnm_readpamrow(&inpam, inrows[2]+1);
80 else clear_inrow(&outpam, inrows[2]);
85 main(int argc, char **argv)
87 unsigned int row,column,i;
89 pnm_init(&argc, argv);
90 pnm_readpaminit(stdin, &inpam, sizeof(struct pam));
93 outpam.width+=2; outpam.height+=2;
95 pnm_writepaminit(&outpam);
97 outrow = pnm_allocpamrow(&outpam);
98 for(i=0; i<3; i++) inrows[i] = pnm_allocpamrow(&outpam);
99 for(i=0; i<3; i++) clear_inrow(&outpam, inrows[i]);
101 clear_outrow(&outpam, outrow);
102 pnm_writepamrow(&outpam, inrows[0]);
104 pnm_readpamrow(&inpam, inrows[1]+1);
105 for(row=0; row < inpam.height; row++) {
106 for(column=1; column<=inpam.width; column++) {
107 if(is_black(1,column)) {
108 if(is_edge(column)) set_black(column);
109 else set_white(column);
110 } else copy_tuple(column);
112 pnm_writepamrow(&outpam, outrow);
113 read_row(row != inpam.height-1);
116 clear_outrow(&outpam, outrow);
117 pnm_writepamrow(&outpam, inrows[2]);
119 pnm_freepamrow(outrow);
120 for(i=0; i<3; i++) pnm_freepamrow(inrows[i]);