8 void DotsWidth(int *dlx, int *drx){
\r
13 for(i = 0; i < canvasWidth && *dlx == 0; i++){
\r
14 for(j = 0; j < canvasHeight; j++){
\r
15 if(kageCanvas[j][i] == 0){
\r
22 for(i = canvasWidth - 1; i >= 0 && *drx == 0; i--){
\r
23 for(j = 0; j < canvasHeight; j++){
\r
24 if(kageCanvas[j][i] == 0){
\r
32 void DotsHeight(int *dly, int *dry){
\r
37 for(j = 0; j < canvasHeight && *dly == 0; j++){
\r
38 for(i = 0; i < canvasWidth; i++){
\r
39 if(kageCanvas[j][i] == 0){
\r
46 for(j = canvasHeight - 1; j >= 0 && *dry == 0; j--){
\r
47 for(i = 0; i < canvasWidth; i++){
\r
48 if(kageCanvas[j][i] == 0){
\r
56 void PartsWidth(const KGString *in, int *lx, int *rx){
\r
59 tempShotai = kShotai;
\r
62 kShotai = tempShotai;
\r
69 *lx = 1000; *rx = 0;
\r
70 buf = convertStroke(in->str, buf, &strokes);
\r
72 for(i = 0; i < strokes; i++){
\r
73 switch(buf[i * 11 + 0] % 10){
\r
79 if(*lx > buf[i * 11 + 3]) *lx = buf[i * 11 + 3];
\r
80 if(*rx < buf[i * 11 + 3]) *rx = buf[i * 11 + 3];
\r
81 if(*lx > buf[i * 11 + 5]) *lx = buf[i * 11 + 5];
\r
82 if(*rx < buf[i * 11 + 5]) *rx = buf[i * 11 + 5];
\r
85 for(t = 0; t <= 1; t = t + 0.05){
\r
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];
\r
87 if(*lx > x) *lx = x;
\r
88 if(*rx < x) *rx = x;
\r
92 if(*lx > buf[i * 11 + 3]) *lx = buf[i * 11 + 3];
\r
93 if(*rx < buf[i * 11 + 3]) *rx = buf[i * 11 + 3];
\r
94 if(*lx > buf[i * 11 + 5]) *lx = buf[i * 11 + 5];
\r
95 if(*rx < buf[i * 11 + 5]) *rx = buf[i * 11 + 5];
\r
96 if(*lx > buf[i * 11 + 7]) *lx = buf[i * 11 + 7];
\r
97 if(*rx < buf[i * 11 + 7]) *rx = buf[i * 11 + 7];
\r
100 for(t = 0; t < 1; t = t + 0.05){
\r
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];
\r
102 if(*lx > x) *lx = x;
\r
103 if(*rx < x) *rx = x;
\r
107 if(*lx > buf[i * 11 + 3]) *lx = buf[i * 11 + 3];
\r
108 if(*rx < buf[i * 11 + 3]) *rx = buf[i * 11 + 3];
\r
109 for(t = 0; t < 1; t = t + 0.05){
\r
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];
\r
111 if(*lx > x) *lx = x;
\r
112 if(*rx < x) *rx = x;
\r
120 void PartsHeight(const KGString *in, int *ly, int *ry){
\r
123 tempShotai = kShotai;
\r
126 kShotai = tempShotai;
\r
127 DotsHeight(ly, ry);
\r
133 *ly = 1000; *ry = 0;
\r
134 buf = convertStroke(in->str, buf, &strokes);
\r
136 for(i = 0; i < strokes; i++){
\r
137 switch(buf[i * 11 + 0] % 10){
\r
143 if(*ly > buf[i * 11 + 4]) *ly = buf[i * 11 + 4];
\r
144 if(*ry < buf[i * 11 + 4]) *ry = buf[i * 11 + 4];
\r
145 if(*ly > buf[i * 11 + 6]) *ly = buf[i * 11 + 6];
\r
146 if(*ry < buf[i * 11 + 6]) *ry = buf[i * 11 + 6];
\r
149 for(t = 0; t <= 1; t = t + 0.05){
\r
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];
\r
151 if(*ly > y) *ly = y;
\r
152 if(*ry < y) *ry = y;
\r
156 if(*ly > buf[i * 11 + 4]) *ly = buf[i * 11 + 4];
\r
157 if(*ry < buf[i * 11 + 4]) *ry = buf[i * 11 + 4];
\r
158 if(*ly > buf[i * 11 + 6]) *ly = buf[i * 11 + 6];
\r
159 if(*ry < buf[i * 11 + 6]) *ry = buf[i * 11 + 6];
\r
160 if(*ly > buf[i * 11 + 8]) *ly = buf[i * 11 + 8];
\r
161 if(*ry < buf[i * 11 + 8]) *ry = buf[i * 11 + 8];
\r
164 for(t = 0; t < 1; t = t + 0.05){
\r
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];
\r
166 if(*ly > y) *ly = y;
\r
167 if(*ry < y) *ry = y;
\r
171 if(*ly > buf[i * 11 + 4]) *ly = buf[i * 11 + 4];
\r
172 if(*ry < buf[i * 11 + 4]) *ry = buf[i * 11 + 4];
\r
173 for(t = 0; t < 1; t = t + 0.05){
\r
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];
\r
175 if(*ly > y) *ly = y;
\r
176 if(*ry < y) *ry = y;
\r
186 buf = convertStroke(in->str, buf, &strokes);
\r
187 *ly = 1000; *ry = 0;
\r
189 for(i = 0; i < strokes; i++){
\r
190 if(buf[i * 11 + 0] % 10 == 0) continue;
\r
192 if(*ly > buf[i * 11 + 4]) *ly = buf[i * 11 + 4];
\r
193 if(*ry < buf[i * 11 + 4]) *ry = buf[i * 11 + 4];
\r
194 if(*ly > buf[i * 11 + 6]) *ly = buf[i * 11 + 6];
\r
195 if(*ry < buf[i * 11 + 6]) *ry = buf[i * 11 + 6];
\r
197 if(buf[i * 11 + 0] % 10 == 2 || buf[i * 11 + 0] % 10 == 3 || buf[i * 11 + 0] % 10 == 8){
\r
198 if(*ly > buf[i * 11 + 8]) *ly = buf[i * 11 + 8];
\r
199 if(*ry < buf[i * 11 + 8]) *ry = buf[i * 11 + 8];
\r
201 if(buf[i * 11 + 0] % 10 == 4 || buf[i * 11 + 0] % 10 == 6 || buf[i * 11 + 0] % 10 == 7){
\r
202 if(*ly > buf[i * 11 + 10]) *ly = buf[i * 11 + 10];
\r
203 if(*ry < buf[i * 11 + 10]) *ry = buf[i * 11 + 10];
\r
210 KGString * CalcSizes(const KGString *in, int mode){
\r
211 int i, j, k, basewidth, one_lineX, one_lineY;
\r
212 int dlx1, drx1, dly1, dry1;
\r
216 int mitsuT, flg_boxT, widthT, heightT;
\r
217 double tateT, yokoT;
\r
224 out = kg_string_new("");
\r
225 basewidth = pngWidth * 0.9;
\r
228 //temporary adjustment X-axis
\r
229 PartsWidth(in, &dlx1, &drx1);
\r
232 px1 = pngWidth / 2 - dlx1;
\r
236 pr1 = (double)basewidth/(drx1 - dlx1);
\r
237 px1 = (pngWidth-basewidth)/2 - (double)(dlx1 * pr1);
\r
241 //temporary adjustment Y-axis
\r
242 PartsHeight(in, &dly1, &dry1);
\r
245 py1 = pngWidth / 2 - dly1;
\r
249 pry1 = (double)basewidth/(dry1 - dly1);
\r
250 py1 = (pngWidth-basewidth)/2 - (double)(dly1 * pry1);
\r
255 PartsWidth(in, &dlx1, &drx1);
\r
256 PartsHeight(in, &dly1, &dry1);
\r
261 CalcOptions(in, &mitsuT, &flg_boxT, &yokoT, &tateT);
\r
263 widthT = basewidth;
\r
264 heightT = basewidth;
\r
266 if(flg_boxT % 2 / 1 != 0){
\r
267 widthT = widthT - kWidth * 3;
\r
270 if(flg_boxT % 4 / 2 != 0){
\r
271 widthT = widthT - kWidth * 3;
\r
274 if(flg_boxT % 8 / 4 != 0){
\r
275 heightT = heightT - kWidth * 3;
\r
278 if(flg_boxT % 16 / 8 != 0){
\r
279 heightT = heightT - kWidth * 3;
\r
283 //especially get small the 'mouth'
\r
284 if(mode == 2 && flg_boxT % 16 == 15){
\r
285 widthT = widthT - kWidth * (max(0, 16 - (int)yokoT * 4));
\r
286 heightT = heightT - kWidth * (max(0, 16 - (int)tateT * 4));
\r
288 //'dot' as same as 'mouth'
\r
289 if(mode == 2 && tateT == 1 && yokoT == 1){
\r
290 widthT = pngWidth * 0.9 * 0.5;
\r
291 heightT = pngWidth * 0.9 * 0.5;
\r
295 if(flg_boxT % 64 / 32 != 0){
\r
296 buf = convertStroke(in->str, buf, &strokes);
\r
297 for(i = 0; i < strokes; i++){
\r
298 if(buf[i * 11 + 0] == 0) j = buf[i * 11 + 4];// j : center line
\r
301 k = max(j - dlx1, drx1 - j);// k : distance from center line
\r
302 pr1 = (basewidth * 0.5) / k;
\r
304 if(k == j - dlx1) px1 = 0;
\r
305 else px1 = pngWidth * 0.5 - j * pr1;
\r
311 px1 = pngWidth / 2 - dlx1;
\r
314 pr1 = (double)widthT/(drx1 - dlx1);
\r
315 px1 = pngWidth / 2 - (double)((dlx1 + drx1) / 2 * pr1);
\r
316 if(flg_boxT % 2 / 1 != 0 && flg_boxT % 4 / 2 == 0) px1 = px1 + kWidth * 1.5;
\r
317 if(flg_boxT % 2 / 1 == 0 && flg_boxT % 4 / 2 != 0) px1 = px1 - kWidth * 1.5;
\r
322 py1 = pngWidth / 2 - dly1;
\r
325 pry1 = (double)heightT/(dry1 - dly1);
\r
326 py1 = pngWidth / 2 - (double)((dly1 + dry1) / 2 * pry1);
\r
327 if(flg_boxT % 8 / 4 != 0 && flg_boxT % 16 / 8 == 0) py1 = py1 + kWidth * 1.5;
\r
328 if(flg_boxT % 8 / 4 == 0 && flg_boxT % 16 / 8 != 0) py1 = py1 - kWidth * 1.5;
\r
335 tf[2] = px1 + pr1 * 200;
\r
336 tf[3] = py1 + pry1 * 200;
\r
337 addStrokeWithTransform(in, 1, tf, out, 0);
\r
338 return kg_string_new(out->str);
\r
344 for(i = 0; i < canvasWidth; i++){
\r
345 for(j = 0; j < canvasHeight; j++){
\r
346 kageCanvas[j][i] = 0xFF;
\r
351 void CalcOptions(const KGString *in, int *mitsudo, int *flag, double *yoko, double *tate){
\r
352 int i, j, k, l, flg;
\r
353 int dlx1, drx1, dly1, dry1;
\r
361 tempShotai = kShotai;
\r
364 kShotai = tempShotai;
\r
365 DotsWidth(&dlx1, &drx1);
\r
366 DotsHeight(&dly1, &dry1);
\r
371 for(i = 0; i < pngWidth; i++){
\r
373 for(j = 0; j < kWidth; j++){
\r
374 if(kageCanvas[i][dlx1 + j] == 0) flg = 1;
\r
386 if(l > pngWidth * 0.9 / 4) *flag = *flag | 1;
\r
391 for(i = 0; i < pngWidth; i++){
\r
393 for(j = 0; j < kWidth; j++){
\r
394 if(kageCanvas[i][drx1 - j] == 0) flg = 1;
\r
404 if(l > pngWidth * 0.9 / 4) *flag = *flag | 2;
\r
409 for(i = 0; i < pngWidth; i++){
\r
411 for(j = 0; j < kWidth; j++){
\r
412 if(kageCanvas[dly1 + j][i] == 0) flg = 1;
\r
422 if(l > pngWidth * 0.9 / 4) *flag = *flag | 4;
\r
424 //check bottom side
\r
427 for(i = 0; i < pngWidth; i++){
\r
429 for(j = 0; j < kWidth; j++){
\r
430 if(kageCanvas[dry1 - j][i] == 0) flg = 1;
\r
440 if(l > pngWidth * 0.9 / 4) *flag = *flag | 8;
\r
444 for(i = 0; i < pngHeight; i++){
\r
445 for(j = 0; j < pngWidth; j++){
\r
446 if(kageCanvas[i][j] == 0) *mitsudo += 1;
\r
450 //calculate X-axis complexity
\r
452 for(i = dly1; i <= dry1; i++){
\r
455 for(j = dlx1; j <= drx1; j++){
\r
456 if(kageCanvas[i][j] == 0 &&
\r
457 kageCanvas[i][j+1] == 0 &&
\r
458 kageCanvas[i][j+2] == 0){
\r
464 else if(mode == 1) mode = 0;
\r
466 if(kari > *yoko) *yoko = kari;
\r
469 //calculate Y-axis complexity
\r
471 for(i = dlx1; i <= drx1; i++){
\r
474 for(j = dly1; j <= dry1; j++){
\r
475 if(kageCanvas[j][i] == 0 &&
\r
476 kageCanvas[j+1][i] == 0 &&
\r
477 kageCanvas[j+2][i] == 0){
\r
483 else if(mode == 1) mode = 0;
\r
485 if(kari > *tate) *tate = kari;
\r
488 //use user defined option if it exists
\r
489 buf = convertStroke(in->str, buf, &strokes);
\r
490 for(i = 0; i < strokes; i++){
\r
491 if(buf[i * 11 + 0] % 10 == 0){
\r
492 if(buf[i * 11 + 1] != 0) *yoko = (double)(buf[i * 11 + 1]) * 0.1;
\r
493 if(buf[i * 11 + 2] != 0) *tate = (double)(buf[i * 11 + 2]) * 0.1;
\r
494 if(buf[i * 11 + 3] != 0) *flag = *flag + buf[i * 11 + 3];
\r
500 void DoDrawParts(const KGString *in, const int lx1, const double rf1, const int ly1, const double rfy1){
\r
505 buf = convertStroke(in->str, buf, &strokes);
\r
506 for(i = 0; i < strokes; i++){
\r
507 dfDrawFont(buf[i * 11 + 0],
\r
510 buf[i * 11 + 3] * rf1 + lx1,
\r
511 buf[i * 11 + 4] * rfy1 + ly1,
\r
512 buf[i * 11 + 5] * rf1 + lx1,
\r
513 buf[i * 11 + 6] * rfy1 + ly1,
\r
514 buf[i * 11 + 7] * rf1 + lx1,
\r
515 buf[i * 11 + 8] * rfy1 + ly1,
\r
516 buf[i * 11 + 9] * rf1 + lx1,
\r
517 buf[i * 11 + 10] * rfy1 + ly1);
\r
522 void DoDrawMixFont(const KGString *in1,
\r
525 const KGString *in2,
\r
531 const double rfy2){
\r
536 buf = convertStroke(in1->str, buf, &strokes);
\r
537 for(i = 0; i < strokes; i++){
\r
538 dfDrawFont(buf[i * 11 + 0],
\r
541 buf[i * 11 + 3] * rf1 + lx1,
\r
542 buf[i * 11 + 4] * rfy1 + ly1,
\r
543 buf[i * 11 + 5] * rf1 + lx1,
\r
544 buf[i * 11 + 6] * rfy1 + ly1,
\r
545 buf[i * 11 + 7] * rf1 + lx1,
\r
546 buf[i * 11 + 8] * rfy1 + ly1,
\r
547 buf[i * 11 + 9] * rf1 + lx1,
\r
548 buf[i * 11 + 10] * rfy1 + ly1);
\r
552 buf = convertStroke(in2->str, buf, &strokes);
\r
553 for(i = 0; i < strokes; i++){
\r
554 dfDrawFont(buf[i * 11 + 0],
\r
557 buf[i * 11 + 3] * rf2 + lx2,
\r
558 buf[i * 11 + 4] * rfy2 + ly2,
\r
559 buf[i * 11 + 5] * rf2 + lx2,
\r
560 buf[i * 11 + 6] * rfy2 + ly2,
\r
561 buf[i * 11 + 7] * rf2 + lx2,
\r
562 buf[i * 11 + 8] * rfy2 + ly2,
\r
563 buf[i * 11 + 9] * rf2 + lx2,
\r
564 buf[i * 11 + 10] * rfy2 + ly2);
\r