X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=0b3ec7f623383a26e07efc560938295438ae74dc;hb=HEAD;hp=59fe7c3df988d35d5a7269041c2c83e2c0745e30;hpb=5f79070adb29e80f70763d4e37034c7e749a6817;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index 59fe7c3d..0b3ec7f6 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -62,14 +62,18 @@ static void FinalizeScreen(int draw_target) if (gfx.draw_global_anim_function != NULL) gfx.draw_global_anim_function(draw_target, DRAW_GLOBAL_ANIM_STAGE_2); - // copy tile selection cursor to render target buffer, if defined (above all) + // copy tile selection cursor to render target buffer, if defined (part 1) if (gfx.draw_tile_cursor_function != NULL) - gfx.draw_tile_cursor_function(draw_target); + gfx.draw_tile_cursor_function(draw_target, TRUE); // copy envelope request to render target buffer, if needed (above all) if (gfx.draw_envelope_request_function != NULL) gfx.draw_envelope_request_function(draw_target); + // copy tile selection cursor to render target buffer, if defined (part 2) + if (gfx.draw_tile_cursor_function != NULL) + gfx.draw_tile_cursor_function(draw_target, FALSE); + // copy global animations to render target buffer, if defined (mouse pointer) if (gfx.draw_global_anim_function != NULL) gfx.draw_global_anim_function(draw_target, DRAW_GLOBAL_ANIM_STAGE_3); @@ -351,7 +355,7 @@ static boolean SDLHasAlpha(SDL_Surface *surface) return (blend_mode == SDL_BLENDMODE_BLEND); } -void SDLSetAlpha(SDL_Surface *surface, boolean set, int alpha) +static void SDLSetSurfaceAlpha(SDL_Surface *surface, boolean set, int alpha) { SDL_BlendMode blend_mode = (set ? SDL_BLENDMODE_BLEND : SDL_BLENDMODE_NONE); @@ -359,6 +363,49 @@ void SDLSetAlpha(SDL_Surface *surface, boolean set, int alpha) SDL_SetSurfaceAlphaMod(surface, alpha); } +static void SDLSetTextureAlpha(SDL_Texture *texture, boolean set, int alpha) +{ + SDL_BlendMode blend_mode = (set ? SDL_BLENDMODE_BLEND : SDL_BLENDMODE_NONE); + + SDL_SetTextureBlendMode(texture, blend_mode); + SDL_SetTextureAlphaMod(texture, alpha); +} + +static void SDLSetBitmapAlpha(Bitmap *bitmap, boolean is_texture, + boolean is_masked) +{ + int alpha_next_blit = bitmap->alpha_next_blit; + + // alpha value must be requested every time before blitting, if needed + bitmap->alpha_next_blit = -1; + + // nothing to do if requested alpha value is already set + if (bitmap->alpha[is_texture][is_masked] == alpha_next_blit) + return; + + // store requested alpha value for masked/unmasked surface/texture + bitmap->alpha[is_texture][is_masked] = alpha_next_blit; + + // set blend mode if bitmap is masked or if alpha value is defined + boolean set_blend_mode = (is_masked || alpha_next_blit != -1); + + // if alpha value is undefined, use default (opaque) alpha value + if (alpha_next_blit == -1) + alpha_next_blit = SDL_ALPHA_OPAQUE; + + if (is_texture) + SDLSetTextureAlpha(is_masked ? bitmap->texture_masked : bitmap->texture, + set_blend_mode, alpha_next_blit); + else + SDLSetSurfaceAlpha(is_masked ? bitmap->surface_masked : bitmap->surface, + set_blend_mode, alpha_next_blit); +} + +void SDLSetAlpha(SDL_Surface *surface, boolean set, int alpha) +{ + SDLSetSurfaceAlpha(surface, set, alpha); +} + const char *SDLGetRendererName(void) { static SDL_RendererInfo renderer_info; @@ -969,6 +1016,25 @@ void SDLFreeBitmapPointers(Bitmap *bitmap) bitmap->texture_masked = NULL; } +void SDLBlitSurface(SDL_Surface *src_surface, SDL_Surface *dst_surface, + int src_x, int src_y, int width, int height, + int dst_x, int dst_y) +{ + SDL_Rect src_rect, dst_rect; + + src_rect.x = src_x; + src_rect.y = src_y; + src_rect.w = width; + src_rect.h = height; + + dst_rect.x = dst_x; + dst_rect.y = dst_y; + dst_rect.w = width; + dst_rect.h = height; + + SDL_BlitSurface(src_surface, &src_rect, dst_surface, &dst_rect); +} + void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap, int src_x, int src_y, int width, int height, int dst_x, int dst_y, int mask_mode) @@ -986,6 +1052,8 @@ void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap, dst_rect.w = width; dst_rect.h = height; + SDLSetBitmapAlpha(src_bitmap, FALSE, mask_mode == BLIT_MASKED); + // if (src_bitmap != backbuffer || dst_bitmap != window) if (!(src_bitmap == backbuffer && dst_bitmap == window)) SDL_BlitSurface((mask_mode == BLIT_MASKED ? @@ -1020,6 +1088,8 @@ void SDLBlitTexture(Bitmap *bitmap, dst_rect.w = width; dst_rect.h = height; + SDLSetBitmapAlpha(bitmap, TRUE, mask_mode == BLIT_MASKED); + SDL_RenderCopy(sdl_renderer, texture, &src_rect, &dst_rect); }