Bugfix.
[chise/kage.git] / kagecgi / kagecd.c
1 //kagecd.c\r
2 //\r
3 #include "kage.h"\r
4 \r
5 void cdDrawCurve(double x1, double y1,\r
6         double x2, double y2,\r
7         double x3, double y3,\r
8         int a1, int a2){\r
9 \r
10         double rad, t;\r
11         double x, y, v;\r
12         double ix, iy, ia, ib, ir;\r
13         int count, tt;\r
14         double delta;\r
15         double deltad;\r
16         double XX, XY, YX, YY;\r
17         \r
18         if(kShotai == kMincho){ // mincho\r
19         switch(a1){\r
20         case 0:\r
21         case 7:\r
22                 delta = -1 * kMinWidthY * 0.5;\r
23                 break;\r
24         case 1:\r
25         case 2:\r
26         case 6:\r
27         case 22:\r
28                 delta = 0;\r
29                 break;\r
30         case 12:\r
31         case 32:\r
32                 delta = kMinWidthY;\r
33                 break;\r
34         default:\r
35                 break;\r
36         }\r
37         \r
38         if(x1 == x2){\r
39                 if(y1 < y2){ y1 = y1 - delta; }\r
40                 else{ y1 = y1 + delta; }\r
41         }\r
42         else if(y1 == y2){\r
43                 if(x1 < x2){ x1 = x1 - delta; }\r
44                 else{ x1 = x1 + delta; }\r
45         }\r
46         else{\r
47                 rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
48                 if(x1 < x2){ v = 1; } else{ v = -1; }\r
49                 x1 = x1 - delta * cos(rad) * v;\r
50                 y1 = y1 - delta * sin(rad) * v;\r
51         }\r
52         \r
53         switch(a2){\r
54         case 0:\r
55         case 1:\r
56         case 8:\r
57         case 7:\r
58         case 9:\r
59         case 15:\r
60         case 14:\r
61         case 17:\r
62         case 5:\r
63                 delta = 0;\r
64                 break;\r
65         default:\r
66                 break;\r
67         }\r
68         \r
69         if(x2 == x3){\r
70                 if(y2 < y3){ y3 = y3 + delta; }\r
71                 else{ y3 = y3 - delta; }\r
72         }\r
73         else if(y2 == y3){\r
74                 if(x2 < x3){ x3 = x3 + delta; }\r
75                 else{ x3 = x3 - delta; }\r
76         }\r
77         else{\r
78                 rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
79                 if(x2 < x3){ v = 1; } else{ v = -1; }\r
80                 x3 = x3 + delta * cos(rad) * v;\r
81                 y3 = y3 + delta * sin(rad) * v;\r
82         }\r
83         \r
84         count = 0;\r
85         \r
86         for(tt = 0; tt <= 1000; tt = tt + kRate){\r
87                 t = (double)(tt) / 1000;\r
88                 \r
89                 //calculate a dot\r
90                 x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);\r
91                 y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);\r
92                 \r
93                 //KATAMUKI of vector by BIBUN\r
94                 ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);\r
95                 iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);\r
96                 \r
97                 //line SUICHOKU by vector\r
98                 if(ix != 0 && iy != 0){\r
99                         ir = atan(iy / ix * -1);\r
100                         ia = sin(ir) * (double)(kMinWidthT);\r
101                         ib = cos(ir) * (double)(kMinWidthT);\r
102                 }\r
103                 else if(ix == 0){\r
104                         ia = kMinWidthT;\r
105                         ib = 0;\r
106                 }\r
107                 else{\r
108                         ia = 0;\r
109                         ib = kMinWidthT;\r
110                 }\r
111                 \r
112                 if(a1 == 7 && a2 != 17){ deltad = sqrt(t); }\r
113                 else if(a2 == 7 && a1 != 17){ deltad = sqrt(1.0 - t); }\r
114                 else if(a1 == 7 && a2 == 17){ deltad = sqrt(t / 2); }\r
115                 else if(a1 == 17 && a2 != 7){ deltad = sqrt(t / 2 + 0.5); }\r
116                 else if(a1 != 7 && a2 == 17){ deltad = sqrt(1.0 - t / 2); }\r
117                 else if(a1 == 17 && a2 == 7){ deltad = sqrt(0.5 - t / 2); }\r
118                 else{ deltad = 1; }\r
119                 ia = ia * deltad;\r
120                 ib = ib * deltad;\r
121                 \r
122                 //reverse if vector is going 2nd/3rd quadrants\r
123                 if(ix <= 0){\r
124                   ia = ia * -1;\r
125                   ib = ib * -1;\r
126                 }\r
127                 \r
128                 //copy to polygon structuer\r
129                 poly[count].X = x - ia;\r
130                 poly[count].Y = y - ib;\r
131                 poly[(1000 / kRate + 1) * 2 - 1 - count].X = x + ia;\r
132                 poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y + ib;\r
133                 count += 1;\r
134         }\r
135         \r
136         icPolygon(poly, (1000 / kRate + 1) * 2);\r
137         \r
138         //process for head of stroke\r
139         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
140         if(x1 < x2){ v = 1; } else{ v = -1; }\r
141         XX = sin(rad) * v;\r
142         XY = cos(rad) * v * -1;\r
143         YX = cos(rad) * v;\r
144         YY = sin(rad) * v;\r
145         \r
146         if(a1 == 12){\r
147                 if(x1 == x2){\r
148                         poly2[0].X = x1 - kMinWidthT;\r
149                         poly2[0].Y = y1;\r
150                         poly2[1].X = x1 + kMinWidthT;\r
151                         poly2[1].Y = y1;\r
152                         poly2[2].X = x1 - kMinWidthT;\r
153                         poly2[2].Y = y1 - kMinWidthT;\r
154                         icPolygon(poly2, 3);\r
155                 }\r
156                 else{\r
157                         poly2[0].X = x1 - kMinWidthT * XX;\r
158                         poly2[0].Y = y1 - kMinWidthT * XY;\r
159                         poly2[1].X = x1 + kMinWidthT * XX;\r
160                         poly2[1].Y = y1 + kMinWidthT * XY;\r
161                         poly2[2].X = x1 - kMinWidthT * XX - kMinWidthT * YX;\r
162                         poly2[2].Y = y1 - kMinWidthT * XY - kMinWidthT * YY;\r
163                         icPolygon(poly2, 3);\r
164                 }\r
165         }\r
166         \r
167         if(a1 == 0){\r
168                 if(y1 <= y3){ //from up to bottom\r
169                         if(x1 == x2){\r
170                                 poly2[0].X = x1 - kMinWidthT;\r
171                                 poly2[0].Y = y1;\r
172                                 poly2[1].X = x1 + kMinWidthT;\r
173                                 poly2[1].Y = y1;\r
174                                 poly2[2].X = x1 - kMinWidthT;\r
175                                 poly2[2].Y = y1 - kMinWidthY;\r
176                                 icPolygon(poly2, 3);\r
177                         }\r
178                         else{\r
179                                 poly2[0].X = x1 - kMinWidthT * XX;\r
180                                 poly2[0].Y = y1 - kMinWidthT * XY;\r
181                                 poly2[1].X = x1 + kMinWidthT * XX;\r
182                                 poly2[1].Y = y1 + kMinWidthT * XY;\r
183                                 poly2[2].X = x1 - kMinWidthT * XX - kMinWidthY * YX;\r
184                                 poly2[2].Y = y1 - kMinWidthT * XY - kMinWidthY * YY;\r
185                                 icPolygon(poly2, 3);\r
186                         }\r
187                 }\r
188                 else{ //bottom to up\r
189                         if(x1 == x2){ //is it right?\r
190                                 poly2[0].X = x1 - kMinWidthT;\r
191                                 poly2[0].Y = y1;\r
192                                 poly2[1].X = x1 + kMinWidthT;\r
193                                 poly2[1].Y = y1;\r
194                                 poly2[2].X = x1 - kMinWidthT;\r
195                                 poly2[2].Y = y1 + kMinWidthY;\r
196                                 icPolygon(poly2, 3);\r
197                         }\r
198                         else{\r
199                                 poly2[0].X = x1 - kMinWidthT * XX;\r
200                                 poly2[0].Y = y1 - kMinWidthT * XY;\r
201                                 poly2[1].X = x1 + kMinWidthT * XX;\r
202                                 poly2[1].Y = y1 + kMinWidthT * XY;\r
203                                 poly2[2].X = x1 + kMinWidthT * XX - kMinWidthY * YX;\r
204                                 poly2[2].Y = y1 + kMinWidthT * XY - kMinWidthY * YY;\r
205                                 icPolygon(poly2, 3);\r
206                         }\r
207                 }\r
208         }\r
209         \r
210         if(a1 == 22){ //box's up-right corner, any time same degree\r
211                 poly3[0].X = x1 - kMinWidthT;\r
212                 poly3[0].Y = y1 - kMinWidthY;\r
213                 poly3[1].X = x1;\r
214                 poly3[1].Y = y1 - kMinWidthY - kWidth;\r
215                 poly3[2].X = x1 + kMinWidthT + kWidth;\r
216                 poly3[2].Y = y1 + kMinWidthY;\r
217                 poly3[3].X = x1 + kMinWidthT;\r
218                 poly3[3].Y = y1 + kMinWidthT;\r
219                 poly3[4].X = x1 - kMinWidthT;\r
220                 poly3[4].Y = y1;\r
221                 icPolygon(poly3, 5);\r
222         }\r
223         \r
224         if(a1 == 0){ //beginning of the stroke\r
225                 if(y1 <= y3){ //from up to bottom\r
226                         if(x1 == x2){\r
227                                 poly2[0].X = x1 + kMinWidthT;\r
228                                 poly2[0].Y = y1 + kMinWidthY * 0.5;\r
229                                 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;\r
230                                 poly2[1].Y = y1 + kMinWidthY * 0.5 + kMinWidthY;\r
231                                 poly2[2].X = x1 + kMinWidthT;\r
232                                 poly2[2].Y = y1 + kMinWidthY * 0.5 + kMinWidthY * 2;\r
233                                 icPolygon(poly2, 3);\r
234                         }\r
235                         else{\r
236                                 poly2[0].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5) * YX;\r
237                                 poly2[0].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5) * YY;\r
238                                 poly2[1].X = x1 + (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;\r
239                                 poly2[1].Y = y1 + (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;\r
240                                 poly2[2].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
241                                 poly2[2].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
242                                 icPolygon(poly2, 3);\r
243                         }\r
244                 }\r
245                 else{ //from bottom to up\r
246                         if(x1 == x2){ //is it right?\r
247                                 poly2[0].X = x1 + kMinWidthT;\r
248                                 poly2[0].Y = y1 - kMinWidthY * 0.5;\r
249                                 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;\r
250                                 poly2[1].Y = y1 - kMinWidthY * 0.5 - kMinWidthY;\r
251                                 poly2[2].X = x1 + kMinWidthT;\r
252                                 poly2[2].Y = y1 - kMinWidthY * 0.5 - kMinWidthY * 2;\r
253                                 icPolygon(poly2, 3);\r
254                         }\r
255                         else //SETSUGOUMEN GA KAKERUNODE HOKYOU\r
256                                 poly3[0].X = x1 - (kMinWidthT - 1) * XX + (kMinWidthY * 0.5) * YX;\r
257                                 poly3[0].Y = y1 - (kMinWidthT - 1) * XY + (kMinWidthY * 0.5) * YY;\r
258                                 poly3[1].X = x1 - (kMinWidthT - 0) * XX + (kMinWidthY * 0.5) * YX;\r
259                                 poly3[1].Y = y1 - (kMinWidthT - 0) * XY + (kMinWidthY * 0.5) * YY;\r
260                                 poly3[2].X = x1 - (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;\r
261                                 poly3[2].Y = y1 - (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;\r
262                                 poly3[3].X = x1 - (kMinWidthT - 0) * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
263                                 poly3[3].Y = y1 - (kMinWidthT - 0) * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
264                                 poly3[4].X = x1 - (kMinWidthT - 1) * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
265                                 poly3[4].Y = y1 - (kMinWidthT - 1) * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
266                                 icPolygon(poly3, 5);\r
267                         }\r
268                 }\r
269                 \r
270                 //process for tail\r
271                 rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
272                 if(x2 < x3){ v = 1; } else{ v = -1; }\r
273                 YX = sin(rad) * v * -1;\r
274                 YY = cos(rad) * v;\r
275                 XX = cos(rad) * v;\r
276                 XY = sin(rad) * v;\r
277                 \r
278                 if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle\r
279                         if(x2 == x3){\r
280                                 poly3[0].X = x3 - kMinWidthT;\r
281                                 poly3[0].Y = y3;\r
282                                 poly3[1].X = x3 - kMinWidthT * 0.6;\r
283                                 poly3[1].Y = y3 + kMinWidthT * 0.6;\r
284                                 poly3[2].X = x3;\r
285                                 poly3[2].Y = y3 + kMinWidthT;\r
286                                 poly3[3].X = x3 + kMinWidthT * 0.6;\r
287                                 poly3[3].Y = y3 + kMinWidthT * 0.6;\r
288                                 poly3[4].X = x3 + kMinWidthT;\r
289                                 poly3[4].Y = y3;\r
290                                 icPolygon(poly3, 5);\r
291                         }\r
292                         else if(y2 == y3){\r
293                                 poly3[0].X = x3;\r
294                                 poly3[0].Y = y3 - kMinWidthT;\r
295                                 poly3[1].X = x3 + kMinWidthT * 0.6;\r
296                                 poly3[1].Y = y3 - kMinWidthT * 0.6;\r
297                                 poly3[2].X = x3 + kMinWidthT;\r
298                                 poly3[2].Y = y3;\r
299                                 poly3[3].X = x3 + kMinWidthT * 0.6;\r
300                                 poly3[3].Y = y3 + kMinWidthT * 0.6;\r
301                                 poly3[4].X = x3;\r
302                                 poly3[4].Y = y3 + kMinWidthT;\r
303                                 icPolygon(poly3, 5);\r
304                         }\r
305                         else{\r
306                                 poly3[0].X = x3 + sin(rad) * kMinWidthT * v;\r
307                                 poly3[0].Y = y3 - cos(rad) * kMinWidthT * v;\r
308                                 poly3[1].X = x3 + cos(rad) * kMinWidthT * 0.8 * v + sin(rad) * kMinWidthT * 0.6 * v;\r
309                                 poly3[1].Y = y3 + sin(rad) * kMinWidthT * 0.8 * v - cos(rad) * kMinWidthT * 0.6 * v;\r
310                                 poly3[2].X = x3 + cos(rad) * kMinWidthT * v;\r
311                                 poly3[2].Y = y3 + sin(rad) * kMinWidthT * v;\r
312                                 poly3[3].X = x3 + cos(rad) * kMinWidthT * 0.8 * v - sin(rad) * kMinWidthT * 0.6 * v;\r
313                                 poly3[3].Y = y3 + sin(rad) * kMinWidthT * 0.8 * v + cos(rad) * kMinWidthT * 0.6 * v;\r
314                                 poly3[4].X = x3 - sin(rad) * kMinWidthT * v;\r
315                                 poly3[4].Y = y3 + cos(rad) * kMinWidthT * v;\r
316                                 icPolygon(poly3, 5);\r
317                         }\r
318                 }\r
319                 \r
320                 if(a2 == 17){ //the last filled half circle\r
321                         if(x2 == x3){\r
322                                 poly3[0].X = x3 - kMinWidthT * 0.5;\r
323                                 poly3[0].Y = y3;\r
324                                 poly3[1].X = x3 - kMinWidthT * 0.6 * 0.5;\r
325                                 poly3[1].Y = y3 + kMinWidthT * 0.6 * 0.5;\r
326                                 poly3[2].X = x3;\r
327                                 poly3[2].Y = y3 + kMinWidthT * 0.5;\r
328                                 poly3[3].X = x3 + kMinWidthT * 0.6 * 0.5;\r
329                                 poly3[3].Y = y3 + kMinWidthT * 0.6 * 0.5;\r
330                                 poly3[4].X = x3 + kMinWidthT * 0.5;\r
331                                 poly3[4].Y = y3;\r
332                                 icPolygon(poly3, 5);\r
333                         }\r
334                         else if(y2 == y3){\r
335                                 poly3[0].X = x3;\r
336                                 poly3[0].Y = y3 - kMinWidthT * 0.5;\r
337                                 poly3[1].X = x3 + kMinWidthT * 0.6 * 0.5;\r
338                                 poly3[1].Y = y3 - kMinWidthT * 0.6 * 0.5;\r
339                                 poly3[2].X = x3 + kMinWidthT * 0.5;\r
340                                 poly3[2].Y = y3;\r
341                                 poly3[3].X = x3 + kMinWidthT * 0.6 * 0.5;\r
342                                 poly3[3].Y = y3 + kMinWidthT * 0.6 * 0.5;\r
343                                 poly3[4].X = x3;\r
344                                 poly3[4].Y = y3 + kMinWidthT * 0.5;\r
345                                 icPolygon(poly3, 5);\r
346                         }\r
347                         else{\r
348                                 poly3[0].X = x3 + sin(rad) * kMinWidthT * 0.5 * v;\r
349                                 poly3[0].Y = y3 - cos(rad) * kMinWidthT * 0.5 * v;\r
350                                 poly3[1].X = x3 + cos(rad) * kMinWidthT * 0.8 * 0.5 * v + sin(rad) * kMinWidthT * 0.6 * 0.5 * v;\r
351                                 poly3[1].Y = y3 + sin(rad) * kMinWidthT * 0.8 * 0.5 * v - cos(rad) * kMinWidthT * 0.6 * 0.5 * v;\r
352                                 poly3[2].X = x3 + cos(rad) * kMinWidthT * 0.5 * v;\r
353                                 poly3[2].Y = y3 + sin(rad) * kMinWidthT * 0.5 * v;\r
354                                 poly3[3].X = x3 + cos(rad) * kMinWidthT * 0.5 * 0.8 * v - sin(rad) * kMinWidthT * 0.6 * 0.5 * v;\r
355                                 poly3[3].Y = y3 + sin(rad) * kMinWidthT * 0.5 * 0.8 * v + cos(rad) * kMinWidthT * 0.6 * 0.5 * v;\r
356                                 poly3[4].X = x3 - sin(rad) * kMinWidthT * 0.5 * v;\r
357                                 poly3[4].Y = y3 + cos(rad) * kMinWidthT * 0.5 * v;\r
358                                 icPolygon(poly3, 5);\r
359                         }\r
360                 }\r
361                 \r
362                 if(a2 == 9){\r
363                         if(y2 == y3){\r
364                                 poly2[0].X = x3;\r
365                                 poly2[0].Y = y3 + kMinWidthT;\r
366                                 poly2[1].X = x3;\r
367                                 poly2[1].Y = y3 - kMinWidthT;\r
368                                 poly2[2].X = x3 + kMinWidthT;\r
369                                 poly2[2].Y = y3 - kMinWidthT;\r
370                                 icPolygon(poly2, 3);\r
371                         }\r
372                         else{\r
373                                 poly2[0].X = x3 + kMinWidthT * YX;\r
374                                 poly2[0].Y = y3 + kMinWidthT * YY;\r
375                                 poly2[1].X = x3 - kMinWidthT * YX;\r
376                                 poly2[1].Y = y3 - kMinWidthT * YY;\r
377                                 poly2[2].X = x3 + kMinWidthT * XX - kMinWidthT * YX;\r
378                                 poly2[2].Y = y3 + kMinWidthT * XY - kMinWidthT * YY;\r
379                                 icPolygon(poly2, 3);\r
380                         }\r
381                 }\r
382                 \r
383                 if(a2 == 15){ //jump up\r
384                         if(y2 == y3){\r
385                                 poly4[0].X = x3;\r
386                                 poly4[0].Y = y3 - kMinWidthT + 1;\r
387                                 poly4[1].X = x3 + 2;\r
388                                 poly4[1].Y = y3 - kMinWidthT - kWidth * 5;\r
389                                 poly4[2].X = x3;\r
390                                 poly4[2].Y = y3 - kMinWidthT - kWidth * 5;\r
391                                 poly4[3].X = x3 - kMinWidthT;\r
392                                 poly4[3].Y = y3 - kMinWidthT + 1;\r
393                                 icPolygon(poly4, 4);\r
394                         }\r
395                         else{\r
396                                 poly4[0].X = x3 + (kMinWidthT - 1) * sin(rad) * v;\r
397                                 poly4[0].Y = y3 - (kMinWidthT - 1) * cos(rad) * v;\r
398                                 poly4[1].X = x3 + 2 * cos(rad) * v + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
399                                 poly4[1].Y = y3 + 2 * sin(rad) * v - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
400                                 poly4[2].X = x3 + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
401                                 poly4[2].Y = y3 - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
402                                 poly4[3].X = x3 + (kMinWidthT - 1) * sin(rad) * v - kMinWidthT * cos(rad) * v;\r
403                                 poly4[3].Y = y3 - (kMinWidthT - 1) * cos(rad) * v - kMinWidthT * sin(rad) * v;\r
404                                 icPolygon(poly4, 4);\r
405                         }\r
406                 }\r
407                 \r
408                 if(a2 == 14){ //jump to left, allways go left\r
409                         poly4[0].X = x3;\r
410                         poly4[0].Y = y3;\r
411                         poly4[1].X = x3;\r
412                         poly4[1].Y = y3 - kMinWidthT;\r
413                         poly4[2].X = x3 - kWidth * 4;\r
414                         poly4[2].Y = y3 - kMinWidthT;\r
415                         poly4[3].X = x3 - kWidth * 4;\r
416                         poly4[3].Y = y3 - kMinWidthT * 0.5;\r
417                         icPolygon(poly4, 4);\r
418                 }\r
419         }\r
420         else{ //gothic\r
421                 if(a1 % 10 == 2){\r
422                         if(x1 == x2){\r
423                                 if(y1 < y2){ y1 = y1 - kWidth; } else{ y1 = y1 + kWidth; }\r
424                         }\r
425                         else if(y1 == y2){\r
426                                 if(x1 < x2){ x1 = x1 - kWidth; } else{ x1 = x1 + kWidth; }\r
427                         }\r
428                         else{\r
429                                 rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
430                                 if(x1 < x2){ v = 1; } else{ v = -1; }\r
431                                 x1 = x1 - kWidth * cos(rad) * v;\r
432                                 y1 = y1 - kWidth * sin(rad) * v;\r
433                         }\r
434                 }\r
435                 \r
436                 if(a1 % 10 == 3){\r
437                         if(x1 == x2){\r
438                                 if(y1 < y2){\r
439                                          y1 = y1 - kWidth * kKakato;\r
440                                 }\r
441                         else{\r
442                                  y1 = y1 + kWidth * kKakato;\r
443                         }\r
444                 }\r
445                 else if(y1 == y2){\r
446                         if(x1 < x2){\r
447                                 x1 = x1 - kWidth * kKakato;\r
448                         }\r
449                         else{\r
450                                 x1 = x1 + kWidth * kKakato;\r
451                         }\r
452                 }\r
453                 else{\r
454                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
455                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
456                         x1 = x1 - kWidth * cos(rad) * v * kKakato;\r
457                         y1 = y1 - kWidth * sin(rad) * v * kKakato;\r
458                         }\r
459                 }\r
460                 if(a2 % 10 == 2){\r
461                         if(x2 == x3){\r
462                                 if(y2 < y3){ y3 = y3 + kWidth; } else{ y3 = y3 - kWidth; }\r
463                         }\r
464                         else if(y2 == y3){\r
465                                 if(x2 < x3){ x3 = x3 + kWidth; } else{ x3 = x3 - kWidth; }\r
466                         }\r
467                         else{\r
468                                 rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
469                                 if(x2 < x3){ v = 1; } else{ v = -1; }\r
470                                 x3 = x3 + kWidth * cos(rad) * v;\r
471                                 y3 = y3 + kWidth * sin(rad) * v;\r
472                         }\r
473                 }\r
474                 \r
475                 if(a2 % 10 == 3){\r
476                         if(x2 == x3){\r
477                                 if(y2 < y3){\r
478                                         y3 = y3 + kWidth * kKakato;\r
479                                 }\r
480                                 else{\r
481                                         y3 = y3 - kWidth * kKakato;\r
482                                 }\r
483                         }\r
484                         else if(y2 == y3){\r
485                                 if(x2 < x3){\r
486                                         x3 = x3 + kWidth * kKakato;\r
487                                 }\r
488                                 else{\r
489                                         x3 = x3 - kWidth * kKakato;\r
490                                 }\r
491                         }\r
492                         else{\r
493                                 rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
494                                 if(x2 < x3){ v = 1; } else{ v = -1; }\r
495                                 x3 = x3 + kWidth * cos(rad) * v * kKakato;\r
496                                 y3 = y3 + kWidth * sin(rad) * v * kKakato;\r
497                         }\r
498                 }\r
499                 \r
500                 count = 0;\r
501                 \r
502                 for(tt = 0; tt <= 1000; tt = tt + kRate){\r
503                         t = (double)tt / 1000;\r
504                         \r
505                         //calculating each point\r
506                         x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);\r
507                         y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);\r
508                         \r
509                         //SESSEN NO KATAMUKI NO KEISAN(BIBUN)\r
510                         ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);\r
511                         iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);\r
512                         \r
513                         //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN\r
514                         if(kShotai == kMincho){ //always false ?\r
515                                 if(ix != 0 && iy != 0){\r
516                                         ir = atan(iy / ix * -1.0);\r
517                                         ia = sin(ir) * (double)kMinWidthT;\r
518                                         ib = cos(ir) * (double)kMinWidthT;\r
519                                 }\r
520                                 else if(ix == 0){\r
521                                         ia = kMinWidthT;\r
522                                         ib = 0;\r
523                                 }\r
524                                 else{\r
525                                         ia = 0;\r
526                                         ib = kMinWidthT;\r
527                                 }\r
528                                 ia = ia * sqrt(1.0 - t);\r
529                                 ib = ib * sqrt(1.0 - t);\r
530                         }\r
531                         else{\r
532                                 if(ix != 0 && iy != 0){\r
533                                         ir = atan(iy / ix * -1.0);\r
534                                         ia = sin(ir) * (double)kWidth;\r
535                                         ib = cos(ir) * (double)kWidth;\r
536                                 }\r
537                                 else if(ix == 0){\r
538                                         ia = kWidth;\r
539                                         ib = 0;\r
540                                 }\r
541                                 else{\r
542                                         ia = 0;\r
543                                         ib = kWidth;\r
544                                 }\r
545                         }\r
546 \r
547                         //reverse if vector is going 2nd/3rd quadrants\r
548                         if(ix <= 0){\r
549                           ia = ia * -1;\r
550                           ib = ib * -1;\r
551                         }\r
552                 \r
553                         //save to polygon\r
554                         poly[count].X = x - ia;\r
555                         poly[count].Y = y - ib;\r
556                         poly[(1000 / kRate + 1) * 2 - 1 - count].X = x + ia;\r
557                         poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y + ib;\r
558                         count += 1;\r
559                 }\r
560                 \r
561                 icPolygon(poly, (1000 / kRate + 1) * 2);\r
562         }\r
563 }\r
564 \r
565 void cdDrawLine(double tx1, double ty1, double tx2, double ty2, int ta1, int ta2){\r
566         double rad;\r
567         double v, x1, y1, x2, y2;\r
568         int a1, a2;\r
569         double XX, XY, YX, YY;\r
570         \r
571         if(kShotai == kMincho){ //mincho\r
572                 x1 = tx1;\r
573                 y1 = ty1;\r
574                 x2 = tx2;\r
575                 y2 = ty2;\r
576                 a1 = ta1;\r
577                 a2 = ta2;\r
578                 \r
579                 if(x1 == x2){ //if TATE stroke, use y-axis\r
580                         switch(a1){\r
581                         case 0:\r
582                                 poly[3].X = x1 - kMinWidthT;\r
583                                 poly[3].Y = y1 - kMinWidthY / 2;\r
584                                 poly[0].X = x1 + kMinWidthT;\r
585                                 poly[0].Y = y1 + kMinWidthY / 2;\r
586                                 break;\r
587                         case 1:\r
588                         case 6:\r
589                         case 22:\r
590                                 poly[3].X = x1 - kMinWidthT;\r
591                                 poly[3].Y = y1;\r
592                                 poly[0].X = x1 + kMinWidthT;\r
593                                 poly[0].Y = y1;\r
594                                 break;\r
595                         case 12:\r
596                                 poly[3].X = x1 - kMinWidthT;\r
597                                 poly[3].Y = y1 - kMinWidthY - kMinWidthT;\r
598                                 poly[0].X = x1 + kMinWidthT;\r
599                                 poly[0].Y = y1 - kMinWidthY;\r
600                                 break;\r
601                         case 32:\r
602                                 poly[3].X = x1 - kMinWidthT;\r
603                                 poly[3].Y = y1 - kMinWidthY;\r
604                                 poly[0].X = x1 + kMinWidthT;\r
605                                 poly[0].Y = y1 - kMinWidthY;\r
606                                 break;\r
607                         }\r
608                         \r
609                         switch(a2){\r
610                         case 0:\r
611                                 if(a1 == 6){ //KAGI's tail\r
612                                         poly[2].X = x2 - kMinWidthT;\r
613                                         poly[2].Y = y2;\r
614                                         poly[1].X = x2 + kMinWidthT;\r
615                                         poly[1].Y = y2;\r
616                                 }\r
617                                 else{\r
618                                         poly[2].X = x2 - kMinWidthT;\r
619                                         poly[2].Y = y2 + kMinWidthT / 2;\r
620                                         poly[1].X = x2 + kMinWidthT;\r
621                                         poly[1].Y = y2 - kMinWidthT / 2;\r
622                                 }\r
623                                 break;\r
624                         case 1:\r
625                                 poly[2].X = x2 - kMinWidthT;\r
626                                 poly[2].Y = y2;\r
627                                 poly[1].X = x2 + kMinWidthT;\r
628                                 poly[1].Y = y2;\r
629                                 break;\r
630                         case 13:\r
631                                 poly[2].X = x2 - kMinWidthT;\r
632                                 poly[2].Y = y2 + kWidth * kKakato + kMinWidthT;\r
633                                 poly[1].X = x2 + kMinWidthT;\r
634                                 poly[1].Y = y2 + kWidth * kKakato;\r
635                                 break;\r
636                         case 23:\r
637                                 poly[2].X = x2 - kMinWidthT;\r
638                                 poly[2].Y = y2 + kWidth * kKakato * 0.5 + kMinWidthT;\r
639                                 poly[1].X = x2 + kMinWidthT;\r
640                                 poly[1].Y = y2 + kWidth * kKakato * 0.5;\r
641                                 break;\r
642                         case 32:\r
643                                 poly[2].X = x2 - kMinWidthT;\r
644                                 poly[2].Y = y2 + kMinWidthY;\r
645                                 poly[1].X = x2 + kMinWidthT;\r
646                                 poly[1].Y = y2 + kMinWidthY;\r
647                                 break;\r
648                         }\r
649                         \r
650                         icPolygon(poly, 4);\r
651                         \r
652                         if(a1 == 22){ //box's right top corner\r
653                                 poly3[0].X = x1 - kMinWidthT;\r
654                                 poly3[0].Y = y1 - kMinWidthY;\r
655                                 poly3[1].X = x1;\r
656                                 poly3[1].Y = y1 - kMinWidthY - kWidth;\r
657                                 poly3[2].X = x1 + kMinWidthT + kWidth;\r
658                                 poly3[2].Y = y1 + kMinWidthY;\r
659                                 poly3[3].X = x1 + kMinWidthT;\r
660                                 poly3[3].Y = y1 + kMinWidthT;\r
661                                 poly3[4].X = x1 - kMinWidthT;\r
662                                 poly3[4].Y = y1;\r
663                                 icPolygon(poly3, 5);\r
664                         }\r
665                         \r
666                         if(a1 == 0){ //beginning of the stroke\r
667                                 poly2[0].X = x1 + kMinWidthT;\r
668                                 poly2[0].Y = y1 + kMinWidthY * 0.5;\r
669                                 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;\r
670                                 poly2[1].Y = y1 + kMinWidthY * 0.5 + kMinWidthY;\r
671                                 poly2[2].X = x1 + kMinWidthT;\r
672                                 poly2[2].Y = y1 + kMinWidthY * 0.5 + kMinWidthY * 2;\r
673                                 icPolygon(poly2, 3);\r
674                         }\r
675                         \r
676                         if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU\r
677                                 poly3[4].X = x2 - kMinWidthT;\r
678                                 poly3[4].Y = y2;\r
679                                 poly3[3].X = x2 - kMinWidthT * 0.6;\r
680                                 poly3[3].Y = y2 + kMinWidthT * 0.6;\r
681                                 poly3[2].X = x2;\r
682                                 poly3[2].Y = y2 + kMinWidthT;\r
683                                 poly3[1].X = x2 + kMinWidthT * 0.6;\r
684                                 poly3[1].Y = y2 + kMinWidthT * 0.6;\r
685                                 poly3[0].X = x2 + kMinWidthT;\r
686                                 poly3[0].Y = y2;\r
687                                 icPolygon(poly3, 5);\r
688                         }\r
689                 }\r
690                 else if(y1 == y2){ //if it is YOKO stroke, use x-axis\r
691                         if(a1 == 6){ //if it is KAGI's YOKO stroke, get bold\r
692                                 poly[0].X = x1;\r
693                                 poly[0].Y = y1 - kMinWidthT;\r
694                                 poly[1].X = x2;\r
695                                 poly[1].Y = y2 - kMinWidthT;\r
696                                 poly[2].X = x2;\r
697                                 poly[2].Y = y2 + kMinWidthT;\r
698                                 poly[3].X = x1;\r
699                                 poly[3].Y = y1 + kMinWidthT;\r
700                                 icPolygon(poly, 4);\r
701                                 \r
702                                 if(a2 == 1 || a2 == 0 || a2 == 5){\r
703                                         //KAGI NO YOKO BOU NO SAIGO NO MARU\r
704                                         poly3[0].X = x2;\r
705                                         poly3[0].Y = y2 - kMinWidthT;\r
706                                         poly3[1].X = x2 + kMinWidthT * 0.6;\r
707                                         poly3[1].Y = y2 - kMinWidthT * 0.6;\r
708                                         poly3[2].X = x2 + kMinWidthT;\r
709                                         poly3[2].Y = y2;\r
710                                         poly3[3].X = x2 + kMinWidthT * 0.6;\r
711                                         poly3[3].Y = y2 + kMinWidthT * 0.6;\r
712                                         poly3[4].X = x2;\r
713                                         poly3[4].Y = y2 + kMinWidthT;\r
714                                         icPolygon(poly3, 5);\r
715                                 }\r
716                                 \r
717                                 if(a2 == 5){\r
718                                         //KAGI NO YOKO BOU NO HANE\r
719                                         poly[0].X = x2;\r
720                                         poly[0].Y = y2 - kMinWidthT + 1;\r
721                                         poly[1].X = x2 + 2;\r
722                                         poly[1].Y = y2 - kMinWidthT - kWidth * 5;\r
723                                         poly[2].X = x2;\r
724                                         poly[2].Y = y2 - kMinWidthT - kWidth * 5;\r
725                                         poly[3].X = x2 - kMinWidthT;\r
726                                         poly[3].Y = y2 - kMinWidthT + 1;\r
727                                         icPolygon(poly, 4);\r
728                                 }\r
729                         }\r
730                         else{\r
731                                 switch(a1){\r
732                                 case 0:\r
733                                         poly[0].X = x1;\r
734                                         poly[0].Y = y1 - kMinWidthY;\r
735                                         poly[3].X = x1;\r
736                                         poly[3].Y = y1 + kMinWidthY;\r
737                                         break;\r
738                                 case 2:\r
739                                         poly[0].X = x1 - kMinWidthT;\r
740                                         poly[0].Y = y1 - kMinWidthY;\r
741                                         poly[3].X = x1 - kMinWidthT;\r
742                                         poly[3].Y = y1 + kMinWidthY;\r
743                                         break;\r
744                                 }\r
745                                 \r
746                                 switch(a2){\r
747                                 case 0:\r
748                                         poly[1].X = x2;\r
749                                         poly[1].Y = y2 - kMinWidthY;\r
750                                         poly[2].X = x2;\r
751                                         poly[2].Y = y2 + kMinWidthY;\r
752                                         break;\r
753                                 case 2:\r
754                                         poly[1].X = x2 + kMinWidthT;\r
755                                         poly[1].Y = y2 - kMinWidthY;\r
756                                         poly[2].X = x2 + kMinWidthT;\r
757                                         poly[2].Y = y2 + kMinWidthY;\r
758                                 }\r
759                                 \r
760                                 icPolygon(poly, 4);\r
761                                 \r
762                                 //UROKO\r
763                                 if(a2 == 0){\r
764                                         poly2[0].X = x2;\r
765                                         poly2[0].Y = y2 - kMinWidthY;\r
766                                         poly2[1].X = x2 - 24;\r
767                                         poly2[1].Y = y2;\r
768                                         poly2[2].X = x2 - 12;\r
769                                         poly2[2].Y = y2 - 12;\r
770                                         icPolygon(poly2, 3);\r
771                                 }\r
772                         }\r
773                 }\r
774                 else{ //for others, use x-axis\r
775                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
776                         if((abs(y2 - y1) < abs(x2 - x1)) && (a1 != 6) && (a2 != 6)){ //ASAI KAUDO\r
777                                 switch(a1){ //must be 0 or 2\r
778                                 case 0:\r
779                                         poly[0].X = x1 + sin(rad) * kMinWidthY;\r
780                                         poly[0].Y = y1 - cos(rad) * kMinWidthY;\r
781                                         poly[3].X = x1 - sin(rad) * kMinWidthY;\r
782                                         poly[3].Y = y1 + cos(rad) * kMinWidthY;\r
783                                         break;\r
784                                 case 2:\r
785                                         poly[0].X = x1 + sin(rad) * kMinWidthY - kMinWidthT * cos(rad);\r
786                                         poly[0].Y = y1 - cos(rad) * kMinWidthY - kMinWidthT * sin(rad);\r
787                                         poly[3].X = x1 - sin(rad) * kMinWidthY - kMinWidthT * cos(rad);\r
788                                         poly[3].Y = y1 + cos(rad) * kMinWidthY - kMinWidthT * sin(rad);\r
789                                         break;\r
790                                 }\r
791                                 \r
792                                 switch(a2){ //must be 0 or 2\r
793                                 case 0:\r
794                                         poly[1].X = x2 + sin(rad) * kMinWidthY;\r
795                                         poly[1].Y = y2 - cos(rad) * kMinWidthY;\r
796                                         poly[2].X = x2 - sin(rad) * kMinWidthY;\r
797                                         poly[2].Y = y2 + cos(rad) * kMinWidthY;\r
798                                         break;\r
799                                 case 2:\r
800                                         poly[1].X = x2 + sin(rad) * kMinWidthY + kMinWidthT * cos(rad);\r
801                                         poly[1].Y = y2 - cos(rad) * kMinWidthY + kMinWidthT * sin(rad);\r
802                                         poly[2].X = x2 - sin(rad) * kMinWidthY + kMinWidthT * cos(rad);\r
803                                         poly[2].Y = y2 + cos(rad) * kMinWidthY + kMinWidthT * sin(rad);\r
804                                 }\r
805                                 \r
806                                 icPolygon(poly, 4);\r
807                                 \r
808                                 //UROKO\r
809                                 if(a2 == 0){\r
810                                         poly2[0].X = x2 + sin(rad) * kMinWidthY;\r
811                                         poly2[0].Y = y2 - cos(rad) * kMinWidthY;\r
812                                         poly2[1].X = x2 - cos(rad) * 24;\r
813                                         poly2[1].Y = y2 - sin(rad) * 24;\r
814                                         poly2[2].X = x2 - cos(rad) * 12 + sin(rad) * 12;\r
815                                         poly2[2].Y = y2 - sin(rad) * 12 - cos(rad) * 12;\r
816                                         icPolygon(poly2, 3);\r
817                                 }\r
818                         }\r
819                         \r
820                         else{ //KAKUDO GA FUKAI or KAGI NO YOKO BOU\r
821                                 if(x1 > x2){ v = -1; } else{ v = 1; }\r
822                                 switch(a1){\r
823                                 case 0:\r
824                                         poly[0].X = x1 + sin(rad) * kMinWidthT * v + kMinWidthY * cos(rad) * 0.5 * v;\r
825                                         poly[0].Y = y1 - cos(rad) * kMinWidthT * v + kMinWidthY * sin(rad) * 0.5 * v;\r
826                                         poly[3].X = x1 - sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * 0.5 * v;\r
827                                         poly[3].Y = y1 + cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * 0.5 * v;\r
828                                         break;\r
829                                 case 1:\r
830                                 case 6:\r
831                                 case 22:\r
832                                         poly[0].X = x1 + sin(rad) * kMinWidthT * v;\r
833                                         poly[0].Y = y1 - cos(rad) * kMinWidthT * v;\r
834                                         poly[3].X = x1 - sin(rad) * kMinWidthT * v;\r
835                                         poly[3].Y = y1 + cos(rad) * kMinWidthT * v;\r
836                                         break;\r
837                                 case 12:\r
838                                         poly[0].X = x1 + sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * v;\r
839                                         poly[0].Y = y1 - cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * v;\r
840                                         poly[3].X = x1 - sin(rad) * kMinWidthT * v - (kMinWidthT + kMinWidthY) * cos(rad) * v;\r
841                                         poly[3].Y = y1 + cos(rad) * kMinWidthT * v - (kMinWidthT + kMinWidthY) * sin(rad) * v;\r
842                                         break;\r
843                                 case 32:\r
844                                         poly[0].X = x1 + sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * v;\r
845                                         poly[0].Y = y1 - cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * v;\r
846                                         poly[3].X = x1 - sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * v;\r
847                                         poly[3].Y = y1 + cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * v;\r
848                                         break;\r
849                                 }\r
850                                 \r
851                                 switch(a2){\r
852                                 case 0:\r
853                                         if(a1 == 6){\r
854                                                 poly[1].X = x2 + sin(rad) * kMinWidthT * v;\r
855                                                 poly[1].Y = y2 - cos(rad) * kMinWidthT * v;\r
856                                                 poly[2].X = x2 - sin(rad) * kMinWidthT * v;\r
857                                                 poly[2].Y = y2 + cos(rad) * kMinWidthT * v;\r
858                                         }\r
859                                         else{\r
860                                                 poly[1].X = x2 + sin(rad) * kMinWidthT * v - kMinWidthT * 0.5 * cos(rad) * v;\r
861                                                 poly[1].Y = y2 - cos(rad) * kMinWidthT * v - kMinWidthT * 0.5 * sin(rad) * v;\r
862                                                 poly[2].X = x2 - sin(rad) * kMinWidthT * v + kMinWidthT * 0.5 * cos(rad) * v;\r
863                                                 poly[2].Y = y2 + cos(rad) * kMinWidthT * v + kMinWidthT * 0.5 * sin(rad) * v;\r
864                                         }\r
865                                         break;\r
866                                 case 1:\r
867                                 case 5:\r
868                                         poly[1].X = x2 + sin(rad) * kMinWidthT * v;\r
869                                         poly[1].Y = y2 - cos(rad) * kMinWidthT * v;\r
870                                         poly[2].X = x2 - sin(rad) * kMinWidthT * v;\r
871                                         poly[2].Y = y2 + cos(rad) * kMinWidthT * v;\r
872                                         break;\r
873                                 case 13:\r
874                                         poly[1].X = x2 + sin(rad) * kMinWidthT * v + kWidth * kKakato * cos(rad) * v;\r
875                                         poly[1].Y = y2 - cos(rad) * kMinWidthT * v + kWidth * kKakato * sin(rad) * v;\r
876                                         poly[2].X = x2 - sin(rad) * kMinWidthT * v + (kWidth * kKakato + kMinWidthT) * cos(rad) * v;\r
877                                         poly[2].Y = y2 + cos(rad) * kMinWidthT * v + (kWidth * kKakato + kMinWidthT) * sin(rad) * v;\r
878                                         break;\r
879                                 case 23:\r
880                                         poly[1].X = x2 + sin(rad) * kMinWidthT * v + kWidth * kKakato * 0.5 * cos(rad) * v;\r
881                                         poly[1].Y = y2 - cos(rad) * kMinWidthT * v + kWidth * kKakato * 0.5 * sin(rad) * v;\r
882                                         poly[2].X = x2 - sin(rad) * kMinWidthT * v + (kWidth * kKakato * 0.5 + kMinWidthT) * cos(rad) * v;\r
883                                         poly[2].Y = y2 + cos(rad) * kMinWidthT * v + (kWidth * kKakato * 0.5 + kMinWidthT) * sin(rad) * v;\r
884                                         break;\r
885                                 case 32:\r
886                                         poly[1].X = x2 + sin(rad) * kMinWidthT * v + kMinWidthY * cos(rad) * v;\r
887                                         poly[1].Y = y2 - cos(rad) * kMinWidthT * v + kMinWidthY * sin(rad) * v;\r
888                                         poly[2].X = x2 - sin(rad) * kMinWidthT * v + kMinWidthY * cos(rad) * v;\r
889                                         poly[2].Y = y2 + cos(rad) * kMinWidthT * v + kMinWidthY * sin(rad) * v;\r
890                                         break;\r
891                                 }\r
892                                 \r
893                                 icPolygon(poly, 4);\r
894                                 \r
895                                 if((a1 == 6) && (a2 == 0 || a2 == 5)){ //KAGI NO YOKO BOU NO SAIGO NO MARU\r
896                                         poly3[0].X = x2 + sin(rad) * kMinWidthT * v;\r
897                                         poly3[0].Y = y2 - cos(rad) * kMinWidthT * v;\r
898                                         poly3[1].X = x2 + cos(rad) * kMinWidthT * 0.8 * v + sin(rad) * kMinWidthT * 0.6 * v;\r
899                                         poly3[1].Y = y2 + sin(rad) * kMinWidthT * 0.8 * v - cos(rad) * kMinWidthT * 0.6 * v;\r
900                                         poly3[2].X = x2 + cos(rad) * kMinWidthT * v;\r
901                                         poly3[2].Y = y2 + sin(rad) * kMinWidthT * v;\r
902                                         poly3[3].X = x2 + cos(rad) * kMinWidthT * 0.8 * v - sin(rad) * kMinWidthT * 0.6 * v;\r
903                                         poly3[3].Y = y2 + sin(rad) * kMinWidthT * 0.8 * v + cos(rad) * kMinWidthT * 0.6 * v;\r
904                                         poly3[4].X = x2 - sin(rad) * kMinWidthT * v;\r
905                                         poly3[4].Y = y2 + cos(rad) * kMinWidthT * v;\r
906                                         icPolygon(poly3, 5);\r
907                                 }\r
908                                 \r
909                                 if(a1 == 6 && a2 == 5){\r
910                                         //KAGI NO YOKO BOU NO HANE\r
911                                         poly[0].X = x2 + (kMinWidthT - 1) * sin(rad) * v;\r
912                                         poly[0].Y = y2 - (kMinWidthT - 1) * cos(rad) * v;\r
913                                         poly[1].X = x2 + 2 * cos(rad) * v + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
914                                         poly[1].Y = y2 + 2 * sin(rad) * v - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
915                                         poly[2].X = x2 + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
916                                         poly[2].Y = y2 - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
917                                         poly[3].X = x2 + (kMinWidthT - 1) * sin(rad) * v - kMinWidthT * cos(rad) * v;\r
918                                         poly[3].Y = y2 - (kMinWidthT - 1) * cos(rad) * v - kMinWidthT * sin(rad) * v;\r
919                                         icPolygon(poly, 4);\r
920                                 }\r
921                                 \r
922                                 if(a1 == 22){ //SHIKAKU MIGIUE UROKO NANAME DEMO MASSUGU MUKI\r
923                                         poly3[0].X = x1 - kMinWidthT;\r
924                                         poly3[0].Y = y1 - kMinWidthY;\r
925                                         poly3[1].X = x1;\r
926                                         poly3[1].Y = y1 - kMinWidthY - kWidth;\r
927                                         poly3[2].X = x1 + kMinWidthT + kWidth;\r
928                                         poly3[2].Y = y1 + kMinWidthY;\r
929                                         poly3[3].X = x1 + kMinWidthT;\r
930                                         poly3[3].Y = y1 + kMinWidthT;\r
931                                         poly3[4].X = x1 - kMinWidthT;\r
932                                         poly3[4].Y = y1;\r
933                                         icPolygon(poly3, 5);\r
934                                 }\r
935                                 \r
936                                 XX = sin(rad) * v;\r
937                                 XY = cos(rad) * v * -1;\r
938                                 YX = cos(rad) * v;\r
939                                 YY = sin(rad) * v;\r
940                                 \r
941                                 if(a1 == 0){ //beginning of the storke\r
942                                         poly2[0].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5) * YX;\r
943                                         poly2[0].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5) * YY;\r
944                                         poly2[1].X = x1 + (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;\r
945                                         poly2[1].Y = y1 + (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;\r
946                                         poly2[2].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
947                                         poly2[2].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
948                                         icPolygon(poly2, 3);\r
949                                 }\r
950                         }\r
951                 }\r
952         }\r
953         else{ //gothic\r
954                 if(tx1 == tx2){ //if TATE stroke, use y-axis\r
955                         if(ty1 > ty2){\r
956                                 x1 = tx2;\r
957                                 y1 = ty2;\r
958                                 x2 = tx1;\r
959                                 y2 = ty1;\r
960                                 a1 = ta2;\r
961                                 a2 = ta1;\r
962                         }\r
963                         else{\r
964                                 x1 = tx1;\r
965                                 y1 = ty1;\r
966                                 x2 = tx2;\r
967                                 y2 = ty2;\r
968                                 a1 = ta1;\r
969                                 a2 = ta2;\r
970                         }\r
971                         \r
972                         if(a1 % 10 == 2){ y1 = y1 - kWidth; }\r
973                         if(a2 % 10 == 2){ y2 = y2 + kWidth; }\r
974                         if(a1 % 10 == 3){ y1 = y1 - kWidth * kKakato; }\r
975                         if(a2 % 10 == 3){ y2 = y2 + kWidth * kKakato; }\r
976                         \r
977                         poly[3].X = x1 - kWidth;\r
978                         poly[3].Y = y1;\r
979                         poly[2].X = x2 - kWidth;\r
980                         poly[2].Y = y2;\r
981                         poly[1].X = x2 + kWidth;\r
982                         poly[1].Y = y2;\r
983                         poly[0].X = x1 + kWidth;\r
984                         poly[0].Y = y1;\r
985                         \r
986                         icPolygon(poly, 4);\r
987                 }\r
988                 else if(ty1 == ty2){ //if YOKO stroke, use x-axis\r
989                         if(tx1 > tx2){\r
990                                 x1 = tx2;\r
991                                 y1 = ty2;\r
992                                 x2 = tx1;\r
993                                 y2 = ty1;\r
994                                 a1 = ta2;\r
995                                 a2 = ta1;\r
996                         }\r
997                         else{\r
998                                 x1 = tx1;\r
999                                 y1 = ty1;\r
1000                                 x2 = tx2;\r
1001                                 y2 = ty2;\r
1002                                 a1 = ta1;\r
1003                                 a2 = ta2;\r
1004                         }\r
1005                         if(a1 % 10 == 2){ x1 = x1 - kWidth; }\r
1006                         if(a2 % 10 == 2){ x2 = x2 + kWidth; }\r
1007                         if(a1 % 10 == 3){ x1 = x1 - kWidth * kKakato; }\r
1008                         if(a2 % 10 == 3){ x2 = x2 + kWidth * kKakato; }\r
1009                         \r
1010                         poly[0].X = x1;\r
1011                         poly[0].Y = y1 - kWidth;\r
1012                         poly[1].X = x2;\r
1013                         poly[1].Y = y2 - kWidth;\r
1014                         poly[2].X = x2;\r
1015                         poly[2].Y = y2 + kWidth;\r
1016                         poly[3].X = x1;\r
1017                         poly[3].Y = y1 + kWidth;\r
1018                         \r
1019                         icPolygon(poly, 4);\r
1020                 }\r
1021                 else{ //for others, use x-axis\r
1022                         if(tx1 > tx2){\r
1023                                 x1 = tx2;\r
1024                                 y1 = ty2;\r
1025                                 x2 = tx1;\r
1026                                 y2 = ty1;\r
1027                                 a1 = ta2;\r
1028                                 a2 = ta1;\r
1029                         }\r
1030                         else{\r
1031                                 x1 = tx1;\r
1032                                 y1 = ty1;\r
1033                                 x2 = tx2;\r
1034                                 y2 = ty2;\r
1035                                 a1 = ta1;\r
1036                                 a2 = ta2;\r
1037                         }\r
1038                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
1039                         if(a1 % 10 == 2){\r
1040                                 x1 = x1 - kWidth * cos(rad);\r
1041                                 y1 = y1 - kWidth * sin(rad);\r
1042                         }\r
1043                         if(a2 % 10 == 2){\r
1044                                 x2 = x2 + kWidth * cos(rad);\r
1045                                 y2 = y2 + kWidth * sin(rad);\r
1046                         }\r
1047                         if(a1 % 10 == 3){\r
1048                                 x1 = x1 - kWidth * cos(rad) * kKakato;\r
1049                                 y1 = y1 - kWidth * sin(rad) * kKakato;\r
1050                         }\r
1051                         if(a2 % 10 == 3){\r
1052                                 x2 = x2 + kWidth * cos(rad) * kKakato;\r
1053                                 y2 = y2 + kWidth * sin(rad) * kKakato;\r
1054                         }\r
1055                         \r
1056                         //SUICHOKU NO ICHI ZURASHI HA sin TO cos NO IREKAE + x-axis MAINASU KA\r
1057                         poly[0].X = x1 + sin(rad) * kWidth;\r
1058                         poly[0].Y = y1 - cos(rad) * kWidth;\r
1059                         poly[1].X = x2 + sin(rad) * kWidth;\r
1060                         poly[1].Y = y2 - cos(rad) * kWidth;\r
1061                         poly[2].X = x2 - sin(rad) * kWidth;\r
1062                         poly[2].Y = y2 + cos(rad) * kWidth;\r
1063                         poly[3].X = x1 - sin(rad) * kWidth;\r
1064                         poly[3].Y = y1 + cos(rad) * kWidth;\r
1065                         \r
1066                         icPolygon(poly, 4);\r
1067                 }\r
1068         }\r
1069 }\r