Bugfix.
[chise/kage.git] / kagecgi / kageeg.c
1 //kageeg.c\r
2 //\r
3 \r
4 #include "kage.h"\r
5 #include "kagecgi.h"\r
6 #include "sysdep.h"\r
7 \r
8 void generateGlyphByIDS(const GString *in, GString *out, int flag){\r
9         GString *tmp1, *tmp2, *tmp3, *tmp4;\r
10         \r
11         //pass this method if 'in' is not UCS parts\r
12         if((in->str)[0] != 'u'){\r
13                 generateGlyph(in, out);\r
14                 return;\r
15         }\r
16         //pass this method if 'in' is place-variant-flag defined\r
17         if(in->len < 5 && 7 < in->len){\r
18                 generateGlyph(in, out);\r
19                 return;\r
20         }\r
21         \r
22         tmp1 = g_string_new(in->str);\r
23         tmp2 = g_string_new(in->str);\r
24 //      tmp3 = g_string_new(in->str);\r
25 //      tmp4 = g_string_new(in->str);\r
26         \r
27         //append design flag\r
28 //      if(kDesign == 10) g_string_append(tmp1, "-10");\r
29 //      else if(kDesign == 11) g_string_append(tmp1, "-11");\r
30 //      else if(kDesign == 20) g_string_append(tmp1, "-20");\r
31 //      else if(kDesign == 30) g_string_append(tmp1, "-30");\r
32 //      else if(kDesign == 40) g_string_append(tmp1, "-40");\r
33 //      else g_string_append(tmp1, "-00");\r
34 //      if(kDesign == 10) g_string_append(tmp2, "-10");\r
35 //      else if(kDesign == 11) g_string_append(tmp2, "-11");\r
36 //      else if(kDesign == 20) g_string_append(tmp2, "-20");\r
37 //      else if(kDesign == 30) g_string_append(tmp2, "-30");\r
38 //      else if(kDesign == 40) g_string_append(tmp2, "-40");\r
39 //      else g_string_append(tmp2, "-00");\r
40 //      g_string_append(tmp3, "-00");\r
41 //      g_string_append(tmp4, "-00");\r
42         \r
43         //append place flag\r
44         if(1 <= flag && flag <= 7){\r
45                 if(tmp1->len != 7) g_string_append(tmp1, "-");\r
46                 if(flag == 1) g_string_append(tmp1, "01");\r
47                 else if(flag == 2) g_string_append(tmp1, "02");\r
48                 else if(flag == 3) g_string_append(tmp1, "03");\r
49                 else if(flag == 4) g_string_append(tmp1, "04");\r
50                 else if(flag == 5) g_string_append(tmp1, "05");\r
51                 else if(flag == 6) g_string_append(tmp1, "06");\r
52         }\r
53 \r
54 //      g_string_append(tmp2, "00");\r
55 //      if(flag == 1) g_string_append(tmp3, "01");\r
56 //      else if(flag == 2) g_string_append(tmp3, "02");\r
57 //      else if(flag == 3) g_string_append(tmp3, "03");\r
58 //      else if(flag == 4) g_string_append(tmp3, "04");\r
59 //      else if(flag == 5) g_string_append(tmp3, "05");\r
60 //      else if(flag == 6) g_string_append(tmp3, "06");\r
61 //      else g_string_append(tmp3, "00");\r
62 //      g_string_append(tmp4, "00");\r
63         \r
64         generateGlyph(tmp1, out);\r
65         if(out->len != 0) return;\r
66         generateGlyph(tmp2, out);\r
67         if(out->len != 0) return;\r
68 //      generateGlyph(tmp3, out);\r
69 //      if(out->len != 0) return;\r
70 //      generateGlyph(tmp4, out);\r
71         return;\r
72 }\r
73 \r
74 void generateGlyph(const GString *in, GString *out){\r
75         GString *tmp, *in2;\r
76         tmp = g_string_new("");\r
77         g_string_set_size(out, 0);\r
78         \r
79 //      in2 = g_string_new(in->str);\r
80         \r
81         //1st search\r
82 //      if(*(in2->str) == 'u' && (in2->len == 4 || in2->len == 5)){\r
83 //              //append design flag\r
84 //              if(kDesign == 10) g_string_append(in2, "-1000");\r
85 //              else if(kDesign == 11) g_string_append(in2, "-1100");\r
86 //              else if(kDesign == 20) g_string_append(in2, "-2000");\r
87 //              else if(kDesign == 30) g_string_append(in2, "-3000");\r
88 //              else if(kDesign == 40) g_string_append(in2, "-4000");\r
89 //              else g_string_append(in2, "-0000");\r
90                 \r
91                 //search from parts(1st)\r
92 //              searchPartsData(in2, tmp);\r
93 //              if(tmp->len != 0){\r
94 //                      g_string_assign(out, tmp->str);\r
95 //                      return;\r
96 //              }\r
97                 \r
98                 //search from alias(1st)\r
99 //              searchAliasData(in2, tmp);\r
100 //              if(tmp->len != 0){\r
101 //                      generateGlyph(tmp, out);\r
102 //                      if(out->len == 0) return;\r
103 //                      //save to cache ... not yet\r
104 //                      return;\r
105 //              }\r
106 //      }\r
107         \r
108         //2nd search\r
109         //search from parts(2nd)\r
110         searchPartsData(in, tmp);\r
111         if(tmp->len != 0){\r
112           tmp = CalcSizes(tmp, 1);\r
113           g_string_assign(out, tmp->str);\r
114           return;\r
115         }\r
116         \r
117         //search from alias(2nd)\r
118         searchAliasData(in, tmp);\r
119         if(tmp->len != 0){\r
120                 generateGlyph(tmp, out);\r
121                 if(out->len == 0) return;\r
122                 //save to cache ... not yet\r
123                 return;\r
124         }\r
125         \r
126         //check if its IDS\r
127         if(isIDS(in)){\r
128                 doCombine(in, out);\r
129                 if(out->len == 0) return;\r
130                 //save to cache ... not yet\r
131                 return;\r
132         }\r
133 }\r
134 \r
135 void doCombine(const GString *in, GString *out){\r
136         GString *partIDS1, *partIDS2, *partIDS3;\r
137         GString *partStroke1, *partStroke2, *partStroke3;\r
138         int result[12];\r
139         \r
140         partIDS1 = g_string_new("");\r
141         partIDS2 = g_string_new("");\r
142         partIDS3 = g_string_new("");\r
143         partStroke1 = g_string_new("");\r
144         partStroke2 = g_string_new("");\r
145         partStroke3 = g_string_new("");\r
146         \r
147         g_string_set_size(out, 0);\r
148         \r
149         //check first IDC\r
150         if(strncmp(in->str, "u2ff", 4) != 0) return;\r
151         //switch by combine types\r
152         switch((in->str)[4]){\r
153                 case '0':\r
154                         divideInto2(in, partIDS1, partIDS3);\r
155                         if(partIDS1->len == 0) return;\r
156                         //ready each parts\r
157                         generateGlyphByIDS(partIDS1, partStroke1, 1);\r
158                         if(partStroke1->len == 0) return;\r
159                         partStroke1 = CalcSizes(partStroke1, 0);\r
160                         generateGlyphByIDS(partIDS3, partStroke3, 2);\r
161                         if(partStroke3->len == 0) return;\r
162                         partStroke3 = CalcSizes(partStroke3, 0);\r
163                         break;\r
164                 case '1':\r
165                         divideInto2(in, partIDS1, partIDS3);\r
166                         if(partIDS1->len == 0) return;\r
167                         //ready each parts\r
168                         generateGlyphByIDS(partIDS1, partStroke1, 3);\r
169                         if(partStroke1->len == 0) return;\r
170                         partStroke1 = CalcSizes(partStroke1, 0);\r
171                         generateGlyphByIDS(partIDS3, partStroke3, 4);\r
172                         if(partStroke3->len == 0) return;\r
173                         partStroke3 = CalcSizes(partStroke3, 0);\r
174                         break;\r
175                 case '4':\r
176                 case '5':\r
177                 case '6':\r
178                 case '7':\r
179                 case '8':\r
180                 case '9':\r
181                 case 'a':\r
182 //              case 'b':\r
183                         divideInto2(in, partIDS1, partIDS3);\r
184                         if(partIDS1->len == 0) return;\r
185                         //ready each parts\r
186                         generateGlyphByIDS(partIDS1, partStroke1, 5);\r
187                         if(partStroke1->len == 0) return;\r
188                         partStroke1 = CalcSizes(partStroke1, 0);\r
189                         generateGlyphByIDS(partIDS3, partStroke3, 6);\r
190                         if(partStroke3->len == 0) return;\r
191                         partStroke3 = CalcSizes(partStroke3, 0);\r
192                         break;\r
193                 case '2':\r
194                         divideInto3(in, partIDS1, partIDS2, partIDS3);\r
195                         if(partIDS1->len == 0) return;\r
196                         //ready each parts\r
197                         generateGlyphByIDS(partIDS1, partStroke1, 1);\r
198                         if(partStroke1->len == 0) return;\r
199                         partStroke1 = CalcSizes(partStroke1, 0);\r
200                         generateGlyphByIDS(partIDS2, partStroke2, 1);\r
201                         if(partStroke2->len == 0) return;\r
202                         partStroke2 = CalcSizes(partStroke2, 0);\r
203                         generateGlyphByIDS(partIDS3, partStroke3, 2);\r
204                         if(partStroke3->len == 0) return;\r
205                         partStroke3 = CalcSizes(partStroke3, 0);\r
206                         break;\r
207                 case '3':\r
208                         divideInto3(in, partIDS1, partIDS2, partIDS3);\r
209                         if(partIDS1->len == 0) return;\r
210                         //ready each parts\r
211                         generateGlyphByIDS(partIDS1, partStroke1, 3);\r
212                         if(partStroke1->len == 0) return;\r
213                         partStroke1 = CalcSizes(partStroke1, 0);\r
214                         generateGlyphByIDS(partIDS2, partStroke2, 3);\r
215                         if(partStroke2->len == 0) return;\r
216                         partStroke2 = CalcSizes(partStroke2, 0);\r
217                         generateGlyphByIDS(partIDS3, partStroke3, 4);\r
218                         if(partStroke3->len == 0) return;\r
219                         partStroke3 = CalcSizes(partStroke3, 0);\r
220                         break;\r
221         }\r
222         switch((in->str)[4]){\r
223                 case '0':\r
224                         combineYoko2(partStroke1, partStroke3, result);\r
225                         break;\r
226                 case '1':\r
227                         combineTate2(partStroke1, partStroke3, result);\r
228                         break;\r
229                 case '2':\r
230                         combineYoko3(partStroke1, partStroke2, partStroke3, result);\r
231                         break;\r
232                 case '3':\r
233                         combineTate3(partStroke1, partStroke2, partStroke3, result);\r
234                         break;\r
235                 case '4':\r
236                 case '5':\r
237                 case '6':\r
238                 case '7':\r
239                 case '8':\r
240                 case '9':\r
241                 case 'a':\r
242 //              case 'b':\r
243                         combineHame2(partStroke1, partStroke3, result);\r
244                         break;\r
245         }\r
246         switch((in->str)[4]){\r
247                 case '0':\r
248                 case '1':\r
249                 case '4':\r
250                 case '5':\r
251                 case '6':\r
252                 case '7':\r
253                 case '8':\r
254                 case '9':\r
255                 case 'a':\r
256 //              case 'b':\r
257                         addStrokeWithTransform(partStroke1, 1, result, out, 1);\r
258                         addStrokeWithTransform(partStroke3, 3, result, out, 1);\r
259                         break;\r
260                 case '2':\r
261                 case '3':\r
262                         addStrokeWithTransform(partStroke1, 1, result, out, 1);\r
263                         addStrokeWithTransform(partStroke2, 2, result, out, 1);\r
264                         addStrokeWithTransform(partStroke3, 3, result, out, 1);\r
265                         break;\r
266         }\r
267 }\r
268 \r
269 void drawGlyph(const GString *in, const int mode){\r
270         int i, j;\r
271         int *buf;\r
272         buf = convertStroke(in->str, buf, &j);\r
273         for(i = 0; i < j; i++){\r
274                 if(mode == 0){ //normal\r
275                         dfDrawFont(buf[i * 11 + 0],\r
276                          buf[i * 11 + 1],\r
277                          buf[i * 11 + 2],\r
278                          buf[i * 11 + 3],\r
279                          buf[i * 11 + 4],\r
280                          buf[i * 11 + 5],\r
281                          buf[i * 11 + 6],\r
282                          buf[i * 11 + 7],\r
283                          buf[i * 11 + 8],\r
284                          buf[i * 11 + 9],\r
285                          buf[i * 11 + 10]);\r
286                 }\r
287                 else if(mode == 1){ //without decoration\r
288                         dfDrawFont(buf[i * 11 + 0],\r
289                          0,\r
290                          0,\r
291                          buf[i * 11 + 3],\r
292                          buf[i * 11 + 4],\r
293                          buf[i * 11 + 5],\r
294                          buf[i * 11 + 6],\r
295                          buf[i * 11 + 7],\r
296                          buf[i * 11 + 8],\r
297                          buf[i * 11 + 9],\r
298                          buf[i * 11 + 10]);\r
299                 }\r
300         }\r
301         free(buf);\r
302 }\r
303 \r