Change box-shape judgement method. Fix gray color painting method.
[chise/kage.git] / kagecgi / kagecd.c
1 //kagecd.c\r
2 //\r
3 #include "kage.h"\r
4 \r
5 void cdDrawBezier(double x1, double y1,\r
6         double x2, double y2,\r
7         double x3, double y3,\r
8         double x4, double y4,\r
9         int a1, int a2){\r
10 \r
11         double rad, t;\r
12         double x, y, v;\r
13         double ix, iy, ia, ib, ir;\r
14         int count, tt;\r
15         double delta;\r
16         double deltad;\r
17         double XX, XY, YX, YY;\r
18         \r
19         if(kShotai == kMincho){ // mincho\r
20         switch(a1){\r
21         case 0:\r
22         case 7:\r
23                 delta = -1 * kMinWidthY * 0.5;\r
24                 break;\r
25         case 1:\r
26         case 2:\r
27         case 6:\r
28         case 22:\r
29                 delta = 0;\r
30                 break;\r
31         case 12:\r
32         case 32:\r
33                 delta = kMinWidthY;\r
34                 break;\r
35         default:\r
36                 break;\r
37         }\r
38         \r
39         if(x1 == x2){\r
40                 if(y1 < y2){ y1 = y1 - delta; }\r
41                 else{ y1 = y1 + delta; }\r
42         }\r
43         else if(y1 == y2){\r
44                 if(x1 < x2){ x1 = x1 - delta; }\r
45                 else{ x1 = x1 + delta; }\r
46         }\r
47         else{\r
48                 rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
49                 if(x1 < x2){ v = 1; } else{ v = -1; }\r
50                 x1 = x1 - delta * cos(rad) * v;\r
51                 y1 = y1 - delta * sin(rad) * v;\r
52         }\r
53         \r
54         switch(a2){\r
55         case 0:\r
56         case 1:\r
57         case 8:\r
58         case 7:\r
59         case 9:\r
60         case 15:\r
61         case 14:\r
62         case 17:\r
63         case 5:\r
64                 delta = 0;\r
65                 break;\r
66         default:\r
67                 break;\r
68         }\r
69         \r
70         if(x3 == x4){\r
71                 if(y3 < y4){ y4 = y4 + delta; }\r
72                 else{ y4 = y4 - delta; }\r
73         }\r
74         else if(y3 == y4){\r
75                 if(x3 < x4){ x4 = x4 + delta; }\r
76                 else{ x4 = x4 - delta; }\r
77         }\r
78         else{\r
79                 rad = atan((double)(y4 - y3) / (double)(x4 - x3));\r
80                 if(x3 < x4){ v = 1; } else{ v = -1; }\r
81                 x4 = x4 + delta * cos(rad) * v;\r
82                 y4 = y4 + delta * sin(rad) * v;\r
83         }\r
84         \r
85         count = 0;\r
86         \r
87         for(tt = 0; tt <= 1000; tt = tt + kRate){\r
88                 t = (double)(tt) / 1000;\r
89                 \r
90                 //calculate a dot\r
91                 x = (1.0 - t) * (1.0 - t) * (1.0 - t) * x1 + 3.0 * t * (1.0 - t) * (1.0 - t) * x2 + 3 * t * t * (1.0 - t) * x3 + t * t * t * x4;\r
92                 y = (1.0 - t) * (1.0 - t) * (1.0 - t) * y1 + 3.0 * t * (1.0 - t) * (1.0 - t) * y2 + 3 * t * t * (1.0 - t) * y3 + t * t * t * y4;\r
93                 //KATAMUKI of vector by BIBUN\r
94                 ix = t * t * (-3 * x1 + 9 * x2 + -9 * x3 + 3 * x4) + t * (6 * x1 + -12 * x2 + 6 * x3) + -3 * x1 + 3 * x2;\r
95                 iy = t * t * (-3 * y1 + 9 * y2 + -9 * y3 + 3 * y4) + t * (6 * y1 + -12 * y2 + 6 * y3) + -3 * y1 + 3 * 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){ deltad = sqrt(t); }\r
113                 else if(a2 == 7){ deltad = sqrt(1.0 - t); }\r
114                 else{ deltad = 1; }\r
115                 ia = ia * deltad;\r
116                 ib = ib * deltad;\r
117                 \r
118                 //reverse if vector is going 2nd/3rd quadrants\r
119                 if(ix <= 0){\r
120                   ia = ia * -1;\r
121                   ib = ib * -1;\r
122                 }\r
123                 \r
124                 //copy to polygon structuer\r
125                 poly[count].X = x - ia;\r
126                 poly[count].Y = y - ib;\r
127                 poly[(1000 / kRate + 1) * 2 - 1 - count].X = x + ia;\r
128                 poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y + ib;\r
129                 count += 1;\r
130         }\r
131         \r
132         icPolygon(poly, (1000 / kRate + 1) * 2);\r
133         \r
134         //process for head of stroke\r
135         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
136         if(x1 < x2){ v = 1; } else{ v = -1; }\r
137         XX = sin(rad) * v;\r
138         XY = cos(rad) * v * -1;\r
139         YX = cos(rad) * v;\r
140         YY = sin(rad) * v;\r
141         \r
142         if(a1 == 12){\r
143                 if(x1 == x2){\r
144                         poly2[0].X = x1 - kMinWidthT;\r
145                         poly2[0].Y = y1;\r
146                         poly2[1].X = x1 + kMinWidthT;\r
147                         poly2[1].Y = y1;\r
148                         poly2[2].X = x1 - kMinWidthT;\r
149                         poly2[2].Y = y1 - kMinWidthT;\r
150                         icPolygon(poly2, 3);\r
151                 }\r
152                 else{\r
153                         poly2[0].X = x1 - kMinWidthT * XX;\r
154                         poly2[0].Y = y1 - kMinWidthT * XY;\r
155                         poly2[1].X = x1 + kMinWidthT * XX;\r
156                         poly2[1].Y = y1 + kMinWidthT * XY;\r
157                         poly2[2].X = x1 - kMinWidthT * XX - kMinWidthT * YX;\r
158                         poly2[2].Y = y1 - kMinWidthT * XY - kMinWidthT * YY;\r
159                         icPolygon(poly2, 3);\r
160                 }\r
161         }\r
162         \r
163         if(a1 == 0){\r
164                 if(y1 <= y4){ //from up to bottom\r
165                         if(x1 == x2){\r
166                                 poly2[0].X = x1 - kMinWidthT;\r
167                                 poly2[0].Y = y1;\r
168                                 poly2[1].X = x1 + kMinWidthT;\r
169                                 poly2[1].Y = y1;\r
170                                 poly2[2].X = x1 - kMinWidthT;\r
171                                 poly2[2].Y = y1 - kMinWidthY;\r
172                                 icPolygon(poly2, 3);\r
173                         }\r
174                         else{\r
175                                 poly2[0].X = x1 - kMinWidthT * XX;\r
176                                 poly2[0].Y = y1 - kMinWidthT * XY;\r
177                                 poly2[1].X = x1 + kMinWidthT * XX;\r
178                                 poly2[1].Y = y1 + kMinWidthT * XY;\r
179                                 poly2[2].X = x1 - kMinWidthT * XX - kMinWidthY * YX;\r
180                                 poly2[2].Y = y1 - kMinWidthT * XY - kMinWidthY * YY;\r
181                                 icPolygon(poly2, 3);\r
182                         }\r
183                 }\r
184                 else{ //bottom to up\r
185                         if(x1 == x2){ //is it right?\r
186                                 poly2[0].X = x1 - kMinWidthT;\r
187                                 poly2[0].Y = y1;\r
188                                 poly2[1].X = x1 + kMinWidthT;\r
189                                 poly2[1].Y = y1;\r
190                                 poly2[2].X = x1 - kMinWidthT;\r
191                                 poly2[2].Y = y1 + kMinWidthY;\r
192                                 icPolygon(poly2, 3);\r
193                         }\r
194                         else{\r
195                                 poly2[0].X = x1 - kMinWidthT * XX;\r
196                                 poly2[0].Y = y1 - kMinWidthT * XY;\r
197                                 poly2[1].X = x1 + kMinWidthT * XX;\r
198                                 poly2[1].Y = y1 + kMinWidthT * XY;\r
199                                 poly2[2].X = x1 + kMinWidthT * XX - kMinWidthY * YX;\r
200                                 poly2[2].Y = y1 + kMinWidthT * XY - kMinWidthY * YY;\r
201                                 icPolygon(poly2, 3);\r
202                         }\r
203                 }\r
204         }\r
205         \r
206         if(a1 == 22){ //box's up-right corner, any time same degree\r
207                 poly3[0].X = x1 - kMinWidthT;\r
208                 poly3[0].Y = y1 - kMinWidthY;\r
209                 poly3[1].X = x1;\r
210                 poly3[1].Y = y1 - kMinWidthY - kWidth;\r
211                 poly3[2].X = x1 + kMinWidthT + kWidth;\r
212                 poly3[2].Y = y1 + kMinWidthY;\r
213                 poly3[3].X = x1 + kMinWidthT;\r
214                 poly3[3].Y = y1 + kMinWidthT;\r
215                 poly3[4].X = x1 - kMinWidthT;\r
216                 poly3[4].Y = y1;\r
217                 icPolygon(poly3, 5);\r
218         }\r
219         \r
220         if(a1 == 0){ //beginning of the stroke\r
221                 if(y1 <= y4){ //from up to bottom\r
222                         if(x1 == x2){\r
223                                 poly2[0].X = x1 + kMinWidthT;\r
224                                 poly2[0].Y = y1 + kMinWidthY * 0.5;\r
225                                 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;\r
226                                 poly2[1].Y = y1 + kMinWidthY * 0.5 + kMinWidthY;\r
227                                 poly2[2].X = x1 + kMinWidthT;\r
228                                 poly2[2].Y = y1 + kMinWidthY * 0.5 + kMinWidthY * 2;\r
229                                 icPolygon(poly2, 3);\r
230                         }\r
231                         else{\r
232                                 poly2[0].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5) * YX;\r
233                                 poly2[0].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5) * YY;\r
234                                 poly2[1].X = x1 + (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;\r
235                                 poly2[1].Y = y1 + (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;\r
236                                 poly2[2].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
237                                 poly2[2].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
238                                 icPolygon(poly2, 3);\r
239                         }\r
240                 }\r
241                 else{ //from bottom to up\r
242                         if(x1 == x2){ //is it right?\r
243                                 poly2[0].X = x1 + kMinWidthT;\r
244                                 poly2[0].Y = y1 - kMinWidthY * 0.5;\r
245                                 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;\r
246                                 poly2[1].Y = y1 - kMinWidthY * 0.5 - kMinWidthY;\r
247                                 poly2[2].X = x1 + kMinWidthT;\r
248                                 poly2[2].Y = y1 - kMinWidthY * 0.5 - kMinWidthY * 2;\r
249                                 icPolygon(poly2, 3);\r
250                         }\r
251                         else //SETSUGOUMEN GA KAKERUNODE HOKYOU\r
252                                 poly3[0].X = x1 - (kMinWidthT - 1) * XX + (kMinWidthY * 0.5) * YX;\r
253                                 poly3[0].Y = y1 - (kMinWidthT - 1) * XY + (kMinWidthY * 0.5) * YY;\r
254                                 poly3[1].X = x1 - (kMinWidthT - 0) * XX + (kMinWidthY * 0.5) * YX;\r
255                                 poly3[1].Y = y1 - (kMinWidthT - 0) * XY + (kMinWidthY * 0.5) * YY;\r
256                                 poly3[2].X = x1 - (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;\r
257                                 poly3[2].Y = y1 - (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;\r
258                                 poly3[3].X = x1 - (kMinWidthT - 0) * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
259                                 poly3[3].Y = y1 - (kMinWidthT - 0) * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
260                                 poly3[4].X = x1 - (kMinWidthT - 1) * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
261                                 poly3[4].Y = y1 - (kMinWidthT - 1) * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
262                                 icPolygon(poly3, 5);\r
263                         }\r
264                 }\r
265                 \r
266                 //process for tail\r
267                 rad = atan((double)(y4 - y3) / (double)(x4 - x3));\r
268                 if(x3 < x4){ v = 1; } else{ v = -1; }\r
269                 YX = sin(rad) * v * -1;\r
270                 YY = cos(rad) * v;\r
271                 XX = cos(rad) * v;\r
272                 XY = sin(rad) * v;\r
273                 \r
274                 if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle\r
275                         if(x3 == x4){\r
276                                 poly3[0].X = x4 - kMinWidthT;\r
277                                 poly3[0].Y = y4;\r
278                                 poly3[1].X = x4 - kMinWidthT * 0.6;\r
279                                 poly3[1].Y = y4 + kMinWidthT * 0.6;\r
280                                 poly3[2].X = x4;\r
281                                 poly3[2].Y = y4 + kMinWidthT;\r
282                                 poly3[3].X = x4 + kMinWidthT * 0.6;\r
283                                 poly3[3].Y = y4 + kMinWidthT * 0.6;\r
284                                 poly3[4].X = x4 + kMinWidthT;\r
285                                 poly3[4].Y = y4;\r
286                                 icPolygon(poly3, 5);\r
287                         }\r
288                         else if(y3 == y4){\r
289                                 poly3[0].X = x4;\r
290                                 poly3[0].Y = y4 - kMinWidthT;\r
291                                 poly3[1].X = x4 + kMinWidthT * 0.6;\r
292                                 poly3[1].Y = y4 - kMinWidthT * 0.6;\r
293                                 poly3[2].X = x4 + kMinWidthT;\r
294                                 poly3[2].Y = y4;\r
295                                 poly3[3].X = x4 + kMinWidthT * 0.6;\r
296                                 poly3[3].Y = y4 + kMinWidthT * 0.6;\r
297                                 poly3[4].X = x4;\r
298                                 poly3[4].Y = y4 + kMinWidthT;\r
299                                 icPolygon(poly3, 5);\r
300                         }\r
301                         else{\r
302                                 poly3[0].X = x4 + sin(rad) * kMinWidthT * v;\r
303                                 poly3[0].Y = y4 - cos(rad) * kMinWidthT * v;\r
304                                 poly3[1].X = x4 + cos(rad) * kMinWidthT * 0.8 * v + sin(rad) * kMinWidthT * 0.6 * v;\r
305                                 poly3[1].Y = y4 + sin(rad) * kMinWidthT * 0.8 * v - cos(rad) * kMinWidthT * 0.6 * v;\r
306                                 poly3[2].X = x4 + cos(rad) * kMinWidthT * v;\r
307                                 poly3[2].Y = y4 + sin(rad) * kMinWidthT * v;\r
308                                 poly3[3].X = x4 + cos(rad) * kMinWidthT * 0.8 * v - sin(rad) * kMinWidthT * 0.6 * v;\r
309                                 poly3[3].Y = y4 + sin(rad) * kMinWidthT * 0.8 * v + cos(rad) * kMinWidthT * 0.6 * v;\r
310                                 poly3[4].X = x4 - sin(rad) * kMinWidthT * v;\r
311                                 poly3[4].Y = y4 + cos(rad) * kMinWidthT * v;\r
312                                 icPolygon(poly3, 5);\r
313                         }\r
314                 }\r
315                 \r
316                 if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Sinnyu & L2RD Harai\r
317                         if(y3 == y4){\r
318                                 poly2[0].X = x4;\r
319                                 poly2[0].Y = y4 + kMinWidthT;\r
320                                 poly2[1].X = x4;\r
321                                 poly2[1].Y = y4 - kMinWidthT;\r
322                                 poly2[2].X = x4 + kMinWidthT;\r
323                                 poly2[2].Y = y4 - kMinWidthT;\r
324                                 icPolygon(poly2, 3);\r
325                         }\r
326                         else{\r
327                                 poly2[0].X = x4 + kMinWidthT * YX;\r
328                                 poly2[0].Y = y4 + kMinWidthT * YY;\r
329                                 poly2[1].X = x4 - kMinWidthT * YX;\r
330                                 poly2[1].Y = y4 - kMinWidthT * YY;\r
331                                 poly2[2].X = x4 + kMinWidthT * XX - kMinWidthT * YX;\r
332                                 poly2[2].Y = y4 + kMinWidthT * XY - kMinWidthT * YY;\r
333                                 icPolygon(poly2, 3);\r
334                         }\r
335                 }\r
336                 \r
337                 if(a2 == 15){ //jump up\r
338                         if(y3 == y4){\r
339                                 poly4[0].X = x4;\r
340                                 poly4[0].Y = y4 - kMinWidthT + 1;\r
341                                 poly4[1].X = x4 + 2;\r
342                                 poly4[1].Y = y4 - kMinWidthT - kWidth * 5;\r
343                                 poly4[2].X = x4;\r
344                                 poly4[2].Y = y4 - kMinWidthT - kWidth * 5;\r
345                                 poly4[3].X = x4 - kMinWidthT;\r
346                                 poly4[3].Y = y4 - kMinWidthT + 1;\r
347                                 icPolygon(poly4, 4);\r
348                         }\r
349                         else{\r
350                                 poly4[0].X = x4 + (kMinWidthT - 1) * sin(rad) * v;\r
351                                 poly4[0].Y = y4 - (kMinWidthT - 1) * cos(rad) * v;\r
352                                 poly4[1].X = x4 + 2 * cos(rad) * v + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
353                                 poly4[1].Y = y4 + 2 * sin(rad) * v - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
354                                 poly4[2].X = x4 + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
355                                 poly4[2].Y = y4 - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
356                                 poly4[3].X = x4 + (kMinWidthT - 1) * sin(rad) * v - kMinWidthT * cos(rad) * v;\r
357                                 poly4[3].Y = y4 - (kMinWidthT - 1) * cos(rad) * v - kMinWidthT * sin(rad) * v;\r
358                                 icPolygon(poly4, 4);\r
359                         }\r
360                 }\r
361                 \r
362                 if(a2 == 14){ //jump to left, allways go left\r
363                         poly4[0].X = x4;\r
364                         poly4[0].Y = y4;\r
365                         poly4[1].X = x4;\r
366                         poly4[1].Y = y4 - kMinWidthT;\r
367                         poly4[2].X = x4 - kWidth * 4;\r
368                         poly4[2].Y = y4 - kMinWidthT;\r
369                         poly4[3].X = x4 - kWidth * 4;\r
370                         poly4[3].Y = y4 - kMinWidthT * 0.5;\r
371                         icPolygon(poly4, 4);\r
372                 }\r
373         }\r
374         else{ //gothic\r
375                 if(a1 % 10 == 2){\r
376                         if(x1 == x2){\r
377                                 if(y1 < y2){ y1 = y1 - kWidth; } else{ y1 = y1 + kWidth; }\r
378                         }\r
379                         else if(y1 == y2){\r
380                                 if(x1 < x2){ x1 = x1 - kWidth; } else{ x1 = x1 + kWidth; }\r
381                         }\r
382                         else{\r
383                                 rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
384                                 if(x1 < x2){ v = 1; } else{ v = -1; }\r
385                                 x1 = x1 - kWidth * cos(rad) * v;\r
386                                 y1 = y1 - kWidth * sin(rad) * v;\r
387                         }\r
388                 }\r
389                 \r
390                 if(a1 % 10 == 3){\r
391                         if(x1 == x2){\r
392                                 if(y1 < y2){\r
393                                          y1 = y1 - kWidth * kKakato;\r
394                                 }\r
395                         else{\r
396                                  y1 = y1 + kWidth * kKakato;\r
397                         }\r
398                 }\r
399                 else if(y1 == y2){\r
400                         if(x1 < x2){\r
401                                 x1 = x1 - kWidth * kKakato;\r
402                         }\r
403                         else{\r
404                                 x1 = x1 + kWidth * kKakato;\r
405                         }\r
406                 }\r
407                 else{\r
408                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
409                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
410                         x1 = x1 - kWidth * cos(rad) * v * kKakato;\r
411                         y1 = y1 - kWidth * sin(rad) * v * kKakato;\r
412                         }\r
413                 }\r
414                 if(a2 % 10 == 2){\r
415                         if(x3 == x4){\r
416                                 if(y3 < y4){ y4 = y4 + kWidth; } else{ y4 = y4 - kWidth; }\r
417                         }\r
418                         else if(y3 == y4){\r
419                                 if(x3 < x4){ x4 = x4 + kWidth; } else{ x4 = x4 - kWidth; }\r
420                         }\r
421                         else{\r
422                                 rad = atan((double)(y4 - y3) / (double)(x4 - x3));\r
423                                 if(x3 < x4){ v = 1; } else{ v = -1; }\r
424                                 x4 = x4 + kWidth * cos(rad) * v;\r
425                                 y4 = y4 + kWidth * sin(rad) * v;\r
426                         }\r
427                 }\r
428                 \r
429                 if(a2 % 10 == 3){\r
430                         if(x3 == x4){\r
431                                 if(y3 < y4){\r
432                                         y4 = y4 + kWidth * kKakato;\r
433                                 }\r
434                                 else{\r
435                                         y4 = y4 - kWidth * kKakato;\r
436                                 }\r
437                         }\r
438                         else if(y3 == y4){\r
439                                 if(x3 < x4){\r
440                                         x4 = x4 + kWidth * kKakato;\r
441                                 }\r
442                                 else{\r
443                                         x4 = x4 - kWidth * kKakato;\r
444                                 }\r
445                         }\r
446                         else{\r
447                                 rad = atan((double)(y4 - y3) / (double)(x4 - x3));\r
448                                 if(x3 < x4){ v = 1; } else{ v = -1; }\r
449                                 x4 = x4 + kWidth * cos(rad) * v * kKakato;\r
450                                 y4 = y4 + kWidth * sin(rad) * v * kKakato;\r
451                         }\r
452                 }\r
453                 \r
454                 count = 0;\r
455                 \r
456                 for(tt = 0; tt <= 1000; tt = tt + kRate){\r
457                         t = (double)tt / 1000;\r
458                         \r
459                         //calculate a dot\r
460                         x = (1.0 - t) * (1.0 - t) * (1.0 - t) * x1 + 3.0 * t * (1.0 - t) * (1.0 - t) * x2 + 3 * t * t * (1.0 - t) * x3 + t * t * t * x4;\r
461                         y = (1.0 - t) * (1.0 - t) * (1.0 - t) * y1 + 3.0 * t * (1.0 - t) * (1.0 - t) * y2 + 3 * t * t * (1.0 - t) * y3 + t * t * t * y4;\r
462                         //KATAMUKI of vector by BIBUN\r
463                         ix = t * t * (-3 * x1 + 9 * x2 + -9 * x3 + 3 * x4) + t * (6 * x1 + -12 * x2 + 6 * x3) + -3 * x1 + 3 * x2;\r
464                         iy = t * t * (-3 * y1 + 9 * y2 + -9 * y3 + 3 * y4) + t * (6 * y1 + -12 * y2 + 6 * y3) + -3 * y1 + 3 * y2;\r
465                         \r
466                         //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN\r
467                         if(kShotai == kMincho){ //always false ?\r
468                                 if(ix != 0 && iy != 0){\r
469                                         ir = atan(iy / ix * -1.0);\r
470                                         ia = sin(ir) * (double)kMinWidthT;\r
471                                         ib = cos(ir) * (double)kMinWidthT;\r
472                                 }\r
473                                 else if(ix == 0){\r
474                                         ia = kMinWidthT;\r
475                                         ib = 0;\r
476                                 }\r
477                                 else{\r
478                                         ia = 0;\r
479                                         ib = kMinWidthT;\r
480                                 }\r
481                                 ia = ia * sqrt(1.0 - t);\r
482                                 ib = ib * sqrt(1.0 - t);\r
483                         }\r
484                         else{\r
485                                 if(ix != 0 && iy != 0){\r
486                                         ir = atan(iy / ix * -1.0);\r
487                                         ia = sin(ir) * (double)kWidth;\r
488                                         ib = cos(ir) * (double)kWidth;\r
489                                 }\r
490                                 else if(ix == 0){\r
491                                         ia = kWidth;\r
492                                         ib = 0;\r
493                                 }\r
494                                 else{\r
495                                         ia = 0;\r
496                                         ib = kWidth;\r
497                                 }\r
498                         }\r
499 \r
500                         //reverse if vector is going 2nd/3rd quadrants\r
501                         if(ix <= 0){\r
502                           ia = ia * -1;\r
503                           ib = ib * -1;\r
504                         }\r
505                 \r
506                         //save to polygon\r
507                         poly[count].X = x - ia;\r
508                         poly[count].Y = y - ib;\r
509                         poly[(1000 / kRate + 1) * 2 - 1 - count].X = x + ia;\r
510                         poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y + ib;\r
511                         count += 1;\r
512                 }\r
513                 \r
514                 icPolygon(poly, (1000 / kRate + 1) * 2);\r
515         }\r
516 }\r
517 \r
518 void cdDrawCurve(double x1, double y1,\r
519         double x2, double y2,\r
520         double x3, double y3,\r
521         int a1, int a2){\r
522 \r
523         double rad, t;\r
524         double x, y, v;\r
525         double ix, iy, ia, ib, ir;\r
526         int count, tt;\r
527         double delta;\r
528         double deltad;\r
529         double XX, XY, YX, YY;\r
530         \r
531         if(kShotai == kMincho){ // mincho\r
532         switch(a1){\r
533         case 0:\r
534         case 7:\r
535                 delta = -1 * kMinWidthY * 0.5;\r
536                 break;\r
537         case 1:\r
538         case 2:\r
539         case 6:\r
540         case 22:\r
541                 delta = 0;\r
542                 break;\r
543         case 12:\r
544         case 32:\r
545                 delta = kMinWidthY;\r
546                 break;\r
547         default:\r
548                 break;\r
549         }\r
550         \r
551         if(x1 == x2){\r
552                 if(y1 < y2){ y1 = y1 - delta; }\r
553                 else{ y1 = y1 + delta; }\r
554         }\r
555         else if(y1 == y2){\r
556                 if(x1 < x2){ x1 = x1 - delta; }\r
557                 else{ x1 = x1 + delta; }\r
558         }\r
559         else{\r
560                 rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
561                 if(x1 < x2){ v = 1; } else{ v = -1; }\r
562                 x1 = x1 - delta * cos(rad) * v;\r
563                 y1 = y1 - delta * sin(rad) * v;\r
564         }\r
565         \r
566         switch(a2){\r
567         case 0:\r
568         case 1:\r
569         case 7:\r
570         case 9:\r
571         case 15:\r
572         case 14:\r
573         case 17:\r
574         case 5:\r
575                 delta = 0;\r
576                 break;\r
577         case 8: // get shorten for tail's circle\r
578           delta = -1 * kMinWidthT * 0.5;\r
579           break;\r
580         default:\r
581                 break;\r
582         }\r
583         \r
584         if(x2 == x3){\r
585                 if(y2 < y3){ y3 = y3 + delta; }\r
586                 else{ y3 = y3 - delta; }\r
587         }\r
588         else if(y2 == y3){\r
589                 if(x2 < x3){ x3 = x3 + delta; }\r
590                 else{ x3 = x3 - delta; }\r
591         }\r
592         else{\r
593                 rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
594                 if(x2 < x3){ v = 1; } else{ v = -1; }\r
595                 x3 = x3 + delta * cos(rad) * v;\r
596                 y3 = y3 + delta * sin(rad) * v;\r
597         }\r
598         \r
599         count = 0;\r
600         \r
601         for(tt = 0; tt <= 1000; tt = tt + kRate){\r
602                 t = (double)(tt) / 1000;\r
603                 \r
604                 //calculate a dot\r
605                 x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);\r
606                 y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);\r
607                 \r
608                 //KATAMUKI of vector by BIBUN\r
609                 ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);\r
610                 iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);\r
611                 \r
612                 //line SUICHOKU by vector\r
613                 if(ix != 0 && iy != 0){\r
614                         ir = atan(iy / ix * -1);\r
615                         ia = sin(ir) * (double)(kMinWidthT);\r
616                         ib = cos(ir) * (double)(kMinWidthT);\r
617                 }\r
618                 else if(ix == 0){\r
619                         ia = kMinWidthT;\r
620                         ib = 0;\r
621                 }\r
622                 else{\r
623                         ia = 0;\r
624                         ib = kMinWidthT;\r
625                 }\r
626                 \r
627                 if(a1 == 7 && a2 == 0){ deltad = sqrt(t) * kL2RDfatten; } //L2RD: fatten\r
628                 else if(a1 == 7){ deltad = sqrt(t); }\r
629                 else if(a2 == 7){ deltad = sqrt(1.0 - t); }\r
630                 else{ deltad = 1; }\r
631                 ia = ia * deltad;\r
632                 ib = ib * deltad;\r
633                 \r
634                 //reverse if vector is going 2nd/3rd quadrants\r
635                 if(ix <= 0){\r
636                   ia = ia * -1;\r
637                   ib = ib * -1;\r
638                 }\r
639                 \r
640                 //copy to polygon structuer\r
641                 poly[count].X = x - ia;\r
642                 poly[count].Y = y - ib;\r
643                 poly[(1000 / kRate + 1) * 2 - 1 - count].X = x + ia;\r
644                 poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y + ib;\r
645                 count += 1;\r
646         }\r
647         \r
648         icPolygon(poly, (1000 / kRate + 1) * 2);\r
649         \r
650         //process for head of stroke\r
651         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
652         if(x1 < x2){ v = 1; } else{ v = -1; }\r
653         XX = sin(rad) * v;\r
654         XY = cos(rad) * v * -1;\r
655         YX = cos(rad) * v;\r
656         YY = sin(rad) * v;\r
657         \r
658         if(a1 == 12){\r
659                 if(x1 == x2){\r
660                         poly2[0].X = x1 - kMinWidthT;\r
661                         poly2[0].Y = y1;\r
662                         poly2[1].X = x1 + kMinWidthT;\r
663                         poly2[1].Y = y1;\r
664                         poly2[2].X = x1 - kMinWidthT;\r
665                         poly2[2].Y = y1 - kMinWidthT;\r
666                         icPolygon(poly2, 3);\r
667                 }\r
668                 else{\r
669                         poly2[0].X = x1 - kMinWidthT * XX;\r
670                         poly2[0].Y = y1 - kMinWidthT * XY;\r
671                         poly2[1].X = x1 + kMinWidthT * XX;\r
672                         poly2[1].Y = y1 + kMinWidthT * XY;\r
673                         poly2[2].X = x1 - kMinWidthT * XX - kMinWidthT * YX;\r
674                         poly2[2].Y = y1 - kMinWidthT * XY - kMinWidthT * YY;\r
675                         icPolygon(poly2, 3);\r
676                 }\r
677         }\r
678         \r
679         if(a1 == 0){\r
680                 if(y1 <= y3){ //from up to bottom\r
681                         if(x1 == x2){\r
682                                 poly2[0].X = x1 - kMinWidthT;\r
683                                 poly2[0].Y = y1;\r
684                                 poly2[1].X = x1 + kMinWidthT;\r
685                                 poly2[1].Y = y1;\r
686                                 poly2[2].X = x1 - kMinWidthT;\r
687                                 poly2[2].Y = y1 - kMinWidthY;\r
688                                 icPolygon(poly2, 3);\r
689                         }\r
690                         else{\r
691                                 poly2[0].X = x1 - kMinWidthT * XX;\r
692                                 poly2[0].Y = y1 - kMinWidthT * XY;\r
693                                 poly2[1].X = x1 + kMinWidthT * XX;\r
694                                 poly2[1].Y = y1 + kMinWidthT * XY;\r
695                                 poly2[2].X = x1 - kMinWidthT * XX - kMinWidthY * YX;\r
696                                 poly2[2].Y = y1 - kMinWidthT * XY - kMinWidthY * YY;\r
697                                 icPolygon(poly2, 3);\r
698                         }\r
699                 }\r
700                 else{ //bottom to up\r
701                         if(x1 == x2){ //is it right?\r
702                                 poly2[0].X = x1 - kMinWidthT;\r
703                                 poly2[0].Y = y1;\r
704                                 poly2[1].X = x1 + kMinWidthT;\r
705                                 poly2[1].Y = y1;\r
706                                 poly2[2].X = x1 - kMinWidthT;\r
707                                 poly2[2].Y = y1 + kMinWidthY;\r
708                                 icPolygon(poly2, 3);\r
709                         }\r
710                         else{\r
711                                 poly2[0].X = x1 - kMinWidthT * XX;\r
712                                 poly2[0].Y = y1 - kMinWidthT * XY;\r
713                                 poly2[1].X = x1 + kMinWidthT * XX;\r
714                                 poly2[1].Y = y1 + kMinWidthT * XY;\r
715                                 poly2[2].X = x1 + kMinWidthT * XX - kMinWidthY * YX;\r
716                                 poly2[2].Y = y1 + kMinWidthT * XY - kMinWidthY * YY;\r
717                                 icPolygon(poly2, 3);\r
718                         }\r
719                 }\r
720         }\r
721         \r
722         if(a1 == 22){ //box's up-right corner, any time same degree\r
723                 poly3[0].X = x1 - kMinWidthT;\r
724                 poly3[0].Y = y1 - kMinWidthY;\r
725                 poly3[1].X = x1;\r
726                 poly3[1].Y = y1 - kMinWidthY - kWidth;\r
727                 poly3[2].X = x1 + kMinWidthT + kWidth;\r
728                 poly3[2].Y = y1 + kMinWidthY;\r
729                 poly3[3].X = x1 + kMinWidthT;\r
730                 poly3[3].Y = y1 + kMinWidthT;\r
731                 poly3[4].X = x1 - kMinWidthT;\r
732                 poly3[4].Y = y1;\r
733                 icPolygon(poly3, 5);\r
734         }\r
735         \r
736         if(a1 == 0){ //beginning of the stroke\r
737                 if(y1 <= y3){ //from up to bottom\r
738                         if(x1 == x2){\r
739                                 poly2[0].X = x1 + kMinWidthT;\r
740                                 poly2[0].Y = y1 + kMinWidthY * 0.5;\r
741                                 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;\r
742                                 poly2[1].Y = y1 + kMinWidthY * 0.5 + kMinWidthY;\r
743                                 poly2[2].X = x1 + kMinWidthT;\r
744                                 poly2[2].Y = y1 + kMinWidthY * 0.5 + kMinWidthY * 2;\r
745                                 icPolygon(poly2, 3);\r
746                         }\r
747                         else{\r
748                                 poly2[0].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5) * YX;\r
749                                 poly2[0].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5) * YY;\r
750                                 poly2[1].X = x1 + (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;\r
751                                 poly2[1].Y = y1 + (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;\r
752                                 poly2[2].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
753                                 poly2[2].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
754                                 icPolygon(poly2, 3);\r
755                         }\r
756                 }\r
757                 else{ //from bottom to up\r
758                         if(x1 == x2){ //is it right?\r
759                                 poly2[0].X = x1 + kMinWidthT;\r
760                                 poly2[0].Y = y1 - kMinWidthY * 0.5;\r
761                                 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;\r
762                                 poly2[1].Y = y1 - kMinWidthY * 0.5 - kMinWidthY;\r
763                                 poly2[2].X = x1 + kMinWidthT;\r
764                                 poly2[2].Y = y1 - kMinWidthY * 0.5 - kMinWidthY * 2;\r
765                                 icPolygon(poly2, 3);\r
766                         }\r
767                         else //SETSUGOUMEN GA KAKERUNODE HOKYOU\r
768                                 poly3[0].X = x1 - (kMinWidthT - 1) * XX + (kMinWidthY * 0.5) * YX;\r
769                                 poly3[0].Y = y1 - (kMinWidthT - 1) * XY + (kMinWidthY * 0.5) * YY;\r
770                                 poly3[1].X = x1 - (kMinWidthT - 0) * XX + (kMinWidthY * 0.5) * YX;\r
771                                 poly3[1].Y = y1 - (kMinWidthT - 0) * XY + (kMinWidthY * 0.5) * YY;\r
772                                 poly3[2].X = x1 - (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;\r
773                                 poly3[2].Y = y1 - (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;\r
774                                 poly3[3].X = x1 - (kMinWidthT - 0) * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
775                                 poly3[3].Y = y1 - (kMinWidthT - 0) * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
776                                 poly3[4].X = x1 - (kMinWidthT - 1) * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
777                                 poly3[4].Y = y1 - (kMinWidthT - 1) * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
778                                 icPolygon(poly3, 5);\r
779                         }\r
780                 }\r
781                 \r
782                 //process for tail\r
783                 rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
784                 if(x2 < x3){ v = 1; } else{ v = -1; }\r
785                 YX = sin(rad) * v * -1;\r
786                 YY = cos(rad) * v;\r
787                 XX = cos(rad) * v;\r
788                 XY = sin(rad) * v;\r
789                 \r
790                 if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle\r
791                         if(x2 == x3){\r
792                                 poly3[0].X = x3 - kMinWidthT;\r
793                                 poly3[0].Y = y3;\r
794                                 poly3[1].X = x3 - kMinWidthT * 0.6;\r
795                                 poly3[1].Y = y3 + kMinWidthT * 0.6;\r
796                                 poly3[2].X = x3;\r
797                                 poly3[2].Y = y3 + kMinWidthT;\r
798                                 poly3[3].X = x3 + kMinWidthT * 0.6;\r
799                                 poly3[3].Y = y3 + kMinWidthT * 0.6;\r
800                                 poly3[4].X = x3 + kMinWidthT;\r
801                                 poly3[4].Y = y3;\r
802                                 icPolygon(poly3, 5);\r
803                         }\r
804                         else if(y2 == y3){\r
805                                 poly3[0].X = x3;\r
806                                 poly3[0].Y = y3 - kMinWidthT;\r
807                                 poly3[1].X = x3 + kMinWidthT * 0.6;\r
808                                 poly3[1].Y = y3 - kMinWidthT * 0.6;\r
809                                 poly3[2].X = x3 + kMinWidthT;\r
810                                 poly3[2].Y = y3;\r
811                                 poly3[3].X = x3 + kMinWidthT * 0.6;\r
812                                 poly3[3].Y = y3 + kMinWidthT * 0.6;\r
813                                 poly3[4].X = x3;\r
814                                 poly3[4].Y = y3 + kMinWidthT;\r
815                                 icPolygon(poly3, 5);\r
816                         }\r
817                         else{\r
818                                 poly3[0].X = x3 + sin(rad) * kMinWidthT * v;\r
819                                 poly3[0].Y = y3 - cos(rad) * kMinWidthT * v;\r
820                                 poly3[1].X = x3 + cos(rad) * kMinWidthT * 0.8 * v + sin(rad) * kMinWidthT * 0.6 * v;\r
821                                 poly3[1].Y = y3 + sin(rad) * kMinWidthT * 0.8 * v - cos(rad) * kMinWidthT * 0.6 * v;\r
822                                 poly3[2].X = x3 + cos(rad) * kMinWidthT * v;\r
823                                 poly3[2].Y = y3 + sin(rad) * kMinWidthT * v;\r
824                                 poly3[3].X = x3 + cos(rad) * kMinWidthT * 0.8 * v - sin(rad) * kMinWidthT * 0.6 * v;\r
825                                 poly3[3].Y = y3 + sin(rad) * kMinWidthT * 0.8 * v + cos(rad) * kMinWidthT * 0.6 * v;\r
826                                 poly3[4].X = x3 - sin(rad) * kMinWidthT * v;\r
827                                 poly3[4].Y = y3 + cos(rad) * kMinWidthT * v;\r
828                                 icPolygon(poly3, 5);\r
829                         }\r
830                 }\r
831                 \r
832                 if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Sinnyu & L2RD Harai\r
833                         if(y2 == y3){\r
834                                 poly2[0].X = x3;\r
835                                 poly2[0].Y = y3 + kMinWidthT * kL2RDfatten;\r
836                                 poly2[1].X = x3;\r
837                                 poly2[1].Y = y3 - kMinWidthT * kL2RDfatten;\r
838                                 poly2[2].X = x3 + kMinWidthT * kL2RDfatten;\r
839                                 poly2[2].Y = y3 - kMinWidthT * kL2RDfatten;\r
840                                 icPolygon(poly2, 3);\r
841                         }\r
842                         else{\r
843                                 poly2[0].X = x3 + kMinWidthT * kL2RDfatten * YX;\r
844                                 poly2[0].Y = y3 + kMinWidthT * kL2RDfatten * YY;\r
845                                 poly2[1].X = x3 - kMinWidthT * kL2RDfatten * YX;\r
846                                 poly2[1].Y = y3 - kMinWidthT * kL2RDfatten * YY;\r
847                                 poly2[2].X = x3 + kMinWidthT * kL2RDfatten * XX - kMinWidthT * kL2RDfatten * YX;\r
848                                 poly2[2].Y = y3 + kMinWidthT * kL2RDfatten * XY - kMinWidthT * kL2RDfatten * YY;\r
849                                 icPolygon(poly2, 3);\r
850                         }\r
851                 }\r
852                 \r
853                 if(a2 == 15){ //jump up\r
854                         if(y2 == y3){\r
855                                 poly4[0].X = x3;\r
856                                 poly4[0].Y = y3 - kMinWidthT + 1;\r
857                                 poly4[1].X = x3 + 2;\r
858                                 poly4[1].Y = y3 - kMinWidthT - kWidth * 5;\r
859                                 poly4[2].X = x3;\r
860                                 poly4[2].Y = y3 - kMinWidthT - kWidth * 5;\r
861                                 poly4[3].X = x3 - kMinWidthT;\r
862                                 poly4[3].Y = y3 - kMinWidthT + 1;\r
863                                 icPolygon(poly4, 4);\r
864                         }\r
865                         else{\r
866                                 poly4[0].X = x3 + (kMinWidthT - 1) * sin(rad) * v;\r
867                                 poly4[0].Y = y3 - (kMinWidthT - 1) * cos(rad) * v;\r
868                                 poly4[1].X = x3 + 2 * cos(rad) * v + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
869                                 poly4[1].Y = y3 + 2 * sin(rad) * v - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
870                                 poly4[2].X = x3 + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
871                                 poly4[2].Y = y3 - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
872                                 poly4[3].X = x3 + (kMinWidthT - 1) * sin(rad) * v - kMinWidthT * cos(rad) * v;\r
873                                 poly4[3].Y = y3 - (kMinWidthT - 1) * cos(rad) * v - kMinWidthT * sin(rad) * v;\r
874                                 icPolygon(poly4, 4);\r
875                         }\r
876                 }\r
877                 \r
878                 if(a2 == 14){ //jump to left, allways go left\r
879                         poly4[0].X = x3;\r
880                         poly4[0].Y = y3;\r
881                         poly4[1].X = x3;\r
882                         poly4[1].Y = y3 - kMinWidthT;\r
883                         poly4[2].X = x3 - kWidth * 4;\r
884                         poly4[2].Y = y3 - kMinWidthT;\r
885                         poly4[3].X = x3 - kWidth * 4;\r
886                         poly4[3].Y = y3 - kMinWidthT * 0.5;\r
887                         icPolygon(poly4, 4);\r
888                 }\r
889         }\r
890         else{ //gothic\r
891                 if(a1 % 10 == 2){\r
892                         if(x1 == x2){\r
893                                 if(y1 < y2){ y1 = y1 - kWidth; } else{ y1 = y1 + kWidth; }\r
894                         }\r
895                         else if(y1 == y2){\r
896                                 if(x1 < x2){ x1 = x1 - kWidth; } else{ x1 = x1 + kWidth; }\r
897                         }\r
898                         else{\r
899                                 rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
900                                 if(x1 < x2){ v = 1; } else{ v = -1; }\r
901                                 x1 = x1 - kWidth * cos(rad) * v;\r
902                                 y1 = y1 - kWidth * sin(rad) * v;\r
903                         }\r
904                 }\r
905                 \r
906                 if(a1 % 10 == 3){\r
907                         if(x1 == x2){\r
908                                 if(y1 < y2){\r
909                                          y1 = y1 - kWidth * kKakato;\r
910                                 }\r
911                         else{\r
912                                  y1 = y1 + kWidth * kKakato;\r
913                         }\r
914                 }\r
915                 else if(y1 == y2){\r
916                         if(x1 < x2){\r
917                                 x1 = x1 - kWidth * kKakato;\r
918                         }\r
919                         else{\r
920                                 x1 = x1 + kWidth * kKakato;\r
921                         }\r
922                 }\r
923                 else{\r
924                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
925                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
926                         x1 = x1 - kWidth * cos(rad) * v * kKakato;\r
927                         y1 = y1 - kWidth * sin(rad) * v * kKakato;\r
928                         }\r
929                 }\r
930                 if(a2 % 10 == 2){\r
931                         if(x2 == x3){\r
932                                 if(y2 < y3){ y3 = y3 + kWidth; } else{ y3 = y3 - kWidth; }\r
933                         }\r
934                         else if(y2 == y3){\r
935                                 if(x2 < x3){ x3 = x3 + kWidth; } else{ x3 = x3 - kWidth; }\r
936                         }\r
937                         else{\r
938                                 rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
939                                 if(x2 < x3){ v = 1; } else{ v = -1; }\r
940                                 x3 = x3 + kWidth * cos(rad) * v;\r
941                                 y3 = y3 + kWidth * sin(rad) * v;\r
942                         }\r
943                 }\r
944                 \r
945                 if(a2 % 10 == 3){\r
946                         if(x2 == x3){\r
947                                 if(y2 < y3){\r
948                                         y3 = y3 + kWidth * kKakato;\r
949                                 }\r
950                                 else{\r
951                                         y3 = y3 - kWidth * kKakato;\r
952                                 }\r
953                         }\r
954                         else if(y2 == y3){\r
955                                 if(x2 < x3){\r
956                                         x3 = x3 + kWidth * kKakato;\r
957                                 }\r
958                                 else{\r
959                                         x3 = x3 - kWidth * kKakato;\r
960                                 }\r
961                         }\r
962                         else{\r
963                                 rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
964                                 if(x2 < x3){ v = 1; } else{ v = -1; }\r
965                                 x3 = x3 + kWidth * cos(rad) * v * kKakato;\r
966                                 y3 = y3 + kWidth * sin(rad) * v * kKakato;\r
967                         }\r
968                 }\r
969                 \r
970                 count = 0;\r
971                 \r
972                 for(tt = 0; tt <= 1000; tt = tt + kRate){\r
973                         t = (double)tt / 1000;\r
974                         \r
975                         //calculating each point\r
976                         x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);\r
977                         y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);\r
978                         \r
979                         //SESSEN NO KATAMUKI NO KEISAN(BIBUN)\r
980                         ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);\r
981                         iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);\r
982                         \r
983                         //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN\r
984                         if(kShotai == kMincho){ //always false ?\r
985                                 if(ix != 0 && iy != 0){\r
986                                         ir = atan(iy / ix * -1.0);\r
987                                         ia = sin(ir) * (double)kMinWidthT;\r
988                                         ib = cos(ir) * (double)kMinWidthT;\r
989                                 }\r
990                                 else if(ix == 0){\r
991                                         ia = kMinWidthT;\r
992                                         ib = 0;\r
993                                 }\r
994                                 else{\r
995                                         ia = 0;\r
996                                         ib = kMinWidthT;\r
997                                 }\r
998                                 ia = ia * sqrt(1.0 - t);\r
999                                 ib = ib * sqrt(1.0 - t);\r
1000                         }\r
1001                         else{\r
1002                                 if(ix != 0 && iy != 0){\r
1003                                         ir = atan(iy / ix * -1.0);\r
1004                                         ia = sin(ir) * (double)kWidth;\r
1005                                         ib = cos(ir) * (double)kWidth;\r
1006                                 }\r
1007                                 else if(ix == 0){\r
1008                                         ia = kWidth;\r
1009                                         ib = 0;\r
1010                                 }\r
1011                                 else{\r
1012                                         ia = 0;\r
1013                                         ib = kWidth;\r
1014                                 }\r
1015                         }\r
1016 \r
1017                         //reverse if vector is going 2nd/3rd quadrants\r
1018                         if(ix <= 0){\r
1019                           ia = ia * -1;\r
1020                           ib = ib * -1;\r
1021                         }\r
1022                 \r
1023                         //save to polygon\r
1024                         poly[count].X = x - ia;\r
1025                         poly[count].Y = y - ib;\r
1026                         poly[(1000 / kRate + 1) * 2 - 1 - count].X = x + ia;\r
1027                         poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y + ib;\r
1028                         count += 1;\r
1029                 }\r
1030                 \r
1031                 icPolygon(poly, (1000 / kRate + 1) * 2);\r
1032         }\r
1033 }\r
1034 \r
1035 void cdDrawLine(double tx1, double ty1, double tx2, double ty2, int ta1, int ta2){\r
1036         double rad;\r
1037         double v, x1, y1, x2, y2;\r
1038         int a1, a2;\r
1039         double XX, XY, YX, YY;\r
1040         \r
1041         if(kShotai == kMincho){ //mincho\r
1042                 x1 = tx1;\r
1043                 y1 = ty1;\r
1044                 x2 = tx2;\r
1045                 y2 = ty2;\r
1046                 a1 = ta1;\r
1047                 a2 = ta2;\r
1048                 \r
1049                 if(x1 == x2){ //if TATE stroke, use y-axis\r
1050                         switch(a1){\r
1051                         case 0:\r
1052                                 poly[3].X = x1 - kMinWidthT;\r
1053                                 poly[3].Y = y1 - kMinWidthY / 2;\r
1054                                 poly[0].X = x1 + kMinWidthT;\r
1055                                 poly[0].Y = y1 + kMinWidthY / 2;\r
1056                                 break;\r
1057                         case 1:\r
1058                         case 6:\r
1059                         case 22:\r
1060                                 poly[3].X = x1 - kMinWidthT;\r
1061                                 poly[3].Y = y1;\r
1062                                 poly[0].X = x1 + kMinWidthT;\r
1063                                 poly[0].Y = y1;\r
1064                                 break;\r
1065                         case 12:\r
1066                                 poly[3].X = x1 - kMinWidthT;\r
1067                                 poly[3].Y = y1 - kMinWidthY - kMinWidthT;\r
1068                                 poly[0].X = x1 + kMinWidthT;\r
1069                                 poly[0].Y = y1 - kMinWidthY;\r
1070                                 break;\r
1071                         case 32:\r
1072                                 poly[3].X = x1 - kMinWidthT;\r
1073                                 poly[3].Y = y1 - kMinWidthY;\r
1074                                 poly[0].X = x1 + kMinWidthT;\r
1075                                 poly[0].Y = y1 - kMinWidthY;\r
1076                                 break;\r
1077                         }\r
1078                         \r
1079                         switch(a2){\r
1080                         case 0:\r
1081                                 if(a1 == 6){ //KAGI's tail\r
1082                                         poly[2].X = x2 - kMinWidthT;\r
1083                                         poly[2].Y = y2;\r
1084                                         poly[1].X = x2 + kMinWidthT;\r
1085                                         poly[1].Y = y2;\r
1086                                 }\r
1087                                 else{\r
1088                                         poly[2].X = x2 - kMinWidthT;\r
1089                                         poly[2].Y = y2 + kMinWidthT / 2;\r
1090                                         poly[1].X = x2 + kMinWidthT;\r
1091                                         poly[1].Y = y2 - kMinWidthT / 2;\r
1092                                 }\r
1093                                 break;\r
1094                         case 1:\r
1095                                 poly[2].X = x2 - kMinWidthT;\r
1096                                 poly[2].Y = y2;\r
1097                                 poly[1].X = x2 + kMinWidthT;\r
1098                                 poly[1].Y = y2;\r
1099                                 break;\r
1100                         case 13:\r
1101                                 poly[2].X = x2 - kMinWidthT;\r
1102                                 poly[2].Y = y2 + kWidth * kKakato + kMinWidthT;\r
1103                                 poly[1].X = x2 + kMinWidthT;\r
1104                                 poly[1].Y = y2 + kWidth * kKakato;\r
1105                                 break;\r
1106                         case 23:\r
1107                                 poly[2].X = x2 - kMinWidthT;\r
1108                                 poly[2].Y = y2 + kWidth * kKakato * 0.5 + kMinWidthT;\r
1109                                 poly[1].X = x2 + kMinWidthT;\r
1110                                 poly[1].Y = y2 + kWidth * kKakato * 0.5;\r
1111                                 break;\r
1112                         case 32:\r
1113                                 poly[2].X = x2 - kMinWidthT;\r
1114                                 poly[2].Y = y2 + kMinWidthY;\r
1115                                 poly[1].X = x2 + kMinWidthT;\r
1116                                 poly[1].Y = y2 + kMinWidthY;\r
1117                                 break;\r
1118                         }\r
1119                         \r
1120                         icPolygon(poly, 4);\r
1121                         \r
1122                         if(a1 == 22){ //box's right top corner\r
1123                                 poly3[0].X = x1 - kMinWidthT;\r
1124                                 poly3[0].Y = y1 - kMinWidthY;\r
1125                                 poly3[1].X = x1;\r
1126                                 poly3[1].Y = y1 - kMinWidthY - kWidth;\r
1127                                 poly3[2].X = x1 + kMinWidthT + kWidth;\r
1128                                 poly3[2].Y = y1 + kMinWidthY;\r
1129                                 poly3[3].X = x1 + kMinWidthT;\r
1130                                 poly3[3].Y = y1 + kMinWidthT;\r
1131                                 poly3[4].X = x1 - kMinWidthT;\r
1132                                 poly3[4].Y = y1;\r
1133                                 icPolygon(poly3, 5);\r
1134                         }\r
1135                         \r
1136                         if(a1 == 0){ //beginning of the stroke\r
1137                                 poly2[0].X = x1 + kMinWidthT;\r
1138                                 poly2[0].Y = y1 + kMinWidthY * 0.5;\r
1139                                 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;\r
1140                                 poly2[1].Y = y1 + kMinWidthY * 0.5 + kMinWidthY;\r
1141                                 poly2[2].X = x1 + kMinWidthT;\r
1142                                 poly2[2].Y = y1 + kMinWidthY * 0.5 + kMinWidthY * 2;\r
1143                                 icPolygon(poly2, 3);\r
1144                         }\r
1145                         \r
1146                         if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU\r
1147                                 poly3[4].X = x2 - kMinWidthT;\r
1148                                 poly3[4].Y = y2;\r
1149                                 poly3[3].X = x2 - kMinWidthT * 0.6;\r
1150                                 poly3[3].Y = y2 + kMinWidthT * 0.6;\r
1151                                 poly3[2].X = x2;\r
1152                                 poly3[2].Y = y2 + kMinWidthT;\r
1153                                 poly3[1].X = x2 + kMinWidthT * 0.6;\r
1154                                 poly3[1].Y = y2 + kMinWidthT * 0.6;\r
1155                                 poly3[0].X = x2 + kMinWidthT;\r
1156                                 poly3[0].Y = y2;\r
1157                                 icPolygon(poly3, 5);\r
1158                         }\r
1159                 }\r
1160                 else if(y1 == y2){ //if it is YOKO stroke, use x-axis\r
1161                         if(a1 == 6){ //if it is KAGI's YOKO stroke, get bold\r
1162                                 poly[0].X = x1;\r
1163                                 poly[0].Y = y1 - kMinWidthT;\r
1164                                 poly[1].X = x2;\r
1165                                 poly[1].Y = y2 - kMinWidthT;\r
1166                                 poly[2].X = x2;\r
1167                                 poly[2].Y = y2 + kMinWidthT;\r
1168                                 poly[3].X = x1;\r
1169                                 poly[3].Y = y1 + kMinWidthT;\r
1170                                 icPolygon(poly, 4);\r
1171                                 \r
1172                                 if(a2 == 1 || a2 == 0 || a2 == 5){\r
1173                                         //KAGI NO YOKO BOU NO SAIGO NO MARU\r
1174                                         poly3[0].X = x2;\r
1175                                         poly3[0].Y = y2 - kMinWidthT;\r
1176                                         poly3[1].X = x2 + kMinWidthT * 0.6;\r
1177                                         poly3[1].Y = y2 - kMinWidthT * 0.6;\r
1178                                         poly3[2].X = x2 + kMinWidthT;\r
1179                                         poly3[2].Y = y2;\r
1180                                         poly3[3].X = x2 + kMinWidthT * 0.6;\r
1181                                         poly3[3].Y = y2 + kMinWidthT * 0.6;\r
1182                                         poly3[4].X = x2;\r
1183                                         poly3[4].Y = y2 + kMinWidthT;\r
1184                                         icPolygon(poly3, 5);\r
1185                                 }\r
1186                                 \r
1187                                 if(a2 == 5){\r
1188                                         //KAGI NO YOKO BOU NO HANE\r
1189                                         poly[0].X = x2;\r
1190                                         poly[0].Y = y2 - kMinWidthT + 1;\r
1191                                         poly[1].X = x2 + 2;\r
1192                                         poly[1].Y = y2 - kMinWidthT - kWidth * 5;\r
1193                                         poly[2].X = x2;\r
1194                                         poly[2].Y = y2 - kMinWidthT - kWidth * 5;\r
1195                                         poly[3].X = x2 - kMinWidthT;\r
1196                                         poly[3].Y = y2 - kMinWidthT + 1;\r
1197                                         icPolygon(poly, 4);\r
1198                                 }\r
1199                         }\r
1200                         else{\r
1201                                 switch(a1){\r
1202                                 case 0:\r
1203                                         poly[0].X = x1;\r
1204                                         poly[0].Y = y1 - kMinWidthY;\r
1205                                         poly[3].X = x1;\r
1206                                         poly[3].Y = y1 + kMinWidthY;\r
1207                                         break;\r
1208                                 case 2:\r
1209                                         poly[0].X = x1 - kMinWidthT;\r
1210                                         poly[0].Y = y1 - kMinWidthY;\r
1211                                         poly[3].X = x1 - kMinWidthT;\r
1212                                         poly[3].Y = y1 + kMinWidthY;\r
1213                                         break;\r
1214                                 }\r
1215                                 \r
1216                                 switch(a2){\r
1217                                 case 0:\r
1218                                         poly[1].X = x2;\r
1219                                         poly[1].Y = y2 - kMinWidthY;\r
1220                                         poly[2].X = x2;\r
1221                                         poly[2].Y = y2 + kMinWidthY;\r
1222                                         break;\r
1223                                 case 2:\r
1224                                         poly[1].X = x2 + kMinWidthT;\r
1225                                         poly[1].Y = y2 - kMinWidthY;\r
1226                                         poly[2].X = x2 + kMinWidthT;\r
1227                                         poly[2].Y = y2 + kMinWidthY;\r
1228                                 }\r
1229                                 \r
1230                                 icPolygon(poly, 4);\r
1231                                 \r
1232                                 //UROKO\r
1233                                 if(a2 == 0){\r
1234                                         poly2[0].X = x2;\r
1235                                         poly2[0].Y = y2 - kMinWidthY;\r
1236                                         poly2[1].X = x2 - 24;\r
1237                                         poly2[1].Y = y2;\r
1238                                         poly2[2].X = x2 - 12;\r
1239                                         poly2[2].Y = y2 - 12;\r
1240                                         icPolygon(poly2, 3);\r
1241                                 }\r
1242                         }\r
1243                 }\r
1244                 else{ //for others, use x-axis\r
1245                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
1246                         if((abs(y2 - y1) < abs(x2 - x1)) && (a1 != 6) && (a2 != 6)){ //ASAI KAUDO\r
1247                                 switch(a1){ //must be 0 or 2\r
1248                                 case 0:\r
1249                                         poly[0].X = x1 + sin(rad) * kMinWidthY;\r
1250                                         poly[0].Y = y1 - cos(rad) * kMinWidthY;\r
1251                                         poly[3].X = x1 - sin(rad) * kMinWidthY;\r
1252                                         poly[3].Y = y1 + cos(rad) * kMinWidthY;\r
1253                                         break;\r
1254                                 case 2:\r
1255                                         poly[0].X = x1 + sin(rad) * kMinWidthY - kMinWidthT * cos(rad);\r
1256                                         poly[0].Y = y1 - cos(rad) * kMinWidthY - kMinWidthT * sin(rad);\r
1257                                         poly[3].X = x1 - sin(rad) * kMinWidthY - kMinWidthT * cos(rad);\r
1258                                         poly[3].Y = y1 + cos(rad) * kMinWidthY - kMinWidthT * sin(rad);\r
1259                                         break;\r
1260                                 }\r
1261                                 \r
1262                                 switch(a2){ //must be 0 or 2\r
1263                                 case 0:\r
1264                                         poly[1].X = x2 + sin(rad) * kMinWidthY;\r
1265                                         poly[1].Y = y2 - cos(rad) * kMinWidthY;\r
1266                                         poly[2].X = x2 - sin(rad) * kMinWidthY;\r
1267                                         poly[2].Y = y2 + cos(rad) * kMinWidthY;\r
1268                                         break;\r
1269                                 case 2:\r
1270                                         poly[1].X = x2 + sin(rad) * kMinWidthY + kMinWidthT * cos(rad);\r
1271                                         poly[1].Y = y2 - cos(rad) * kMinWidthY + kMinWidthT * sin(rad);\r
1272                                         poly[2].X = x2 - sin(rad) * kMinWidthY + kMinWidthT * cos(rad);\r
1273                                         poly[2].Y = y2 + cos(rad) * kMinWidthY + kMinWidthT * sin(rad);\r
1274                                 }\r
1275                                 \r
1276                                 icPolygon(poly, 4);\r
1277                                 \r
1278                                 //UROKO\r
1279                                 if(a2 == 0){\r
1280                                         poly2[0].X = x2 + sin(rad) * kMinWidthY;\r
1281                                         poly2[0].Y = y2 - cos(rad) * kMinWidthY;\r
1282                                         poly2[1].X = x2 - cos(rad) * 24;\r
1283                                         poly2[1].Y = y2 - sin(rad) * 24;\r
1284                                         poly2[2].X = x2 - cos(rad) * 12 + sin(rad) * 12;\r
1285                                         poly2[2].Y = y2 - sin(rad) * 12 - cos(rad) * 12;\r
1286                                         icPolygon(poly2, 3);\r
1287                                 }\r
1288                         }\r
1289                         \r
1290                         else{ //KAKUDO GA FUKAI or KAGI NO YOKO BOU\r
1291                                 if(x1 > x2){ v = -1; } else{ v = 1; }\r
1292                                 switch(a1){\r
1293                                 case 0:\r
1294                                         poly[0].X = x1 + sin(rad) * kMinWidthT * v + kMinWidthY * cos(rad) * 0.5 * v;\r
1295                                         poly[0].Y = y1 - cos(rad) * kMinWidthT * v + kMinWidthY * sin(rad) * 0.5 * v;\r
1296                                         poly[3].X = x1 - sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * 0.5 * v;\r
1297                                         poly[3].Y = y1 + cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * 0.5 * v;\r
1298                                         break;\r
1299                                 case 1:\r
1300                                 case 6:\r
1301                                 case 22:\r
1302                                         poly[0].X = x1 + sin(rad) * kMinWidthT * v;\r
1303                                         poly[0].Y = y1 - cos(rad) * kMinWidthT * v;\r
1304                                         poly[3].X = x1 - sin(rad) * kMinWidthT * v;\r
1305                                         poly[3].Y = y1 + cos(rad) * kMinWidthT * v;\r
1306                                         break;\r
1307                                 case 12:\r
1308                                         poly[0].X = x1 + sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * v;\r
1309                                         poly[0].Y = y1 - cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * v;\r
1310                                         poly[3].X = x1 - sin(rad) * kMinWidthT * v - (kMinWidthT + kMinWidthY) * cos(rad) * v;\r
1311                                         poly[3].Y = y1 + cos(rad) * kMinWidthT * v - (kMinWidthT + kMinWidthY) * sin(rad) * v;\r
1312                                         break;\r
1313                                 case 32:\r
1314                                         poly[0].X = x1 + sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * v;\r
1315                                         poly[0].Y = y1 - cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * v;\r
1316                                         poly[3].X = x1 - sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * v;\r
1317                                         poly[3].Y = y1 + cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * v;\r
1318                                         break;\r
1319                                 }\r
1320                                 \r
1321                                 switch(a2){\r
1322                                 case 0:\r
1323                                         if(a1 == 6){\r
1324                                                 poly[1].X = x2 + sin(rad) * kMinWidthT * v;\r
1325                                                 poly[1].Y = y2 - cos(rad) * kMinWidthT * v;\r
1326                                                 poly[2].X = x2 - sin(rad) * kMinWidthT * v;\r
1327                                                 poly[2].Y = y2 + cos(rad) * kMinWidthT * v;\r
1328                                         }\r
1329                                         else{\r
1330                                                 poly[1].X = x2 + sin(rad) * kMinWidthT * v - kMinWidthT * 0.5 * cos(rad) * v;\r
1331                                                 poly[1].Y = y2 - cos(rad) * kMinWidthT * v - kMinWidthT * 0.5 * sin(rad) * v;\r
1332                                                 poly[2].X = x2 - sin(rad) * kMinWidthT * v + kMinWidthT * 0.5 * cos(rad) * v;\r
1333                                                 poly[2].Y = y2 + cos(rad) * kMinWidthT * v + kMinWidthT * 0.5 * sin(rad) * v;\r
1334                                         }\r
1335                                         break;\r
1336                                 case 1:\r
1337                                 case 5:\r
1338                                         poly[1].X = x2 + sin(rad) * kMinWidthT * v;\r
1339                                         poly[1].Y = y2 - cos(rad) * kMinWidthT * v;\r
1340                                         poly[2].X = x2 - sin(rad) * kMinWidthT * v;\r
1341                                         poly[2].Y = y2 + cos(rad) * kMinWidthT * v;\r
1342                                         break;\r
1343                                 case 13:\r
1344                                         poly[1].X = x2 + sin(rad) * kMinWidthT * v + kWidth * kKakato * cos(rad) * v;\r
1345                                         poly[1].Y = y2 - cos(rad) * kMinWidthT * v + kWidth * kKakato * sin(rad) * v;\r
1346                                         poly[2].X = x2 - sin(rad) * kMinWidthT * v + (kWidth * kKakato + kMinWidthT) * cos(rad) * v;\r
1347                                         poly[2].Y = y2 + cos(rad) * kMinWidthT * v + (kWidth * kKakato + kMinWidthT) * sin(rad) * v;\r
1348                                         break;\r
1349                                 case 23:\r
1350                                         poly[1].X = x2 + sin(rad) * kMinWidthT * v + kWidth * kKakato * 0.5 * cos(rad) * v;\r
1351                                         poly[1].Y = y2 - cos(rad) * kMinWidthT * v + kWidth * kKakato * 0.5 * sin(rad) * v;\r
1352                                         poly[2].X = x2 - sin(rad) * kMinWidthT * v + (kWidth * kKakato * 0.5 + kMinWidthT) * cos(rad) * v;\r
1353                                         poly[2].Y = y2 + cos(rad) * kMinWidthT * v + (kWidth * kKakato * 0.5 + kMinWidthT) * sin(rad) * v;\r
1354                                         break;\r
1355                                 case 32:\r
1356                                         poly[1].X = x2 + sin(rad) * kMinWidthT * v + kMinWidthY * cos(rad) * v;\r
1357                                         poly[1].Y = y2 - cos(rad) * kMinWidthT * v + kMinWidthY * sin(rad) * v;\r
1358                                         poly[2].X = x2 - sin(rad) * kMinWidthT * v + kMinWidthY * cos(rad) * v;\r
1359                                         poly[2].Y = y2 + cos(rad) * kMinWidthT * v + kMinWidthY * sin(rad) * v;\r
1360                                         break;\r
1361                                 }\r
1362                                 \r
1363                                 icPolygon(poly, 4);\r
1364                                 \r
1365                                 if((a1 == 6) && (a2 == 0 || a2 == 5)){ //KAGI NO YOKO BOU NO SAIGO NO MARU\r
1366                                         poly3[0].X = x2 + sin(rad) * kMinWidthT * v;\r
1367                                         poly3[0].Y = y2 - cos(rad) * kMinWidthT * v;\r
1368                                         poly3[1].X = x2 + cos(rad) * kMinWidthT * 0.8 * v + sin(rad) * kMinWidthT * 0.6 * v;\r
1369                                         poly3[1].Y = y2 + sin(rad) * kMinWidthT * 0.8 * v - cos(rad) * kMinWidthT * 0.6 * v;\r
1370                                         poly3[2].X = x2 + cos(rad) * kMinWidthT * v;\r
1371                                         poly3[2].Y = y2 + sin(rad) * kMinWidthT * v;\r
1372                                         poly3[3].X = x2 + cos(rad) * kMinWidthT * 0.8 * v - sin(rad) * kMinWidthT * 0.6 * v;\r
1373                                         poly3[3].Y = y2 + sin(rad) * kMinWidthT * 0.8 * v + cos(rad) * kMinWidthT * 0.6 * v;\r
1374                                         poly3[4].X = x2 - sin(rad) * kMinWidthT * v;\r
1375                                         poly3[4].Y = y2 + cos(rad) * kMinWidthT * v;\r
1376                                         icPolygon(poly3, 5);\r
1377                                 }\r
1378                                 \r
1379                                 if(a1 == 6 && a2 == 5){\r
1380                                         //KAGI NO YOKO BOU NO HANE\r
1381                                         poly[0].X = x2 + (kMinWidthT - 1) * sin(rad) * v;\r
1382                                         poly[0].Y = y2 - (kMinWidthT - 1) * cos(rad) * v;\r
1383                                         poly[1].X = x2 + 2 * cos(rad) * v + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
1384                                         poly[1].Y = y2 + 2 * sin(rad) * v - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
1385                                         poly[2].X = x2 + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
1386                                         poly[2].Y = y2 - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
1387                                         poly[3].X = x2 + (kMinWidthT - 1) * sin(rad) * v - kMinWidthT * cos(rad) * v;\r
1388                                         poly[3].Y = y2 - (kMinWidthT - 1) * cos(rad) * v - kMinWidthT * sin(rad) * v;\r
1389                                         icPolygon(poly, 4);\r
1390                                 }\r
1391                                 \r
1392                                 if(a1 == 22){ //SHIKAKU MIGIUE UROKO NANAME DEMO MASSUGU MUKI\r
1393                                         poly3[0].X = x1 - kMinWidthT;\r
1394                                         poly3[0].Y = y1 - kMinWidthY;\r
1395                                         poly3[1].X = x1;\r
1396                                         poly3[1].Y = y1 - kMinWidthY - kWidth;\r
1397                                         poly3[2].X = x1 + kMinWidthT + kWidth;\r
1398                                         poly3[2].Y = y1 + kMinWidthY;\r
1399                                         poly3[3].X = x1 + kMinWidthT;\r
1400                                         poly3[3].Y = y1 + kMinWidthT;\r
1401                                         poly3[4].X = x1 - kMinWidthT;\r
1402                                         poly3[4].Y = y1;\r
1403                                         icPolygon(poly3, 5);\r
1404                                 }\r
1405                                 \r
1406                                 XX = sin(rad) * v;\r
1407                                 XY = cos(rad) * v * -1;\r
1408                                 YX = cos(rad) * v;\r
1409                                 YY = sin(rad) * v;\r
1410                                 \r
1411                                 if(a1 == 0){ //beginning of the storke\r
1412                                         poly2[0].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5) * YX;\r
1413                                         poly2[0].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5) * YY;\r
1414                                         poly2[1].X = x1 + (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;\r
1415                                         poly2[1].Y = y1 + (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;\r
1416                                         poly2[2].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
1417                                         poly2[2].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
1418                                         icPolygon(poly2, 3);\r
1419                                 }\r
1420                         }\r
1421                 }\r
1422         }\r
1423         else{ //gothic\r
1424                 if(tx1 == tx2){ //if TATE stroke, use y-axis\r
1425                         if(ty1 > ty2){\r
1426                                 x1 = tx2;\r
1427                                 y1 = ty2;\r
1428                                 x2 = tx1;\r
1429                                 y2 = ty1;\r
1430                                 a1 = ta2;\r
1431                                 a2 = ta1;\r
1432                         }\r
1433                         else{\r
1434                                 x1 = tx1;\r
1435                                 y1 = ty1;\r
1436                                 x2 = tx2;\r
1437                                 y2 = ty2;\r
1438                                 a1 = ta1;\r
1439                                 a2 = ta2;\r
1440                         }\r
1441                         \r
1442                         if(a1 % 10 == 2){ y1 = y1 - kWidth; }\r
1443                         if(a2 % 10 == 2){ y2 = y2 + kWidth; }\r
1444                         if(a1 % 10 == 3){ y1 = y1 - kWidth * kKakato; }\r
1445                         if(a2 % 10 == 3){ y2 = y2 + kWidth * kKakato; }\r
1446                         \r
1447                         poly[3].X = x1 - kWidth;\r
1448                         poly[3].Y = y1;\r
1449                         poly[2].X = x2 - kWidth;\r
1450                         poly[2].Y = y2;\r
1451                         poly[1].X = x2 + kWidth;\r
1452                         poly[1].Y = y2;\r
1453                         poly[0].X = x1 + kWidth;\r
1454                         poly[0].Y = y1;\r
1455                         \r
1456                         icPolygon(poly, 4);\r
1457                 }\r
1458                 else if(ty1 == ty2){ //if YOKO stroke, use x-axis\r
1459                         if(tx1 > tx2){\r
1460                                 x1 = tx2;\r
1461                                 y1 = ty2;\r
1462                                 x2 = tx1;\r
1463                                 y2 = ty1;\r
1464                                 a1 = ta2;\r
1465                                 a2 = ta1;\r
1466                         }\r
1467                         else{\r
1468                                 x1 = tx1;\r
1469                                 y1 = ty1;\r
1470                                 x2 = tx2;\r
1471                                 y2 = ty2;\r
1472                                 a1 = ta1;\r
1473                                 a2 = ta2;\r
1474                         }\r
1475                         if(a1 % 10 == 2){ x1 = x1 - kWidth; }\r
1476                         if(a2 % 10 == 2){ x2 = x2 + kWidth; }\r
1477                         if(a1 % 10 == 3){ x1 = x1 - kWidth * kKakato; }\r
1478                         if(a2 % 10 == 3){ x2 = x2 + kWidth * kKakato; }\r
1479                         \r
1480                         poly[0].X = x1;\r
1481                         poly[0].Y = y1 - kWidth;\r
1482                         poly[1].X = x2;\r
1483                         poly[1].Y = y2 - kWidth;\r
1484                         poly[2].X = x2;\r
1485                         poly[2].Y = y2 + kWidth;\r
1486                         poly[3].X = x1;\r
1487                         poly[3].Y = y1 + kWidth;\r
1488                         \r
1489                         icPolygon(poly, 4);\r
1490                 }\r
1491                 else{ //for others, use x-axis\r
1492                         if(tx1 > tx2){\r
1493                                 x1 = tx2;\r
1494                                 y1 = ty2;\r
1495                                 x2 = tx1;\r
1496                                 y2 = ty1;\r
1497                                 a1 = ta2;\r
1498                                 a2 = ta1;\r
1499                         }\r
1500                         else{\r
1501                                 x1 = tx1;\r
1502                                 y1 = ty1;\r
1503                                 x2 = tx2;\r
1504                                 y2 = ty2;\r
1505                                 a1 = ta1;\r
1506                                 a2 = ta2;\r
1507                         }\r
1508                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
1509                         if(a1 % 10 == 2){\r
1510                                 x1 = x1 - kWidth * cos(rad);\r
1511                                 y1 = y1 - kWidth * sin(rad);\r
1512                         }\r
1513                         if(a2 % 10 == 2){\r
1514                                 x2 = x2 + kWidth * cos(rad);\r
1515                                 y2 = y2 + kWidth * sin(rad);\r
1516                         }\r
1517                         if(a1 % 10 == 3){\r
1518                                 x1 = x1 - kWidth * cos(rad) * kKakato;\r
1519                                 y1 = y1 - kWidth * sin(rad) * kKakato;\r
1520                         }\r
1521                         if(a2 % 10 == 3){\r
1522                                 x2 = x2 + kWidth * cos(rad) * kKakato;\r
1523                                 y2 = y2 + kWidth * sin(rad) * kKakato;\r
1524                         }\r
1525                         \r
1526                         //SUICHOKU NO ICHI ZURASHI HA sin TO cos NO IREKAE + x-axis MAINASU KA\r
1527                         poly[0].X = x1 + sin(rad) * kWidth;\r
1528                         poly[0].Y = y1 - cos(rad) * kWidth;\r
1529                         poly[1].X = x2 + sin(rad) * kWidth;\r
1530                         poly[1].Y = y2 - cos(rad) * kWidth;\r
1531                         poly[2].X = x2 - sin(rad) * kWidth;\r
1532                         poly[2].Y = y2 + cos(rad) * kWidth;\r
1533                         poly[3].X = x1 - sin(rad) * kWidth;\r
1534                         poly[3].Y = y1 + cos(rad) * kWidth;\r
1535                         \r
1536                         icPolygon(poly, 4);\r
1537                 }\r
1538         }\r
1539 }\r