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