JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
now using netpbm stuff to generate proper ship image.
[vor.git] / pnmoutline.c
1 #include <pam.h>
2 #include <string.h>
3
4 struct pam inpam, outpam;
5 tuple *inrows[3];
6 tuple *outrow;
7
8 void
9 clear_inrow(struct pam *p, tuple *row)
10 {
11         int i, j;
12         
13         for(i=0; i<p->width; i++)
14                 for(j=0; j<3; j++)
15                         row[i][j]=0;
16 }
17
18 void
19 clear_outrow(struct pam *p, tuple *row)
20 {
21         int i,j;
22
23         for(i=0; i<p->width; i++)
24                 for(j=0; j<3; j++)
25                         row[i][j]=p->maxval;
26 }
27
28 int
29 is_black(unsigned int row, unsigned int column)
30 {
31
32         sample *s = inrows[row][column];
33         if(s[0]==0 && s[1]==0 && s[2]==0) return ~0;
34         else return 0;
35 }
36
37 int
38 is_edge(unsigned int column)
39 {
40         unsigned int n = 0;
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++;
45         return n==2 || n==3;
46 }
47
48 void
49 set_white(unsigned int column)
50 {
51         sample *s = outrow[column];
52         s[0]=255; s[1]=255; s[2]=255;
53 }
54
55 void
56 set_black(unsigned int column)
57 {
58         sample *s = outrow[column];
59         s[0]=0; s[1]=0; s[2]=0;
60 }
61
62 void
63 copy_tuple(unsigned int column)
64 {
65         sample *src, *dest;
66
67         src = inrows[1][column];
68         dest = outrow[column];
69         dest[0] = src[0];
70         dest[1] = src[1];
71         dest[2] = src[2];
72 }
73
74 void
75 read_row(unsigned int q)
76 {
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]);
81 }
82
83
84 int
85 main(int argc, char **argv)
86 {
87         unsigned int row,column,i;
88
89         pnm_init(&argc, argv);
90         pnm_readpaminit(stdin, &inpam, sizeof(struct pam));
91
92         outpam = inpam;
93         outpam.width+=2; outpam.height+=2;
94         outpam.file = stdout;
95         pnm_writepaminit(&outpam);
96
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]);
100
101         clear_outrow(&outpam, outrow);
102         pnm_writepamrow(&outpam, inrows[0]);
103
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);
111                 }
112                 pnm_writepamrow(&outpam, outrow);
113                 read_row(row != inpam.height-1);
114         }
115
116         clear_outrow(&outpam, outrow);
117         pnm_writepamrow(&outpam, inrows[2]);
118
119         pnm_freepamrow(outrow);
120         for(i=0; i<3; i++) pnm_freepamrow(inrows[i]);
121         return 0;
122 }