Improved OTSU curve.
[chise/kage.git] / engine / kagedf.js
1 function dfDrawFont(kage, polygons, a1, a2, a3, x1, y1, x2, y2, x3, y3, x4, y4){\r
2   var tx1, tx2, tx3, tx4, ty1, ty2, ty3, ty4, v;\r
3   var rad;\r
4         \r
5   if(kage.kShotai == kage.kMincho){\r
6     switch(a1 % 100){ // ... no need to divide\r
7     case 0:\r
8       break;\r
9     case 1:\r
10       if(a3 == 4){\r
11         if(x1 == x2){\r
12           if(y1 < y2){ v = 1; } else{ v = -1; }\r
13           tx1 = x2;\r
14           ty1 = y2 - kage.kMage * v;\r
15         }\r
16         else if(y1 == y2){ // ... no need\r
17           if(x1 < x2){ v = 1; } else{ v = -1; }\r
18           tx1 = x2 - kage.kMage * v;\r
19           ty1 = y2;\r
20         }\r
21         else{\r
22           rad = Math.atan((y2 - y1) / (x2 - x1));\r
23           if(x1 < x2){ v = 1; } else{v = -1; }\r
24           tx1 = x2 - kage.kMage * Math.cos(rad) * v;\r
25           ty1 = y2 - kage.kMage * Math.sin(rad) * v;\r
26         }\r
27         cdDrawLine(kage, polygons, x1, y1, tx1, ty1, a2, 1);\r
28         cdDrawCurve(kage, polygons, tx1, ty1, x2, y2, x2 - kage.kMage, y2, 1, 14);\r
29       }\r
30       else{\r
31         cdDrawLine(kage, polygons, x1, y1, x2, y2, a2, a3);\r
32       }\r
33       break;\r
34     case 2:\r
35     //case 12: // ... no need\r
36       if(a3 == 4){\r
37         if(x2 == x3){\r
38           tx1 = x3;\r
39           ty1 = y3 - kage.kMage;\r
40         }\r
41         else if(y2 == y3){\r
42           tx1 = x3 - kage.kMage;\r
43           ty1 = y3;\r
44         }\r
45         else{\r
46           rad = Math.atan((y3 - y2) / (x3 - x2));\r
47           if(x2 < x3){ v = 1; } else{ v = -1; }\r
48           tx1 = x3 - kage.kMage * Math.cos(rad) * v;\r
49           ty1 = y3 - kage.kMage * Math.sin(rad) * v;\r
50         }\r
51         cdDrawCurve(kage, polygons, x1, y1, x2, y2, tx1, ty1, a2, 1);\r
52         cdDrawCurve(kage, polygons, tx1, ty1, x3, y3, x3 - kage.kMage, y3, 1, 14);\r
53       }\r
54       else if(a3 == 5){\r
55         cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a2, 15);\r
56       }\r
57       else{\r
58         cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a2, a3);\r
59       }\r
60       break;\r
61     case 3:\r
62       if(a3 == 5){\r
63         if(x1 == x2){\r
64           if(y1 < y2){ v = 1; } else{ v = -1; }\r
65           tx1 = x2;\r
66           ty1 = y2 - kage.kMage * v;\r
67         }\r
68         else if(y1 == y2){\r
69           if(x1 < x2){ v = 1; } else{ v = -1; }\r
70           tx1 = x2 - kage.kMage * v;\r
71           ty1 = y2;\r
72         }\r
73         else{\r
74           rad = Math.atan((y2 - y1) / (x2 - x1));\r
75           if(x1 < x2){ v = 1; } else{ v = -1; }\r
76           tx1 = x2 - kage.kMage * Math.cos(rad) * v;\r
77           ty1 = y2 - kage.kMage * Math.sin(rad) * v;\r
78         }\r
79         if(x2 == x3){\r
80           if(y2 < y3){ v = 1; } else{ v = -1; }\r
81           tx2 = x2;\r
82           ty2 = y2 + kage.kMage * v;\r
83         }\r
84         else if(y2 == y3){\r
85           if(x2 < x3){ v = 1; } else { v = -1; }\r
86           tx2 = x2 + kage.kMage * v;\r
87           ty2 = y2;\r
88         }\r
89         else{\r
90           rad = Math.atan((y3 - y2) / (x3 - x2));\r
91           if(x2 < x3){ v = 1; } else{ v = -1; }\r
92           tx2 = x2 + kage.kMage * Math.cos(rad) * v;\r
93           ty2 = y2 + kage.kMage * Math.sin(rad) * v;\r
94         }\r
95                                 tx3 = x3;\r
96         ty3 = y3;\r
97         \r
98         cdDrawLine(kage, polygons, x1, y1, tx1, ty1, a2, 1);\r
99         cdDrawCurve(kage, polygons, tx1, ty1, x2, y2, tx2, ty2, 1, 1);\r
100                                 if(tx3 - tx2 > 0){ // for closer position\r
101                                         cdDrawLine(kage, polygons, tx2, ty2, tx3, ty3, 6, 5); // bolder by force\r
102                                 }\r
103       }\r
104       else{\r
105         if(x1 == x2){\r
106           if(y1 < y2){ v = 1; } else { v = -1; }\r
107           tx1 = x2;\r
108           ty1 = y2 - kage.kMage * v;\r
109         }\r
110         else if(y1 == y2){\r
111           if(x1 < x2){ v = 1; } else{ v = -1; }\r
112           tx1 = x2 - kage.kMage * v;\r
113           ty1 = y2;\r
114         }\r
115         else{\r
116           rad = Math.atan((y2 - y1) / (x2 - x1));\r
117           if(x1 < x2){ v = 1; } else{ v = -1; }\r
118           tx1 = x2 - kage.kMage * Math.cos(rad) * v;\r
119           ty1 = y2 - kage.kMage * Math.sin(rad) * v;\r
120         }\r
121         if(x2 == x3){\r
122           if(y2 < y3){ v = 1; } else{ v = -1; }\r
123           tx2 = x2;\r
124           ty2 = y2 + kage.kMage * v;\r
125         }\r
126         else if(y2 == y3){\r
127           if(x2 < x3){ v = 1; } else{ v = -1; }\r
128           tx2 = x2 + kage.kMage * v;\r
129           ty2 = y2;\r
130         }\r
131         else{\r
132           rad = Math.atan((y3 - y2) / (x3 - x2));\r
133           if(x2 < x3){ v = 1; } else{ v = -1; }\r
134           tx2 = x2 + kage.kMage * Math.cos(rad) * v;\r
135           ty2 = y2 + kage.kMage * Math.sin(rad) * v;\r
136         }\r
137         cdDrawLine(kage, polygons, x1, y1, tx1, ty1, a2, 1);\r
138         cdDrawCurve(kage, polygons, tx1, ty1, x2, y2, tx2, ty2, 1, 1);\r
139         cdDrawLine(kage, polygons, tx2, ty2, x3, y3, 6, a3); // bolder by force\r
140       }\r
141       break;\r
142     case 12:\r
143       cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a2, 1);\r
144       cdDrawLine(kage, polygons, x3, y3, x4, y4, 6, a3);\r
145       break;\r
146     case 4:\r
147       rate = 6;\r
148       if((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2) < 14400){ // smaller than 120 x 120\r
149         rate = Math.sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2)) / 120 * 6;\r
150       }\r
151       if(a3 == 5){\r
152         if(x1 == x2){\r
153           if(y1 < y2){ v = 1; } else{ v = -1; }\r
154           tx1 = x2;\r
155           ty1 = y2 - kage.kMage * v * rate;\r
156         }\r
157         else if(y1 == y2){\r
158           if(x1 < x2){ v = 1; } else{ v = -1; }\r
159           tx1 = x2 - kage.kMage * v * rate;\r
160           ty1 = y2;\r
161         }\r
162         else{\r
163           rad = Math.atan((y2 - y1) / (x2 - x1));\r
164           if(x1 < x2){ v = 1; } else{ v = -1; }\r
165           tx1 = x2 - kage.kMage * Math.cos(rad) * v * rate;\r
166           ty1 = y2 - kage.kMage * Math.sin(rad) * v * rate;\r
167         }\r
168         if(x2 == x3){\r
169           if(y2 < y3){ v = 1; } else{ v = -1; }\r
170           tx2 = x2;\r
171           ty2 = y2 + kage.kMage * v * rate;\r
172         }\r
173         else if(y2 == y3){\r
174           if(x2 < x3){ v = 1; } else { v = -1; }\r
175           tx2 = x2 + kage.kMage * v * rate;\r
176           ty2 = y2;\r
177         }\r
178         else{\r
179           rad = Math.atan((y3 - y2) / (x3 - x2));\r
180           if(x2 < x3){ v = 1; } else{ v = -1; }\r
181           tx2 = x2 + kage.kMage * Math.cos(rad) * v * rate;\r
182           ty2 = y2 + kage.kMage * Math.sin(rad) * v * rate;\r
183         }\r
184         tx3 = x3;\r
185         ty3 = y3;\r
186         \r
187         cdDrawLine(kage, polygons, x1, y1, tx1, ty1, a2, 1);\r
188         cdDrawCurve(kage, polygons, tx1, ty1, x2, y2, tx2, ty2, 1, 1);\r
189         if(tx3 - tx2 > 0){ // for closer position\r
190           cdDrawLine(kage, polygons, tx2, ty2, tx3, ty3, 6, 5); // bolder by force\r
191         }\r
192       }\r
193       else{\r
194         if(x1 == x2){\r
195           if(y1 < y2){ v = 1; } else { v = -1; }\r
196           tx1 = x2;\r
197           ty1 = y2 - kage.kMage * v * rate;\r
198         }\r
199         else if(y1 == y2){\r
200           if(x1 < x2){ v = 1; } else{ v = -1; }\r
201           tx1 = x2 - kage.kMage * v * rate;\r
202           ty1 = y2;\r
203         }\r
204         else{\r
205           rad = Math.atan((y2 - y1) / (x2 - x1));\r
206           if(x1 < x2){ v = 1; } else{ v = -1; }\r
207           tx1 = x2 - kage.kMage * Math.cos(rad) * v * rate;\r
208           ty1 = y2 - kage.kMage * Math.sin(rad) * v * rate;\r
209         }\r
210         if(x2 == x3){\r
211           if(y2 < y3){ v = 1; } else{ v = -1; }\r
212           tx2 = x2;\r
213           ty2 = y2 + kage.kMage * v * rate;\r
214         }\r
215         else if(y2 == y3){\r
216           if(x2 < x3){ v = 1; } else{ v = -1; }\r
217           tx2 = x2 + kage.kMage * v * rate;\r
218           ty2 = y2;\r
219         }\r
220         else{\r
221           rad = Math.atan((y3 - y2) / (x3 - x2));\r
222           if(x2 < x3){ v = 1; } else{ v = -1; }\r
223           tx2 = x2 + kage.kMage * Math.cos(rad) * v * rate;\r
224           ty2 = y2 + kage.kMage * Math.sin(rad) * v * rate;\r
225         }\r
226         cdDrawLine(kage, polygons, x1, y1, tx1, ty1, a2, 1);\r
227         cdDrawCurve(kage, polygons, tx1, ty1, x2, y2, tx2, ty2, 1, 1);\r
228         cdDrawLine(kage, polygons, tx2, ty2, x3, y3, 6, a3); // bolder by force\r
229       }\r
230       break;\r
231     case 6:\r
232       if(a3 == 5){\r
233         /* only implimented for gothic\r
234                                 tx1 = x4 - kage.kMage;\r
235                                 ty1 = y4;\r
236                                 tx2 = x4 + kage.kMage * 0.5;\r
237                                 ty2 = y4 - kage.kMage * 2;\r
238                                 */\r
239         cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a2, 15);\r
240         /*\r
241                                 if(a2 == 7 || a3 == 7){\r
242                                         cdDrawCurve(x1, y1, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, a2, 17);\r
243                                         cdDrawCurve((x2 + x3) / 2, (y2 + y3) / 2, x3, y3, x4, y4, 17, 15);\r
244                                 }\r
245                                 else{\r
246                                         cdDrawCurve(x1, y1, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, a2, 8);\r
247                                         cdDrawCurve((x2 + x3) / 2, (y2 + y3) / 2, x3, y3, x4, y4, 1, 15);\r
248                                 }\r
249          */\r
250       }\r
251       else{\r
252         cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a2, a3);\r
253         /*\r
254                                 if(a2 == 7 || a3 == 7){\r
255                                         cdDrawCurve(x1, y1, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, a2, 17);\r
256                                         cdDrawCurve((x2 + x3) / 2, (y2 + y3) / 2, x3, y3, x4, y4, 17, a3);\r
257                                 }\r
258                                 else{\r
259                                         cdDrawCurve(x1, y1, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, a2, 8);\r
260                                         cdDrawCurve((x2 + x3) / 2, (y2 + y3) / 2, x3, y3, x4, y4, 1, a3);\r
261                                 }\r
262          */\r
263       }\r
264       break;\r
265     case 7:\r
266       cdDrawLine(kage, polygons, x1, y1, x2, y2, a2, 1);\r
267       cdDrawCurve(kage, polygons, x2, y2, x3, y3, x4, y4, 1, a3);\r
268       break;\r
269     case 9: // may not be exist ... no need\r
270       //kageCanvas[y1][x1] = 0;\r
271       //kageCanvas[y2][x2] = 0;\r
272       break;\r
273     default:\r
274       break;\r
275     }\r
276   }\r
277     \r
278   else{ // gothic\r
279     switch(a1 % 100){\r
280     case 0:\r
281       break;\r
282     case 1:\r
283       if(a3 == 4){\r
284         if(x1 == x2){\r
285           if(y1 < y2){ v = 1; } else{ v = -1; }\r
286           tx1 = x2;\r
287           ty1 = y2 - kage.kMage * v;\r
288         }\r
289         else if(y1 == y2){\r
290           if(x1 < x2){ v = 1; } else{ v = -1; }\r
291           tx1 = x2 - kage.kMage * v;\r
292           ty1 = y2;\r
293         }\r
294         else{\r
295           rad = Math.atan((y2 - y1) / (x2 - x1));\r
296           if(x1 < x2){ v = 1; } else{ v = -1; }\r
297           tx1 = x2 - kage.kMage * Math.cos(rad) * v;\r
298           ty1 = y2 - kage.kMage * Math.sin(rad) * v;\r
299         }\r
300         cdDrawLine(kage, polygons, x1, y1, tx1, ty1, a2, 1);\r
301         cdDrawCurve(kage, polygons, tx1, ty1, x2, y2, x2 - kage.kMage * 2, y2 - kage.kMage * 0.5, 1, 0);\r
302       }\r
303       else{\r
304         cdDrawLine(kage, polygons, x1, y1, x2, y2, a2, a3);\r
305       }\r
306       break;\r
307     case 2:\r
308     case 12:\r
309       if(a3 == 4){\r
310         if(x2 == x3){\r
311           tx1 = x3;\r
312           ty1 = y3 - kage.kMage;\r
313         }\r
314         else if(y2 == y3){\r
315           tx1 = x3 - kage.kMage;\r
316           ty1 = y3;\r
317         }\r
318         else{\r
319           rad = Math.atan((y3 - y2) / (x3 - x2));\r
320           if(x2 < x3){ v = 1; } else{ v = -1; }\r
321           tx1 = x3 - kage.kMage * Math.cos(rad) * v;\r
322           ty1 = y3 - kage.kMage * Math.sin(rad) * v;\r
323         }\r
324         cdDrawCurve(kage, polygons, x1, y1, x2, y2, tx1, ty1, a2, 1);\r
325         cdDrawCurve(kage, polygons, tx1, ty1, x3, y3, x3 - kage.kMage * 2, y3 - kage.kMage * 0.5, 1, 0);\r
326       }\r
327       else if(a3 == 5){\r
328         tx1 = x3 + kage.kMage;\r
329         ty1 = y3;\r
330         tx2 = tx1 + kage.kMage * 0.5;\r
331         ty2 = y3 - kage.kMage * 2;\r
332         cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a2, 1);\r
333         cdDrawCurve(kage, polygons, x3, y3, tx1, ty1, tx2, ty2, 1, 0);\r
334       }\r
335       else{\r
336         cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a2, a3);\r
337       }\r
338       break;\r
339     case 3:\r
340       if(a3 == 5){\r
341         if(x1 == x2){\r
342           if(y1 < y2){ v = 1; } else{ v = -1; }\r
343           tx1 = x2;\r
344           ty1 = y2 - kage.kMage * v;\r
345         }\r
346         else if(y1 == y2){\r
347           if(x1 < x2){ v = 1; } else{ v = -1; }\r
348           tx1 = x2 - kage.kMage * v;\r
349           ty1 = y2;\r
350         }\r
351         else{\r
352           rad = Math.atan((y2 - y1) / (x2 - x1));\r
353           if(x1 < x2){ v = 1; } else{ v = -1; }\r
354           tx1 = x2 - kage.kMage * Math.cos(rad) * v;\r
355           ty1 = y2 - kage.kMage * Math.sin(rad) * v;\r
356         }\r
357         if(x2 == x3){\r
358           if(y2 < y3){ v = 1; } else{ v = -1; }\r
359           tx2 = x2;\r
360           ty2 = y2 + kage.kMage * v;\r
361         }\r
362         else if(y2 == y3){\r
363           if(x2 < x3){ v = 1; } else{ v = -1; }\r
364           tx2 = x2 + kage.kMage * v;\r
365           ty2 = y2;\r
366         }\r
367         else{\r
368           rad = Math.atan((y3 - y2) / (x3 - x2));\r
369           if(x2 < x3){ v = 1; } else{ v = -1; }\r
370           tx2 = x2 + kage.kMage * Math.cos(rad) * v;\r
371           ty2 = y2 + kage.kMage * Math.sin(rad) * v;\r
372         }\r
373         tx3 = x3 - kage.kMage;\r
374         ty3 = y3;\r
375         tx4 = x3 + kage.kMage * 0.5;\r
376         ty4 = y3 - kage.kMage * 2;\r
377         \r
378         cdDrawLine(kage, polygons, x1, y1, tx1, ty1, a2, 1);\r
379         cdDrawCurve(kage, polygons, tx1, ty1, x2, y2, tx2, ty2, 1, 1);\r
380         cdDrawLine(kage, polygons, tx2, ty2, tx3, ty3, 1, 1);\r
381         cdDrawCurve(kage, polygons, tx3, ty3, x3, y3, tx4, ty4, 1, 0);\r
382       }\r
383       else{\r
384         if(x1 == x2){\r
385           if(y1 < y2){ v = 1; } else{ v = -1; }\r
386           tx1 = x2;\r
387           ty1 = y2 - kage.kMage * v;\r
388         }\r
389         else if(y1 == y2){\r
390           if(x1 < x2){ v = 1; } else{ v = -1; }\r
391           tx1 = x2 - kage.kMage * v;\r
392           ty1 = y2;\r
393         }\r
394         else{\r
395           rad = Math.atan((y2 - y1) / (x2 - x1));\r
396           if(x1 < x2){ v = 1; } else{ v = -1; }\r
397           tx1 = x2 - kage.kMage * Math.cos(rad) * v;\r
398           ty1 = y2 - kage.kMage * Math.sin(rad) * v;\r
399         }\r
400         if(x2 == x3){\r
401           if(y2 < y3){ v = 1; } else{ v = -1; }\r
402           tx2 = x2;\r
403           ty2 = y2 + kage.kMage * v;\r
404         }\r
405         else if(y2 == y3){\r
406           if(x2 < x3){ v = 1; } else{ v = -1; }\r
407           tx2 = x2 + kage.kMage * v;\r
408           ty2 = y2;\r
409         }\r
410         else{\r
411           rad = Math.atan((y3 - y2) / (x3 - x2));\r
412           if(x2 < x3){ v = 1; } else{ v = -1; }\r
413           tx2 = x2 + kage.kMage * Math.cos(rad) * v;\r
414           ty2 = y2 + kage.kMage * Math.sin(rad) * v;\r
415         }\r
416         \r
417         cdDrawLine(kage, polygons, x1, y1, tx1, ty1, a2, 1);\r
418         cdDrawCurve(kage, polygons, tx1, ty1, x2, y2, tx2, ty2, 1, 1);\r
419         cdDrawLine(kage, polygons, tx2, ty2, x3, y3, 1, a3);\r
420       }\r
421       break;\r
422     case 6:\r
423       if(a3 == 5){\r
424         tx1 = x4 - kage.kMage;\r
425         ty1 = y4;\r
426         tx2 = x4 + kage.kMage * 0.5;\r
427         ty2 = y4 - kage.kMage * 2;\r
428         /*\r
429                                 cdDrawCurve(x1, y1, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, a2, 1);\r
430                                 cdDrawCurve((x2 + x3) / 2, (y2 + y3) / 2, x3, y3, tx1, ty1, 1, 1);\r
431          */\r
432         cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, tx1, ty1, a2, 1);\r
433         cdDrawCurve(kage, polygons, tx1, ty1, x4, y4, tx2, ty2, 1, 0);\r
434       }\r
435       else{\r
436         /*\r
437                                 cdDrawCurve(x1, y1, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, a2, 1);\r
438                                 cdDrawCurve((x2 + x3) / 2, (y2 + y3) / 2, x3, y3, x4, y4, 1, a3);\r
439          */\r
440         cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a2, a3);\r
441       }\r
442       break;\r
443     case 7:\r
444       cdDrawLine(kage, polygons, x1, y1, x2, y2, a2, 1);\r
445       cdDrawCurve(kage, polygons, x2, y2, x3, y3, x4, y4, 1, a3);\r
446       break;\r
447     case 9: // may not be exist\r
448       //kageCanvas[y1][x1] = 0;\r
449       //kageCanvas[y2][x2] = 0;\r
450       break;\r
451     default:\r
452       break;\r
453     }\r
454   }\r
455 }\r