JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fixed makebangdots to check surface's colorkey.
[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 row_fill_black(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 int
19 is_black(unsigned int row, unsigned int column)
20 {
21
22         sample *s = inrows[row][column];
23         if(s[0]==0 && s[1]==0 && s[2]==0) return ~0;
24         else return 0;
25 }
26
27 int
28 is_edge(unsigned int column)
29 {
30         unsigned int n = 0;
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++;
35         return n>1 && n<4;
36 }
37
38 void
39 set_black(unsigned int column)
40 {
41         sample *s = outrow[column];
42         s[0]=0; s[1]=0; s[2]=0;
43 }
44
45 void
46 set_white(unsigned int column)
47 {
48         sample *s = outrow[column];
49         s[0]=255; s[1]=255; s[2]=255;
50 }
51
52 void
53 copy_tuple(sample *dest, sample *src)
54 {
55         dest[0] = src[0];
56         dest[1] = src[1];
57         dest[2] = src[2];
58 }
59
60 void
61 copy_row(struct pam *p, tuple *dest, tuple *src) 
62 {
63         int i;
64
65         for(i=0; i<p->width; i++) copy_tuple(dest[i], src[i]);
66 }
67
68 void
69 next_row(unsigned int read)
70 {
71         copy_row(&outpam, inrows[0], inrows[1]);
72         copy_row(&outpam, inrows[1], inrows[2]);
73         /*
74         memcpy(inrows[0], inrows[1], outpam.width*sizeof(sample)*3);
75         memcpy(inrows[1], inrows[2], outpam.width*sizeof(sample)*3);
76         */
77         if(read) pnm_readpamrow(&inpam, inrows[2]+1);
78         else row_fill_black(&outpam, inrows[2]);
79 }
80
81
82 int
83 main(int argc, char **argv)
84 {
85         unsigned int row,column,i;
86
87         pnm_init(&argc, argv);
88         pnm_readpaminit(stdin, &inpam, sizeof(struct pam));
89
90         outpam = inpam;
91         outpam.width+=2; outpam.height+=2;
92         outpam.file = stdout;
93         pnm_writepaminit(&outpam);
94
95         for(i=0; i<3; i++) {
96                 inrows[i] = pnm_allocpamrow(&outpam);
97                 row_fill_black(&outpam, inrows[i]);
98         }
99
100         outrow = pnm_allocpamrow(&outpam);
101
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]);
109                 }
110                 pnm_writepamrow(&outpam, outrow);
111         }
112
113         pnm_freepamrow(outrow);
114         for(i=0; i<3; i++) pnm_freepamrow(inrows[i]);
115         return 0;
116 }