Install svg pieces in themes/default
authorH.G. Muller <h.g.muller@hccnet.nl>
Fri, 12 Oct 2012 08:45:29 +0000 (10:45 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Sun, 21 Oct 2012 09:28:23 +0000 (11:28 +0200)
The svg pieces are installed with the XBoard data in the directory
.../xboard/themes/default . A new option -fallbackPieceImageDirectory
is added, and is configured in the master settings file to point to
these pieces. This options, which replaces -svgDirectory, is volatile,
and the menu control to set it is removed. The -pngDirectory option
is renamed to -pieceImageDirectory (-pid).

Makefile.am
args.h
common.h
dialogs.c
draw.c
xboard.conf.in

index 53fc9b2..4671560 100644 (file)
@@ -75,7 +75,7 @@ mime_DATA = xboard.xml
 
 ### directory and files for svgs
 
-svgdir = $(datadir)/games/xboard/svg
+svgdir = $(datadir)/games/xboard/themes/default
 dist_svg_DATA = svg/icon_white.svg         svg/icon_black.svg      \
            svg/DarkSquare.svg         svg/LightSquare.svg svg/NeutralSquare.svg \
            svg/BlackAdvisor.svg       svg/WhiteAdvisor.svg    \
@@ -138,6 +138,7 @@ dist_sounds_DATA = \
 ### set correct dir in xboard.conf
 
 edit = sed -e 's|@pngdir[@]|$(pngdir)|g' \
+           -e 's|@svgdir[@]|$(svgdir)|g' \
            -e 's|@soundsdir[@]|$(soundsdir)|g'
 
 xboard.conf: Makefile $(srcdir)/xboard.conf.in
diff --git a/args.h b/args.h
index b91608d..6d9d3d0 100644 (file)
--- a/args.h
+++ b/args.h
@@ -211,10 +211,9 @@ ArgDescriptor argDescriptors[] = {
   { "xtitle", ArgFalse, (void *) &appData.titleInWindow, FALSE, INVALID },
   { "flashCount", ArgInt, (void *) &appData.flashCount, XBOARD, INVALID }, // let X handle this
   { "flashRate", ArgInt, (void *) &appData.flashRate, XBOARD, (ArgIniType) FLASH_RATE },
-  { "pngDirectory", ArgFilename, (void *) &appData.pngDirectory, XBOARD, (ArgIniType) "" },
-  { "png", ArgFilename, (void *) &appData.pngDirectory, FALSE, INVALID },
-  { "svgDirectory", ArgFilename, (void *) &appData.svgDirectory, XBOARD, (ArgIniType) "" },
-  { "svg", ArgFilename, (void *) &appData.svgDirectory, FALSE, INVALID },
+  { "pieceImageDirectory", ArgFilename, (void *) &appData.pieceDirectory, XBOARD, (ArgIniType) "" },
+  { "pid", ArgFilename, (void *) &appData.pieceDirectory, FALSE, INVALID },
+  { "fallbackPieceImageDirectory", ArgFilename, (void *) &appData.svgDirectory, FALSE, (ArgIniType) "" },
   { "trueColors", ArgBoolean, (void *) &appData.trueColors, TRUE, (ArgIniType) FALSE },
   { "soundDirectory", ArgFilename, (void *) &appData.soundDirectory, XBOARD, (ArgIniType) "" },
   { "msLoginDelay", ArgInt, (void *) &appData.msLoginDelay, XBOARD, (ArgIniType) MS_LOGIN_DELAY },
index 68749f3..2fca8fb 100644 (file)
--- a/common.h
+++ b/common.h
@@ -408,7 +408,7 @@ typedef struct {
     Boolean firstPlaysBlack;
     Boolean noChessProgram;
     char *host[ENGINES];
-    char *pngDirectory;
+    char *pieceDirectory;
     char *svgDirectory;
     char *soundDirectory;
     char *remoteShell;
index c27fdfe..a720a9f 100644 (file)
--- a/dialogs.c
+++ b/dialogs.c
@@ -752,14 +752,13 @@ SoundOptionsProc ()
 static void DefColor P((int n));
 static void AdjustColor P((int i));
 
-static char oldPngDir[MSG_SIZ];
-static char oldSvgDir[MSG_SIZ];
+static char oldPieceDir[MSG_SIZ];
 
 static int
 BoardOptionsOK (int n)
 {
     if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; else lineGap = defaultLineGap;
-    InitDrawingParams(strcmp(oldPngDir, appData.pngDirectory) || strcmp(oldSvgDir, appData.svgDirectory));
+    InitDrawingParams(strcmp(oldPieceDir, appData.pieceDirectory));
     InitDrawingSizes(-1, 0);
     DrawPosition(True, NULL);
     return 1;
@@ -814,8 +813,7 @@ static Option boardOptions[] = {
 { 0, 0, 0, NULL, (void*) &appData.liteBackTextureFile, ".xpm", NULL, FileName, N_("Light-Squares Texture File:") },
 { 0, 0, 0, NULL, (void*) &appData.darkBackTextureFile, ".xpm", NULL, FileName, N_("Dark-Squares Texture File:") },
 { 0, 0, 0, NULL, (void*) &appData.trueColors, "", NULL, CheckBox, N_("Use external piece bitmaps with their own colors") },
-{ 0, 0, 0, NULL, (void*) &appData.pngDirectory, "", NULL, PathName, N_("Directory with PNG Pieces:") },
-{ 0, 0, 0, NULL, (void*) &appData.svgDirectory, "", NULL, PathName, N_("Directory with SVG Pieces:") },
+{ 0, 0, 0, NULL, (void*) &appData.pieceDirectory, "", NULL, PathName, N_("Directory with Pieces Images:") },
 { 0, 0, 0, NULL, (void*) &BoardOptionsOK, "", NULL, EndMark , "" }
 };
 
@@ -864,8 +862,7 @@ AdjustColor (int i)
 void
 BoardOptionsProc ()
 {
-   strncpy(oldPngDir, appData.pngDirectory, MSG_SIZ-1); // to see if it changed
-   strncpy(oldSvgDir, appData.svgDirectory, MSG_SIZ-1); // to see if it changed
+   strncpy(oldPieceDir, appData.pieceDirectory, MSG_SIZ-1); // to see if it changed
    GenericPopUp(boardOptions, _("Board Options"), TransientDlg, BoardWindow, MODAL, 0);
 }
 
diff --git a/draw.c b/draw.c
index 340a54c..d317507 100644 (file)
--- a/draw.c
+++ b/draw.c
@@ -256,21 +256,17 @@ ConvertPixmap (int color, int piece)
   return res;
 }
 
-static void
-ScaleOnePiece (char *name, int color, int piece)
+int
+LoadSVG(char *dir, int color, int piece)
 {
-  float w, h;
-  char buf[MSG_SIZ];
+    char buf[MSG_SIZ];
   RsvgHandle *svg=NULL;
   RsvgDimensionData svg_dimensions;
   GError **svgerror=NULL;
-  cairo_surface_t *img, *cs;
+  cairo_surface_t *img;
   cairo_t *cr;
 
-  g_type_init ();
-
-  if(*appData.svgDirectory) { // try to freshly render svg pieces first, always from file, to supply the source bitmap
-    snprintf(buf, MSG_SIZ, "%s/%s%s.svg", appData.svgDirectory, color ? "Black" : "White", pngPieceNames[piece]);
+    snprintf(buf, MSG_SIZ, "%s/%s%s.svg", dir, color ? "Black" : "White", pngPieceNames[piece]);
 
     if(svg = rsvg_handle_new_from_file(buf,svgerror)) {
 
@@ -285,14 +281,30 @@ ScaleOnePiece (char *name, int color, int piece)
         pngPieceImages[color][piece] = img;
       }
       cairo_destroy(cr);
-
       rsvg_handle_close (svg,NULL);
+
+      return 1;
     }
+    return 0;
+}
+
+static void
+ScaleOnePiece (int color, int piece)
+{
+  float w, h;
+  char buf[MSG_SIZ];
+  cairo_surface_t *img, *cs;
+  cairo_t *cr;
+
+  g_type_init ();
+
+  if(*appData.svgDirectory) { // try to freshly render svg pieces first, always from file, to supply the source bitmap
+    LoadSVG(appData.svgDirectory, color, piece);
   }
 
   if((img = pngPieceImages[color][piece]) == NULL) { // if PNG file for this piece was not yet read, read it now and store it
-    if(!*appData.pngDirectory) img = ConvertPixmap(color, piece); else {
-      snprintf(buf, MSG_SIZ, "%s/%s%s.png", appData.pngDirectory, color ? "Black" : "White", pngPieceNames[piece]);
+    if(!*appData.pieceDirectory) img = ConvertPixmap(color, piece); else {
+      snprintf(buf, MSG_SIZ, "%s/%s%s.png", appData.pieceDirectory, color ? "Black" : "White", pngPieceNames[piece]);
       img = cairo_image_surface_create_from_png (buf);
       if(cairo_surface_status(img) != CAIRO_STATUS_SUCCESS) img = ConvertPixmap(color, piece);
     }
@@ -314,7 +326,7 @@ ScaleOnePiece (char *name, int color, int piece)
   cairo_paint (cr);
   cairo_destroy (cr);
 
-  if(!appData.trueColors || !*appData.pngDirectory && !appData.svgDirectory) { // operate on bitmap to color it (king-size hack...)
+  if(!appData.trueColors || !*appData.pieceDirectory && !appData.svgDirectory) { // operate on bitmap to color it (king-size hack...)
     int stride = cairo_image_surface_get_stride(cs)/4;
     int *buf = (int *) cairo_image_surface_get_data(cs);
     int i, j, p;
@@ -340,8 +352,8 @@ CreatePNGPieces ()
   int p;
 
   for(p=0; pngPieceNames[p]; p++) {
-    ScaleOnePiece(pngPieceNames[p], 0, p);
-    ScaleOnePiece(pngPieceNames[p], 1, p);
+    ScaleOnePiece(0, p);
+    ScaleOnePiece(1, p);
   }
 }
 
index 0e94d2c..d3ea7c7 100644 (file)
@@ -23,6 +23,7 @@
 -flashRate 5
 -fontSizeTolerance 4
 -useBoardTexture true
+-fallbackPieceImageDirectory "@svgdir@"
 -liteBackTextureFile  "@pngdir@/wood_l.png"
 -darkBackTextureFile  "@pngdir@/wood_d.png"
 -overrideLineGap 1