Make source clean.
[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 8:\r
570         case 7:\r
571         case 9:\r
572         case 15:\r
573         case 14:\r
574         case 17:\r
575         case 5:\r
576                 delta = 0;\r
577                 break;\r
578         default:\r
579                 break;\r
580         }\r
581         \r
582         if(x2 == x3){\r
583                 if(y2 < y3){ y3 = y3 + delta; }\r
584                 else{ y3 = y3 - delta; }\r
585         }\r
586         else if(y2 == y3){\r
587                 if(x2 < x3){ x3 = x3 + delta; }\r
588                 else{ x3 = x3 - delta; }\r
589         }\r
590         else{\r
591                 rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
592                 if(x2 < x3){ v = 1; } else{ v = -1; }\r
593                 x3 = x3 + delta * cos(rad) * v;\r
594                 y3 = y3 + delta * sin(rad) * v;\r
595         }\r
596         \r
597         count = 0;\r
598         \r
599         for(tt = 0; tt <= 1000; tt = tt + kRate){\r
600                 t = (double)(tt) / 1000;\r
601                 \r
602                 //calculate a dot\r
603                 x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);\r
604                 y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);\r
605                 \r
606                 //KATAMUKI of vector by BIBUN\r
607                 ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);\r
608                 iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);\r
609                 \r
610                 //line SUICHOKU by vector\r
611                 if(ix != 0 && iy != 0){\r
612                         ir = atan(iy / ix * -1);\r
613                         ia = sin(ir) * (double)(kMinWidthT);\r
614                         ib = cos(ir) * (double)(kMinWidthT);\r
615                 }\r
616                 else if(ix == 0){\r
617                         ia = kMinWidthT;\r
618                         ib = 0;\r
619                 }\r
620                 else{\r
621                         ia = 0;\r
622                         ib = kMinWidthT;\r
623                 }\r
624                 \r
625                 if(a1 == 7 && a2 == 0){ deltad = sqrt(t) * kL2RDfatten; } //L2RD: fatten\r
626                 else if(a1 == 7){ deltad = sqrt(t); }\r
627                 else if(a2 == 7){ deltad = sqrt(1.0 - t); }\r
628                 else{ deltad = 1; }\r
629                 ia = ia * deltad;\r
630                 ib = ib * deltad;\r
631                 \r
632                 //reverse if vector is going 2nd/3rd quadrants\r
633                 if(ix <= 0){\r
634                   ia = ia * -1;\r
635                   ib = ib * -1;\r
636                 }\r
637                 \r
638                 //copy to polygon structuer\r
639                 poly[count].X = x - ia;\r
640                 poly[count].Y = y - ib;\r
641                 poly[(1000 / kRate + 1) * 2 - 1 - count].X = x + ia;\r
642                 poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y + ib;\r
643                 count += 1;\r
644         }\r
645         \r
646         icPolygon(poly, (1000 / kRate + 1) * 2);\r
647         \r
648         //process for head of stroke\r
649         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
650         if(x1 < x2){ v = 1; } else{ v = -1; }\r
651         XX = sin(rad) * v;\r
652         XY = cos(rad) * v * -1;\r
653         YX = cos(rad) * v;\r
654         YY = sin(rad) * v;\r
655         \r
656         if(a1 == 12){\r
657                 if(x1 == x2){\r
658                         poly2[0].X = x1 - kMinWidthT;\r
659                         poly2[0].Y = y1;\r
660                         poly2[1].X = x1 + kMinWidthT;\r
661                         poly2[1].Y = y1;\r
662                         poly2[2].X = x1 - kMinWidthT;\r
663                         poly2[2].Y = y1 - kMinWidthT;\r
664                         icPolygon(poly2, 3);\r
665                 }\r
666                 else{\r
667                         poly2[0].X = x1 - kMinWidthT * XX;\r
668                         poly2[0].Y = y1 - kMinWidthT * XY;\r
669                         poly2[1].X = x1 + kMinWidthT * XX;\r
670                         poly2[1].Y = y1 + kMinWidthT * XY;\r
671                         poly2[2].X = x1 - kMinWidthT * XX - kMinWidthT * YX;\r
672                         poly2[2].Y = y1 - kMinWidthT * XY - kMinWidthT * YY;\r
673                         icPolygon(poly2, 3);\r
674                 }\r
675         }\r
676         \r
677         if(a1 == 0){\r
678                 if(y1 <= y3){ //from up to bottom\r
679                         if(x1 == x2){\r
680                                 poly2[0].X = x1 - kMinWidthT;\r
681                                 poly2[0].Y = y1;\r
682                                 poly2[1].X = x1 + kMinWidthT;\r
683                                 poly2[1].Y = y1;\r
684                                 poly2[2].X = x1 - kMinWidthT;\r
685                                 poly2[2].Y = y1 - kMinWidthY;\r
686                                 icPolygon(poly2, 3);\r
687                         }\r
688                         else{\r
689                                 poly2[0].X = x1 - kMinWidthT * XX;\r
690                                 poly2[0].Y = y1 - kMinWidthT * XY;\r
691                                 poly2[1].X = x1 + kMinWidthT * XX;\r
692                                 poly2[1].Y = y1 + kMinWidthT * XY;\r
693                                 poly2[2].X = x1 - kMinWidthT * XX - kMinWidthY * YX;\r
694                                 poly2[2].Y = y1 - kMinWidthT * XY - kMinWidthY * YY;\r
695                                 icPolygon(poly2, 3);\r
696                         }\r
697                 }\r
698                 else{ //bottom to up\r
699                         if(x1 == x2){ //is it right?\r
700                                 poly2[0].X = x1 - kMinWidthT;\r
701                                 poly2[0].Y = y1;\r
702                                 poly2[1].X = x1 + kMinWidthT;\r
703                                 poly2[1].Y = y1;\r
704                                 poly2[2].X = x1 - kMinWidthT;\r
705                                 poly2[2].Y = y1 + kMinWidthY;\r
706                                 icPolygon(poly2, 3);\r
707                         }\r
708                         else{\r
709                                 poly2[0].X = x1 - kMinWidthT * XX;\r
710                                 poly2[0].Y = y1 - kMinWidthT * XY;\r
711                                 poly2[1].X = x1 + kMinWidthT * XX;\r
712                                 poly2[1].Y = y1 + kMinWidthT * XY;\r
713                                 poly2[2].X = x1 + kMinWidthT * XX - kMinWidthY * YX;\r
714                                 poly2[2].Y = y1 + kMinWidthT * XY - kMinWidthY * YY;\r
715                                 icPolygon(poly2, 3);\r
716                         }\r
717                 }\r
718         }\r
719         \r
720         if(a1 == 22){ //box's up-right corner, any time same degree\r
721                 poly3[0].X = x1 - kMinWidthT;\r
722                 poly3[0].Y = y1 - kMinWidthY;\r
723                 poly3[1].X = x1;\r
724                 poly3[1].Y = y1 - kMinWidthY - kWidth;\r
725                 poly3[2].X = x1 + kMinWidthT + kWidth;\r
726                 poly3[2].Y = y1 + kMinWidthY;\r
727                 poly3[3].X = x1 + kMinWidthT;\r
728                 poly3[3].Y = y1 + kMinWidthT;\r
729                 poly3[4].X = x1 - kMinWidthT;\r
730                 poly3[4].Y = y1;\r
731                 icPolygon(poly3, 5);\r
732         }\r
733         \r
734         if(a1 == 0){ //beginning of the stroke\r
735                 if(y1 <= y3){ //from up to bottom\r
736                         if(x1 == x2){\r
737                                 poly2[0].X = x1 + kMinWidthT;\r
738                                 poly2[0].Y = y1 + kMinWidthY * 0.5;\r
739                                 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;\r
740                                 poly2[1].Y = y1 + kMinWidthY * 0.5 + kMinWidthY;\r
741                                 poly2[2].X = x1 + kMinWidthT;\r
742                                 poly2[2].Y = y1 + kMinWidthY * 0.5 + kMinWidthY * 2;\r
743                                 icPolygon(poly2, 3);\r
744                         }\r
745                         else{\r
746                                 poly2[0].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5) * YX;\r
747                                 poly2[0].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5) * YY;\r
748                                 poly2[1].X = x1 + (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;\r
749                                 poly2[1].Y = y1 + (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;\r
750                                 poly2[2].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
751                                 poly2[2].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
752                                 icPolygon(poly2, 3);\r
753                         }\r
754                 }\r
755                 else{ //from bottom to up\r
756                         if(x1 == x2){ //is it right?\r
757                                 poly2[0].X = x1 + kMinWidthT;\r
758                                 poly2[0].Y = y1 - kMinWidthY * 0.5;\r
759                                 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;\r
760                                 poly2[1].Y = y1 - kMinWidthY * 0.5 - kMinWidthY;\r
761                                 poly2[2].X = x1 + kMinWidthT;\r
762                                 poly2[2].Y = y1 - kMinWidthY * 0.5 - kMinWidthY * 2;\r
763                                 icPolygon(poly2, 3);\r
764                         }\r
765                         else //SETSUGOUMEN GA KAKERUNODE HOKYOU\r
766                                 poly3[0].X = x1 - (kMinWidthT - 1) * XX + (kMinWidthY * 0.5) * YX;\r
767                                 poly3[0].Y = y1 - (kMinWidthT - 1) * XY + (kMinWidthY * 0.5) * YY;\r
768                                 poly3[1].X = x1 - (kMinWidthT - 0) * XX + (kMinWidthY * 0.5) * YX;\r
769                                 poly3[1].Y = y1 - (kMinWidthT - 0) * XY + (kMinWidthY * 0.5) * YY;\r
770                                 poly3[2].X = x1 - (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;\r
771                                 poly3[2].Y = y1 - (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;\r
772                                 poly3[3].X = x1 - (kMinWidthT - 0) * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
773                                 poly3[3].Y = y1 - (kMinWidthT - 0) * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
774                                 poly3[4].X = x1 - (kMinWidthT - 1) * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
775                                 poly3[4].Y = y1 - (kMinWidthT - 1) * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
776                                 icPolygon(poly3, 5);\r
777                         }\r
778                 }\r
779                 \r
780                 //process for tail\r
781                 rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
782                 if(x2 < x3){ v = 1; } else{ v = -1; }\r
783                 YX = sin(rad) * v * -1;\r
784                 YY = cos(rad) * v;\r
785                 XX = cos(rad) * v;\r
786                 XY = sin(rad) * v;\r
787                 \r
788                 if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle\r
789                         if(x2 == x3){\r
790                                 poly3[0].X = x3 - kMinWidthT;\r
791                                 poly3[0].Y = y3;\r
792                                 poly3[1].X = x3 - kMinWidthT * 0.6;\r
793                                 poly3[1].Y = y3 + kMinWidthT * 0.6;\r
794                                 poly3[2].X = x3;\r
795                                 poly3[2].Y = y3 + kMinWidthT;\r
796                                 poly3[3].X = x3 + kMinWidthT * 0.6;\r
797                                 poly3[3].Y = y3 + kMinWidthT * 0.6;\r
798                                 poly3[4].X = x3 + kMinWidthT;\r
799                                 poly3[4].Y = y3;\r
800                                 icPolygon(poly3, 5);\r
801                         }\r
802                         else if(y2 == y3){\r
803                                 poly3[0].X = x3;\r
804                                 poly3[0].Y = y3 - kMinWidthT;\r
805                                 poly3[1].X = x3 + kMinWidthT * 0.6;\r
806                                 poly3[1].Y = y3 - kMinWidthT * 0.6;\r
807                                 poly3[2].X = x3 + kMinWidthT;\r
808                                 poly3[2].Y = y3;\r
809                                 poly3[3].X = x3 + kMinWidthT * 0.6;\r
810                                 poly3[3].Y = y3 + kMinWidthT * 0.6;\r
811                                 poly3[4].X = x3;\r
812                                 poly3[4].Y = y3 + kMinWidthT;\r
813                                 icPolygon(poly3, 5);\r
814                         }\r
815                         else{\r
816                                 poly3[0].X = x3 + sin(rad) * kMinWidthT * v;\r
817                                 poly3[0].Y = y3 - cos(rad) * kMinWidthT * v;\r
818                                 poly3[1].X = x3 + cos(rad) * kMinWidthT * 0.8 * v + sin(rad) * kMinWidthT * 0.6 * v;\r
819                                 poly3[1].Y = y3 + sin(rad) * kMinWidthT * 0.8 * v - cos(rad) * kMinWidthT * 0.6 * v;\r
820                                 poly3[2].X = x3 + cos(rad) * kMinWidthT * v;\r
821                                 poly3[2].Y = y3 + sin(rad) * kMinWidthT * v;\r
822                                 poly3[3].X = x3 + cos(rad) * kMinWidthT * 0.8 * v - sin(rad) * kMinWidthT * 0.6 * v;\r
823                                 poly3[3].Y = y3 + sin(rad) * kMinWidthT * 0.8 * v + cos(rad) * kMinWidthT * 0.6 * v;\r
824                                 poly3[4].X = x3 - sin(rad) * kMinWidthT * v;\r
825                                 poly3[4].Y = y3 + cos(rad) * kMinWidthT * v;\r
826                                 icPolygon(poly3, 5);\r
827                         }\r
828                 }\r
829                 \r
830                 if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Sinnyu & L2RD Harai\r
831                         if(y2 == y3){\r
832                                 poly2[0].X = x3;\r
833                                 poly2[0].Y = y3 + kMinWidthT * kL2RDfatten;\r
834                                 poly2[1].X = x3;\r
835                                 poly2[1].Y = y3 - kMinWidthT * kL2RDfatten;\r
836                                 poly2[2].X = x3 + kMinWidthT * kL2RDfatten;\r
837                                 poly2[2].Y = y3 - kMinWidthT * kL2RDfatten;\r
838                                 icPolygon(poly2, 3);\r
839                         }\r
840                         else{\r
841                                 poly2[0].X = x3 + kMinWidthT * kL2RDfatten * YX;\r
842                                 poly2[0].Y = y3 + kMinWidthT * kL2RDfatten * YY;\r
843                                 poly2[1].X = x3 - kMinWidthT * kL2RDfatten * YX;\r
844                                 poly2[1].Y = y3 - kMinWidthT * kL2RDfatten * YY;\r
845                                 poly2[2].X = x3 + kMinWidthT * kL2RDfatten * XX - kMinWidthT * kL2RDfatten * YX;\r
846                                 poly2[2].Y = y3 + kMinWidthT * kL2RDfatten * XY - kMinWidthT * kL2RDfatten * YY;\r
847                                 icPolygon(poly2, 3);\r
848                         }\r
849                 }\r
850                 \r
851                 if(a2 == 15){ //jump up\r
852                         if(y2 == y3){\r
853                                 poly4[0].X = x3;\r
854                                 poly4[0].Y = y3 - kMinWidthT + 1;\r
855                                 poly4[1].X = x3 + 2;\r
856                                 poly4[1].Y = y3 - kMinWidthT - kWidth * 5;\r
857                                 poly4[2].X = x3;\r
858                                 poly4[2].Y = y3 - kMinWidthT - kWidth * 5;\r
859                                 poly4[3].X = x3 - kMinWidthT;\r
860                                 poly4[3].Y = y3 - kMinWidthT + 1;\r
861                                 icPolygon(poly4, 4);\r
862                         }\r
863                         else{\r
864                                 poly4[0].X = x3 + (kMinWidthT - 1) * sin(rad) * v;\r
865                                 poly4[0].Y = y3 - (kMinWidthT - 1) * cos(rad) * v;\r
866                                 poly4[1].X = x3 + 2 * cos(rad) * v + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
867                                 poly4[1].Y = y3 + 2 * sin(rad) * v - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
868                                 poly4[2].X = x3 + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
869                                 poly4[2].Y = y3 - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
870                                 poly4[3].X = x3 + (kMinWidthT - 1) * sin(rad) * v - kMinWidthT * cos(rad) * v;\r
871                                 poly4[3].Y = y3 - (kMinWidthT - 1) * cos(rad) * v - kMinWidthT * sin(rad) * v;\r
872                                 icPolygon(poly4, 4);\r
873                         }\r
874                 }\r
875                 \r
876                 if(a2 == 14){ //jump to left, allways go left\r
877                         poly4[0].X = x3;\r
878                         poly4[0].Y = y3;\r
879                         poly4[1].X = x3;\r
880                         poly4[1].Y = y3 - kMinWidthT;\r
881                         poly4[2].X = x3 - kWidth * 4;\r
882                         poly4[2].Y = y3 - kMinWidthT;\r
883                         poly4[3].X = x3 - kWidth * 4;\r
884                         poly4[3].Y = y3 - kMinWidthT * 0.5;\r
885                         icPolygon(poly4, 4);\r
886                 }\r
887         }\r
888         else{ //gothic\r
889                 if(a1 % 10 == 2){\r
890                         if(x1 == x2){\r
891                                 if(y1 < y2){ y1 = y1 - kWidth; } else{ y1 = y1 + kWidth; }\r
892                         }\r
893                         else if(y1 == y2){\r
894                                 if(x1 < x2){ x1 = x1 - kWidth; } else{ x1 = x1 + kWidth; }\r
895                         }\r
896                         else{\r
897                                 rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
898                                 if(x1 < x2){ v = 1; } else{ v = -1; }\r
899                                 x1 = x1 - kWidth * cos(rad) * v;\r
900                                 y1 = y1 - kWidth * sin(rad) * v;\r
901                         }\r
902                 }\r
903                 \r
904                 if(a1 % 10 == 3){\r
905                         if(x1 == x2){\r
906                                 if(y1 < y2){\r
907                                          y1 = y1 - kWidth * kKakato;\r
908                                 }\r
909                         else{\r
910                                  y1 = y1 + kWidth * kKakato;\r
911                         }\r
912                 }\r
913                 else if(y1 == y2){\r
914                         if(x1 < x2){\r
915                                 x1 = x1 - kWidth * kKakato;\r
916                         }\r
917                         else{\r
918                                 x1 = x1 + kWidth * kKakato;\r
919                         }\r
920                 }\r
921                 else{\r
922                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
923                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
924                         x1 = x1 - kWidth * cos(rad) * v * kKakato;\r
925                         y1 = y1 - kWidth * sin(rad) * v * kKakato;\r
926                         }\r
927                 }\r
928                 if(a2 % 10 == 2){\r
929                         if(x2 == x3){\r
930                                 if(y2 < y3){ y3 = y3 + kWidth; } else{ y3 = y3 - kWidth; }\r
931                         }\r
932                         else if(y2 == y3){\r
933                                 if(x2 < x3){ x3 = x3 + kWidth; } else{ x3 = x3 - kWidth; }\r
934                         }\r
935                         else{\r
936                                 rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
937                                 if(x2 < x3){ v = 1; } else{ v = -1; }\r
938                                 x3 = x3 + kWidth * cos(rad) * v;\r
939                                 y3 = y3 + kWidth * sin(rad) * v;\r
940                         }\r
941                 }\r
942                 \r
943                 if(a2 % 10 == 3){\r
944                         if(x2 == x3){\r
945                                 if(y2 < y3){\r
946                                         y3 = y3 + kWidth * kKakato;\r
947                                 }\r
948                                 else{\r
949                                         y3 = y3 - kWidth * kKakato;\r
950                                 }\r
951                         }\r
952                         else if(y2 == y3){\r
953                                 if(x2 < x3){\r
954                                         x3 = x3 + kWidth * kKakato;\r
955                                 }\r
956                                 else{\r
957                                         x3 = x3 - kWidth * kKakato;\r
958                                 }\r
959                         }\r
960                         else{\r
961                                 rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
962                                 if(x2 < x3){ v = 1; } else{ v = -1; }\r
963                                 x3 = x3 + kWidth * cos(rad) * v * kKakato;\r
964                                 y3 = y3 + kWidth * sin(rad) * v * kKakato;\r
965                         }\r
966                 }\r
967                 \r
968                 count = 0;\r
969                 \r
970                 for(tt = 0; tt <= 1000; tt = tt + kRate){\r
971                         t = (double)tt / 1000;\r
972                         \r
973                         //calculating each point\r
974                         x = ((1.0 - t) * (1.0 - t) * x1 + 2.0 * t * (1.0 - t) * x2 + t * t * x3);\r
975                         y = ((1.0 - t) * (1.0 - t) * y1 + 2.0 * t * (1.0 - t) * y2 + t * t * y3);\r
976                         \r
977                         //SESSEN NO KATAMUKI NO KEISAN(BIBUN)\r
978                         ix = (x1 - 2.0 * x2 + x3) * 2.0 * t + (-2.0 * x1 + 2.0 * x2);\r
979                         iy = (y1 - 2.0 * y2 + y3) * 2.0 * t + (-2.0 * y1 + 2.0 * y2);\r
980                         \r
981                         //SESSEN NI SUICHOKU NA CHOKUSEN NO KEISAN\r
982                         if(kShotai == kMincho){ //always false ?\r
983                                 if(ix != 0 && iy != 0){\r
984                                         ir = atan(iy / ix * -1.0);\r
985                                         ia = sin(ir) * (double)kMinWidthT;\r
986                                         ib = cos(ir) * (double)kMinWidthT;\r
987                                 }\r
988                                 else if(ix == 0){\r
989                                         ia = kMinWidthT;\r
990                                         ib = 0;\r
991                                 }\r
992                                 else{\r
993                                         ia = 0;\r
994                                         ib = kMinWidthT;\r
995                                 }\r
996                                 ia = ia * sqrt(1.0 - t);\r
997                                 ib = ib * sqrt(1.0 - t);\r
998                         }\r
999                         else{\r
1000                                 if(ix != 0 && iy != 0){\r
1001                                         ir = atan(iy / ix * -1.0);\r
1002                                         ia = sin(ir) * (double)kWidth;\r
1003                                         ib = cos(ir) * (double)kWidth;\r
1004                                 }\r
1005                                 else if(ix == 0){\r
1006                                         ia = kWidth;\r
1007                                         ib = 0;\r
1008                                 }\r
1009                                 else{\r
1010                                         ia = 0;\r
1011                                         ib = kWidth;\r
1012                                 }\r
1013                         }\r
1014 \r
1015                         //reverse if vector is going 2nd/3rd quadrants\r
1016                         if(ix <= 0){\r
1017                           ia = ia * -1;\r
1018                           ib = ib * -1;\r
1019                         }\r
1020                 \r
1021                         //save to polygon\r
1022                         poly[count].X = x - ia;\r
1023                         poly[count].Y = y - ib;\r
1024                         poly[(1000 / kRate + 1) * 2 - 1 - count].X = x + ia;\r
1025                         poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y + ib;\r
1026                         count += 1;\r
1027                 }\r
1028                 \r
1029                 icPolygon(poly, (1000 / kRate + 1) * 2);\r
1030         }\r
1031 }\r
1032 \r
1033 void cdDrawLine(double tx1, double ty1, double tx2, double ty2, int ta1, int ta2){\r
1034         double rad;\r
1035         double v, x1, y1, x2, y2;\r
1036         int a1, a2;\r
1037         double XX, XY, YX, YY;\r
1038         \r
1039         if(kShotai == kMincho){ //mincho\r
1040                 x1 = tx1;\r
1041                 y1 = ty1;\r
1042                 x2 = tx2;\r
1043                 y2 = ty2;\r
1044                 a1 = ta1;\r
1045                 a2 = ta2;\r
1046                 \r
1047                 if(x1 == x2){ //if TATE stroke, use y-axis\r
1048                         switch(a1){\r
1049                         case 0:\r
1050                                 poly[3].X = x1 - kMinWidthT;\r
1051                                 poly[3].Y = y1 - kMinWidthY / 2;\r
1052                                 poly[0].X = x1 + kMinWidthT;\r
1053                                 poly[0].Y = y1 + kMinWidthY / 2;\r
1054                                 break;\r
1055                         case 1:\r
1056                         case 6:\r
1057                         case 22:\r
1058                                 poly[3].X = x1 - kMinWidthT;\r
1059                                 poly[3].Y = y1;\r
1060                                 poly[0].X = x1 + kMinWidthT;\r
1061                                 poly[0].Y = y1;\r
1062                                 break;\r
1063                         case 12:\r
1064                                 poly[3].X = x1 - kMinWidthT;\r
1065                                 poly[3].Y = y1 - kMinWidthY - kMinWidthT;\r
1066                                 poly[0].X = x1 + kMinWidthT;\r
1067                                 poly[0].Y = y1 - kMinWidthY;\r
1068                                 break;\r
1069                         case 32:\r
1070                                 poly[3].X = x1 - kMinWidthT;\r
1071                                 poly[3].Y = y1 - kMinWidthY;\r
1072                                 poly[0].X = x1 + kMinWidthT;\r
1073                                 poly[0].Y = y1 - kMinWidthY;\r
1074                                 break;\r
1075                         }\r
1076                         \r
1077                         switch(a2){\r
1078                         case 0:\r
1079                                 if(a1 == 6){ //KAGI's tail\r
1080                                         poly[2].X = x2 - kMinWidthT;\r
1081                                         poly[2].Y = y2;\r
1082                                         poly[1].X = x2 + kMinWidthT;\r
1083                                         poly[1].Y = y2;\r
1084                                 }\r
1085                                 else{\r
1086                                         poly[2].X = x2 - kMinWidthT;\r
1087                                         poly[2].Y = y2 + kMinWidthT / 2;\r
1088                                         poly[1].X = x2 + kMinWidthT;\r
1089                                         poly[1].Y = y2 - kMinWidthT / 2;\r
1090                                 }\r
1091                                 break;\r
1092                         case 1:\r
1093                                 poly[2].X = x2 - kMinWidthT;\r
1094                                 poly[2].Y = y2;\r
1095                                 poly[1].X = x2 + kMinWidthT;\r
1096                                 poly[1].Y = y2;\r
1097                                 break;\r
1098                         case 13:\r
1099                                 poly[2].X = x2 - kMinWidthT;\r
1100                                 poly[2].Y = y2 + kWidth * kKakato + kMinWidthT;\r
1101                                 poly[1].X = x2 + kMinWidthT;\r
1102                                 poly[1].Y = y2 + kWidth * kKakato;\r
1103                                 break;\r
1104                         case 23:\r
1105                                 poly[2].X = x2 - kMinWidthT;\r
1106                                 poly[2].Y = y2 + kWidth * kKakato * 0.5 + kMinWidthT;\r
1107                                 poly[1].X = x2 + kMinWidthT;\r
1108                                 poly[1].Y = y2 + kWidth * kKakato * 0.5;\r
1109                                 break;\r
1110                         case 32:\r
1111                                 poly[2].X = x2 - kMinWidthT;\r
1112                                 poly[2].Y = y2 + kMinWidthY;\r
1113                                 poly[1].X = x2 + kMinWidthT;\r
1114                                 poly[1].Y = y2 + kMinWidthY;\r
1115                                 break;\r
1116                         }\r
1117                         \r
1118                         icPolygon(poly, 4);\r
1119                         \r
1120                         if(a1 == 22){ //box's right top corner\r
1121                                 poly3[0].X = x1 - kMinWidthT;\r
1122                                 poly3[0].Y = y1 - kMinWidthY;\r
1123                                 poly3[1].X = x1;\r
1124                                 poly3[1].Y = y1 - kMinWidthY - kWidth;\r
1125                                 poly3[2].X = x1 + kMinWidthT + kWidth;\r
1126                                 poly3[2].Y = y1 + kMinWidthY;\r
1127                                 poly3[3].X = x1 + kMinWidthT;\r
1128                                 poly3[3].Y = y1 + kMinWidthT;\r
1129                                 poly3[4].X = x1 - kMinWidthT;\r
1130                                 poly3[4].Y = y1;\r
1131                                 icPolygon(poly3, 5);\r
1132                         }\r
1133                         \r
1134                         if(a1 == 0){ //beginning of the stroke\r
1135                                 poly2[0].X = x1 + kMinWidthT;\r
1136                                 poly2[0].Y = y1 + kMinWidthY * 0.5;\r
1137                                 poly2[1].X = x1 + kMinWidthT + kMinWidthT * 0.5;\r
1138                                 poly2[1].Y = y1 + kMinWidthY * 0.5 + kMinWidthY;\r
1139                                 poly2[2].X = x1 + kMinWidthT;\r
1140                                 poly2[2].Y = y1 + kMinWidthY * 0.5 + kMinWidthY * 2;\r
1141                                 icPolygon(poly2, 3);\r
1142                         }\r
1143                         \r
1144                         if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU\r
1145                                 poly3[4].X = x2 - kMinWidthT;\r
1146                                 poly3[4].Y = y2;\r
1147                                 poly3[3].X = x2 - kMinWidthT * 0.6;\r
1148                                 poly3[3].Y = y2 + kMinWidthT * 0.6;\r
1149                                 poly3[2].X = x2;\r
1150                                 poly3[2].Y = y2 + kMinWidthT;\r
1151                                 poly3[1].X = x2 + kMinWidthT * 0.6;\r
1152                                 poly3[1].Y = y2 + kMinWidthT * 0.6;\r
1153                                 poly3[0].X = x2 + kMinWidthT;\r
1154                                 poly3[0].Y = y2;\r
1155                                 icPolygon(poly3, 5);\r
1156                         }\r
1157                 }\r
1158                 else if(y1 == y2){ //if it is YOKO stroke, use x-axis\r
1159                         if(a1 == 6){ //if it is KAGI's YOKO stroke, get bold\r
1160                                 poly[0].X = x1;\r
1161                                 poly[0].Y = y1 - kMinWidthT;\r
1162                                 poly[1].X = x2;\r
1163                                 poly[1].Y = y2 - kMinWidthT;\r
1164                                 poly[2].X = x2;\r
1165                                 poly[2].Y = y2 + kMinWidthT;\r
1166                                 poly[3].X = x1;\r
1167                                 poly[3].Y = y1 + kMinWidthT;\r
1168                                 icPolygon(poly, 4);\r
1169                                 \r
1170                                 if(a2 == 1 || a2 == 0 || a2 == 5){\r
1171                                         //KAGI NO YOKO BOU NO SAIGO NO MARU\r
1172                                         poly3[0].X = x2;\r
1173                                         poly3[0].Y = y2 - kMinWidthT;\r
1174                                         poly3[1].X = x2 + kMinWidthT * 0.6;\r
1175                                         poly3[1].Y = y2 - kMinWidthT * 0.6;\r
1176                                         poly3[2].X = x2 + kMinWidthT;\r
1177                                         poly3[2].Y = y2;\r
1178                                         poly3[3].X = x2 + kMinWidthT * 0.6;\r
1179                                         poly3[3].Y = y2 + kMinWidthT * 0.6;\r
1180                                         poly3[4].X = x2;\r
1181                                         poly3[4].Y = y2 + kMinWidthT;\r
1182                                         icPolygon(poly3, 5);\r
1183                                 }\r
1184                                 \r
1185                                 if(a2 == 5){\r
1186                                         //KAGI NO YOKO BOU NO HANE\r
1187                                         poly[0].X = x2;\r
1188                                         poly[0].Y = y2 - kMinWidthT + 1;\r
1189                                         poly[1].X = x2 + 2;\r
1190                                         poly[1].Y = y2 - kMinWidthT - kWidth * 5;\r
1191                                         poly[2].X = x2;\r
1192                                         poly[2].Y = y2 - kMinWidthT - kWidth * 5;\r
1193                                         poly[3].X = x2 - kMinWidthT;\r
1194                                         poly[3].Y = y2 - kMinWidthT + 1;\r
1195                                         icPolygon(poly, 4);\r
1196                                 }\r
1197                         }\r
1198                         else{\r
1199                                 switch(a1){\r
1200                                 case 0:\r
1201                                         poly[0].X = x1;\r
1202                                         poly[0].Y = y1 - kMinWidthY;\r
1203                                         poly[3].X = x1;\r
1204                                         poly[3].Y = y1 + kMinWidthY;\r
1205                                         break;\r
1206                                 case 2:\r
1207                                         poly[0].X = x1 - kMinWidthT;\r
1208                                         poly[0].Y = y1 - kMinWidthY;\r
1209                                         poly[3].X = x1 - kMinWidthT;\r
1210                                         poly[3].Y = y1 + kMinWidthY;\r
1211                                         break;\r
1212                                 }\r
1213                                 \r
1214                                 switch(a2){\r
1215                                 case 0:\r
1216                                         poly[1].X = x2;\r
1217                                         poly[1].Y = y2 - kMinWidthY;\r
1218                                         poly[2].X = x2;\r
1219                                         poly[2].Y = y2 + kMinWidthY;\r
1220                                         break;\r
1221                                 case 2:\r
1222                                         poly[1].X = x2 + kMinWidthT;\r
1223                                         poly[1].Y = y2 - kMinWidthY;\r
1224                                         poly[2].X = x2 + kMinWidthT;\r
1225                                         poly[2].Y = y2 + kMinWidthY;\r
1226                                 }\r
1227                                 \r
1228                                 icPolygon(poly, 4);\r
1229                                 \r
1230                                 //UROKO\r
1231                                 if(a2 == 0){\r
1232                                         poly2[0].X = x2;\r
1233                                         poly2[0].Y = y2 - kMinWidthY;\r
1234                                         poly2[1].X = x2 - 24;\r
1235                                         poly2[1].Y = y2;\r
1236                                         poly2[2].X = x2 - 12;\r
1237                                         poly2[2].Y = y2 - 12;\r
1238                                         icPolygon(poly2, 3);\r
1239                                 }\r
1240                         }\r
1241                 }\r
1242                 else{ //for others, use x-axis\r
1243                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
1244                         if((abs(y2 - y1) < abs(x2 - x1)) && (a1 != 6) && (a2 != 6)){ //ASAI KAUDO\r
1245                                 switch(a1){ //must be 0 or 2\r
1246                                 case 0:\r
1247                                         poly[0].X = x1 + sin(rad) * kMinWidthY;\r
1248                                         poly[0].Y = y1 - cos(rad) * kMinWidthY;\r
1249                                         poly[3].X = x1 - sin(rad) * kMinWidthY;\r
1250                                         poly[3].Y = y1 + cos(rad) * kMinWidthY;\r
1251                                         break;\r
1252                                 case 2:\r
1253                                         poly[0].X = x1 + sin(rad) * kMinWidthY - kMinWidthT * cos(rad);\r
1254                                         poly[0].Y = y1 - cos(rad) * kMinWidthY - kMinWidthT * sin(rad);\r
1255                                         poly[3].X = x1 - sin(rad) * kMinWidthY - kMinWidthT * cos(rad);\r
1256                                         poly[3].Y = y1 + cos(rad) * kMinWidthY - kMinWidthT * sin(rad);\r
1257                                         break;\r
1258                                 }\r
1259                                 \r
1260                                 switch(a2){ //must be 0 or 2\r
1261                                 case 0:\r
1262                                         poly[1].X = x2 + sin(rad) * kMinWidthY;\r
1263                                         poly[1].Y = y2 - cos(rad) * kMinWidthY;\r
1264                                         poly[2].X = x2 - sin(rad) * kMinWidthY;\r
1265                                         poly[2].Y = y2 + cos(rad) * kMinWidthY;\r
1266                                         break;\r
1267                                 case 2:\r
1268                                         poly[1].X = x2 + sin(rad) * kMinWidthY + kMinWidthT * cos(rad);\r
1269                                         poly[1].Y = y2 - cos(rad) * kMinWidthY + kMinWidthT * sin(rad);\r
1270                                         poly[2].X = x2 - sin(rad) * kMinWidthY + kMinWidthT * cos(rad);\r
1271                                         poly[2].Y = y2 + cos(rad) * kMinWidthY + kMinWidthT * sin(rad);\r
1272                                 }\r
1273                                 \r
1274                                 icPolygon(poly, 4);\r
1275                                 \r
1276                                 //UROKO\r
1277                                 if(a2 == 0){\r
1278                                         poly2[0].X = x2 + sin(rad) * kMinWidthY;\r
1279                                         poly2[0].Y = y2 - cos(rad) * kMinWidthY;\r
1280                                         poly2[1].X = x2 - cos(rad) * 24;\r
1281                                         poly2[1].Y = y2 - sin(rad) * 24;\r
1282                                         poly2[2].X = x2 - cos(rad) * 12 + sin(rad) * 12;\r
1283                                         poly2[2].Y = y2 - sin(rad) * 12 - cos(rad) * 12;\r
1284                                         icPolygon(poly2, 3);\r
1285                                 }\r
1286                         }\r
1287                         \r
1288                         else{ //KAKUDO GA FUKAI or KAGI NO YOKO BOU\r
1289                                 if(x1 > x2){ v = -1; } else{ v = 1; }\r
1290                                 switch(a1){\r
1291                                 case 0:\r
1292                                         poly[0].X = x1 + sin(rad) * kMinWidthT * v + kMinWidthY * cos(rad) * 0.5 * v;\r
1293                                         poly[0].Y = y1 - cos(rad) * kMinWidthT * v + kMinWidthY * sin(rad) * 0.5 * v;\r
1294                                         poly[3].X = x1 - sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * 0.5 * v;\r
1295                                         poly[3].Y = y1 + cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * 0.5 * v;\r
1296                                         break;\r
1297                                 case 1:\r
1298                                 case 6:\r
1299                                 case 22:\r
1300                                         poly[0].X = x1 + sin(rad) * kMinWidthT * v;\r
1301                                         poly[0].Y = y1 - cos(rad) * kMinWidthT * v;\r
1302                                         poly[3].X = x1 - sin(rad) * kMinWidthT * v;\r
1303                                         poly[3].Y = y1 + cos(rad) * kMinWidthT * v;\r
1304                                         break;\r
1305                                 case 12:\r
1306                                         poly[0].X = x1 + sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * v;\r
1307                                         poly[0].Y = y1 - cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * v;\r
1308                                         poly[3].X = x1 - sin(rad) * kMinWidthT * v - (kMinWidthT + kMinWidthY) * cos(rad) * v;\r
1309                                         poly[3].Y = y1 + cos(rad) * kMinWidthT * v - (kMinWidthT + kMinWidthY) * sin(rad) * v;\r
1310                                         break;\r
1311                                 case 32:\r
1312                                         poly[0].X = x1 + sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * v;\r
1313                                         poly[0].Y = y1 - cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * v;\r
1314                                         poly[3].X = x1 - sin(rad) * kMinWidthT * v - kMinWidthY * cos(rad) * v;\r
1315                                         poly[3].Y = y1 + cos(rad) * kMinWidthT * v - kMinWidthY * sin(rad) * v;\r
1316                                         break;\r
1317                                 }\r
1318                                 \r
1319                                 switch(a2){\r
1320                                 case 0:\r
1321                                         if(a1 == 6){\r
1322                                                 poly[1].X = x2 + sin(rad) * kMinWidthT * v;\r
1323                                                 poly[1].Y = y2 - cos(rad) * kMinWidthT * v;\r
1324                                                 poly[2].X = x2 - sin(rad) * kMinWidthT * v;\r
1325                                                 poly[2].Y = y2 + cos(rad) * kMinWidthT * v;\r
1326                                         }\r
1327                                         else{\r
1328                                                 poly[1].X = x2 + sin(rad) * kMinWidthT * v - kMinWidthT * 0.5 * cos(rad) * v;\r
1329                                                 poly[1].Y = y2 - cos(rad) * kMinWidthT * v - kMinWidthT * 0.5 * sin(rad) * v;\r
1330                                                 poly[2].X = x2 - sin(rad) * kMinWidthT * v + kMinWidthT * 0.5 * cos(rad) * v;\r
1331                                                 poly[2].Y = y2 + cos(rad) * kMinWidthT * v + kMinWidthT * 0.5 * sin(rad) * v;\r
1332                                         }\r
1333                                         break;\r
1334                                 case 1:\r
1335                                 case 5:\r
1336                                         poly[1].X = x2 + sin(rad) * kMinWidthT * v;\r
1337                                         poly[1].Y = y2 - cos(rad) * kMinWidthT * v;\r
1338                                         poly[2].X = x2 - sin(rad) * kMinWidthT * v;\r
1339                                         poly[2].Y = y2 + cos(rad) * kMinWidthT * v;\r
1340                                         break;\r
1341                                 case 13:\r
1342                                         poly[1].X = x2 + sin(rad) * kMinWidthT * v + kWidth * kKakato * cos(rad) * v;\r
1343                                         poly[1].Y = y2 - cos(rad) * kMinWidthT * v + kWidth * kKakato * sin(rad) * v;\r
1344                                         poly[2].X = x2 - sin(rad) * kMinWidthT * v + (kWidth * kKakato + kMinWidthT) * cos(rad) * v;\r
1345                                         poly[2].Y = y2 + cos(rad) * kMinWidthT * v + (kWidth * kKakato + kMinWidthT) * sin(rad) * v;\r
1346                                         break;\r
1347                                 case 23:\r
1348                                         poly[1].X = x2 + sin(rad) * kMinWidthT * v + kWidth * kKakato * 0.5 * cos(rad) * v;\r
1349                                         poly[1].Y = y2 - cos(rad) * kMinWidthT * v + kWidth * kKakato * 0.5 * sin(rad) * v;\r
1350                                         poly[2].X = x2 - sin(rad) * kMinWidthT * v + (kWidth * kKakato * 0.5 + kMinWidthT) * cos(rad) * v;\r
1351                                         poly[2].Y = y2 + cos(rad) * kMinWidthT * v + (kWidth * kKakato * 0.5 + kMinWidthT) * sin(rad) * v;\r
1352                                         break;\r
1353                                 case 32:\r
1354                                         poly[1].X = x2 + sin(rad) * kMinWidthT * v + kMinWidthY * cos(rad) * v;\r
1355                                         poly[1].Y = y2 - cos(rad) * kMinWidthT * v + kMinWidthY * sin(rad) * v;\r
1356                                         poly[2].X = x2 - sin(rad) * kMinWidthT * v + kMinWidthY * cos(rad) * v;\r
1357                                         poly[2].Y = y2 + cos(rad) * kMinWidthT * v + kMinWidthY * sin(rad) * v;\r
1358                                         break;\r
1359                                 }\r
1360                                 \r
1361                                 icPolygon(poly, 4);\r
1362                                 \r
1363                                 if((a1 == 6) && (a2 == 0 || a2 == 5)){ //KAGI NO YOKO BOU NO SAIGO NO MARU\r
1364                                         poly3[0].X = x2 + sin(rad) * kMinWidthT * v;\r
1365                                         poly3[0].Y = y2 - cos(rad) * kMinWidthT * v;\r
1366                                         poly3[1].X = x2 + cos(rad) * kMinWidthT * 0.8 * v + sin(rad) * kMinWidthT * 0.6 * v;\r
1367                                         poly3[1].Y = y2 + sin(rad) * kMinWidthT * 0.8 * v - cos(rad) * kMinWidthT * 0.6 * v;\r
1368                                         poly3[2].X = x2 + cos(rad) * kMinWidthT * v;\r
1369                                         poly3[2].Y = y2 + sin(rad) * kMinWidthT * v;\r
1370                                         poly3[3].X = x2 + cos(rad) * kMinWidthT * 0.8 * v - sin(rad) * kMinWidthT * 0.6 * v;\r
1371                                         poly3[3].Y = y2 + sin(rad) * kMinWidthT * 0.8 * v + cos(rad) * kMinWidthT * 0.6 * v;\r
1372                                         poly3[4].X = x2 - sin(rad) * kMinWidthT * v;\r
1373                                         poly3[4].Y = y2 + cos(rad) * kMinWidthT * v;\r
1374                                         icPolygon(poly3, 5);\r
1375                                 }\r
1376                                 \r
1377                                 if(a1 == 6 && a2 == 5){\r
1378                                         //KAGI NO YOKO BOU NO HANE\r
1379                                         poly[0].X = x2 + (kMinWidthT - 1) * sin(rad) * v;\r
1380                                         poly[0].Y = y2 - (kMinWidthT - 1) * cos(rad) * v;\r
1381                                         poly[1].X = x2 + 2 * cos(rad) * v + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
1382                                         poly[1].Y = y2 + 2 * sin(rad) * v - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
1383                                         poly[2].X = x2 + (kMinWidthT + kWidth * 5) * sin(rad) * v;\r
1384                                         poly[2].Y = y2 - (kMinWidthT + kWidth * 5) * cos(rad) * v;\r
1385                                         poly[3].X = x2 + (kMinWidthT - 1) * sin(rad) * v - kMinWidthT * cos(rad) * v;\r
1386                                         poly[3].Y = y2 - (kMinWidthT - 1) * cos(rad) * v - kMinWidthT * sin(rad) * v;\r
1387                                         icPolygon(poly, 4);\r
1388                                 }\r
1389                                 \r
1390                                 if(a1 == 22){ //SHIKAKU MIGIUE UROKO NANAME DEMO MASSUGU MUKI\r
1391                                         poly3[0].X = x1 - kMinWidthT;\r
1392                                         poly3[0].Y = y1 - kMinWidthY;\r
1393                                         poly3[1].X = x1;\r
1394                                         poly3[1].Y = y1 - kMinWidthY - kWidth;\r
1395                                         poly3[2].X = x1 + kMinWidthT + kWidth;\r
1396                                         poly3[2].Y = y1 + kMinWidthY;\r
1397                                         poly3[3].X = x1 + kMinWidthT;\r
1398                                         poly3[3].Y = y1 + kMinWidthT;\r
1399                                         poly3[4].X = x1 - kMinWidthT;\r
1400                                         poly3[4].Y = y1;\r
1401                                         icPolygon(poly3, 5);\r
1402                                 }\r
1403                                 \r
1404                                 XX = sin(rad) * v;\r
1405                                 XY = cos(rad) * v * -1;\r
1406                                 YX = cos(rad) * v;\r
1407                                 YY = sin(rad) * v;\r
1408                                 \r
1409                                 if(a1 == 0){ //beginning of the storke\r
1410                                         poly2[0].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5) * YX;\r
1411                                         poly2[0].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5) * YY;\r
1412                                         poly2[1].X = x1 + (kMinWidthT + kMinWidthT * 0.5) * XX + (kMinWidthY * 0.5 + kMinWidthY) * YX;\r
1413                                         poly2[1].Y = y1 + (kMinWidthT + kMinWidthT * 0.5) * XY + (kMinWidthY * 0.5 + kMinWidthY) * YY;\r
1414                                         poly2[2].X = x1 + kMinWidthT * XX + (kMinWidthY * 0.5 + kMinWidthY * 2) * YX;\r
1415                                         poly2[2].Y = y1 + kMinWidthT * XY + (kMinWidthY * 0.5 + kMinWidthY * 2) * YY;\r
1416                                         icPolygon(poly2, 3);\r
1417                                 }\r
1418                         }\r
1419                 }\r
1420         }\r
1421         else{ //gothic\r
1422                 if(tx1 == tx2){ //if TATE stroke, use y-axis\r
1423                         if(ty1 > ty2){\r
1424                                 x1 = tx2;\r
1425                                 y1 = ty2;\r
1426                                 x2 = tx1;\r
1427                                 y2 = ty1;\r
1428                                 a1 = ta2;\r
1429                                 a2 = ta1;\r
1430                         }\r
1431                         else{\r
1432                                 x1 = tx1;\r
1433                                 y1 = ty1;\r
1434                                 x2 = tx2;\r
1435                                 y2 = ty2;\r
1436                                 a1 = ta1;\r
1437                                 a2 = ta2;\r
1438                         }\r
1439                         \r
1440                         if(a1 % 10 == 2){ y1 = y1 - kWidth; }\r
1441                         if(a2 % 10 == 2){ y2 = y2 + kWidth; }\r
1442                         if(a1 % 10 == 3){ y1 = y1 - kWidth * kKakato; }\r
1443                         if(a2 % 10 == 3){ y2 = y2 + kWidth * kKakato; }\r
1444                         \r
1445                         poly[3].X = x1 - kWidth;\r
1446                         poly[3].Y = y1;\r
1447                         poly[2].X = x2 - kWidth;\r
1448                         poly[2].Y = y2;\r
1449                         poly[1].X = x2 + kWidth;\r
1450                         poly[1].Y = y2;\r
1451                         poly[0].X = x1 + kWidth;\r
1452                         poly[0].Y = y1;\r
1453                         \r
1454                         icPolygon(poly, 4);\r
1455                 }\r
1456                 else if(ty1 == ty2){ //if YOKO stroke, use x-axis\r
1457                         if(tx1 > tx2){\r
1458                                 x1 = tx2;\r
1459                                 y1 = ty2;\r
1460                                 x2 = tx1;\r
1461                                 y2 = ty1;\r
1462                                 a1 = ta2;\r
1463                                 a2 = ta1;\r
1464                         }\r
1465                         else{\r
1466                                 x1 = tx1;\r
1467                                 y1 = ty1;\r
1468                                 x2 = tx2;\r
1469                                 y2 = ty2;\r
1470                                 a1 = ta1;\r
1471                                 a2 = ta2;\r
1472                         }\r
1473                         if(a1 % 10 == 2){ x1 = x1 - kWidth; }\r
1474                         if(a2 % 10 == 2){ x2 = x2 + kWidth; }\r
1475                         if(a1 % 10 == 3){ x1 = x1 - kWidth * kKakato; }\r
1476                         if(a2 % 10 == 3){ x2 = x2 + kWidth * kKakato; }\r
1477                         \r
1478                         poly[0].X = x1;\r
1479                         poly[0].Y = y1 - kWidth;\r
1480                         poly[1].X = x2;\r
1481                         poly[1].Y = y2 - kWidth;\r
1482                         poly[2].X = x2;\r
1483                         poly[2].Y = y2 + kWidth;\r
1484                         poly[3].X = x1;\r
1485                         poly[3].Y = y1 + kWidth;\r
1486                         \r
1487                         icPolygon(poly, 4);\r
1488                 }\r
1489                 else{ //for others, use x-axis\r
1490                         if(tx1 > tx2){\r
1491                                 x1 = tx2;\r
1492                                 y1 = ty2;\r
1493                                 x2 = tx1;\r
1494                                 y2 = ty1;\r
1495                                 a1 = ta2;\r
1496                                 a2 = ta1;\r
1497                         }\r
1498                         else{\r
1499                                 x1 = tx1;\r
1500                                 y1 = ty1;\r
1501                                 x2 = tx2;\r
1502                                 y2 = ty2;\r
1503                                 a1 = ta1;\r
1504                                 a2 = ta2;\r
1505                         }\r
1506                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
1507                         if(a1 % 10 == 2){\r
1508                                 x1 = x1 - kWidth * cos(rad);\r
1509                                 y1 = y1 - kWidth * sin(rad);\r
1510                         }\r
1511                         if(a2 % 10 == 2){\r
1512                                 x2 = x2 + kWidth * cos(rad);\r
1513                                 y2 = y2 + kWidth * sin(rad);\r
1514                         }\r
1515                         if(a1 % 10 == 3){\r
1516                                 x1 = x1 - kWidth * cos(rad) * kKakato;\r
1517                                 y1 = y1 - kWidth * sin(rad) * kKakato;\r
1518                         }\r
1519                         if(a2 % 10 == 3){\r
1520                                 x2 = x2 + kWidth * cos(rad) * kKakato;\r
1521                                 y2 = y2 + kWidth * sin(rad) * kKakato;\r
1522                         }\r
1523                         \r
1524                         //SUICHOKU NO ICHI ZURASHI HA sin TO cos NO IREKAE + x-axis MAINASU KA\r
1525                         poly[0].X = x1 + sin(rad) * kWidth;\r
1526                         poly[0].Y = y1 - cos(rad) * kWidth;\r
1527                         poly[1].X = x2 + sin(rad) * kWidth;\r
1528                         poly[1].Y = y2 - cos(rad) * kWidth;\r
1529                         poly[2].X = x2 - sin(rad) * kWidth;\r
1530                         poly[2].Y = y2 + cos(rad) * kWidth;\r
1531                         poly[3].X = x1 - sin(rad) * kWidth;\r
1532                         poly[3].Y = y1 + cos(rad) * kWidth;\r
1533                         \r
1534                         icPolygon(poly, 4);\r
1535                 }\r
1536         }\r
1537 }\r