From: Holger Schemel Date: Thu, 30 Nov 2023 22:26:52 +0000 (+0100) Subject: fixed invisible envelope request if request background is masked X-Git-Tag: 4.3.8.0~31 X-Git-Url: https://git.artsoft.org/?a=commitdiff_plain;h=d1a43a46fb2cf63ef5045a248f016305d70acdbb;p=rocksndiamonds.git fixed invisible envelope request if request background is masked When using "global.use_envelope_request: true" (to use envelope style request dialogs instead of door style request dialogs) together with "background.request.draw_masked: true" (to use a partially transparent background image for the request dialog), no request dialog is drawn at all (so the request dialog has to be answered blindly). This change fixes this problem. There are a few graphical bugs left (if the request dialog opens after a game was lost, asking to play again) which still have to be fixed. --- diff --git a/src/tools.c b/src/tools.c index 6086cf25..eb039fdd 100644 --- a/src/tools.c +++ b/src/tools.c @@ -3039,6 +3039,17 @@ static void PrepareEnvelopeRequestToScreen(Bitmap *bitmap, int sx, int sy, BlitBitmap(bitmap, request.bitmap, sx, sy, xsize, ysize, 0, 0); + // create masked surface for request bitmap, if needed + if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked) + { + SDL_Surface *surface = request.bitmap->surface; + SDL_Surface *surface_masked = request.bitmap->surface_masked; + + SDLBlitSurface(surface, surface_masked, 0, 0, xsize, ysize, 0, 0); + SDL_SetColorKey(surface_masked, SET_TRANSPARENT_PIXEL, + SDL_MapRGB(surface_masked->format, 0x00, 0x00, 0x00)); + } + SDLFreeBitmapTextures(request.bitmap); SDLCreateBitmapTextures(request.bitmap); @@ -3055,8 +3066,12 @@ void DrawEnvelopeRequestToScreen(int drawing_target) game.request_active_or_moving && drawing_target == DRAW_TO_SCREEN) { - BlitToScreen(request.bitmap, 0, 0, request.xsize, request.ysize, - request.sx, request.sy); + if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked) + BlitToScreenMasked(request.bitmap, 0, 0, request.xsize, request.ysize, + request.sx, request.sy); + else + BlitToScreen(request.bitmap, 0, 0, request.xsize, request.ysize, + request.sx, request.sy); } } @@ -3210,6 +3225,24 @@ static void DrawEnvelopeRequest(char *text) // store readily prepared envelope request for later use when animating BlitBitmap(backbuffer, bitmap_db_store_2, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + // create masked surface for request bitmap, if needed + if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked) + { + if (bitmap_db_store_2->surface_masked == NULL) + { + if ((bitmap_db_store_2->surface_masked = + SDLGetNativeSurface(bitmap_db_store_2->surface)) == NULL) + Fail("SDLGetNativeSurface() failed"); + } + + SDL_Surface *surface = bitmap_db_store_2->surface; + SDL_Surface *surface_masked = bitmap_db_store_2->surface_masked; + + SDLBlitSurface(surface, surface_masked, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + SDL_SetColorKey(surface_masked, SET_TRANSPARENT_PIXEL, + SDL_MapRGB(surface_masked->format, 0x00, 0x00, 0x00)); + } + PrepareEnvelopeRequestToScreen(bitmap_db_store_2, sx, sy, width, height); if (text_door_style) @@ -4546,7 +4579,10 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) if (global.use_envelope_request) { // copy current state of request area to middle of playfield area - BlitBitmap(bitmap_db_store_2, drawto, sx, sy, width, height, sx, sy); + if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked) + BlitBitmapMasked(bitmap_db_store_2, drawto, sx, sy, width, height, sx, sy); + else + BlitBitmap(bitmap_db_store_2, drawto, sx, sy, width, height, sx, sy); } }