Replace to original source for polygon drawing.
[chise/kage.git] / kagecgi / kagepoly.c
1 // kagepoly.c\r
2 //\r
3 \r
4 #include "kage.h"\r
5 #include "kagecgi.h"\r
6 \r
7 void fillPolygon(struct kPoint *p, int number, int col, unsigned char **image){\r
8   int miny, maxy;\r
9   int cross[16], num;\r
10   int i, j, k, l, m;\r
11   double a, b;\r
12 \r
13   miny = 10000;\r
14   maxy = -10000;\r
15   //detect max/min y-point\r
16   for(i = 0; i < number; i++){\r
17     if(p[i].Y < miny) miny = p[i].Y;\r
18     if(p[i].Y > maxy) maxy = p[i].Y;\r
19     //fprintf(stderr,"%.1f:%.1f\n",p[i].X,p[i].Y);\r
20   }\r
21   //detect crossing point of each y-point and draw\r
22   for(j = miny; j <= maxy; j++){\r
23     num = 0;\r
24     for(i = 0; i < number; i++){\r
25       //if two points are tha same position, do nothing\r
26       if(p[i].X == p[(i + 1) % number].X &&\r
27          p[i].Y == p[(i + 1) % number].Y) continue;\r
28       //if be parallel to x-axis\r
29       if(p[i].Y == p[(i + 1) % number].Y){\r
30         if(p[i].Y == j){\r
31           cross[num] = p[(i + 1) % number].X;\r
32           //fprintf(stderr,"[%d]",cross[num]);\r
33           num++;\r
34         }\r
35       }\r
36       //if be parallel to y-axis\r
37       else if(p[i].X == p[(i + 1) % number].X){\r
38         if((p[i].Y < j && j <= p[(i + 1) % number].Y) ||\r
39          (p[(i + 1) % number].Y <= j && j < p[i].Y)){\r
40           cross[num] = p[i].X;\r
41           //fprintf(stderr,"[%d]",cross[num]);\r
42           num++;\r
43           //spearhead: add one more\r
44           if(p[(i + 1) % number].Y == j &&\r
45              ((p[i].Y > p[(i + 1) % number].Y &&\r
46              p[(i + 1) % number].Y < p[(i + 2) % number].Y) ||\r
47              (p[i].Y < p[(i + 1) % number].Y &&\r
48              p[(i + 1) % number].Y > p[(i + 2) % number].Y))){\r
49             cross[num] = p[(i + 1) % number].X;\r
50             //fprintf(stderr,"[%d]",cross[num]);\r
51             num++;\r
52             //fprintf(stderr,"(add:%d)",j);\r
53           }\r
54         }\r
55       }\r
56       //detect crossing point of each vector\r
57       else if((p[i].Y < j && j <= p[(i + 1) % number].Y) ||\r
58        (p[(i + 1) % number].Y <= j && j < p[i].Y)){\r
59         a = (p[(i + 1) % number].Y - p[i].Y) \r
60          / (p[(i + 1) % number].X - p[i].X);\r
61         b = p[i].Y - a * p[i].X;\r
62         cross[num] = (j - b) / a;\r
63         //fprintf(stderr,"[%d]",cross[num]);\r
64         num++;\r
65         //spearhead: add one more\r
66         if(p[(i + 1) % number].Y == j &&\r
67          ((p[i].Y > p[(i + 1) % number].Y &&\r
68          p[(i + 1) % number].Y < p[(i + 2) % number].Y) ||\r
69          (p[i].Y < p[(i + 1) % number].Y &&\r
70          p[(i + 1) % number].Y > p[(i + 2) % number].Y))){\r
71           cross[num] = p[(i + 1) % number].X;\r
72           //fprintf(stderr,"[%d]",cross[num]);\r
73           num++;\r
74           //fprintf(stderr,"(add:%d)",j);\r
75         }\r
76       }\r
77     }\r
78     if(num != 0){\r
79       if(num % 2 != 0)fprintf(stderr,"y:%d(%d)\n",j,num);\r
80       //if(num != 0 && num % 2 == 0){\r
81       //sort crossing point\r
82       for(k = 0; k < num - 1; k++){\r
83         for(l = num - 1; l > k; l--){\r
84           if(cross[l] < cross[l - 1]){\r
85             m = cross[l];\r
86             cross[l] = cross[l - 1];\r
87             cross[l - 1] = m;\r
88           }\r
89         }\r
90       }\r
91       //for(k=0;k<num;k++)fprintf(stderr,"%d:",cross[k]);\r
92       //draw to vram\r
93       for(k = 0 ; k < num; k = k + 2){\r
94         for(l = cross[k]; l <= cross[k + 1]; l++){\r
95           if(0 <= j && j < canvasHeight && 0 <= l && l < canvasWidth)\r
96            image[j][l] = col;\r
97         }\r
98         //image[j][cross[k]] = col;\r
99         //image[j][cross[k+1]] = col;\r
100       }\r
101     }\r
102   }\r
103 }\r
104 \r