X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=baa53340c4502380357bc45e8540f1efe11eb782;hb=a30a27ce6c313e56cc92dc7183d599f63f8ca1f2;hp=4108b2b531c533825c092df0ceab9fb1fd596d90;hpb=3b7f6c6d572ffd50744e76f9ed93733785e13211;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index 4108b2b5..baa53340 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -69,12 +69,11 @@ static void FinalizeScreen(int draw_target) 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) + static DelayCounter update_screen_delay = { 50 }; // (milliseconds) SDL_Surface *screen = backbuffer->surface; if (limit_screen_updates && - !DelayReached(&update_screen_delay, update_screen_delay_value)) + !DelayReached(&update_screen_delay)) return; LimitScreenUpdates(FALSE); @@ -151,28 +150,31 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay) dst_rect1 = &dst_rect_screen; #if defined(HAS_SCREEN_KEYBOARD) - if (video.shifted_up || video.shifted_up_delay) + SDL_Rect src_rect_up = { 0, 0, video.width, video.height }; + SDL_Rect dst_rect_up = dst_rect_screen; + + if (video.shifted_up || video.shifted_up_delay.count) { int time_current = SDL_GetTicks(); int pos = video.shifted_up_pos; int pos_last = video.shifted_up_pos_last; - if (!DelayReachedExt(&video.shifted_up_delay, video.shifted_up_delay_value, - time_current)) + if (!DelayReachedExt(&video.shifted_up_delay, time_current)) { - int delay = time_current - video.shifted_up_delay; - int delay_value = video.shifted_up_delay_value; + int delay_count = time_current - video.shifted_up_delay.count; + int delay_value = video.shifted_up_delay.value; - pos = pos_last + (pos - pos_last) * delay / delay_value; + pos = pos_last + (pos - pos_last) * delay_count / delay_value; } else { video.shifted_up_pos_last = pos; - video.shifted_up_delay = 0; + video.shifted_up_delay.count = 0; } - SDL_Rect src_rect_up = { 0, pos, video.width, video.height - pos }; - SDL_Rect dst_rect_up = { xoff, yoff, video.width, video.height - pos }; + src_rect_up.y = pos; + src_rect_up.h = video.height - pos; + dst_rect_up.h = video.height - pos; if (video.screen_rendering_mode == SPECIAL_RENDERING_TARGET || video.screen_rendering_mode == SPECIAL_RENDERING_DOUBLE) @@ -221,7 +223,7 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay) // global synchronization point of the game to align video frame delay if (with_frame_delay) - WaitUntilDelayReached(&video.frame_delay, video.frame_delay_value); + WaitUntilDelayReached(&video.frame_delay); video.frame_counter++; @@ -260,7 +262,7 @@ static void SDLSetWindowIcon(char *basename) // (setting the window icon on Mac OS X would replace the high-quality // dock icon with the currently smaller (and uglier) icon from file) -#if !defined(PLATFORM_MACOSX) +#if !defined(PLATFORM_MAC) char *filename = getCustomImageFilename(basename); SDL_Surface *surface; @@ -551,6 +553,7 @@ static boolean SDLCreateScreen(boolean fullscreen) int screen_height = video.screen_height; int surface_flags = (fullscreen ? surface_flags_fullscreen : surface_flags_window); + int display_nr = options.display_nr; // default window size is unscaled video.window_width = screen_width; @@ -586,15 +589,14 @@ static boolean SDLCreateScreen(boolean fullscreen) if (sdl_window) { - SDL_DestroyWindow(sdl_window); - sdl_window = NULL; + SDL_SetWindowSize(sdl_window, video.window_width, video.window_height); } } if (sdl_window == NULL) sdl_window = SDL_CreateWindow(program.window_title, - SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED_DISPLAY(display_nr), + SDL_WINDOWPOS_CENTERED_DISPLAY(display_nr), video.window_width, video.window_height, surface_flags); @@ -794,7 +796,8 @@ void SDLSetWindowFullscreen(boolean fullscreen) { SDLSetWindowScaling(setup.window_scaling_percent); SDL_SetWindowPosition(sdl_window, - SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); + SDL_WINDOWPOS_CENTERED_DISPLAY(options.display_nr), + SDL_WINDOWPOS_CENTERED_DISPLAY(options.display_nr)); video.fullscreen_initial = FALSE; } @@ -1225,6 +1228,9 @@ void SDLFadeRectangle(int x, int y, int width, int height, draw_border_function(); UpdateScreen_WithFrameDelay(&dst_rect2); + + if (PendingEscapeKeyEvent()) + break; } } } @@ -1281,6 +1287,9 @@ void SDLFadeRectangle(int x, int y, int width, int height, // only update the region of the screen that is affected from fading UpdateScreen_WithFrameDelay(&dst_rect2); + + if (PendingEscapeKeyEvent()) + break; } } else // fading in, fading out or cross-fading @@ -1307,6 +1316,9 @@ void SDLFadeRectangle(int x, int y, int width, int height, // only update the region of the screen that is affected from fading UpdateScreen_WithFrameDelay(&dst_rect); + + if (PendingEscapeKeyEvent()) + break; } } @@ -1891,22 +1903,6 @@ void SDLPutPixel(Bitmap *dst_bitmap, int x, int y, Pixel pixel) // quick (no, it's slow) and dirty hack to "invert" rectangle inside SDL surface // ---------------------------------------------------------------------------- -void SDLInvertArea(Bitmap *bitmap, int src_x, int src_y, - int width, int height, Uint32 color) -{ - int x, y; - - for (y = src_y; y < src_y + height; y++) - { - for (x = src_x; x < src_x + width; x++) - { - Uint32 pixel = SDLGetPixel(bitmap, x, y); - - SDLPutPixel(bitmap, x, y, pixel == BLACK_PIXEL ? color : BLACK_PIXEL); - } - } -} - void SDLCopyInverseMasked(Bitmap *src_bitmap, Bitmap *dst_bitmap, int src_x, int src_y, int width, int height, int dst_x, int dst_y)