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