csBoardWindow = DRAWABLE(currBoard);
}
+void
+SelectPieces(VariantClass v)
+{
+ int i;
+ for(i=0; i<2; i++) {
+ int p;
+ for(p=0; p<=(int)WhiteKing; p++)
+ pngPieceBitmaps[i][p] = pngPieceBitmaps2[i][p]; // defaults
+ if(v == VariantShogi) {
+ pngPieceBitmaps[i][(int)WhiteCannon] = pngPieceBitmaps2[i][(int)WhiteKing+1];
+ pngPieceBitmaps[i][(int)WhiteNightrider] = pngPieceBitmaps2[i][(int)WhiteKing+2];
+ pngPieceBitmaps[i][(int)WhiteSilver] = pngPieceBitmaps2[i][(int)WhiteKing+3];
+ pngPieceBitmaps[i][(int)WhiteGrasshopper] = pngPieceBitmaps2[i][(int)WhiteKing+4];
+ pngPieceBitmaps[i][(int)WhiteQueen] = pngPieceBitmaps2[i][(int)WhiteLance];
+ }
+#ifdef GOTHIC
+ if(v == VariantGothic) {
+ pngPieceBitmaps[i][(int)WhiteMarshall] = pngPieceBitmaps2[i][(int)WhiteSilver];
+ }
+#endif
+ if(v == VariantSChess) {
+ pngPieceBitmaps[i][(int)WhiteAngel] = pngPieceBitmaps2[i][(int)WhiteFalcon];
+ pngPieceBitmaps[i][(int)WhiteMarshall] = pngPieceBitmaps2[i][(int)WhiteAlfil];
+ }
+ }
+}
+
#define BoardSize int
void
InitDrawingSizes (BoardSize boardSize, int flags)
if(gameInfo.variant != oldVariant) { // and only if variant changed
- for(i=0; i<2; i++) {
- int p;
- for(p=0; p<=(int)WhiteKing; p++)
- pngPieceBitmaps[i][p] = pngPieceBitmaps2[i][p]; // defaults
- if(gameInfo.variant == VariantShogi) {
- pngPieceBitmaps[i][(int)WhiteCannon] = pngPieceBitmaps2[i][(int)WhiteKing+1];
- pngPieceBitmaps[i][(int)WhiteNightrider] = pngPieceBitmaps2[i][(int)WhiteKing+2];
- pngPieceBitmaps[i][(int)WhiteSilver] = pngPieceBitmaps2[i][(int)WhiteKing+3];
- pngPieceBitmaps[i][(int)WhiteGrasshopper] = pngPieceBitmaps2[i][(int)WhiteKing+4];
- pngPieceBitmaps[i][(int)WhiteQueen] = pngPieceBitmaps2[i][(int)WhiteLance];
- }
-#ifdef GOTHIC
- if(gameInfo.variant == VariantGothic) {
- pngPieceBitmaps[i][(int)WhiteMarshall] = pngPieceBitmaps2[i][(int)WhiteSilver];
- }
-#endif
- if(gameInfo.variant == VariantSChess) {
- pngPieceBitmaps[i][(int)WhiteAngel] = pngPieceBitmaps2[i][(int)WhiteFalcon];
- pngPieceBitmaps[i][(int)WhiteMarshall] = pngPieceBitmaps2[i][(int)WhiteAlfil];
- }
- }
+ SelectPieces(gameInfo.variant);
+
oldMono = -10; // kludge to force recreation of animation masks
oldVariant = gameInfo.variant;
}
oldMono = appData.monoMode;
}
+void
+ExposeRedraw (Option *graph, int x, int y, int w, int h)
+{ // copy a selected part of the buffer bitmap to the display
+ cairo_t *cr = cairo_create((cairo_surface_t *) graph->textValue);
+ cairo_set_source_surface(cr, (cairo_surface_t *) graph->choice, 0, 0);
+ cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
+ cairo_rectangle(cr, x, y, w, h);
+ cairo_fill(cr);
+ cairo_destroy(cr);
+}
+
static void
CreatePNGBoard (char *s, int kind)
{
char buf[MSG_SIZ];
RsvgHandle *svg=svgPieces[color][piece];
RsvgDimensionData svg_dimensions;
- GError **svgerror=NULL;
+ GError *svgerror=NULL;
cairo_surface_t *img;
cairo_t *cr;
snprintf(buf, MSG_SIZ, "%s/%s%s.svg", dir, color ? "Black" : "White", pngPieceNames[piece]);
- if(svg || *dir && (svg = rsvg_handle_new_from_file(buf,svgerror))) {
+ if(svg || *dir && (svg = rsvg_handle_new_from_file(buf, &svgerror))) {
rsvg_handle_get_dimensions(svg, &svg_dimensions);
img = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, squareSize, squareSize);
return svg;
}
+ if(svgerror)
+ g_error_free(svgerror);
return NULL;
}
if(!pngPieceImages[color][piece]) { // we don't have cached bitmap (implying we did not have cached svg)
if(*appData.pieceDirectory) { // user specified piece directory
snprintf(buf, MSG_SIZ, "%s/%s%s.png", appData.pieceDirectory, color ? "Black" : "White", pngPieceNames[piece]);
- pngPieceImages[color][piece] = img = cairo_image_surface_create_from_png (buf); // try if there are png pieces there
+ img = cairo_image_surface_create_from_png (buf); // try if there are png pieces there
if(cairo_surface_status(img) != CAIRO_STATUS_SUCCESS) { // there were not
svgPieces[color][piece] = LoadSVG(appData.pieceDirectory, color, piece); // so try if he has svg there
- }
+ } else pngPieceImages[color][piece] = img;
}
}
if(!pngPieceImages[color][piece]) { // we still did not manage to acquire a piece bitmap
- if(!(svgPieces[color][piece] = LoadSVG(appData.svgDirectory, color, piece))) // try to fall back on installed svg
- DisplayError(_("No default pieces installed\nSelect your own -pieceImageDirectory"), 0); // give up
+ static int warned = 0;
+ if(!(svgPieces[color][piece] = LoadSVG(SVGDIR, color, piece)) && !warned) { // try to fall back on installed svg
+ char *msg = _("No default pieces installed\nSelect your own -pieceImageDirectory");
+ printf("%s\n", msg); // give up
+ DisplayError(msg, 0);
+ warned = 1; // prevent error message being repeated for each piece type
+ }
}
img = pngPieceImages[color][piece];
// create new bitmap to hold scaled piece image (and remove any old)
if(pngPieceBitmaps2[color][piece]) cairo_surface_destroy (pngPieceBitmaps2[color][piece]);
pngPieceBitmaps2[color][piece] = cs = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, squareSize, squareSize);
- if(piece <= WhiteKing) pngPieceBitmaps[color][piece] = cs;
+
+ if(!img) return;
// scaled copying of the raw png image
cr = cairo_create(cs);
cairo_paint (cr);
cairo_destroy (cr);
- if(!appData.trueColors || !*appData.pieceDirectory && !appData.svgDirectory) { // operate on bitmap to color it (king-size hack...)
+ if(!appData.trueColors || !*appData.pieceDirectory) { // 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;
buf[i*stride + j] = c & 0xFF000000; // alpha channel is kept at same opacity
buf[i*stride + j] += ((int)(f*(p&0xFF0000)) & 0xFF0000) + ((int)(f*(p&0xFF00)) & 0xFF00) + (int)(f*(p&0xFF)); // add desired fraction of new color
if(color) buf[i*stride + j] += r | r << 8 | r << 16; // details on black pieces get their weight added in pure white
+ if(appData.monoMode) {
+ if(a < 64) buf[i*stride + j] = 0; // if not opaque enough, totally transparent
+ else if(2*r < a) buf[i*stride + j] = 0xFF000000; // if not light enough, totally black
+ else buf[i*stride + j] = 0xFFFFFFFF; // otherwise white
+ }
}
cairo_surface_mark_dirty(cs);
}
ScaleOnePiece(0, p);
ScaleOnePiece(1, p);
}
+ SelectPieces(gameInfo.variant);
}
void
InitDrawingParams (int reloadPieces)
{
int i, p;
- MakeColors();
if(reloadPieces)
for(i=0; i<2; i++) for(p=0; p<BlackPawn+4; p++) {
if(pngPieceImages[i][p]) cairo_surface_destroy(pngPieceImages[i][p]);
/* lines in X */
for (i = 0; i < BOARD_WIDTH + BOARD_HEIGHT + 2; i++)
{
- cairo_move_to (cr, gridSegments[i].x1 + odd, gridSegments[i].y1 + odd);
- cairo_line_to (cr, gridSegments[i].x2 + odd, gridSegments[i].y2 + odd);
+ int h = (gridSegments[i].y1 == gridSegments[i].y2); // horizontal
+ cairo_move_to (cr, gridSegments[i].x1 + !h*odd, gridSegments[i].y1 + h*odd);
+ cairo_line_to (cr, gridSegments[i].x2 + !h*odd, gridSegments[i].y2 + h*odd);
cairo_stroke (cr);
}