9 int isIDS(const GString *in){
\r
11 if(strncmp(in->str, "u2ff", 4) == 0){
\r
12 //check the last char
\r
13 if('0' <= (in->str)[4] && (in->str)[4] <= 'a') return TRUE;
\r
18 void divideInto2(const GString *in, GString *partIDS1, GString *partIDS3){
\r
19 GString *buffer[16];
\r
20 char tmp[kMaxIDCLength + 1];
\r
21 int i, counter, pointer, flag;
\r
23 g_string_set_size(partIDS1, 0);
\r
27 for(i = 0; i < in->len; i++){
\r
28 if((in->str)[i] == '.'){
\r
29 strncpy(tmp, (in->str) + pointer, i - pointer);
\r
30 tmp[i - pointer] = '\0';
\r
31 buffer[counter] = g_string_new(tmp);
\r
36 strncpy(tmp, (in->str) + pointer, i - pointer);
\r
37 tmp[i - pointer] = '\0';
\r
38 buffer[counter] = g_string_new(tmp);
\r
41 //reject over-length of IDS
\r
42 if(counter > kMaxIDSSequenceLength) return;
\r
47 while(flag >= 0 && pointer < counter){
\r
48 g_string_append(partIDS1, (buffer[pointer])->str);
\r
49 g_string_append(partIDS1, ".");
\r
50 if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){
\r
51 switch (((buffer[pointer])->str)[4]){
\r
73 g_string_erase(partIDS1, partIDS1->len - 1, 1);
\r
77 while(flag >= 0 && pointer < counter){
\r
78 g_string_append(partIDS3, (buffer[pointer])->str);
\r
79 g_string_append(partIDS3, ".");
\r
80 if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){
\r
81 switch (((buffer[pointer])->str)[4]){
\r
103 g_string_erase(partIDS3, partIDS3->len - 1, 1);
\r
106 void divideInto3(const GString *in, GString *partIDS1, GString *partIDS2, GString *partIDS3){
\r
107 GString *buffer[16];
\r
108 char tmp[kMaxIDCLength + 1];
\r
109 int i, counter, pointer, flag;
\r
111 g_string_set_size(partIDS1, 0);
\r
115 for(i = 0; i < in->len; i++){
\r
116 if((in->str)[i] == '.'){
\r
117 strncpy(tmp, (in->str) + pointer, i - pointer);
\r
118 tmp[i - pointer] = '\0';
\r
119 buffer[counter] = g_string_new(tmp);
\r
124 strncpy(tmp, (in->str) + pointer, i - pointer);
\r
125 tmp[i - pointer] = '\0';
\r
126 buffer[counter] = g_string_new(tmp);
\r
129 //reject over-length of IDS
\r
130 if(counter > kMaxIDSSequenceLength) return;
\r
135 while(flag >= 0 && pointer < counter){
\r
136 g_string_append(partIDS1, (buffer[pointer])->str);
\r
137 g_string_append(partIDS1, ".");
\r
138 if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){
\r
139 switch (((buffer[pointer])->str)[4]){
\r
161 g_string_erase(partIDS1, partIDS1->len - 1, 1);
\r
165 while(flag >= 0 && pointer < counter){
\r
166 g_string_append(partIDS2, (buffer[pointer])->str);
\r
167 g_string_append(partIDS2, ".");
\r
168 if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){
\r
169 switch (((buffer[pointer])->str)[4]){
\r
191 g_string_erase(partIDS2, partIDS2->len - 1, 1);
\r
195 while(flag >= 0 && pointer < counter){
\r
196 g_string_append(partIDS3, (buffer[pointer])->str);
\r
197 g_string_append(partIDS3, ".");
\r
198 if(strncmp((buffer[pointer])->str, "u2ff", 4) == 0){
\r
199 switch (((buffer[pointer])->str)[4]){
\r
221 g_string_erase(partIDS3, partIDS3->len - 1, 1);
\r
224 void addStrokeWithTransform(const GString *stroke, const int num, const int *tf, GString *out, int mode){
\r
228 tmp = g_string_new("");
\r
229 buf = convertStroke(stroke->str, buf, &size);
\r
231 for(i = 0; i < size; i++){
\r
232 if(buf[i * 11 + 0] != 0 && buf[i * 11 + 0] != 99){
\r
234 tf[(num - 1) * 4 + 0] + buf[i * 11 + 3] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;
\r
236 tf[(num - 1) * 4 + 0] + buf[i * 11 + 5] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;
\r
238 tf[(num - 1) * 4 + 0] + buf[i * 11 + 7] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;
\r
240 tf[(num - 1) * 4 + 0] + buf[i * 11 + 9] * (tf[(num - 1) * 4 + 2] - tf[(num - 1) * 4 + 0]) / pngWidth;
\r
242 tf[(num - 1) * 4 + 1] + buf[i * 11 + 4] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;
\r
244 tf[(num - 1) * 4 + 1] + buf[i * 11 + 6] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;
\r
246 tf[(num - 1) * 4 + 1] + buf[i * 11 + 8] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;
\r
248 tf[(num - 1) * 4 + 1] + buf[i * 11 + 10] * (tf[(num - 1) * 4 + 3] - tf[(num - 1) * 4 + 1]) / pngHeight;
\r
251 convertArray(buf, tmp, size, mode);
\r
252 if(out->len != 0) g_string_append(out, "$");
\r
253 g_string_append(out, tmp->str);
\r
258 void convertArray(int *buf, GString *out, int size, int mode){
\r
260 char tmp[kMaxStrokeDataLength];
\r
262 for(i = 0; i < size; i++){
\r
263 if(!(mode == 1 && (buf[i * 11 + 0] == 0 || buf[i * 11 + 0] == 99))){
\r
264 sprintf(tmp, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d$",
\r
276 g_string_append(out, tmp);
\r
279 g_string_erase(out, (out->len - 1), 1);
\r
282 int * convertStroke(const char *in, int *a, int *size){
\r
283 int i, counter, pointer;
\r
284 int a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;
\r
285 char tmp[kMaxStrokeDataLength + 1];
\r
287 a = (int *)malloc(0);
\r
290 for(i = 0; i < strlen(in); i++){
\r
292 strncpy(tmp, &in[pointer], i - pointer);
\r
293 tmp[i - pointer] = '\0';
\r
294 a = (int *)realloc(a, sizeof(int) * 11 * (counter + 1));
\r
295 sscanf(tmp, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
\r
296 &a0,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9,&a10);
\r
297 a[counter * 11 + 0] = a0;
\r
298 a[counter * 11 + 1] = a1;
\r
299 a[counter * 11 + 2] = a2;
\r
300 a[counter * 11 + 3] = a3;
\r
301 a[counter * 11 + 4] = a4;
\r
302 a[counter * 11 + 5] = a5;
\r
303 a[counter * 11 + 6] = a6;
\r
304 a[counter * 11 + 7] = a7;
\r
305 a[counter * 11 + 8] = a8;
\r
306 a[counter * 11 + 9] = a9;
\r
307 a[counter * 11 + 10] = a10;
\r
312 strncpy(tmp, &in[pointer], i - pointer);
\r
313 tmp[i - pointer] = '\0';
\r
314 a = (int *)realloc(a, sizeof(int) * 11 * (counter + 1));
\r
315 sscanf(tmp, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
\r
316 &a0,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9,&a10);
\r
317 a[counter * 11 + 0] = a0;
\r
318 a[counter * 11 + 1] = a1;
\r
319 a[counter * 11 + 2] = a2;
\r
320 a[counter * 11 + 3] = a3;
\r
321 a[counter * 11 + 4] = a4;
\r
322 a[counter * 11 + 5] = a5;
\r
323 a[counter * 11 + 6] = a6;
\r
324 a[counter * 11 + 7] = a7;
\r
325 a[counter * 11 + 8] = a8;
\r
326 a[counter * 11 + 9] = a9;
\r
327 a[counter * 11 + 10] = a10;
\r
333 void convert99(const GString *in, GString *out){
\r
335 char tmp[kMaxStrokeDataLength + 1];
\r
338 g_string_set_size(out, 0);
\r
339 buf = g_string_new("");
\r
341 for(i = 0; i < in->len; i++){
\r
342 if((in->str)[i] == '$'){
\r
343 strncpy(tmp, in->str + pointer, i - pointer);
\r
344 tmp[i - pointer] = '\0';
\r
345 if(strncmp(tmp, "99:", 3) == 0){
\r
346 convert99calc(tmp, buf);
\r
348 g_string_set_size(out, 0);
\r
351 g_string_append(out, buf->str);
\r
353 else g_string_append(out, tmp);
\r
354 g_string_append(out, "$");
\r
359 strncpy(tmp, in->str + pointer, i - pointer);
\r
360 tmp[i - pointer] = '\0';
\r
361 if(strncmp(tmp, "99:", 3) == 0){
\r
362 convert99calc(tmp, buf);
\r
364 g_string_set_size(out, 0);
\r
367 g_string_append(out, buf->str);
\r
369 else g_string_append(out, tmp);
\r
372 void convert99calc(const char *in, GString *out){
\r
373 GString *buf1, *buf2;
\r
374 int a1,x1,y1,x2,y2,option,option2;
\r
375 char pname[kMaxStrokeDataLength];
\r
379 g_string_set_size(out, 0);
\r
380 buf2 = g_string_new("");
\r
383 sscanf(in, "%d:%d:%d:%d:%d:%d:%d:%s",
\r
384 &a1,&option,&option2,&x1,&y1,&x2,&y2,pname);
\r
385 //end = strchr(pname, ':');
\r
387 buf1 = g_string_new(pname);
\r
388 generateGlyph(buf1, buf2);
\r
389 if(buf2->len == 0) return;
\r
396 addStrokeWithTransform(buf2, 1, tf, out, 1);
\r