From: Holger Schemel Date: Sat, 16 Mar 2024 11:52:48 +0000 (+0100) Subject: added functions to load title screen from native BD caveset X-Git-Tag: 4.4.0.0-test-1~183 X-Git-Url: https://git.artsoft.org/?a=commitdiff_plain;h=35a2f21580d9bd01f55e1265fc8174cfcbdd5ad9;p=rocksndiamonds.git added functions to load title screen from native BD caveset --- diff --git a/src/game_bd/bd_graphics.c b/src/game_bd/bd_graphics.c index ef87fc0f..43964906 100644 --- a/src/game_bd/bd_graphics.c +++ b/src/game_bd/bd_graphics.c @@ -44,6 +44,9 @@ static Bitmap *gd_tile_bitmap = NULL; // pointer to reference tile bitmap (without level-specific colors) static Bitmap *gd_tile_bitmap_reference = NULL; +// optional title screen bitmap +static Bitmap *gd_title_screen_bitmap = NULL; + // screen area Bitmap *gd_screen_bitmap = NULL; @@ -739,3 +742,113 @@ int gd_drawcave(Bitmap *dest, GdGame *game, boolean force_redraw) return 0; } + +static SDL_Surface *get_surface_from_raw_data(const unsigned char *data, int size) +{ + SDL_RWops *rwop = SDL_RWFromConstMem(data, size); + SDL_Surface *surface = IMG_Load_RW(rwop, 1); // 1 = automatically closes rwop + + return surface; +} + +static SDL_Surface *get_surface_from_base64(const char *base64_data) +{ + int decoded_data_size = base64_decoded_size(base64_data); + unsigned char *decoded_data = checked_malloc(decoded_data_size); + + base64_decode(decoded_data, base64_data); + + SDL_Surface *surface = get_surface_from_raw_data(decoded_data, decoded_data_size); + + checked_free(decoded_data); + + return surface; +} + +static SDL_Surface *get_title_screen_surface(void) +{ + if (gd_caveset_data == NULL || gd_caveset_data->title_screen == NULL) + return NULL; + + SDL_Surface *surface = get_surface_from_base64(gd_caveset_data->title_screen); + + if (surface == NULL) + return NULL; + + // create target surface + SDL_Surface *target = SDL_CreateRGBSurface(0, surface->w, surface->h, 32, 0, 0, 0, 0); + + // check for transparency and background tile + if (surface->format->Amask != 0 && gd_caveset_data->title_screen_scroll != NULL) + { + SDL_Surface *tile = get_surface_from_base64(gd_caveset_data->title_screen_scroll); + + if (tile != NULL) + { + int x, y; + + // create background surface + SDL_Surface *back = SDL_CreateRGBSurface(0, surface->w, surface->h, 32, 0, 0, 0, 0); + + // fill background surface with tile + for (y = 0; y < surface->h; y += tile->h) + for (x = 0; x < surface->w; x += tile->w) + SDLBlitSurface(tile, back, 0, 0, tile->w, tile->h, x, y); + + // copy masked screen over background surface + SDLBlitSurface(back, target, 0, 0, surface->w, surface->h, 0, 0); + + // free temporary surfaces + SDL_FreeSurface(tile); + SDL_FreeSurface(back); + } + } + + SDLBlitSurface(surface, target, 0, 0, surface->w, surface->h, 0, 0); + + SDL_FreeSurface(surface); + + return target; +} + +static void set_title_screen_bitmap(void) +{ + if (gd_title_screen_bitmap != NULL) + FreeBitmap(gd_title_screen_bitmap); + + gd_title_screen_bitmap = NULL; + + SDL_Surface *surface = get_title_screen_surface(); + + if (surface == NULL) + return; + + int width_scaled = surface->w * 2; + int height_scaled = surface->h * 2; + SDL_Surface *surface_scaled = SDLZoomSurface(surface, width_scaled, height_scaled); + + gd_title_screen_bitmap = SDLGetBitmapFromSurface(surface_scaled); + + SDL_FreeSurface(surface); + SDL_FreeSurface(surface_scaled); +} + +Bitmap *gd_get_title_screen_bitmap(void) +{ + static char *levelset_subdir_last = NULL; + + if (gd_caveset_data == NULL || gd_caveset_data->title_screen == NULL) + return NULL; + + // check if stored cave set is used as current level set (may be outdated) + if (!strEqual(gd_caveset_data->levelset_subdir, leveldir_current->subdir)) + return NULL; + + // check if stored cave set has changed + if (!strEqual(gd_caveset_data->levelset_subdir, levelset_subdir_last)) + set_title_screen_bitmap(); + + setString(&levelset_subdir_last, gd_caveset_data->levelset_subdir); + + return gd_title_screen_bitmap; +} diff --git a/src/game_bd/bd_graphics.h b/src/game_bd/bd_graphics.h index 0f953cf0..ce38a7e0 100644 --- a/src/game_bd/bd_graphics.h +++ b/src/game_bd/bd_graphics.h @@ -45,4 +45,6 @@ void gd_scroll_to_origin(void); int get_scroll_x(void); int get_scroll_y(void); +Bitmap *gd_get_title_screen_bitmap(void); + #endif // BD_GRAPHICS_H diff --git a/src/game_bd/export_bd.h b/src/game_bd/export_bd.h index 52d367bb..f14d8f84 100644 --- a/src/game_bd/export_bd.h +++ b/src/game_bd/export_bd.h @@ -108,6 +108,8 @@ Bitmap *GetPreviewTileBitmap_BD(Bitmap *); unsigned int InitEngineRandom_BD(int); void InitGameEngine_BD(void); void GameActions_BD(byte[MAX_PLAYERS]); + +Bitmap *GetTitleScreen_BD(void); void CoverScreen_BD(void); void BlitScreenToBitmap_BD(Bitmap *); diff --git a/src/game_bd/main_bd.c b/src/game_bd/main_bd.c index a854786e..6b3ba104 100644 --- a/src/game_bd/main_bd.c +++ b/src/game_bd/main_bd.c @@ -409,6 +409,11 @@ void GameActions_BD(byte action[MAX_PLAYERS]) // graphics functions // ============================================================================ +Bitmap *GetTitleScreen_BD(void) +{ + return gd_get_title_screen_bitmap(); +} + void CoverScreen_BD(void) { game_bd.cover_screen = FALSE;