X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=0b2e1c1663064c7886a5cfe46e36f52db794deee;hb=c8020d330cab48d59515e0e3b7e2f856630ef80b;hp=3ab03783ba16a33a1da73c7c76362b368118368b;hpb=8390d74131ba7877a1e993e38da227c1336e6a10;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index 3ab03783..0b2e1c16 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -98,10 +98,22 @@ static void UpdateScreen(SDL_Rect *rect) { SDL_UpdateTexture(sdl_texture, NULL, screen->pixels, screen->pitch); } + + // clear render target buffer SDL_RenderClear(sdl_renderer); + + // copy backbuffer to render target buffer SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL); + + // copy global animations to render target buffer, if defined + if (gfx.draw_global_anim_function != NULL) + gfx.draw_global_anim_function(); + + // show render target buffer on screen SDL_RenderPresent(sdl_renderer); + #else + if (rect) SDL_UpdateWindowSurfaceRects(sdl_window, rect, 1); else @@ -286,6 +298,30 @@ SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface) #endif +#if defined(TARGET_SDL2) +static SDL_Texture *SDLCreateTextureFromSurface(SDL_Surface *surface) +{ + SDL_Texture *texture = SDL_CreateTextureFromSurface(sdl_renderer, surface); + + if (texture == NULL) + Error(ERR_EXIT, "SDL_CreateTextureFromSurface() failed: %s", + SDL_GetError()); + + return texture; +} +#endif + +void SDLCreateBitmapTextures(Bitmap *bitmap) +{ +#if defined(TARGET_SDL2) + if (bitmap == NULL) + return; + + bitmap->texture = SDLCreateTextureFromSurface(bitmap->surface); + bitmap->texture_masked = SDLCreateTextureFromSurface(bitmap->surface_masked); +#endif +} + void SDLInitVideoDisplay(void) { #if !defined(TARGET_SDL2) @@ -871,8 +907,19 @@ void SDLFreeBitmapPointers(Bitmap *bitmap) SDL_FreeSurface(bitmap->surface); if (bitmap->surface_masked) SDL_FreeSurface(bitmap->surface_masked); + bitmap->surface = NULL; bitmap->surface_masked = NULL; + +#if defined(TARGET_SDL2) + if (bitmap->texture) + SDL_DestroyTexture(bitmap->texture); + if (bitmap->texture_masked) + SDL_DestroyTexture(bitmap->texture_masked); + + bitmap->texture = NULL; + bitmap->texture_masked = NULL; +#endif } void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap, @@ -926,6 +973,37 @@ void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap, #endif } +void SDLBlitTexture(Bitmap *bitmap, + int src_x, int src_y, int width, int height, + int dst_x, int dst_y, int mask_mode) +{ +#if defined(TARGET_SDL2) +#if USE_RENDERER + SDL_Texture *texture; + SDL_Rect src_rect; + SDL_Rect dst_rect; + + texture = + (mask_mode == BLIT_MASKED ? bitmap->texture_masked : bitmap->texture); + + if (texture == NULL) + return; + + 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_RenderCopy(sdl_renderer, texture, &src_rect, &dst_rect); +#endif +#endif +} + void SDLFillRectangle(Bitmap *dst_bitmap, int x, int y, int width, int height, Uint32 color) {