option to flip the board - chess-puzzles - chess puzzle book generator | |
git clone git://git.codemadness.org/chess-puzzles | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 3d921c8e0e2011ae994e508e89fc71086fffd598 | |
parent 3c9f4a2be304b3f0d197d69bea715ee0c9e29570 | |
Author: Hiltjo Posthuma <[email protected]> | |
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(-) | |
--- | |
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… | |
@@ -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] ? lightsquareh… | |
@@ -185,11 +190,11 @@ svg_showboard(void) | |
} | |
printf("<g><rect x=\"%d\" y=\"%d\" width=\"45\" height… | |
- 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… | |
+ printf("<g transform=\"translate(%d %d)\">", i… | |
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 : ligh… | |
- else | |
- color = highlight[y][x] ? darksquarehi : darks… | |
+ 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… | |
+ else | |
+ color = highlight[y][x] ? lightsquareh… | |
+ } else { | |
+ if (y % 2 == 0) | |
+ color = highlight[y][x] ? lightsquareh… | |
+ else | |
+ color = highlight[y][x] ? darksquarehi… | |
+ } | |
+ | |
printf("<text x=\"%d\" y=\"%d\" fill=\"#%02x%02x%02x\"… | |
- (x + 1) * 45 - 2, (y * 45) + 10, color[0], col… | |
+ (ix + 1) * 45 - 2, (iy * 45) + 10, color[0], c… | |
} | |
- y = 7; | |
- for (x = 0; x < 8; x++) { | |
- if (x % 2 == 0) | |
- color = highlight[y][x] ? lightsquarehi : ligh… | |
- else | |
- color = highlight[y][x] ? darksquarehi : darks… | |
+ 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… | |
+ else | |
+ color = highlight[y][x] ? lightsquareh… | |
+ } else { | |
+ if (y % 2 == 0) | |
+ color = highlight[y][x] ? lightsquareh… | |
+ else | |
+ color = highlight[y][x] ? darksquarehi… | |
+ } | |
+ | |
printf("<text x=\"%d\" y=\"%d\" fill=\"#%02x%02x%02x\"… | |
- (x * 45) + 2, (y + 1) * 45 - 3, color[0], colo… | |
+ (ix * 45) + 2, (iy + 1) * 45 - 3, color[0], co… | |
} | |
} | |
@@ -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] ? lightsquareh… | |
@@ -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') { | |