8 void DotsWidth(int *dlx, int *drx){
13 for(i = 0; i < canvasWidth && *dlx == 0; i++){
14 for(j = 0; j < canvasHeight; j++){
15 if(kageCanvas[j][i] != kWhite){
22 for(i = canvasWidth - 1; i >= 0 && *drx == 0; i--){
23 for(j = 0; j < canvasHeight; j++){
24 if(kageCanvas[j][i] != kWhite){
32 void DotsHeight(int *dly, int *dry){
37 for(j = 0; j < canvasHeight && *dly == 0; j++){
38 for(i = 0; i < canvasWidth; i++){
39 if(kageCanvas[j][i] != kWhite){
46 for(j = canvasHeight - 1; j >= 0 && *dry == 0; j--){
47 for(i = 0; i < canvasWidth; i++){
48 if(kageCanvas[j][i] != kWhite){
56 void PartsWidth(const KGString *in, int *lx, int *rx){
61 drawGlyph(in, DRAW_GLYPH_MODE_WITHOUT_DECORATION);
70 buf = convertStroke(in->str, buf, &strokes);
72 for(i = 0; i < strokes; i++){
73 switch(buf[i * 11 + 0] % 10){
79 if(*lx > buf[i * 11 + 3]) *lx = buf[i * 11 + 3];
80 if(*rx < buf[i * 11 + 3]) *rx = buf[i * 11 + 3];
81 if(*lx > buf[i * 11 + 5]) *lx = buf[i * 11 + 5];
82 if(*rx < buf[i * 11 + 5]) *rx = buf[i * 11 + 5];
85 for(t = 0; t <= 1; t = t + 0.05){
86 x = (1.0 - t) * (1.0 - t) * buf[i * 11 + 3] + 2.0 * t * (1.0 - t) * buf[i * 11 + 5] + t * t * buf[i * 11 + 7];
92 if(*lx > buf[i * 11 + 3]) *lx = buf[i * 11 + 3];
93 if(*rx < buf[i * 11 + 3]) *rx = buf[i * 11 + 3];
94 if(*lx > buf[i * 11 + 5]) *lx = buf[i * 11 + 5];
95 if(*rx < buf[i * 11 + 5]) *rx = buf[i * 11 + 5];
96 if(*lx > buf[i * 11 + 7]) *lx = buf[i * 11 + 7];
97 if(*rx < buf[i * 11 + 7]) *rx = buf[i * 11 + 7];
100 for(t = 0; t < 1; t = t + 0.05){
101 x = (1.0 - t) * (1.0 - t) * (1.0 - t) * buf[i * 11 + 3] + 3.0 * t * (1.0 - t) * (1.0 - t) * buf[i * 11 + 5] + 3 * t * t * (1.0 - t) * buf[i * 11 + 7] + t * t * t * buf[i * 11 + 9];
107 if(*lx > buf[i * 11 + 3]) *lx = buf[i * 11 + 3];
108 if(*rx < buf[i * 11 + 3]) *rx = buf[i * 11 + 3];
109 for(t = 0; t < 1; t = t + 0.05){
110 x = (1.0 - t) * (1.0 - t) * buf[i * 11 + 5] + 2.0 * t * (1.0 - t) * buf[i * 11 + 7] + t * t * buf[i * 11 + 9];
120 void PartsHeight(const KGString *in, int *ly, int *ry){
123 tempShotai = kShotai;
125 drawGlyph(in, DRAW_GLYPH_MODE_WITHOUT_DECORATION);
126 kShotai = tempShotai;
134 buf = convertStroke(in->str, buf, &strokes);
136 for(i = 0; i < strokes; i++){
137 switch(buf[i * 11 + 0] % 10){
143 if(*ly > buf[i * 11 + 4]) *ly = buf[i * 11 + 4];
144 if(*ry < buf[i * 11 + 4]) *ry = buf[i * 11 + 4];
145 if(*ly > buf[i * 11 + 6]) *ly = buf[i * 11 + 6];
146 if(*ry < buf[i * 11 + 6]) *ry = buf[i * 11 + 6];
149 for(t = 0; t <= 1; t = t + 0.05){
150 y = (1.0 - t) * (1.0 - t) * buf[i * 11 + 4] + 2.0 * t * (1.0 - t) * buf[i * 11 + 6] + t * t * buf[i * 11 + 8];
156 if(*ly > buf[i * 11 + 4]) *ly = buf[i * 11 + 4];
157 if(*ry < buf[i * 11 + 4]) *ry = buf[i * 11 + 4];
158 if(*ly > buf[i * 11 + 6]) *ly = buf[i * 11 + 6];
159 if(*ry < buf[i * 11 + 6]) *ry = buf[i * 11 + 6];
160 if(*ly > buf[i * 11 + 8]) *ly = buf[i * 11 + 8];
161 if(*ry < buf[i * 11 + 8]) *ry = buf[i * 11 + 8];
164 for(t = 0; t < 1; t = t + 0.05){
165 y = (1.0 - t) * (1.0 - t) * (1.0 - t) * buf[i * 11 + 4] + 3.0 * t * (1.0 - t) * (1.0 - t) * buf[i * 11 + 6] + 3 * t * t * (1.0 - t) * buf[i * 11 + 8] + t * t * t * buf[i * 11 + 10];
171 if(*ly > buf[i * 11 + 4]) *ly = buf[i * 11 + 4];
172 if(*ry < buf[i * 11 + 4]) *ry = buf[i * 11 + 4];
173 for(t = 0; t < 1; t = t + 0.05){
174 y = (1.0 - t) * (1.0 - t) * buf[i * 11 + 6] + 2.0 * t * (1.0 - t) * buf[i * 11 + 8] + t * t * buf[i * 11 + 10];
186 buf = convertStroke(in->str, buf, &strokes);
189 for(i = 0; i < strokes; i++){
190 if(buf[i * 11 + 0] % 10 == 0) continue;
192 if(*ly > buf[i * 11 + 4]) *ly = buf[i * 11 + 4];
193 if(*ry < buf[i * 11 + 4]) *ry = buf[i * 11 + 4];
194 if(*ly > buf[i * 11 + 6]) *ly = buf[i * 11 + 6];
195 if(*ry < buf[i * 11 + 6]) *ry = buf[i * 11 + 6];
197 if(buf[i * 11 + 0] % 10 == 2 || buf[i * 11 + 0] % 10 == 3 || buf[i * 11 + 0] % 10 == 8){
198 if(*ly > buf[i * 11 + 8]) *ly = buf[i * 11 + 8];
199 if(*ry < buf[i * 11 + 8]) *ry = buf[i * 11 + 8];
201 if(buf[i * 11 + 0] % 10 == 4 || buf[i * 11 + 0] % 10 == 6 || buf[i * 11 + 0] % 10 == 7){
202 if(*ly > buf[i * 11 + 10]) *ly = buf[i * 11 + 10];
203 if(*ry < buf[i * 11 + 10]) *ry = buf[i * 11 + 10];
210 KGString * CalcSizes(const KGString *in, int mode){
211 int i, j, k, basewidth, one_lineX, one_lineY;
212 int dlx1, drx1, dly1, dry1;
216 int mitsuT, flg_boxT, widthT, heightT;
224 out = kg_string_new("");
225 basewidth = pngWidth * 0.9;
228 //temporary adjustment X-axis
229 PartsWidth(in, &dlx1, &drx1);
232 px1 = pngWidth / 2 - dlx1;
236 pr1 = (double)basewidth/(drx1 - dlx1);
237 px1 = (pngWidth-basewidth)/2 - (double)(dlx1 * pr1);
241 //temporary adjustment Y-axis
242 PartsHeight(in, &dly1, &dry1);
245 py1 = pngWidth / 2 - dly1;
249 pry1 = (double)basewidth/(dry1 - dly1);
250 py1 = (pngWidth-basewidth)/2 - (double)(dly1 * pry1);
255 PartsWidth(in, &dlx1, &drx1);
256 PartsHeight(in, &dly1, &dry1);
261 CalcOptions(in, &mitsuT, &flg_boxT, &yokoT, &tateT);
266 if(flg_boxT % 2 / 1 != 0){
267 widthT = widthT - kWidth * 3;
270 if(flg_boxT % 4 / 2 != 0){
271 widthT = widthT - kWidth * 3;
274 if(flg_boxT % 8 / 4 != 0){
275 heightT = heightT - kWidth * 3;
278 if(flg_boxT % 16 / 8 != 0){
279 heightT = heightT - kWidth * 3;
283 //especially get small the 'mouth'
284 if(mode == 2 && flg_boxT % 16 == 15){
285 widthT = widthT - kWidth * (max(0, 16 - (int)yokoT * 4));
286 heightT = heightT - kWidth * (max(0, 16 - (int)tateT * 4));
288 //'dot' as same as 'mouth'
289 if(mode == 2 && tateT == 1 && yokoT == 1){
290 widthT = pngWidth * 0.9 * 0.5;
291 heightT = pngWidth * 0.9 * 0.5;
295 if(flg_boxT % 64 / 32 != 0){
296 buf = convertStroke(in->str, buf, &strokes);
297 for(i = 0; i < strokes; i++){
298 if(buf[i * 11 + 0] == 0) j = buf[i * 11 + 4];// j : center line
301 k = max(j - dlx1, drx1 - j);// k : distance from center line
302 pr1 = (basewidth * 0.5) / k;
304 if(k == j - dlx1) px1 = 0;
305 else px1 = pngWidth * 0.5 - j * pr1;
311 px1 = pngWidth / 2 - dlx1;
314 pr1 = (double)widthT/(drx1 - dlx1);
315 px1 = pngWidth / 2 - (double)((dlx1 + drx1) / 2 * pr1);
316 if(flg_boxT % 2 / 1 != 0 && flg_boxT % 4 / 2 == 0) px1 = px1 + kWidth * 1.5;
317 if(flg_boxT % 2 / 1 == 0 && flg_boxT % 4 / 2 != 0) px1 = px1 - kWidth * 1.5;
322 py1 = pngWidth / 2 - dly1;
325 pry1 = (double)heightT/(dry1 - dly1);
326 py1 = pngWidth / 2 - (double)((dly1 + dry1) / 2 * pry1);
327 if(flg_boxT % 8 / 4 != 0 && flg_boxT % 16 / 8 == 0) py1 = py1 + kWidth * 1.5;
328 if(flg_boxT % 8 / 4 == 0 && flg_boxT % 16 / 8 != 0) py1 = py1 - kWidth * 1.5;
335 tf[2] = px1 + pr1 * 200;
336 tf[3] = py1 + pry1 * 200;
337 addStrokeWithTransform(in, 1, tf, out, 0);
338 return kg_string_new(out->str);
344 for(i = 0; i < canvasWidth; i++){
345 for(j = 0; j < canvasHeight; j++){
346 kageCanvas[j][i] = kWhite;
351 void CalcOptions(const KGString *in, int *mitsudo, int *flag, double *yoko, double *tate){
353 int dlx1, drx1, dly1, dry1;
361 buf = convertStroke(in->str, buf, &strokes);
363 //check left side (NEW)
365 for(i = 0; i < strokes; i++){
369 if(buf[i * 11 + 9] < value){ value = buf[i * 11 + 9]; }
373 if(buf[i * 11 + 7] < value){ value = buf[i * 11 + 7]; }
375 if(buf[i * 11 + 5] < value){ value = buf[i * 11 + 5]; }
376 if(buf[i * 11 + 3] < value){ value = buf[i * 11 + 3]; }
379 for(i = 0; i < strokes; i++){
380 if((buf[i * 11] == 1 || buf[i * 11] == 3) && // stroke #1 and #3
381 buf[i * 11 + 3] == value &&
382 buf[i * 11 + 5] == value &&
383 (buf[i * 11 + 6] - buf[i * 11 + 4]) > pngWidth * 0.9 / 4){
384 *flag = *flag | FLAG_FLAT_LEFT;
388 //check right side (NEW)
390 for(i = 0; i < strokes; i++){
394 if(buf[i * 11 + 9] > value){ value = buf[i * 11 + 9]; }
398 if(buf[i * 11 + 7] > value){ value = buf[i * 11 + 7]; }
400 if(buf[i * 11 + 5] > value){ value = buf[i * 11 + 5]; }
401 if(buf[i * 11 + 3] > value){ value = buf[i * 11 + 3]; }
404 for(i = 0; i < strokes; i++){
405 if(buf[i * 11] == 1 &&
406 buf[i * 11 + 3] == value &&
407 buf[i * 11 + 5] == value &&
408 (buf[i * 11 + 6] - buf[i * 11 + 4]) > pngWidth * 0.9 / 4){
409 *flag = *flag | FLAG_FLAT_RIGHT;
413 //check upper side (NEW)
415 for(i = 0; i < strokes; i++){
419 if(buf[i * 11 + 10] < value){ value = buf[i * 11 + 10]; }
423 if(buf[i * 11 + 8] < value){ value = buf[i * 11 + 8]; }
425 if(buf[i * 11 + 6] < value){ value = buf[i * 11 + 6]; }
426 if(buf[i * 11 + 4] < value){ value = buf[i * 11 + 4]; }
429 for(i = 0; i < strokes; i++){
430 if(buf[i * 11] == 1 &&
431 buf[i * 11 + 4] == value &&
432 buf[i * 11 + 6] == value &&
433 (buf[i * 11 + 5] - buf[i * 11 + 3]) > pngWidth * 0.9 / 4){
434 *flag = *flag | FLAG_FLAT_TOP;
438 //check bottom side (NEW)
440 for(i = 0; i < strokes; i++){
444 if(buf[i * 11 + 10] > value){ value = buf[i * 11 + 10]; }
448 if(buf[i * 11 + 8] > value){ value = buf[i * 11 + 8]; }
450 if(buf[i * 11 + 6] > value){ value = buf[i * 11 + 6]; }
451 if(buf[i * 11 + 4] > value){ value = buf[i * 11 + 4]; }
454 for(i = 0; i < strokes; i++){
455 if(buf[i * 11] == 1 &&
456 buf[i * 11 + 4] == value &&
457 buf[i * 11 + 6] == value &&
458 (buf[i * 11 + 5] - buf[i * 11 + 3]) > pngWidth * 0.9 / 4){
459 *flag = *flag | FLAG_FLAT_BOTTOM;
464 tempShotai = kShotai;
466 drawGlyph(in, DRAW_GLYPH_MODE_WITHOUT_DECORATION);
467 kShotai = tempShotai;
468 DotsWidth(&dlx1, &drx1);
469 DotsHeight(&dly1, &dry1);
473 for(i = 0; i < pngHeight; i++){
474 for(j = 0; j < pngWidth; j++){
475 if(kageCanvas[i][j] != kWhite) *mitsudo += 1;
479 //calculate X-axis complexity
481 for(i = dly1; i <= dry1; i++){
484 for(j = dlx1; j <= drx1; j++){
485 if(kageCanvas[i][j] != kWhite &&
486 kageCanvas[i][j+1] != kWhite &&
487 kageCanvas[i][j+2] != kWhite){
493 else if(mode == 1) mode = 0;
495 if(kari > *yoko) *yoko = kari;
498 //calculate Y-axis complexity
500 for(i = dlx1; i <= drx1; i++){
503 for(j = dly1; j <= dry1; j++){
504 if(kageCanvas[j][i] != kWhite &&
505 kageCanvas[j+1][i] != kWhite &&
506 kageCanvas[j+2][i] != kWhite){
512 else if(mode == 1) mode = 0;
514 if(kari > *tate) *tate = kari;
517 //use user defined option if it exists
518 //buf = convertStroke(in->str, buf, &strokes);
519 for(i = 0; i < strokes; i++){
520 if(buf[i * 11 + 0] % 10 == 0){
521 if(buf[i * 11 + 1] != 0) *yoko = (double)(buf[i * 11 + 1]) * 0.1;
522 if(buf[i * 11 + 2] != 0) *tate = (double)(buf[i * 11 + 2]) * 0.1;
523 if(buf[i * 11 + 3] != 0) *flag = *flag + buf[i * 11 + 3];
529 void DoDrawParts(const KGString *in, const int lx1, const double rf1, const int ly1, const double rfy1){
534 buf = convertStroke(in->str, buf, &strokes);
535 for(i = 0; i < strokes; i++){
536 dfDrawFont(buf[i * 11 + 0],
539 buf[i * 11 + 3] * rf1 + lx1,
540 buf[i * 11 + 4] * rfy1 + ly1,
541 buf[i * 11 + 5] * rf1 + lx1,
542 buf[i * 11 + 6] * rfy1 + ly1,
543 buf[i * 11 + 7] * rf1 + lx1,
544 buf[i * 11 + 8] * rfy1 + ly1,
545 buf[i * 11 + 9] * rf1 + lx1,
546 buf[i * 11 + 10] * rfy1 + ly1);
551 void DoDrawMixFont(const KGString *in1,
565 buf = convertStroke(in1->str, buf, &strokes);
566 for(i = 0; i < strokes; i++){
567 dfDrawFont(buf[i * 11 + 0],
570 buf[i * 11 + 3] * rf1 + lx1,
571 buf[i * 11 + 4] * rfy1 + ly1,
572 buf[i * 11 + 5] * rf1 + lx1,
573 buf[i * 11 + 6] * rfy1 + ly1,
574 buf[i * 11 + 7] * rf1 + lx1,
575 buf[i * 11 + 8] * rfy1 + ly1,
576 buf[i * 11 + 9] * rf1 + lx1,
577 buf[i * 11 + 10] * rfy1 + ly1);
581 buf = convertStroke(in2->str, buf, &strokes);
582 for(i = 0; i < strokes; i++){
583 dfDrawFont(buf[i * 11 + 0],
586 buf[i * 11 + 3] * rf2 + lx2,
587 buf[i * 11 + 4] * rfy2 + ly2,
588 buf[i * 11 + 5] * rf2 + lx2,
589 buf[i * 11 + 6] * rfy2 + ly2,
590 buf[i * 11 + 7] * rf2 + lx2,
591 buf[i * 11 + 8] * rfy2 + ly2,
592 buf[i * 11 + 9] * rf2 + lx2,
593 buf[i * 11 + 10] * rfy2 + ly2);