option to flip the board - chess-puzzles - chess puzzle book generator
 (HTM) git clone git://git.codemadness.org/chess-puzzles
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 3d921c8e0e2011ae994e508e89fc71086fffd598
 (DIR) parent 3c9f4a2be304b3f0d197d69bea715ee0c9e29570
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Wed, 20 Dec 2023 21:54:11 +0100
       
       option to flip the board
       
       Diffstat:
         M fen_to_svg.c                        |     115 +++++++++++++++++++++----------
       
       1 file changed, 80 insertions(+), 35 deletions(-)
       ---
 (DIR) diff --git a/fen_to_svg.c b/fen_to_svg.c
       @@ -1,4 +1,4 @@
       -/* TODO: option to flip board? */
       +/* TODO: output for PGN notation for moves */
        
        #include <ctype.h>
        #include <stdio.h>
       @@ -26,7 +26,8 @@ static const int lightsquare[] = { 0xf0, 0xd9, 0xb5 };
        static const int darksquarehi[] = { 0xaa, 0xa2, 0x3a };
        static const int lightsquarehi[] = { 0xcd, 0xd2, 0x6a };
        
       -static const int showcoords = 1; /* config: show board coordinates? */
       +static int showcoords = 1; /* config: show board coordinates? */
       +static int flipboard = 0; /* config: flip board ? */
        
        int
        isvalidsquare(int x, int y)
       @@ -159,7 +160,7 @@ void
        svg_showboard(void)
        {
                const int *color;
       -        int x, y, piece;
       +        int ix, iy, x, y, piece;
        
                fputs("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
                        "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"
       @@ -170,8 +171,12 @@ svg_showboard(void)
                showboardfen();
                fputs(" -->\n", stdout);
        
       -        for (y = 0; y < 8; y++) {
       -                for (x = 0; x < 8; x++) {
       +        for (iy = 0; iy < 8; iy++) {
       +                y = flipboard ? 7 - iy : iy;
       +
       +                for (ix = 0; ix < 8; ix++) {
       +                        x = flipboard ? 7 - ix : ix;
       +
                                if (x % 2 == 0) {
                                        if (y % 2 == 0)
                                                color = highlight[y][x] ? lightsquarehi : lightsquare;
       @@ -185,11 +190,11 @@ svg_showboard(void)
                                }
        
                                printf("<g><rect x=\"%d\" y=\"%d\" width=\"45\" height=\"45\" fill=\"#%02x%02x%02x\"/></g>\n",
       -                                x * 45, y * 45, color[0], color[1], color[2]);
       +                                ix * 45, iy * 45, color[0], color[1], color[2]);
        
                                piece = getpiece(x, y);
                                if (piece) {
       -                                printf("<g transform=\"translate(%d %d)\">", x * 45, y * 45);
       +                                printf("<g transform=\"translate(%d %d)\">", ix * 45, iy * 45);
                                        svg_showpiece(piece);
                                        fputs("</g>\n", stdout);
                                }
       @@ -197,23 +202,47 @@ svg_showboard(void)
                }
        
                if (showcoords) {
       -                x = 7;
       -                for (y = 0; y < 8; y++) {
       -                        if (y % 2 == 0)
       -                                color = highlight[y][x] ? lightsquarehi : lightsquare;
       -                        else
       -                                color = highlight[y][x] ? darksquarehi : darksquare;
       +                ix = 7;
       +                x = flipboard ? 0 : 7;
       +                for (iy = 0; iy < 8; iy++) {
       +                        y = flipboard ? 7 - iy : iy;
       +
       +                        /* inverse square color for text */
       +                        if (x % 2 == 0) {
       +                                if (y % 2 == 0)
       +                                        color = highlight[y][x] ? darksquarehi : darksquare;
       +                                else
       +                                        color = highlight[y][x] ? lightsquarehi : lightsquare;
       +                        } else {
       +                                if (y % 2 == 0)
       +                                        color = highlight[y][x] ? lightsquarehi : lightsquare;
       +                                else
       +                                        color = highlight[y][x] ? darksquarehi : darksquare;
       +                        }
       +
                                printf("<text x=\"%d\" y=\"%d\" fill=\"#%02x%02x%02x\" text-anchor=\"end\" style=\"font-family: sans-serif; font-size: 10px\">%c</text>\n",
       -                                (x + 1) * 45 - 2, (y * 45) + 10, color[0], color[1], color[2], '8' - y);
       +                                (ix + 1) * 45 - 2, (iy * 45) + 10, color[0], color[1], color[2], '8' - y);
                        }
       -                y = 7;
       -                for (x = 0; x < 8; x++) {
       -                        if (x % 2 == 0)
       -                                color = highlight[y][x] ? lightsquarehi : lightsquare;
       -                        else
       -                                color = highlight[y][x] ? darksquarehi : darksquare;
       +                iy = 7;
       +                y = flipboard ? 0 : 7;
       +                for (ix = 0; ix < 8; ix++) {
       +                        x = flipboard ? 7 - ix : ix;
       +
       +                        /* inverse square color for text */
       +                        if (x % 2 == 0) {
       +                                if (y % 2 == 0)
       +                                        color = highlight[y][x] ? darksquarehi : darksquare;
       +                                else
       +                                        color = highlight[y][x] ? lightsquarehi : lightsquare;
       +                        } else {
       +                                if (y % 2 == 0)
       +                                        color = highlight[y][x] ? lightsquarehi : lightsquare;
       +                                else
       +                                        color = highlight[y][x] ? darksquarehi : darksquare;
       +                        }
       +
                                printf("<text x=\"%d\" y=\"%d\" fill=\"#%02x%02x%02x\" text-anchor=\"start\" style=\"font-family: sans-serif; font-size: 10px\">%c</text>\n",
       -                                (x * 45) + 2, (y + 1) * 45 - 3, color[0], color[1], color[2], x + 'a');
       +                                (ix * 45) + 2, (iy + 1) * 45 - 3, color[0], color[1], color[2], x + 'a');
                        }
                }
        
       @@ -255,7 +284,7 @@ void
        tty_showboard(void)
        {
                const int *color;
       -        int x, y, piece;
       +        int ix, iy, x, y, piece;
        
                printf("Board FEN:\n");
                showboardfen();
       @@ -271,13 +300,17 @@ tty_showboard(void)
                SETFGCOLOR(0x00, 0x00, 0x00);
                putchar('\n');
        
       -        for (y = 0; y < 8; y++) {
       +        for (iy = 0; iy < 8; iy++) {
       +                y = flipboard ? 7 - iy : iy;
       +
                        color = border;
                        SETBGCOLOR(color[0], color[1], color[2]);
                        SETFGCOLOR(0xff, 0xff, 0xff);
                        fputs("  ", stdout);
        
       -                for (x = 0; x < 8; x++) {
       +                for (ix = 0; ix < 8; ix++) {
       +                        x = flipboard ? 7 - ix : ix;
       +
                                if (x % 2 == 0) {
                                        if (y % 2 == 0)
                                                color = highlight[y][x] ? lightsquarehi : lightsquare;
       @@ -326,10 +359,14 @@ tty_showboard(void)
                color = border;
                SETBGCOLOR(color[0], color[1], color[2]);
                SETFGCOLOR(0xff, 0xff, 0xff);
       -        if (showcoords)
       -                fputs("   a  b  c  d  e  f  g  h    ", stdout);
       -        else
       +        if (showcoords) {
       +                if (flipboard)
       +                        fputs("   h  g  f  e  d  c  b  a    ", stdout);
       +                else
       +                        fputs("   a  b  c  d  e  f  g  h    ", stdout);
       +        } else {
                        fputs("                             ", stdout);
       +        }
                printf("\x1b[0m"); /* reset */
                printf("\n");
        }
       @@ -355,15 +392,19 @@ ascii_showboard(void)
                int hi[3] = { '>', ' ', '<' };
                int dark[3] = { '.', '.', '.' };
                int light[3] = { ' ', ' ', ' ' };
       -        int *color, x, y, piece;
       +        int *color, ix, iy, x, y, piece;
        
                printf("Board FEN:\n");
                showboardfen();
                printf("\n\n");
        
       -        for (y = 0; y < 8; y++) {
       +        for (iy = 0; iy < 8; iy++) {
       +                y = flipboard ? 7 - iy : iy;
       +
                        fputs("+---+---+---+---+---+---+---+---+\n", stdout);
       -                for (x = 0; x < 8; x++) {
       +                for (ix = 0; ix < 8; ix++) {
       +                        x = flipboard ? 7 - ix : ix;
       +
                                if (x % 2 == 0) {
                                        if (y % 2 == 0)
                                                color = highlight[y][x] ? hi : light;
       @@ -375,8 +416,8 @@ ascii_showboard(void)
                                        else
                                                color = highlight[y][x] ? hi : light;
                                }
       -                
       -                        if (x == 0)
       +
       +                        if (ix == 0)
                                        putchar('|');
                                putchar(color[0]);
                                piece = getpiece(x, y);
       @@ -394,8 +435,12 @@ ascii_showboard(void)
                        putchar('\n');
                }
                fputs("+---+---+---+---+---+---+---+---+\n", stdout);
       -        if (showcoords)
       -                printf("  a | b | c | d | e | f | g | h |\n");
       +        if (showcoords) {
       +                if (flipboard)
       +                        printf("  h | g | f | e | d | c | b | a |\n");
       +                else
       +                        printf("  a | b | c | d | e | f | g | h |\n");
       +        }
        
                fputs("\n", stdout);
        }
       @@ -467,7 +512,7 @@ main(int argc, char *argv[])
                                        black_can_castle[1] = 1;
                                }
                                break;
       -                case 3: /* TODO: en-passant square, rest of the fields */
       +                case 3: /* en passant square */
                                if (*s >= 'a' && *s <= 'h' &&
                                        *(s + 1) >= '1' && *(s + 1) >= '6') {