Replace 4pts-curve drawing function from DoubleSpline to Bezier
[chise/kage.git] / kagecgi / kagedf.c
1 //kagedf.c\r
2 //\r
3 #include "kage.h"\r
4 \r
5 void dfDrawFont(int a1, int a2, int a3,\r
6         int x1, int y1,\r
7         int x2, int y2,\r
8         int x3, int y3,\r
9         int x4, int y4){\r
10         int tx1, tx2, tx3, tx4, ty1, ty2, ty3, ty4, v;\r
11         double rad;\r
12         \r
13         if(kShotai == kMincho){\r
14                 switch(a1 % 100){\r
15                 case 0:\r
16                         break;\r
17         case 1:\r
18                 if(a3 == 4){\r
19                                 if(x1 == x2){\r
20                                         if(y1 < y2){ v = 1; } else{ v = -1; }\r
21                                         tx1 = x2;\r
22                                         ty1 = y2 - kMage * v;\r
23                                 }\r
24                                 else if(y1 == y2){\r
25                                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
26                                         tx1 = x2 - kMage * v;\r
27                                         ty1 = y2;\r
28                                 }\r
29                                 else{\r
30                                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
31                                         if(x1 < x2){ v = 1; } else{v = -1; }\r
32                                         tx1 = x2 - kMage * cos(rad) * v;\r
33                                         ty1 = y2 - kMage * sin(rad) * v;\r
34                                 }\r
35                                 cdDrawLine(x1, y1, tx1, ty1, a2, 1);\r
36                                 cdDrawCurve(tx1, ty1, x2, y2, x2 - kMage, y2, 1, 14);\r
37                 }\r
38                 else{\r
39                                 cdDrawLine(x1, y1, x2, y2, a2, a3);\r
40                 }\r
41                 break;\r
42         case 2:\r
43         case 12:\r
44                 if(a3 == 4){\r
45                                 if(x2 == x3){\r
46                                         tx1 = x3;\r
47                                         ty1 = y3 - kMage;\r
48                                 }\r
49                                 else if(y2 == y3){\r
50                                         tx1 = x3 - kMage;\r
51                                         ty1 = y3;\r
52                                 }\r
53                                 else{\r
54                                         rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
55                                         if(x2 < x3){ v = 1; } else{ v = -1; }\r
56                                         tx1 = x3 - kMage * cos(rad) * v;\r
57                                         ty1 = y3 - kMage * sin(rad) * v;\r
58                                 }\r
59                                 cdDrawCurve(x1, y1, x2, y2, tx1, ty1, a2, 1);\r
60                                 cdDrawCurve(tx1, ty1, x3, y3, x3 - kMage, y3, 1, 14);\r
61                 }\r
62                 else if(a3 == 5){\r
63                                 cdDrawCurve(x1, y1, x2, y2, x3, y3, a2, 15);\r
64                 }\r
65                 else{\r
66                                 cdDrawCurve(x1, y1, x2, y2, x3, y3, a2, a3);\r
67                 }\r
68                 break;\r
69                 case 3:\r
70                 if(a3 == 5){\r
71                                 if(x1 == x2){\r
72                                         if(y1 < y2){ v = 1; } else{ v = -1; }\r
73                                         tx1 = x2;\r
74                                         ty1 = y2 - kMage * v;\r
75                                 }\r
76                                 else if(y1 == y2){\r
77                                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
78                                         tx1 = x2 - kMage * v;\r
79                                         ty1 = y2;\r
80                                 }\r
81                                 else{\r
82                                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
83                                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
84                                         tx1 = x2 - kMage * cos(rad) * v;\r
85                                         ty1 = y2 - kMage * sin(rad) * v;\r
86                                 }\r
87                                 if(x2 == x3){\r
88                                         if(y2 < y3){ v = 1; } else{ v = -1; }\r
89                                         tx2 = x2;\r
90                                         ty2 = y2 + kMage * v;\r
91                                 }\r
92                                 else if(y2 == y3){\r
93                                         if(x2 < x3){ v = 1; } else { v = -1; }\r
94                                         tx2 = x2 + kMage * v;\r
95                                         ty2 = y2;\r
96                                 }\r
97                                 else{\r
98                                         rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
99                                         if(x2 < x3){ v = 1; } else{ v = -1; }\r
100                                         tx2 = x2 + kMage * cos(rad) * v;\r
101                                         ty2 = y2 + kMage * sin(rad) * v;\r
102                                 }\r
103                                 tx3 = x3 - kMage;\r
104                                 ty3 = y3;\r
105                                 tx4 = x3 + kMage * 0.5;\r
106                                 ty4 = y3 - kMage * 2;\r
107                                 \r
108                                 cdDrawLine(x1, y1, tx1, ty1, a2, 1);\r
109                                 cdDrawCurve(tx1, ty1, x2, y2, tx2, ty2, 1, 1);\r
110                                 cdDrawLine(tx2, ty2, tx3, ty3, 6, 5); // bolder by force\r
111                         }\r
112                         else{\r
113                                 if(x1 == x2){\r
114                                         if(y1 < y2){ v = 1; } else { v = -1; }\r
115                                         tx1 = x2;\r
116                                         ty1 = y2 - kMage * v;\r
117                                 }\r
118                                 else if(y1 == y2){\r
119                                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
120                                         tx1 = x2 - kMage * v;\r
121                                         ty1 = y2;\r
122                                 }\r
123                                 else{\r
124                                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
125                                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
126                                         tx1 = x2 - kMage * cos(rad) * v;\r
127                                         ty1 = y2 - kMage * sin(rad) * v;\r
128                                 }\r
129                                 if(x2 == x3){\r
130                                         if(y2 < y3){ v = 1; } else{ v = -1; }\r
131                                         tx2 = x2;\r
132                                         ty2 = y2 + kMage * v;\r
133                                 }\r
134                                 else if(y2 == y3){\r
135                                         if(x2 < x3){ v = 1; } else{ v = -1; }\r
136                                         tx2 = x2 + kMage * v;\r
137                                         ty2 = y2;\r
138                                 }\r
139                                 else{\r
140                                         rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
141                                         if(x2 < x3){ v = 1; } else{ v = -1; }\r
142                                         tx2 = x2 + kMage * cos(rad) * v;\r
143                                         ty2 = y2 + kMage * sin(rad) * v;\r
144                                 }\r
145                                 cdDrawLine(x1, y1, tx1, ty1, a2, 1);\r
146                                 cdDrawCurve(tx1, ty1, x2, y2, tx2, ty2, 1, 1);\r
147                                 cdDrawLine(tx2, ty2, x3, y3, 6, a3); // bolder by force\r
148                         }\r
149                 break;\r
150             case 6:\r
151                 if(a3 == 5){\r
152                                 /* only implimented for gothic\r
153                                 tx1 = x4 - kMage;\r
154                                 ty1 = y4;\r
155                                 tx2 = x4 + kMage * 0.5;\r
156                                 ty2 = y4 - kMage * 2;\r
157                                 */\r
158                                 cdDrawBezier(x1, y1, x2, y2, x3, y3, x4, y4, a2, 15);\r
159                                 /*\r
160                                 if(a2 == 7 || a3 == 7){\r
161                                         cdDrawCurve(x1, y1, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, a2, 17);\r
162                                         cdDrawCurve((x2 + x3) / 2, (y2 + y3) / 2, x3, y3, x4, y4, 17, 15);\r
163                                 }\r
164                                 else{\r
165                                         cdDrawCurve(x1, y1, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, a2, 8);\r
166                                         cdDrawCurve((x2 + x3) / 2, (y2 + y3) / 2, x3, y3, x4, y4, 1, 15);\r
167                                 }\r
168                                 */\r
169                         }\r
170                         else{\r
171                                 cdDrawBezier(x1, y1, x2, y2, x3, y3, x4, y4, a2, a3);\r
172                                 /*\r
173                                 if(a2 == 7 || a3 == 7){\r
174                                         cdDrawCurve(x1, y1, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, a2, 17);\r
175                                         cdDrawCurve((x2 + x3) / 2, (y2 + y3) / 2, x3, y3, x4, y4, 17, a3);\r
176                                 }\r
177                                 else{\r
178                                         cdDrawCurve(x1, y1, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, a2, 8);\r
179                                         cdDrawCurve((x2 + x3) / 2, (y2 + y3) / 2, x3, y3, x4, y4, 1, a3);\r
180                                 }\r
181                                 */\r
182                         }\r
183                         break;\r
184         case 7:\r
185           cdDrawLine(x1, y1, x2, y2, a2, 1);\r
186           cdDrawCurve(x2, y2, x3, y3, x4, y4, 1, 7);\r
187           break;\r
188         case 9: // may not be exist\r
189           break;\r
190         default:\r
191           break;\r
192         }\r
193         }\r
194     \r
195     else{ // gothic\r
196         switch(a1 % 100){\r
197         case 0:\r
198                 break;\r
199         case 1:\r
200                 if(a3 == 4){\r
201                                 if(x1 == x2){\r
202                                         if(y1 < y2){ v = 1; } else{ v = -1; }\r
203                                         tx1 = x2;\r
204                                         ty1 = y2 - kMage * v;\r
205                                 }\r
206                                 else if(y1 == y2){\r
207                                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
208                                         tx1 = x2 - kMage * v;\r
209                                         ty1 = y2;\r
210                                 }\r
211                                 else{\r
212                                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
213                                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
214                                         tx1 = x2 - kMage * cos(rad) * v;\r
215                                         ty1 = y2 - kMage * sin(rad) * v;\r
216                                 }\r
217                                 cdDrawLine(x1, y1, tx1, ty1, a2, 1);\r
218                                 cdDrawCurve(tx1, ty1, x2, y2, x2 - kMage * 2, y2 - kMage * 0.5, 1, 0);\r
219                 }\r
220                 else{\r
221                                 cdDrawLine(x1, y1, x2, y2, a2, a3);\r
222                 }\r
223                         break;\r
224         case 2:\r
225         case 12:\r
226                 if(a3 == 4){\r
227                                 if(x2 == x3){\r
228                                         tx1 = x3;\r
229                                         ty1 = y3 - kMage;\r
230                                 }\r
231                                 else if(y2 == y3){\r
232                                         tx1 = x3 - kMage;\r
233                                         ty1 = y3;\r
234                                 }\r
235                                 else{\r
236                                         rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
237                                         if(x2 < x3){ v = 1; } else{ v = -1; }\r
238                                         tx1 = x3 - kMage * cos(rad) * v;\r
239                                         ty1 = y3 - kMage * sin(rad) * v;\r
240                                 }\r
241                                 cdDrawCurve(x1, y1, x2, y2, tx1, ty1, a2, 1);\r
242                                 cdDrawCurve(tx1, ty1, x3, y3, x3 - kMage * 2, y3 - kMage * 0.5, 1, 0);\r
243                 }\r
244                 else if(a3 == 5){\r
245                                 tx1 = x3 + kMage;\r
246                                 ty1 = y3;\r
247                                 tx2 = tx1 + kMage * 0.5;\r
248                                 ty2 = y3 - kMage * 2;\r
249                                 cdDrawCurve(x1, y1, x2, y2, x3, y3, a2, 1);\r
250                                 cdDrawCurve(x3, y3, tx1, ty1, tx2, ty2, 1, 0);\r
251                 }\r
252                 else{\r
253                                 cdDrawCurve(x1, y1, x2, y2, x3, y3, a2, a3);\r
254                 }\r
255                 break;\r
256         case 3:\r
257                 if(a3 == 5){\r
258                                 if(x1 == x2){\r
259                                         if(y1 < y2){ v = 1; } else{ v = -1; }\r
260                                         tx1 = x2;\r
261                                         ty1 = y2 - kMage * v;\r
262                                 }\r
263                                 else if(y1 == y2){\r
264                                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
265                                         tx1 = x2 - kMage * v;\r
266                                         ty1 = y2;\r
267                                 }\r
268                                 else{\r
269                                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
270                                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
271                                         tx1 = x2 - kMage * cos(rad) * v;\r
272                                         ty1 = y2 - kMage * sin(rad) * v;\r
273                                 }\r
274                                 if(x2 == x3){\r
275                                         if(y2 < y3){ v = 1; } else{ v = -1; }\r
276                                         tx2 = x2;\r
277                                         ty2 = y2 + kMage * v;\r
278                                 }\r
279                                 else if(y2 == y3){\r
280                                         if(x2 < x3){ v = 1; } else{ v = -1; }\r
281                                         tx2 = x2 + kMage * v;\r
282                                         ty2 = y2;\r
283                                 }\r
284                                 else{\r
285                                         rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
286                                         if(x2 < x3){ v = 1; } else{ v = -1; }\r
287                                         tx2 = x2 + kMage * cos(rad) * v;\r
288                                         ty2 = y2 + kMage * sin(rad) * v;\r
289                                 }\r
290                                 tx3 = x3 - kMage;\r
291                                 ty3 = y3;\r
292                                 tx4 = x3 + kMage * 0.5;\r
293                                 ty4 = y3 - kMage * 2;\r
294                                 \r
295                                 cdDrawLine(x1, y1, tx1, ty1, a2, 1);\r
296                                 cdDrawCurve(tx1, ty1, x2, y2, tx2, ty2, 1, 1);\r
297                                 cdDrawLine(tx2, ty2, tx3, ty3, 1, 1);\r
298                                 cdDrawCurve(tx3, ty3, x3, y3, tx4, ty4, 1, 0);\r
299                 }\r
300                 else{\r
301                                 if(x1 == x2){\r
302                                         if(y1 < y2){ v = 1; } else{ v = -1; }\r
303                                         tx1 = x2;\r
304                                         ty1 = y2 - kMage * v;\r
305                                 }\r
306                                 else if(y1 == y2){\r
307                                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
308                                         tx1 = x2 - kMage * v;\r
309                                         ty1 = y2;\r
310                                 }\r
311                                 else{\r
312                                         rad = atan((double)(y2 - y1) / (double)(x2 - x1));\r
313                                         if(x1 < x2){ v = 1; } else{ v = -1; }\r
314                                         tx1 = x2 - kMage * cos(rad) * v;\r
315                                         ty1 = y2 - kMage * sin(rad) * v;\r
316                                 }\r
317                                 if(x2 == x3){\r
318                                         if(y2 < y3){ v = 1; } else{ v = -1; }\r
319                                         tx2 = x2;\r
320                                         ty2 = y2 + kMage * v;\r
321                                 }\r
322                                 else if(y2 == y3){\r
323                                         if(x2 < x3){ v = 1; } else{ v = -1; }\r
324                                         tx2 = x2 + kMage * v;\r
325                                         ty2 = y2;\r
326                                 }\r
327                                 else{\r
328                                         rad = atan((double)(y3 - y2) / (double)(x3 - x2));\r
329                                         if(x2 < x3){ v = 1; } else{ v = -1; }\r
330                                         tx2 = x2 + kMage * cos(rad) * v;\r
331                                         ty2 = y2 + kMage * sin(rad) * v;\r
332                                 }\r
333                                 \r
334                                 cdDrawLine(x1, y1, tx1, ty1, a2, 1);\r
335                                 cdDrawCurve(tx1, ty1, x2, y2, tx2, ty2, 1, 1);\r
336                                 cdDrawLine(tx2, ty2, x3, y3, 1, a3);\r
337                 }\r
338                 break;\r
339         case 6:\r
340                 if(a3 == 5){\r
341                                 tx1 = x4 - kMage;\r
342                                 ty1 = y4;\r
343                                 tx2 = x4 + kMage * 0.5;\r
344                                 ty2 = y4 - kMage * 2;\r
345                                 /*\r
346                                 cdDrawCurve(x1, y1, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, a2, 1);\r
347                                 cdDrawCurve((x2 + x3) / 2, (y2 + y3) / 2, x3, y3, tx1, ty1, 1, 1);\r
348                                 */\r
349                                 cdDrawBezier(x1, y1, x2, y2, x3, y3, tx1, ty1, a2, 1);\r
350                                 cdDrawCurve(tx1, ty1, x4, y4, tx2, ty2, 1, 0);\r
351                 }\r
352                 else{\r
353                                 /*\r
354                                 cdDrawCurve(x1, y1, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, a2, 1);\r
355                                 cdDrawCurve((x2 + x3) / 2, (y2 + y3) / 2, x3, y3, x4, y4, 1, a3);\r
356                                 */\r
357                                 cdDrawBezier(x1, y1, x2, y2, x3, y3, x4, y4, a2, a3);\r
358                 }\r
359                 break;\r
360         case 7:\r
361                 cdDrawLine(x1, y1, x2, y2, a2, 1);\r
362                 cdDrawCurve(x2, y2, x3, y3, x4, y4, 1, a3);\r
363                 break;\r
364         case 9: // may not be exist\r
365                 break;\r
366         default:\r
367                         break;\r
368                 }\r
369         }\r
370 }\r