X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=d1406e8bcb5dff7fdfab840cd8d2346e7dd92949;hb=766384cc29e6d22af67fe3329069291efc0f681a;hp=480677c31bb117b3f26c07ccca2351f6841a2b42;hpb=d0409bd76aa84a8745ec2ea6d8a5480c8bea0bcd;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index 480677c3..d1406e8b 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -57,7 +57,7 @@ static void FinalizeScreen() gfx.draw_global_anim_function(DRAW_GLOBAL_ANIM_STAGE_2); } -static void UpdateScreen(SDL_Rect *rect) +static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay) { static unsigned int update_screen_delay = 0; unsigned int update_screen_delay_value = 50; /* (milliseconds) */ @@ -148,7 +148,8 @@ static void UpdateScreen(SDL_Rect *rect) #endif // global synchronization point of the game to align video frame delay - WaitUntilDelayReached(&video.frame_delay, video.frame_delay_value); + if (with_frame_delay) + WaitUntilDelayReached(&video.frame_delay, video.frame_delay_value); #if defined(TARGET_SDL2) // show render target buffer on screen @@ -161,6 +162,16 @@ static void UpdateScreen(SDL_Rect *rect) #endif } +static void UpdateScreen_WithFrameDelay(SDL_Rect *rect) +{ + UpdateScreenExt(rect, TRUE); +} + +static void UpdateScreen_WithoutFrameDelay(SDL_Rect *rect) +{ + UpdateScreenExt(rect, FALSE); +} + static void SDLSetWindowIcon(char *basename) { /* (setting the window icon on Mac OS X would replace the high-quality @@ -374,13 +385,8 @@ void SDLInitVideoBuffer(boolean fullscreen) { video.window_scaling_percent = setup.window_scaling_percent; video.window_scaling_quality = setup.window_scaling_quality; - video.screen_rendering_mode = - (strEqual(setup.screen_rendering_mode, STR_SPECIAL_RENDERING_BITMAP) ? - SPECIAL_RENDERING_BITMAP : - strEqual(setup.screen_rendering_mode, STR_SPECIAL_RENDERING_TARGET) ? - SPECIAL_RENDERING_TARGET: - strEqual(setup.screen_rendering_mode, STR_SPECIAL_RENDERING_DOUBLE) ? - SPECIAL_RENDERING_DOUBLE : SPECIAL_RENDERING_OFF); + + SDLSetScreenRenderingMode(setup.screen_rendering_mode); #if defined(TARGET_SDL2) // SDL 2.0: support for (desktop) fullscreen mode available @@ -629,13 +635,8 @@ boolean SDLSetVideoMode(boolean fullscreen) video.fullscreen_enabled = FALSE; video.window_scaling_percent = setup.window_scaling_percent; video.window_scaling_quality = setup.window_scaling_quality; - video.screen_rendering_mode = - (strEqual(setup.screen_rendering_mode, STR_SPECIAL_RENDERING_BITMAP) ? - SPECIAL_RENDERING_BITMAP : - strEqual(setup.screen_rendering_mode, STR_SPECIAL_RENDERING_TARGET) ? - SPECIAL_RENDERING_TARGET: - strEqual(setup.screen_rendering_mode, STR_SPECIAL_RENDERING_DOUBLE) ? - SPECIAL_RENDERING_DOUBLE : SPECIAL_RENDERING_OFF); + + SDLSetScreenRenderingMode(setup.screen_rendering_mode); } } @@ -746,17 +747,6 @@ void SDLSetWindowScalingQuality(char *window_scaling_quality) video.window_scaling_quality = window_scaling_quality; } -void SDLSetScreenRenderingMode(char *screen_rendering_mode) -{ - video.screen_rendering_mode = - (strEqual(screen_rendering_mode, STR_SPECIAL_RENDERING_BITMAP) ? - SPECIAL_RENDERING_BITMAP : - strEqual(screen_rendering_mode, STR_SPECIAL_RENDERING_TARGET) ? - SPECIAL_RENDERING_TARGET: - strEqual(screen_rendering_mode, STR_SPECIAL_RENDERING_DOUBLE) ? - SPECIAL_RENDERING_DOUBLE : SPECIAL_RENDERING_OFF); -} - void SDLSetWindowFullscreen(boolean fullscreen) { if (sdl_window == NULL) @@ -777,12 +767,27 @@ void SDLSetWindowFullscreen(boolean fullscreen) video.fullscreen_initial = FALSE; } } +#endif + +void SDLSetScreenRenderingMode(char *screen_rendering_mode) +{ +#if defined(TARGET_SDL2) + video.screen_rendering_mode = + (strEqual(screen_rendering_mode, STR_SPECIAL_RENDERING_BITMAP) ? + SPECIAL_RENDERING_BITMAP : + strEqual(screen_rendering_mode, STR_SPECIAL_RENDERING_TARGET) ? + SPECIAL_RENDERING_TARGET: + strEqual(screen_rendering_mode, STR_SPECIAL_RENDERING_DOUBLE) ? + SPECIAL_RENDERING_DOUBLE : SPECIAL_RENDERING_OFF); +#else + video.screen_rendering_mode = SPECIAL_RENDERING_BITMAP; +#endif +} void SDLRedrawWindow() { - UpdateScreen(NULL); + UpdateScreen_WithoutFrameDelay(NULL); } -#endif void SDLCreateBitmapContent(Bitmap *bitmap, int width, int height, int depth) @@ -843,7 +848,7 @@ void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap, &src_rect, real_dst_bitmap->surface, &dst_rect); if (dst_bitmap == window) - UpdateScreen(&dst_rect); + UpdateScreen_WithFrameDelay(&dst_rect); } void SDLBlitTexture(Bitmap *bitmap, @@ -889,7 +894,7 @@ void SDLFillRectangle(Bitmap *dst_bitmap, int x, int y, int width, int height, SDL_FillRect(real_dst_bitmap->surface, &rect, color); if (dst_bitmap == window) - UpdateScreen(&rect); + UpdateScreen_WithFrameDelay(&rect); } void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, @@ -1070,7 +1075,7 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, if (draw_border_function != NULL) draw_border_function(); - UpdateScreen(&dst_rect2); + UpdateScreen_WithFrameDelay(&dst_rect2); } } } @@ -1129,7 +1134,7 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, draw_border_function(); /* only update the region of the screen that is affected from fading */ - UpdateScreen(&dst_rect2); + UpdateScreen_WithFrameDelay(&dst_rect2); } } else /* fading in, fading out or cross-fading */ @@ -1160,7 +1165,7 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, draw_border_function(); /* only update the region of the screen that is affected from fading */ - UpdateScreen(&dst_rect); + UpdateScreen_WithFrameDelay(&dst_rect); } } @@ -1174,7 +1179,7 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, while (time_current < time_post_delay) { // updating the screen contains waiting for frame delay (non-busy) - UpdateScreen(NULL); + UpdateScreen_WithFrameDelay(NULL); time_current = SDL_GetTicks(); }