From ab1b88fdff55c78b506bfe5ff18d45723be0d2a9 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Fri, 18 Dec 2020 02:24:11 +0100 Subject: [PATCH] added storing active or opening/closing request dialog area into texture --- src/main.h | 5 +++++ src/tools.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/main.h b/src/main.h index 6dc9881f..4745e393 100644 --- a/src/main.h +++ b/src/main.h @@ -2894,6 +2894,11 @@ struct RequestInfo boolean autowrap; boolean centered; boolean wrap_single_words; + + // run-time values + Bitmap *bitmap; + int sx, sy; + int xsize, ysize; }; struct PreviewInfo diff --git a/src/tools.c b/src/tools.c index 68ec63e9..92d0fa3f 100644 --- a/src/tools.c +++ b/src/tools.c @@ -2810,6 +2810,40 @@ void ShowEnvelope(int envelope_nr) BackToFront(); } +static void PrepareEnvelopeRequestToScreen(Bitmap *bitmap, int sx, int sy, + int xsize, int ysize) +{ + if (!global.use_envelope_request || + request.sort_priority <= 0) + return; + + if (request.bitmap == NULL || + xsize > request.xsize || + ysize > request.ysize) + { + if (request.bitmap != NULL) + FreeBitmap(request.bitmap); + + request.bitmap = CreateBitmap(xsize, ysize, DEFAULT_DEPTH); + + SDL_Surface *surface = request.bitmap->surface; + + if ((request.bitmap->surface_masked = SDLGetNativeSurface(surface)) == NULL) + Fail("SDLGetNativeSurface() failed"); + } + + BlitBitmap(bitmap, request.bitmap, sx, sy, xsize, ysize, 0, 0); + + SDLFreeBitmapTextures(request.bitmap); + SDLCreateBitmapTextures(request.bitmap); + + // set envelope request run-time values + request.sx = sx; + request.sy = sy; + request.xsize = xsize; + request.ysize = ysize; +} + static void setRequestBasePosition(int *x, int *y) { int sx_base, sy_base; @@ -2960,6 +2994,8 @@ 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); + PrepareEnvelopeRequestToScreen(bitmap_db_store_2, sx, sy, width, height); + if (text_door_style) free(text_door_style); } @@ -3041,6 +3077,8 @@ static void AnimateEnvelopeRequest(int anim_mode, int action) } } + PrepareEnvelopeRequestToScreen(backbuffer, dst_x, dst_y, width, height); + redraw_mask |= REDRAW_FIELD; BackToFront(); @@ -4527,6 +4565,8 @@ static int RequestHandleEvents(unsigned int req_state) BlitBitmap(drawto, bitmap_db_store_2, sx, sy, width, height, sx, sy); } } + + PrepareEnvelopeRequestToScreen(drawto, sx, sy, width, height); } BackToFront(); -- 2.34.1