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