Make source clean.
[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 KGString *in, KGString *out, int flag){\r
9         KGString *tmp1, *tmp2;\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 = kg_string_new(in->str);\r
23         tmp2 = kg_string_new(in->str);\r
24         \r
25         //append place flag\r
26         if(1 <= flag && flag <= 7){\r
27                 if(tmp1->len != 7) kg_string_append(tmp1, "-");\r
28                 if(flag == 1) kg_string_append(tmp1, "01");\r
29                 else if(flag == 2) kg_string_append(tmp1, "02");\r
30                 else if(flag == 3) kg_string_append(tmp1, "03");\r
31                 else if(flag == 4) kg_string_append(tmp1, "04");\r
32                 else if(flag == 5) kg_string_append(tmp1, "05");\r
33                 else if(flag == 6) kg_string_append(tmp1, "06");\r
34         }\r
35 \r
36         generateGlyph(tmp1, out);\r
37         if(out->len != 0) return;\r
38         generateGlyph(tmp2, out);\r
39         if(out->len != 0) return;\r
40         return;\r
41 }\r
42 \r
43 void generateGlyph(const KGString *in, KGString *out){\r
44   KGString *tmp;\r
45         tmp = kg_string_new("");\r
46         kg_string_set_size(out, 0);\r
47         \r
48         //search from parts\r
49         searchPartsData(in, tmp);\r
50         if(tmp->len != 0){\r
51           tmp = CalcSizes(tmp, 1);\r
52           out = kg_string_assign(out, tmp->str);\r
53           return;\r
54         }\r
55         \r
56         //search from alias\r
57         searchAliasData(in, tmp);\r
58         if(tmp->len != 0){\r
59                 generateGlyph(tmp, out);\r
60                 if(out->len == 0) return;\r
61                 //save to cache ... not yet\r
62                 return;\r
63         }\r
64         \r
65         //check if its IDS\r
66         if(isIDS(in)){\r
67                 doCombine(in, out);\r
68                 if(out->len == 0) return;\r
69                 //save to cache ... not yet\r
70                 return;\r
71         }\r
72 }\r
73 \r
74 void doCombine(const KGString *in, KGString *out){\r
75         KGString *partIDS1, *partIDS2, *partIDS3;\r
76         KGString *partStroke1, *partStroke2, *partStroke3;\r
77         int result[12];\r
78         \r
79         partIDS1 = kg_string_new("");\r
80         partIDS2 = kg_string_new("");\r
81         partIDS3 = kg_string_new("");\r
82         partStroke1 = kg_string_new("");\r
83         partStroke2 = kg_string_new("");\r
84         partStroke3 = kg_string_new("");\r
85         \r
86         kg_string_set_size(out, 0);\r
87         \r
88         //check first IDC\r
89         if(strncmp(in->str, "u2ff", 4) != 0) return;\r
90         //switch by combine types\r
91         switch((in->str)[4]){\r
92                 case '0':\r
93                         divideInto2(in, partIDS1, partIDS3);\r
94                         if(partIDS1->len == 0) return;\r
95                         //ready each parts\r
96                         generateGlyphByIDS(partIDS1, partStroke1, 1);\r
97                         if(partStroke1->len == 0) return;\r
98                         partStroke1 = CalcSizes(partStroke1, 0);\r
99                         generateGlyphByIDS(partIDS3, partStroke3, 2);\r
100                         if(partStroke3->len == 0) return;\r
101                         partStroke3 = CalcSizes(partStroke3, 0);\r
102                         break;\r
103                 case '1':\r
104                         divideInto2(in, partIDS1, partIDS3);\r
105                         if(partIDS1->len == 0) return;\r
106                         //ready each parts\r
107                         generateGlyphByIDS(partIDS1, partStroke1, 3);\r
108                         if(partStroke1->len == 0) return;\r
109                         partStroke1 = CalcSizes(partStroke1, 0);\r
110                         generateGlyphByIDS(partIDS3, partStroke3, 4);\r
111                         if(partStroke3->len == 0) return;\r
112                         partStroke3 = CalcSizes(partStroke3, 0);\r
113                         break;\r
114                 case '4':\r
115                 case '5':\r
116                 case '6':\r
117                 case '7':\r
118                 case '8':\r
119                 case '9':\r
120                 case 'a':\r
121 //              case 'b':\r
122                         divideInto2(in, partIDS1, partIDS3);\r
123                         if(partIDS1->len == 0) return;\r
124                         //ready each parts\r
125                         generateGlyphByIDS(partIDS1, partStroke1, 5);\r
126                         if(partStroke1->len == 0) return;\r
127                         partStroke1 = CalcSizes(partStroke1, 0);\r
128                         generateGlyphByIDS(partIDS3, partStroke3, 6);\r
129                         if(partStroke3->len == 0) return;\r
130                         partStroke3 = CalcSizes(partStroke3, 0);\r
131                         break;\r
132                 case '2':\r
133                         divideInto3(in, partIDS1, partIDS2, partIDS3);\r
134                         if(partIDS1->len == 0) return;\r
135                         //ready each parts\r
136                         generateGlyphByIDS(partIDS1, partStroke1, 1);\r
137                         if(partStroke1->len == 0) return;\r
138                         partStroke1 = CalcSizes(partStroke1, 0);\r
139                         generateGlyphByIDS(partIDS2, partStroke2, 1);\r
140                         if(partStroke2->len == 0) return;\r
141                         partStroke2 = CalcSizes(partStroke2, 0);\r
142                         generateGlyphByIDS(partIDS3, partStroke3, 2);\r
143                         if(partStroke3->len == 0) return;\r
144                         partStroke3 = CalcSizes(partStroke3, 0);\r
145                         break;\r
146                 case '3':\r
147                         divideInto3(in, partIDS1, partIDS2, partIDS3);\r
148                         if(partIDS1->len == 0) return;\r
149                         //ready each parts\r
150                         generateGlyphByIDS(partIDS1, partStroke1, 3);\r
151                         if(partStroke1->len == 0) return;\r
152                         partStroke1 = CalcSizes(partStroke1, 0);\r
153                         generateGlyphByIDS(partIDS2, partStroke2, 3);\r
154                         if(partStroke2->len == 0) return;\r
155                         partStroke2 = CalcSizes(partStroke2, 0);\r
156                         generateGlyphByIDS(partIDS3, partStroke3, 4);\r
157                         if(partStroke3->len == 0) return;\r
158                         partStroke3 = CalcSizes(partStroke3, 0);\r
159                         break;\r
160         }\r
161         switch((in->str)[4]){\r
162                 case '0':\r
163                         combineYoko2(partStroke1, partStroke3, result);\r
164                         break;\r
165                 case '1':\r
166                         combineTate2(partStroke1, partStroke3, result);\r
167                         break;\r
168                 case '2':\r
169                         combineYoko3(partStroke1, partStroke2, partStroke3, result);\r
170                         break;\r
171                 case '3':\r
172                         combineTate3(partStroke1, partStroke2, partStroke3, result);\r
173                         break;\r
174                 case '4':\r
175                 case '5':\r
176                 case '6':\r
177                 case '7':\r
178                 case '8':\r
179                 case '9':\r
180                 case 'a':\r
181 //              case 'b':\r
182                         combineHame2(partStroke1, partStroke3, result);\r
183                         break;\r
184         }\r
185         switch((in->str)[4]){\r
186                 case '0':\r
187                 case '1':\r
188                 case '4':\r
189                 case '5':\r
190                 case '6':\r
191                 case '7':\r
192                 case '8':\r
193                 case '9':\r
194                 case 'a':\r
195 //              case 'b':\r
196                         addStrokeWithTransform(partStroke1, 1, result, out, 1);\r
197                         addStrokeWithTransform(partStroke3, 3, result, out, 1);\r
198                         break;\r
199                 case '2':\r
200                 case '3':\r
201                         addStrokeWithTransform(partStroke1, 1, result, out, 1);\r
202                         addStrokeWithTransform(partStroke2, 2, result, out, 1);\r
203                         addStrokeWithTransform(partStroke3, 3, result, out, 1);\r
204                         break;\r
205         }\r
206 }\r
207 \r
208 void drawGlyph(const KGString *in, const int mode){\r
209         int i, j;\r
210         int *buf;\r
211         buf = convertStroke(in->str, buf, &j);\r
212         for(i = 0; i < j; i++){\r
213                 if(mode == 0){ //normal\r
214                         dfDrawFont(buf[i * 11 + 0],\r
215                          buf[i * 11 + 1],\r
216                          buf[i * 11 + 2],\r
217                          buf[i * 11 + 3],\r
218                          buf[i * 11 + 4],\r
219                          buf[i * 11 + 5],\r
220                          buf[i * 11 + 6],\r
221                          buf[i * 11 + 7],\r
222                          buf[i * 11 + 8],\r
223                          buf[i * 11 + 9],\r
224                          buf[i * 11 + 10]);\r
225                 }\r
226                 else if(mode == 1){ //without decoration\r
227                         dfDrawFont(buf[i * 11 + 0],\r
228                          0,\r
229                          0,\r
230                          buf[i * 11 + 3],\r
231                          buf[i * 11 + 4],\r
232                          buf[i * 11 + 5],\r
233                          buf[i * 11 + 6],\r
234                          buf[i * 11 + 7],\r
235                          buf[i * 11 + 8],\r
236                          buf[i * 11 + 9],\r
237                          buf[i * 11 + 10]);\r
238                 }\r
239         }\r
240         free(buf);\r
241 }\r
242 \r