8 int isIDS(const KGString *in){
10 if(strncmp(in->str, "u2ff", 4) == 0){
12 if('0' <= (in->str)[4] && (in->str)[4] <= 'a') return 1; //true
17 void divideInto2(const KGString *in, KGString *partIDS1, KGString *partIDS3){
19 char tmp[kMaxIDCLength + 1];
20 int i, counter, pointer, flag;
22 kg_string_set_size(partIDS1, 0);
26 for(i = 0; i < in->len; i++){
27 if((in->str)[i] == '.'){
28 strncpy(tmp, (in->str) + pointer, i - pointer);
29 tmp[i - pointer] = '\0';
30 buffer[counter] = kg_string_new(tmp);
35 strncpy(tmp, (in->str) + pointer, i - pointer);
36 tmp[i - pointer] = '\0';
37 buffer[counter] = kg_string_new(tmp);
40 //reject over-length of IDS
41 if(counter > kMaxIDSSequenceLength) return;
46 while(flag >= 0 && pointer < counter){
47 kg_string_append(partIDS1, (buffer[pointer])->str);
48 kg_string_append(partIDS1, ".");
49 if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){
50 switch (((buffer[pointer])->str)[4]){
72 kg_string_erase(partIDS1, partIDS1->len - 1, 1);
76 while(flag >= 0 && pointer < counter){
77 kg_string_append(partIDS3, (buffer[pointer])->str);
78 kg_string_append(partIDS3, ".");
79 if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){
80 switch (((buffer[pointer])->str)[4]){
102 kg_string_erase(partIDS3, partIDS3->len - 1, 1);
105 void divideInto3(const KGString *in, KGString *partIDS1, KGString *partIDS2, KGString *partIDS3){
106 KGString *buffer[16];
107 char tmp[kMaxIDCLength + 1];
108 int i, counter, pointer, flag;
110 kg_string_set_size(partIDS1, 0);
114 for(i = 0; i < in->len; i++){
115 if((in->str)[i] == '.'){
116 strncpy(tmp, (in->str) + pointer, i - pointer);
117 tmp[i - pointer] = '\0';
118 buffer[counter] = kg_string_new(tmp);
123 strncpy(tmp, (in->str) + pointer, i - pointer);
124 tmp[i - pointer] = '\0';
125 buffer[counter] = kg_string_new(tmp);
128 //reject over-length of IDS
129 if(counter > kMaxIDSSequenceLength) return;
134 while(flag >= 0 && pointer < counter){
135 kg_string_append(partIDS1, (buffer[pointer])->str);
136 kg_string_append(partIDS1, ".");
137 if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){
138 switch (((buffer[pointer])->str)[4]){
160 kg_string_erase(partIDS1, partIDS1->len - 1, 1);
164 while(flag >= 0 && pointer < counter){
165 kg_string_append(partIDS2, (buffer[pointer])->str);
166 kg_string_append(partIDS2, ".");
167 if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){
168 switch (((buffer[pointer])->str)[4]){
190 kg_string_erase(partIDS2, partIDS2->len - 1, 1);
194 while(flag >= 0 && pointer < counter){
195 kg_string_append(partIDS3, (buffer[pointer])->str);
196 kg_string_append(partIDS3, ".");
197 if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){
198 switch (((buffer[pointer])->str)[4]){
220 kg_string_erase(partIDS3, partIDS3->len - 1, 1);
223 void addStrokeWithTransform(const KGString *stroke, const int num, const int *tf, KGString *out, int mode){
227 tmp = kg_string_new("");
228 buf = convertStroke(stroke->str, buf, &size);
230 for(i = 0; i < size; i++){
231 if(buf[i * 11 + 0] != 0 && buf[i * 11 + 0] != 99){
233 tf[(num - 1) * 4 + 0] + buf[i * 11 + 3] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;
235 tf[(num - 1) * 4 + 0] + buf[i * 11 + 5] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;
237 tf[(num - 1) * 4 + 0] + buf[i * 11 + 7] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;
239 tf[(num - 1) * 4 + 0] + buf[i * 11 + 9] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;
241 tf[(num - 1) * 4 + 1] + buf[i * 11 + 4] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;
243 tf[(num - 1) * 4 + 1] + buf[i * 11 + 6] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;
245 tf[(num - 1) * 4 + 1] + buf[i * 11 + 8] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;
247 tf[(num - 1) * 4 + 1] + buf[i * 11 + 10] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;
250 convertArray(buf, tmp, size, mode);
251 if(out->len != 0) kg_string_append(out, "$");
252 kg_string_append(out, tmp->str);
257 void convertArray(int *buf, KGString *out, int size, int mode){
259 char tmp[kMaxStrokeDataLength];
261 for(i = 0; i < size; i++){
262 if(!(mode == 1 && (buf[i * 11 + 0] == 0 || buf[i * 11 + 0] == 99))){
263 sprintf(tmp, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d$",
275 kg_string_append(out, tmp);
278 out = kg_string_erase(out, (out->len - 1), 1);
281 int * convertStroke(const char *in, int *a, int *size){
282 int i, counter, pointer;
283 int a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;
284 char tmp[kMaxStrokeDataLength + 1];
286 a = (int *)malloc(0);
289 for(i = 0; i < strlen(in); i++){
291 strncpy(tmp, &in[pointer], i - pointer);
292 tmp[i - pointer] = '\0';
293 a = (int *)realloc(a, sizeof(int) * 11 * (counter + 1));
294 sscanf(tmp, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
295 &a0,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9,&a10);
296 a[counter * 11 + 0] = a0;
297 a[counter * 11 + 1] = a1;
298 a[counter * 11 + 2] = a2;
299 a[counter * 11 + 3] = a3;
300 a[counter * 11 + 4] = a4;
301 a[counter * 11 + 5] = a5;
302 a[counter * 11 + 6] = a6;
303 a[counter * 11 + 7] = a7;
304 a[counter * 11 + 8] = a8;
305 a[counter * 11 + 9] = a9;
306 a[counter * 11 + 10] = a10;
311 strncpy(tmp, &in[pointer], i - pointer);
312 tmp[i - pointer] = '\0';
313 a = (int *)realloc(a, sizeof(int) * 11 * (counter + 1));
314 sscanf(tmp, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
315 &a0,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9,&a10);
316 a[counter * 11 + 0] = a0;
317 a[counter * 11 + 1] = a1;
318 a[counter * 11 + 2] = a2;
319 a[counter * 11 + 3] = a3;
320 a[counter * 11 + 4] = a4;
321 a[counter * 11 + 5] = a5;
322 a[counter * 11 + 6] = a6;
323 a[counter * 11 + 7] = a7;
324 a[counter * 11 + 8] = a8;
325 a[counter * 11 + 9] = a9;
326 a[counter * 11 + 10] = a10;
332 void convert99(const KGString *in, KGString *out){
334 char tmp[kMaxStrokeDataLength + 1];
337 kg_string_set_size(out, 0);
338 buf = kg_string_new("");
340 for(i = 0; i < in->len; i++){
341 if((in->str)[i] == '$'){
342 strncpy(tmp, in->str + pointer, i - pointer);
343 tmp[i - pointer] = '\0';
344 if(strncmp(tmp, "99:", 3) == 0){
345 convert99calc(tmp, buf);
347 kg_string_set_size(out, 0);
350 kg_string_append(out, buf->str);
352 else kg_string_append(out, tmp);
353 kg_string_append(out, "$");
358 strncpy(tmp, in->str + pointer, i - pointer);
359 tmp[i - pointer] = '\0';
360 if(strncmp(tmp, "99:", 3) == 0){
361 convert99calc(tmp, buf);
363 kg_string_set_size(out, 0);
366 kg_string_append(out, buf->str);
368 else kg_string_append(out, tmp);
371 void convert99calc(const char *in, KGString *out){
372 KGString *buf1, *buf2;
373 int a1,x1,y1,x2,y2,option,option2;
374 char pname[kMaxStrokeDataLength];
377 kg_string_set_size(out, 0);
378 buf2 = kg_string_new("");
381 sscanf(in, "%d:%d:%d:%d:%d:%d:%d:%s",
382 &a1,&option,&option2,&x1,&y1,&x2,&y2,pname);
383 //end = strchr(pname, ':');
385 buf1 = kg_string_new(pname);
386 generateGlyph(buf1, buf2);
387 if(buf2->len == 0) return;
394 addStrokeWithTransform(buf2, 1, tf, out, 1);