From d1a43a46fb2cf63ef5045a248f016305d70acdbb Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Thu, 30 Nov 2023 23:26:52 +0100 Subject: [PATCH] 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. --- src/tools.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) 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); } } -- 2.34.1