From 87c2133b5e998ff349a7aa2a8eb3026ff958c395 Mon Sep 17 00:00:00 2001 From: H.G. Muller Date: Fri, 12 Oct 2012 10:45:29 +0200 Subject: [PATCH] Install svg pieces in themes/default 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 | 3 ++- args.h | 7 +++---- common.h | 2 +- dialogs.c | 11 ++++------- draw.c | 42 +++++++++++++++++++++++++++--------------- xboard.conf.in | 1 + 6 files changed, 38 insertions(+), 28 deletions(-) diff --git a/Makefile.am b/Makefile.am index 53fc9b2..4671560 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 --- 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 }, diff --git a/common.h b/common.h index 68749f3..2fca8fb 100644 --- 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; diff --git a/dialogs.c b/dialogs.c index c27fdfe..a720a9f 100644 --- 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 --- 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); } } diff --git a/xboard.conf.in b/xboard.conf.in index 0e94d2c..d3ea7c7 100644 --- a/xboard.conf.in +++ b/xboard.conf.in @@ -23,6 +23,7 @@ -flashRate 5 -fontSizeTolerance 4 -useBoardTexture true +-fallbackPieceImageDirectory "@svgdir@" -liteBackTextureFile "@pngdir@/wood_l.png" -darkBackTextureFile "@pngdir@/wood_d.png" -overrideLineGap 1 -- 1.7.0.4