Removed for miss placement.
[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(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   kPoint tpoly[kResolution + 2];\r
12   int tnum;\r
13   double a, b;\r
14 \r
15   //copy to temp buffer and detect max/min y-point\r
16   tnum = 0;\r
17   tpoly[tnum].X = p[0].X;\r
18   tpoly[tnum].Y = p[0].Y;\r
19   miny = maxy = tpoly[tnum].Y;\r
20   tnum++;\r
21   for(i = 1; i < number; i++){\r
22     if(p[i].X != tpoly[tnum - 1].X || p[i].Y != tpoly[tnum - 1].Y){\r
23       tpoly[tnum].X = p[i].X;\r
24       tpoly[tnum].Y = p[i].Y;\r
25       if(tpoly[tnum].Y < miny) miny = tpoly[tnum].Y;\r
26       if(tpoly[tnum].Y > maxy) maxy = tpoly[tnum].Y;\r
27       tnum++;\r
28     }\r
29   }\r
30   tpoly[tnum].X = tpoly[0].X;\r
31   tpoly[tnum].Y = tpoly[0].Y;\r
32   tpoly[tnum + 1].X = tpoly[1].X;\r
33   tpoly[tnum + 1].Y = tpoly[1].Y;\r
34 \r
35   //detect crossing point of each y-point and draw\r
36   for(j = miny; j <= maxy; j++){\r
37     num = 0;\r
38     for(i = 0; i < tnum; i++){\r
39       //if be parallel to x-axis\r
40       if(tpoly[i].Y == tpoly[i + 1].Y){\r
41         if(tpoly[i].Y == j){\r
42           cross[num] = tpoly[i + 1].X;\r
43           num++;\r
44         }\r
45       }\r
46       //if be parallel to y-axis\r
47       else if(tpoly[i].X == tpoly[i + 1].X){\r
48         if((tpoly[i].Y < j && j <= tpoly[i + 1].Y) ||\r
49          (tpoly[i + 1].Y <= j && j < tpoly[i].Y)){\r
50           cross[num] = tpoly[i].X;\r
51           num++;\r
52           //spearhead: add one more\r
53           if(tpoly[i + 1].Y == j &&\r
54            ((tpoly[i].Y > tpoly[i + 1].Y &&\r
55            tpoly[i + 1].Y < tpoly[i + 2].Y) ||\r
56            (tpoly[i].Y < tpoly[i + 1].Y &&\r
57            tpoly[i + 1].Y > tpoly[i + 2].Y))){\r
58             cross[num] = tpoly[i + 1].X;\r
59             num++;\r
60           }\r
61         }\r
62       }\r
63       //detect crossing point of each vector\r
64       else if((tpoly[i].Y < j && j <= tpoly[i + 1].Y) ||\r
65        (tpoly[i + 1].Y <= j && j < tpoly[i].Y)){\r
66         a = (tpoly[i + 1].Y - tpoly[i].Y) \r
67          / (tpoly[i + 1].X - tpoly[i].X);\r
68         b = tpoly[i].Y - a * tpoly[i].X;\r
69         cross[num] = (j - b) / a;\r
70         num++;\r
71         //spearhead: add one more\r
72         if(tpoly[i + 1].Y == j &&\r
73          ((tpoly[i].Y > tpoly[i + 1].Y &&\r
74          tpoly[i + 1].Y < tpoly[i + 2].Y) ||\r
75          (tpoly[i].Y < tpoly[i + 1].Y &&\r
76          tpoly[i + 1].Y > tpoly[i + 2].Y))){\r
77           cross[num] = tpoly[i + 1].X;\r
78           num++;\r
79         }\r
80       }\r
81     }\r
82     if(num != 0){\r
83       //(for debug)\r
84       if(num % 2 != 0){\r
85         fprintf(stderr,"y:%d(%d)\n",j,num);\r
86         for(k=0;k<num;k++) fprintf(stderr,"%d+",cross[k]);\r
87       }\r
88       //sort crossing point\r
89       for(k = 0; k < num - 1; k++){\r
90         for(l = num - 1; l > k; l--){\r
91           if(cross[l] < cross[l - 1]){\r
92             m = cross[l];\r
93             cross[l] = cross[l - 1];\r
94             cross[l - 1] = m;\r
95           }\r
96         }\r
97       }\r
98       //draw to vram\r
99       for(k = 0 ; k < num; k = k + 2){\r
100         for(l = cross[k]; l <= cross[k + 1]; l++){\r
101           if(0 <= j && j < canvasHeight && 0 <= l && l < canvasWidth)\r
102            image[j][l] = col;\r
103         }\r
104       }\r
105     }\r
106   }\r
107 }\r