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