Add some data.
[chise/kage.git] / kagecgi / kagetool.c
index 77a2147..e3fc89b 100755 (executable)
@@ -10,8 +10,8 @@ void DotsWidth(int *dlx, int *drx){
        \r
     *dlx = 0;\r
     *drx = 0;\r
-    for(i = 0; i <= pngWidth && *dlx == 0; i++){\r
-               for(j = 0; j <= pngHeight; j++){\r
+    for(i = 0; i < canvasWidth && *dlx == 0; i++){\r
+               for(j = 0; j < canvasHeight; j++){\r
                        if(kageCanvas[j][i] == 0){\r
                                *dlx = i;\r
                                break;\r
@@ -19,8 +19,8 @@ void DotsWidth(int *dlx, int *drx){
                }\r
        }\r
        \r
-       for(i = pngWidth; i >= 0 && *drx == 0; i--){\r
-               for(j = 0; j <= pngHeight; j++){\r
+       for(i = canvasWidth - 1; i >= 0 && *drx == 0; i--){\r
+               for(j = 0; j < canvasHeight; j++){\r
                        if(kageCanvas[j][i] == 0){\r
                                *drx = i;\r
                                break;\r
@@ -34,8 +34,8 @@ void DotsHeight(int *dly, int *dry){
        \r
     *dly = 0;\r
        *dry = 0;\r
-    for(j = 0; j <= pngHeight && *dly == 0; j++){\r
-        for(i = 0; i <= pngWidth; i++){\r
+    for(j = 0; j < canvasHeight && *dly == 0; j++){\r
+        for(i = 0; i < canvasWidth; i++){\r
             if(kageCanvas[j][i] == 0){\r
                 *dly = j;\r
                 break;\r
@@ -43,8 +43,8 @@ void DotsHeight(int *dly, int *dry){
         }\r
     }\r
        \r
-    for(j = pngHeight; j >= 0 && *dry == 0; j--){\r
-        for(i = 0; i <= pngWidth; i++){\r
+    for(j = canvasHeight - 1; j >= 0 && *dry == 0; j--){\r
+        for(i = 0; i < canvasWidth; i++){\r
             if(kageCanvas[j][i] == 0){\r
                 *dry = j;\r
                 break;\r
@@ -54,33 +54,132 @@ void DotsHeight(int *dly, int *dry){
 }\r
 \r
 void PartsWidth(const KGString *in, int *lx, int *rx){\r
+       int tempShotai;\r
+    DrawBox();\r
+    tempShotai = kShotai;\r
+    kShotai = kGothic;\r
+    drawGlyph(in, 1);\r
+    kShotai = tempShotai;\r
+    DotsWidth(lx, rx);\r
+       /*\r
     int i;\r
        int *buf, strokes;\r
+       double t, x;\r
        \r
        *lx = 1000; *rx = 0;\r
        buf = convertStroke(in->str, buf, &strokes);\r
        \r
     for(i = 0; i < strokes; i++){\r
-        if(buf[i * 11 + 0] % 10 == 0) continue;\r
+               switch(buf[i * 11 + 0] % 10){\r
                \r
-        if(*lx > buf[i * 11 + 3]) *lx = buf[i * 11 + 3];\r
-               if(*rx < buf[i * 11 + 3]) *rx = buf[i * 11 + 3];\r
-        if(*lx > buf[i * 11 + 5]) *lx = buf[i * 11 + 5];\r
-        if(*rx < buf[i * 11 + 5]) *rx = buf[i * 11 + 5];\r
-               \r
-        if(buf[i * 11 + 0] % 10 == 2 || buf[i * 11 + 0] % 10 == 3 || buf[i * 11 + 0] % 10 == 8){\r
+               case 0:\r
+               case 9:\r
+                       break;\r
+               case 1:\r
+               if(*lx > buf[i * 11 + 3]) *lx = buf[i * 11 + 3];\r
+                       if(*rx < buf[i * 11 + 3]) *rx = buf[i * 11 + 3];\r
+               if(*lx > buf[i * 11 + 5]) *lx = buf[i * 11 + 5];\r
+               if(*rx < buf[i * 11 + 5]) *rx = buf[i * 11 + 5];\r
+                       break;\r
+               case 2:\r
+                       for(t = 0; t <= 1; t = t + 0.05){\r
+                               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
+                       if(*lx > x) *lx = x;\r
+                   if(*rx < x) *rx = x;\r
+                       }\r
+                       break;\r
+               case 3:\r
+               if(*lx > buf[i * 11 + 3]) *lx = buf[i * 11 + 3];\r
+                       if(*rx < buf[i * 11 + 3]) *rx = buf[i * 11 + 3];\r
+               if(*lx > buf[i * 11 + 5]) *lx = buf[i * 11 + 5];\r
+               if(*rx < buf[i * 11 + 5]) *rx = buf[i * 11 + 5];\r
                if(*lx > buf[i * 11 + 7]) *lx = buf[i * 11 + 7];\r
             if(*rx < buf[i * 11 + 7]) *rx = buf[i * 11 + 7];\r
+                       break;\r
+               case 6:\r
+                       for(t = 0; t < 1; t = t + 0.05){\r
+                               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
+                       if(*lx > x) *lx = x;\r
+                   if(*rx < x) *rx = x;\r
+                       }\r
+                       break;\r
+               case 7:\r
+               if(*lx > buf[i * 11 + 3]) *lx = buf[i * 11 + 3];\r
+                       if(*rx < buf[i * 11 + 3]) *rx = buf[i * 11 + 3];\r
+                       for(t = 0; t < 1; t = t + 0.05){\r
+                               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
+                       if(*lx > x) *lx = x;\r
+                   if(*rx < x) *rx = x;\r
+                       }\r
                }\r
-        if(buf[i * 11 + 0] % 10 == 4 || buf[i * 11 + 0] % 10 == 6 || buf[i * 11 + 0] % 10 == 7){\r
-               if(*lx > buf[i * 11 + 9]) *lx = buf[i * 11 + 9];\r
-               if(*rx < buf[i * 11 + 9]) *rx = buf[i * 11 + 9];\r
-        }\r
        }\r
        free(buf);\r
+       */\r
 }\r
 \r
 void PartsHeight(const KGString *in, int *ly, int *ry){\r
+       int tempShotai;\r
+    DrawBox();\r
+    tempShotai = kShotai;\r
+    kShotai = kGothic;\r
+    drawGlyph(in, 1);\r
+    kShotai = tempShotai;\r
+    DotsHeight(ly, ry);\r
+       /*\r
+    int i;\r
+       int *buf, strokes;\r
+       double t, y;\r
+       \r
+       *ly = 1000; *ry = 0;\r
+       buf = convertStroke(in->str, buf, &strokes);\r
+       \r
+    for(i = 0; i < strokes; i++){\r
+               switch(buf[i * 11 + 0] % 10){\r
+               \r
+               case 0:\r
+               case 9:\r
+                       break;\r
+               case 1:\r
+               if(*ly > buf[i * 11 + 4]) *ly = buf[i * 11 + 4];\r
+                       if(*ry < buf[i * 11 + 4]) *ry = buf[i * 11 + 4];\r
+               if(*ly > buf[i * 11 + 6]) *ly = buf[i * 11 + 6];\r
+               if(*ry < buf[i * 11 + 6]) *ry = buf[i * 11 + 6];\r
+                       break;\r
+               case 2:\r
+                       for(t = 0; t <= 1; t = t + 0.05){\r
+                               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
+                       if(*ly > y) *ly = y;\r
+                   if(*ry < y) *ry = y;\r
+                       }\r
+                       break;\r
+               case 3:\r
+               if(*ly > buf[i * 11 + 4]) *ly = buf[i * 11 + 4];\r
+                       if(*ry < buf[i * 11 + 4]) *ry = buf[i * 11 + 4];\r
+               if(*ly > buf[i * 11 + 6]) *ly = buf[i * 11 + 6];\r
+               if(*ry < buf[i * 11 + 6]) *ry = buf[i * 11 + 6];\r
+               if(*ly > buf[i * 11 + 8]) *ly = buf[i * 11 + 8];\r
+            if(*ry < buf[i * 11 + 8]) *ry = buf[i * 11 + 8];\r
+                       break;\r
+               case 6:\r
+                       for(t = 0; t < 1; t = t + 0.05){\r
+                               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
+                       if(*ly > y) *ly = y;\r
+                   if(*ry < y) *ry = y;\r
+                       }\r
+                       break;\r
+               case 7:\r
+               if(*ly > buf[i * 11 + 4]) *ly = buf[i * 11 + 4];\r
+                       if(*ry < buf[i * 11 + 4]) *ry = buf[i * 11 + 4];\r
+                       for(t = 0; t < 1; t = t + 0.05){\r
+                               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
+                       if(*ly > y) *ly = y;\r
+                   if(*ry < y) *ry = y;\r
+                       }\r
+               }\r
+       }\r
+       free(buf);\r
+       */\r
+       /*\r
     int i;\r
        int *buf, strokes;\r
        \r
@@ -105,6 +204,7 @@ void PartsHeight(const KGString *in, int *ly, int *ry){
         }\r
        }\r
        free(buf);\r
+       */\r
 }\r
 \r
 KGString * CalcSizes(const KGString *in, int mode){\r
@@ -191,28 +291,31 @@ KGString * CalcSizes(const KGString *in, int mode){
             heightT = pngWidth * 0.9 * 0.5;\r
         }\r
                \r
-               if(flg_boxT % 64 / 32 != 0){\r
-                       buf = convertStroke(in->str, buf, &strokes);\r
-                       for(i = 0; i < strokes; i++){\r
-                if(buf[i * 11 + 0] == 0) j = buf[i * 11 + 4];// j : center line\r
+          /*\r
+if(flg_boxT % 64 / 32 != 0){\r
+            buf = convertStroke(in->str, buf, &strokes);\r
+            for(i = 0; i < strokes; i++){\r
+              if(buf[i * 11 + 0] == 0) j = buf[i * 11 + 4];// j : center line\r
             }\r
             free(buf);\r
             k = max(j - dlx1, drx1 - j);// k : distance from center line\r
             pr1 = (basewidth * 0.5) / k;\r
-                       \r
+            \r
             if(k == j - dlx1) px1 = 0;\r
             else px1 = pngWidth * 0.5 - j * pr1;\r
-        }\r
-        else if(dlx1 == drx1){\r
+          }\r
+        else\r
+*/\r
+          if(dlx1 == drx1){\r
             pr1 = 1.0;\r
             px1 = pngWidth / 2 - dlx1;\r
-        }\r
-        else{\r
+          }\r
+          else{\r
             pr1 = (double)widthT/(drx1 - dlx1);\r
             px1 = pngWidth / 2 - (double)((dlx1 + drx1) / 2 * pr1);\r
             if(flg_boxT % 2 / 1 != 0 && flg_boxT % 4 / 2 == 0) px1 = px1 + kWidth * 1.5;\r
             if(flg_boxT % 2 / 1 == 0 && flg_boxT % 4 / 2 != 0) px1 = px1 - kWidth * 1.5;\r
-        }\r
+          }\r
                \r
         if(dly1 == dry1){\r
             pry1 = 1.0;\r
@@ -388,7 +491,7 @@ void CalcOptions(const KGString *in, int *mitsudo, int *flag, double *yoko, doub
         if(buf[i * 11 + 0] % 10 == 0){\r
             if(buf[i * 11 + 1] != 0) *yoko = (double)(buf[i * 11 + 1]) * 0.1;\r
             if(buf[i * 11 + 2] != 0) *tate = (double)(buf[i * 11 + 2]) * 0.1;\r
-            if(buf[i * 11 + 3] != 0) *flag = *flag + buf[i * 11 + 3] * 16;\r
+            if(buf[i * 11 + 3] != 0) *flag = *flag + buf[i * 11 + 3];\r
         }\r
     }\r
     free(buf);\r