Add some data.
[chise/kage.git] / kagecgi / kagetool.c
index 8254e05..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
@@ -53,34 +53,133 @@ void DotsHeight(int *dly, int *dry){
     }\r
 }\r
 \r
-void PartsWidth(const GString *in, int *lx, int *rx){\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 GString *in, int *ly, int *ry){\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,9 +204,10 @@ void PartsHeight(const GString *in, int *ly, int *ry){
         }\r
        }\r
        free(buf);\r
+       */\r
 }\r
 \r
-GString * CalcSizes(const GString *in, int mode){\r
+KGString * CalcSizes(const KGString *in, int mode){\r
     int i, j, k, basewidth, one_lineX, one_lineY;\r
     int dlx1, drx1, dly1, dry1;\r
        int px1, py1;\r
@@ -119,9 +219,9 @@ GString * CalcSizes(const GString *in, int mode){
        \r
        int *buf, strokes;\r
        int tf[12];\r
-       GString *out;\r
+       KGString *out;\r
        \r
-       out = g_string_new("");\r
+       out = kg_string_new("");\r
     basewidth = pngWidth * 0.9;\r
        \r
     if(mode == 0){\r
@@ -191,28 +291,31 @@ GString * CalcSizes(const GString *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
@@ -232,7 +335,7 @@ GString * CalcSizes(const GString *in, int mode){
        tf[2] = px1 + pr1 * 200;\r
        tf[3] = py1 + pry1 * 200;\r
        addStrokeWithTransform(in, 1, tf, out, 0);\r
-       return g_string_new(out->str);\r
+       return kg_string_new(out->str);\r
 }\r
 \r
 void DrawBox(){\r
@@ -245,7 +348,7 @@ void DrawBox(){
        }\r
 }\r
 \r
-void CalcOptions(const GString *in, int *mitsudo, int *flag, double *yoko, double *tate){\r
+void CalcOptions(const KGString *in, int *mitsudo, int *flag, double *yoko, double *tate){\r
     int i, j, k, l, flg;\r
     int dlx1, drx1, dly1, dry1;\r
     int kari, mode;\r
@@ -386,15 +489,15 @@ void CalcOptions(const GString *in, int *mitsudo, int *flag, double *yoko, doubl
        buf = convertStroke(in->str, buf, &strokes);\r
        for(i = 0; i < strokes; i++){\r
         if(buf[i * 11 + 0] % 10 == 0){\r
-            if(buf[i * 11 + 1] != 0){ *yoko = (double)(buf[i * 11 + 1]) * 0.1;fprintf(stderr,"@@@@@\r\n");}\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
 }\r
 \r
-void DoDrawParts(const GString *in, const int lx1, const double rf1, const int ly1, const double rfy1){\r
+void DoDrawParts(const KGString *in, const int lx1, const double rf1, const int ly1, const double rfy1){\r
     int i;\r
        int *buf, strokes;\r
        \r
@@ -416,10 +519,10 @@ void DoDrawParts(const GString *in, const int lx1, const double rf1, const int l
        free(buf);\r
 }\r
 \r
-void DoDrawMixFont(const GString *in1,\r
+void DoDrawMixFont(const KGString *in1,\r
  const int lx1,\r
  const double rf1,\r
- const GString *in2,\r
+ const KGString *in2,\r
  const int lx2,\r
  const double rf2,\r
  const int ly1,\r