Bugfix.
[chise/kage.git] / kagecgi / kagecd.c
index 93fc8e2..62d1afe 100755 (executable)
@@ -2,17 +2,16 @@
 //\r
 #include "kage.h"\r
 \r
-void cdDrawCurve(int x1, int y1,\r
-       int x2, int y2,\r
-       int x3, int y3,\r
+void cdDrawCurve(double x1, double y1,\r
+       double x2, double y2,\r
+       double x3, double y3,\r
        int a1, int a2){\r
 \r
        double rad, t;\r
        double x, y, v;\r
        double ix, iy, ia, ib, ir;\r
-       int ox1, oy1, ox2, oy2;\r
        int count, tt;\r
-       int delta;\r
+       double delta;\r
        double deltad;\r
        double XX, XY, YX, YY;\r
        \r
@@ -97,7 +96,7 @@ void cdDrawCurve(int x1, int y1,
                \r
                //line SUICHOKU by vector\r
                if(ix != 0 && iy != 0){\r
-                       ir = atan(iy / ix * -1.0);\r
+                       ir = atan(iy / ix * -1);\r
                        ia = sin(ir) * (double)(kMinWidthT);\r
                        ib = cos(ir) * (double)(kMinWidthT);\r
                }\r
@@ -120,26 +119,17 @@ void cdDrawCurve(int x1, int y1,
                ia = ia * deltad;\r
                ib = ib * deltad;\r
                \r
-               //swap if two lines are crossing\r
-               if(((x + ia) - ox1) * ((x + ia) - ox1) +\r
-                       ((y + ib) - oy1) * ((y + ib) - oy1) >\r
-                       ((x - ia) - ox1) * ((x - ia) - ox1) +\r
-                       ((y - ib) - oy1) * ((y - ib) - oy1) && count != 0){\r
-                       ia = ia * -1;\r
-                       ib = ib * -1;\r
+               //reverse if vector is going 2nd/3rd quadrants\r
+               if(ix <= 0){\r
+                 ia = ia * -1;\r
+                 ib = ib * -1;\r
                }\r
                \r
-               //copy as an old point\r
-               ox1 = x + ia;\r
-               oy1 = y + ib;\r
-               ox2 = x - ia;\r
-               oy2 = y - ib;\r
-               \r
                //copy to polygon structuer\r
-               poly[count].X = x + ia;\r
-               poly[count].Y = y + ib;\r
-               poly[(1000 / kRate + 1) * 2 - 1 - count].X = x - ia;\r
-               poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y - ib;\r
+               poly[count].X = x - ia;\r
+               poly[count].Y = y - ib;\r
+               poly[(1000 / kRate + 1) * 2 - 1 - count].X = x + ia;\r
+               poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y + ib;\r
                count += 1;\r
        }\r
        \r
@@ -553,27 +543,18 @@ void cdDrawCurve(int x1, int y1,
                                        ib = kWidth;\r
                                }\r
                        }\r
-                       \r
-                       //if it is crossing, swap each other\r
-                       if(((x + ia) - ox1) * ((x + ia) - ox1) +\r
-                               ((y + ib) - oy1) * ((y + ib) - oy1) >\r
-                               ((x - ia) - ox1) * ((x - ia) - ox1) +\r
-                               ((y - ib) - oy1) * ((y - ib) - oy1) && count != 0){\r
-                               ia = ia * -1;\r
-                               ib = ib * -1;\r
+\r
+                       //reverse if vector is going 2nd/3rd quadrants\r
+                       if(ix <= 0){\r
+                         ia = ia * -1;\r
+                         ib = ib * -1;\r
                        }\r
-                       \r
-                       //save old points for calculate crossing\r
-                       ox1 = x + ia;\r
-                       oy1 = y + ib;\r
-                       ox2 = x - ia;\r
-                       oy2 = y - ib;\r
-                       \r
+               \r
                        //save to polygon\r
-                       poly[count].X = x + ia;\r
-                       poly[count].Y = y + ib;\r
-                       poly[(1000 / kRate + 1) * 2 - 1 - count].X = x - ia;\r
-                       poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y - ib;\r
+                       poly[count].X = x - ia;\r
+                       poly[count].Y = y - ib;\r
+                       poly[(1000 / kRate + 1) * 2 - 1 - count].X = x + ia;\r
+                       poly[(1000 / kRate + 1) * 2 - 1 - count].Y = y + ib;\r
                        count += 1;\r
                }\r
                \r
@@ -581,9 +562,10 @@ void cdDrawCurve(int x1, int y1,
        }\r
 }\r
 \r
-void cdDrawLine(int tx1, int ty1, int tx2, int ty2, int ta1, int ta2){\r
+void cdDrawLine(double tx1, double ty1, double tx2, double ty2, int ta1, int ta2){\r
        double rad;\r
-       int v, x1, y1, x2, y2, a1, a2;\r
+       double v, x1, y1, x2, y2;\r
+       int a1, a2;\r
        double XX, XY, YX, YY;\r
        \r
        if(kShotai == kMincho){ //mincho\r
@@ -597,71 +579,71 @@ void cdDrawLine(int tx1, int ty1, int tx2, int ty2, int ta1, int ta2){
                if(x1 == x2){ //if TATE stroke, use y-axis\r
                        switch(a1){\r
                        case 0:\r
-                               poly[0].X = x1 - kMinWidthT;\r
-                               poly[0].Y = y1 - kMinWidthY / 2;\r
-                               poly[3].X = x1 + kMinWidthT;\r
-                               poly[3].Y = y1 + kMinWidthY / 2;\r
+                               poly[3].X = x1 - kMinWidthT;\r
+                               poly[3].Y = y1 - kMinWidthY / 2;\r
+                               poly[0].X = x1 + kMinWidthT;\r
+                               poly[0].Y = y1 + kMinWidthY / 2;\r
                                break;\r
                        case 1:\r
                        case 6:\r
                        case 22:\r
-                               poly[0].X = x1 - kMinWidthT;\r
-                               poly[0].Y = y1;\r
-                               poly[3].X = x1 + kMinWidthT;\r
+                               poly[3].X = x1 - kMinWidthT;\r
                                poly[3].Y = y1;\r
+                               poly[0].X = x1 + kMinWidthT;\r
+                               poly[0].Y = y1;\r
                                break;\r
                        case 12:\r
-                               poly[0].X = x1 - kMinWidthT;\r
-                               poly[0].Y = y1 - kMinWidthY - kMinWidthT;\r
-                               poly[3].X = x1 + kMinWidthT;\r
-                               poly[3].Y = y1 - kMinWidthY;\r
+                               poly[3].X = x1 - kMinWidthT;\r
+                               poly[3].Y = y1 - kMinWidthY - kMinWidthT;\r
+                               poly[0].X = x1 + kMinWidthT;\r
+                               poly[0].Y = y1 - kMinWidthY;\r
                                break;\r
                        case 32:\r
-                               poly[0].X = x1 - kMinWidthT;\r
-                               poly[0].Y = y1 - kMinWidthY;\r
-                               poly[3].X = x1 + kMinWidthT;\r
+                               poly[3].X = x1 - kMinWidthT;\r
                                poly[3].Y = y1 - kMinWidthY;\r
+                               poly[0].X = x1 + kMinWidthT;\r
+                               poly[0].Y = y1 - kMinWidthY;\r
                                break;\r
                        }\r
                        \r
                        switch(a2){\r
                        case 0:\r
                                if(a1 == 6){ //KAGI's tail\r
-                                       poly[1].X = x2 - kMinWidthT;\r
-                                       poly[1].Y = y2;\r
-                                       poly[2].X = x2 + kMinWidthT;\r
+                                       poly[2].X = x2 - kMinWidthT;\r
                                        poly[2].Y = y2;\r
+                                       poly[1].X = x2 + kMinWidthT;\r
+                                       poly[1].Y = y2;\r
                                }\r
                                else{\r
-                                       poly[1].X = x2 - kMinWidthT;\r
-                                       poly[1].Y = y2 + kMinWidthT / 2;\r
-                                       poly[2].X = x2 + kMinWidthT;\r
-                                       poly[2].Y = y2 - kMinWidthT / 2;\r
+                                       poly[2].X = x2 - kMinWidthT;\r
+                                       poly[2].Y = y2 + kMinWidthT / 2;\r
+                                       poly[1].X = x2 + kMinWidthT;\r
+                                       poly[1].Y = y2 - kMinWidthT / 2;\r
                                }\r
                                break;\r
                        case 1:\r
-                               poly[1].X = x2 - kMinWidthT;\r
-                               poly[1].Y = y2;\r
-                               poly[2].X = x2 + kMinWidthT;\r
+                               poly[2].X = x2 - kMinWidthT;\r
                                poly[2].Y = y2;\r
+                               poly[1].X = x2 + kMinWidthT;\r
+                               poly[1].Y = y2;\r
                                break;\r
                        case 13:\r
-                               poly[1].X = x2 - kMinWidthT;\r
-                               poly[1].Y = y2 + kWidth * kKakato + kMinWidthT;\r
-                               poly[2].X = x2 + kMinWidthT;\r
-                               poly[2].Y = y2 + kWidth * kKakato;\r
+                               poly[2].X = x2 - kMinWidthT;\r
+                               poly[2].Y = y2 + kWidth * kKakato + kMinWidthT;\r
+                               poly[1].X = x2 + kMinWidthT;\r
+                               poly[1].Y = y2 + kWidth * kKakato;\r
                                break;\r
                        case 23:\r
-                               poly[1].X = x2 - kMinWidthT;\r
-                               poly[1].Y = y2 + kWidth * kKakato * 0.5 + kMinWidthT;\r
-                               poly[2].X = x2 + kMinWidthT;\r
-                               poly[2].Y = y2 + kWidth * kKakato * 0.5;\r
+                               poly[2].X = x2 - kMinWidthT;\r
+                               poly[2].Y = y2 + kWidth * kKakato * 0.5 + kMinWidthT;\r
+                               poly[1].X = x2 + kMinWidthT;\r
+                               poly[1].Y = y2 + kWidth * kKakato * 0.5;\r
                                break;\r
                        case 32:\r
-                               poly[1].X = x2 - kMinWidthT;\r
-                               poly[1].Y = y2 + kMinWidthY;\r
-                               poly[2].X = x2 + kMinWidthT;\r
+                               poly[2].X = x2 - kMinWidthT;\r
                                poly[2].Y = y2 + kMinWidthY;\r
+                               poly[1].X = x2 + kMinWidthT;\r
+                               poly[1].Y = y2 + kMinWidthY;\r
                                break;\r
                        }\r
                        \r
@@ -692,16 +674,16 @@ void cdDrawLine(int tx1, int ty1, int tx2, int ty2, int ta1, int ta2){
                        }\r
                        \r
                        if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU\r
-                               poly3[0].X = x2 - kMinWidthT;\r
-                               poly3[0].Y = y2;\r
-                               poly3[1].X = x2 - kMinWidthT * 0.6;\r
-                               poly3[1].Y = y2 + kMinWidthT * 0.6;\r
+                               poly3[4].X = x2 - kMinWidthT;\r
+                               poly3[4].Y = y2;\r
+                               poly3[3].X = x2 - kMinWidthT * 0.6;\r
+                               poly3[3].Y = y2 + kMinWidthT * 0.6;\r
                                poly3[2].X = x2;\r
                                poly3[2].Y = y2 + kMinWidthT;\r
-                               poly3[3].X = x2 + kMinWidthT * 0.6;\r
-                               poly3[3].Y = y2 + kMinWidthT * 0.6;\r
-                               poly3[4].X = x2 + kMinWidthT;\r
-                               poly3[4].Y = y2;\r
+                               poly3[1].X = x2 + kMinWidthT * 0.6;\r
+                               poly3[1].Y = y2 + kMinWidthT * 0.6;\r
+                               poly3[0].X = x2 + kMinWidthT;\r
+                               poly3[0].Y = y2;\r
                                icPolygon(poly3, 5);\r
                        }\r
                }\r
@@ -992,14 +974,14 @@ void cdDrawLine(int tx1, int ty1, int tx2, int ty2, int ta1, int ta2){
                        if(a1 % 10 == 3){ y1 = y1 - kWidth * kKakato; }\r
                        if(a2 % 10 == 3){ y2 = y2 + kWidth * kKakato; }\r
                        \r
-                       poly[0].X = x1 - kWidth;\r
-                       poly[0].Y = y1;\r
-                       poly[1].X = x2 - kWidth;\r
-                       poly[1].Y = y2;\r
-                       poly[2].X = x2 + kWidth;\r
-                       poly[2].Y = y2;\r
-                       poly[3].X = x1 + kWidth;\r
+                       poly[3].X = x1 - kWidth;\r
                        poly[3].Y = y1;\r
+                       poly[2].X = x2 - kWidth;\r
+                       poly[2].Y = y2;\r
+                       poly[1].X = x2 + kWidth;\r
+                       poly[1].Y = y2;\r
+                       poly[0].X = x1 + kWidth;\r
+                       poly[0].Y = y1;\r
                        \r
                        icPolygon(poly, 4);\r
                }\r