X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=draw.c;h=7ec60ae4e205c30d248d7aa52d56726691034d0e;hb=604256ed14dc82406197376be74f9fe4d1d7f9da;hp=2da2dd71bae4c41cc482bfb7c529604403db9c4d;hpb=31ca9325081d84c819031a2358877f1087dd0bf1;p=xboard.git diff --git a/draw.c b/draw.c index 2da2dd7..7ec60ae 100644 --- a/draw.c +++ b/draw.c @@ -200,6 +200,17 @@ InitDrawingSizes (BoardSize boardSize, int flags) 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) { @@ -276,8 +287,13 @@ ScaleOnePiece (int color, int piece) } 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]; @@ -287,6 +303,8 @@ ScaleOnePiece (int color, int 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); w = cairo_image_surface_get_width (img); @@ -296,7 +314,7 @@ ScaleOnePiece (int color, int piece) 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; @@ -311,6 +329,11 @@ ScaleOnePiece (int color, int piece) 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); } @@ -339,7 +362,6 @@ void InitDrawingParams (int reloadPieces) { int i, p; - MakeColors(); if(reloadPieces) for(i=0; i<2; i++) for(p=0; p