X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=d431aacf29c96c34d73b2a4db489d075608a5640;hp=da72bd490b965805ccff119494ab1c54de77734f;hb=0a69f419ffadee5822bc103be9e85d378e0d0274;hpb=abe44529b439ad39b4d8dbf19cbd67c9b9844279 diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index da72bd49..d431aacf 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -15,8 +15,8 @@ #include "misc.h" #include "setup.h" +#define ENABLE_UNUSED_CODE 0 /* currently unused functions */ -#if defined(TARGET_SDL) /* ========================================================================= */ /* video functions */ @@ -27,6 +27,7 @@ static SDL_Window *sdl_window = NULL; static SDL_Renderer *sdl_renderer = NULL; static SDL_Texture *sdl_texture = NULL; +static boolean fullscreen_enabled = FALSE; #define USE_RENDERER TRUE #endif @@ -53,20 +54,54 @@ static void UpdateScreen(SDL_Rect *rect) { static unsigned int update_screen_delay = 0; unsigned int update_screen_delay_value = 20; /* (milliseconds) */ + SDL_Surface *screen = backbuffer->surface; -#if 1 if (limit_screen_updates && !DelayReached(&update_screen_delay, update_screen_delay_value)) return; LimitScreenUpdates(FALSE); + +#if 0 + { + static int LastFrameCounter = 0; + boolean changed = (FrameCounter != LastFrameCounter); + + printf("::: FrameCounter == %d [%s]\n", FrameCounter, + (changed ? "-" : "SAME FRAME UPDATED")); + + LastFrameCounter = FrameCounter; + + /* + if (FrameCounter % 2) + return; + */ + } +#endif + +#if USE_FINAL_SCREEN_BITMAP + if (gfx.final_screen_bitmap != NULL) // may not be initialized yet + { + // !!! TEST !!! + // draw global animations using bitmaps instead of using textures + // to prevent texture scaling artefacts (this is potentially slower) + + BlitBitmap(backbuffer, gfx.final_screen_bitmap, 0, 0, + gfx.win_xsize, gfx.win_ysize, 0, 0); + + // copy global animations to render target buffer, if defined + if (gfx.draw_global_anim_function != NULL) + gfx.draw_global_anim_function(); + + screen = gfx.final_screen_bitmap->surface; + + // force full window redraw + rect = NULL; + } #endif #if defined(TARGET_SDL2) #if USE_RENDERER - SDL_Surface *screen = backbuffer->surface; - -#if 1 if (rect) { int bytes_x = screen->pitch / video.width; @@ -83,13 +118,24 @@ static void UpdateScreen(SDL_Rect *rect) { SDL_UpdateTexture(sdl_texture, NULL, screen->pixels, screen->pitch); } -#else - SDL_UpdateTexture(sdl_texture, NULL, screen->pixels, screen->pitch); -#endif + + // clear render target buffer SDL_RenderClear(sdl_renderer); + + // copy backbuffer to render target buffer SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL); + +#if !USE_FINAL_SCREEN_BITMAP + // copy global animations to render target buffer, if defined + if (gfx.draw_global_anim_function != NULL) + gfx.draw_global_anim_function(); +#endif + + // show render target buffer on screen SDL_RenderPresent(sdl_renderer); + #else + if (rect) SDL_UpdateWindowSurfaceRects(sdl_window, rect, 1); else @@ -98,9 +144,9 @@ static void UpdateScreen(SDL_Rect *rect) #else // TARGET_SDL if (rect) - SDL_UpdateRects(backbuffer->surface, 1, rect); + SDL_UpdateRects(screen, 1, rect); else - SDL_UpdateRect(backbuffer->surface, 0, 0, 0, 0); + SDL_UpdateRect(screen, 0, 0, 0, 0); #endif } @@ -204,6 +250,9 @@ boolean SDLSetNativeSurface(SDL_Surface **surface) new_surface = SDL_ConvertSurface(*surface, backbuffer->surface->format, 0); + if (new_surface == NULL) + Error(ERR_EXIT, "SDL_ConvertSurface() failed: %s", SDL_GetError()); + SDL_FreeSurface(*surface); *surface = new_surface; @@ -213,42 +262,20 @@ boolean SDLSetNativeSurface(SDL_Surface **surface) SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface) { - if (surface == NULL || - backbuffer == NULL || - backbuffer->surface == NULL) - return NULL; - - return SDL_ConvertSurface(surface, backbuffer->surface->format, 0); -} + SDL_Surface *new_surface; -SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface) -{ - if (surface == NULL || - backbuffer == NULL || - backbuffer->surface == NULL) + if (surface == NULL) return NULL; -#if 0 - boolean same_pixel_format = - equalSDLPixelFormat(surface->format, backbuffer->surface->format); - - printf("::: SDL_DisplayFormat: %08x -> %08x [%08x, %08x, %08x -> %08x, %08x, %08x] [%d, %d -> %d, %d] => %s\n", - surface->format->format, - backbuffer->surface->format->format, - surface->format->Rmask, - surface->format->Gmask, - surface->format->Bmask, - backbuffer->surface->format->Rmask, - backbuffer->surface->format->Gmask, - backbuffer->surface->format->Bmask, - surface->format->BitsPerPixel, - surface->format->BytesPerPixel, - backbuffer->surface->format->BitsPerPixel, - backbuffer->surface->format->BytesPerPixel, - (same_pixel_format ? "SAME" : "DIFF")); -#endif + if (backbuffer && backbuffer->surface) + new_surface = SDL_ConvertSurface(surface, backbuffer->surface->format, 0); + else + new_surface = SDL_ConvertSurface(surface, surface->format, 0); + + if (new_surface == NULL) + Error(ERR_EXIT, "SDL_ConvertSurface() failed: %s", SDL_GetError()); - return SDL_ConvertSurface(surface, backbuffer->surface->format, 0); + return new_surface; } #else @@ -257,7 +284,9 @@ boolean SDLSetNativeSurface(SDL_Surface **surface) { SDL_Surface *new_surface; - if (surface == NULL) + if (surface == NULL || + *surface == NULL || + !video.initialized) return FALSE; new_surface = SDL_DisplayFormat(*surface); @@ -274,16 +303,68 @@ boolean SDLSetNativeSurface(SDL_Surface **surface) SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface) { - SDL_Surface *new_surface = SDL_DisplayFormat(surface); + SDL_Surface *new_surface; + + if (video.initialized) + new_surface = SDL_DisplayFormat(surface); + else + new_surface = SDL_ConvertSurface(surface, surface->format, SURFACE_FLAGS); if (new_surface == NULL) - Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s", SDL_GetError()); + Error(ERR_EXIT, "%s() failed: %s", + (video.initialized ? "SDL_DisplayFormat" : "SDL_ConvertSurface"), + SDL_GetError()); return new_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; + + if (bitmap->texture) + SDL_DestroyTexture(bitmap->texture); + if (bitmap->texture_masked) + SDL_DestroyTexture(bitmap->texture_masked); + + bitmap->texture = SDLCreateTextureFromSurface(bitmap->surface); + bitmap->texture_masked = SDLCreateTextureFromSurface(bitmap->surface_masked); +#endif +} + +void SDLFreeBitmapTextures(Bitmap *bitmap) +{ +#if defined(TARGET_SDL2) + if (bitmap == NULL) + return; + + 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 SDLInitVideoDisplay(void) { #if !defined(TARGET_SDL2) @@ -344,12 +425,10 @@ void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, fullscreen_yoffset = (fullscreen_height - video.height) / 2; #endif -#if 1 checked_free(video.fullscreen_modes); video.fullscreen_modes = NULL; video.fullscreen_mode_current = NULL; -#endif video.window_scaling_percent = setup.window_scaling_percent; video.window_scaling_quality = setup.window_scaling_quality; @@ -466,20 +545,13 @@ void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, } #endif -#if 0 - /* set window icon */ - SDLSetWindowIcon(program.sdl_icon_filename); -#endif - /* open SDL video output device (window or fullscreen mode) */ if (!SDLSetVideoMode(backbuffer, fullscreen)) Error(ERR_EXIT, "setting video mode failed"); -#if 1 /* !!! SDL2 can only set the window icon if the window already exists !!! */ /* set window icon */ - SDLSetWindowIcon(program.sdl_icon_filename); -#endif + SDLSetWindowIcon(program.icon_filename); /* set window and icon title */ #if defined(TARGET_SDL2) @@ -502,11 +574,7 @@ void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, should never be drawn to directly, it would do no harm nevertheless. */ /* create additional (symbolic) buffer for double-buffering */ -#if 1 ReCreateBitmap(window, video.width, video.height, video.depth); -#else - *window = CreateBitmap(video.width, video.height, video.depth); -#endif } static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer, @@ -515,7 +583,6 @@ static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer, SDL_Surface *new_surface = NULL; #if defined(TARGET_SDL2) - static boolean fullscreen_enabled = FALSE; int surface_flags_window = SURFACE_FLAGS | SDL_WINDOW_RESIZABLE; #if USE_DESKTOP_FULLSCREEN int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN_DESKTOP; @@ -539,15 +606,8 @@ static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer, #if defined(TARGET_SDL2) - // store if initial screen mode on game start is fullscreen mode - if (sdl_window == NULL) - { -#if 0 - printf("::: GAME STARTS WITH FULLSCREEN %d\n", fullscreen); -#endif - - video.fullscreen_initial = fullscreen; - } + // store if initial screen mode is fullscreen mode when changing screen size + video.fullscreen_initial = fullscreen; #if USE_RENDERER float window_scaling_factor = (float)setup.window_scaling_percent / 100; @@ -558,10 +618,6 @@ static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer, video.window_width = window_scaling_factor * width; video.window_height = window_scaling_factor * height; -#if 0 - printf("::: use window scaling factor %f\n", screen_scaling_factor); -#endif - if ((*backbuffer)->surface) { SDL_FreeSurface((*backbuffer)->surface); @@ -589,14 +645,6 @@ static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer, } } -#if 0 - Error(ERR_INFO, "::: checking 'sdl_window' ..."); - - if (sdl_window == NULL) - Error(ERR_INFO, "::: calling SDL_CreateWindow() [%d, %d, %d] ...", - setup.fullscreen, fullscreen, fullscreen_enabled); -#endif - if (sdl_window == NULL) sdl_window = SDL_CreateWindow(program.window_title, SDL_WINDOWPOS_CENTERED, @@ -637,28 +685,8 @@ static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer, if (sdl_texture != NULL) { -#if 1 // use SDL default values for RGB masks and no alpha channel new_surface = SDL_CreateRGBSurface(0, width, height, 32, 0,0,0, 0); -#else - -#if 1 - // (do not use alpha channel) - new_surface = SDL_CreateRGBSurface(0, width, height, 32, - 0x00FF0000, - 0x0000FF00, - 0x000000FF, - 0x00000000); -#else - // (this uses an alpha channel, which we don't want here) - new_surface = SDL_CreateRGBSurface(0, width, height, 32, - 0x00FF0000, - 0x0000FF00, - 0x000000FF, - 0xFF000000); -#endif - -#endif if (new_surface == NULL) Error(ERR_WARN, "SDL_CreateRGBSurface() failed: %s", @@ -710,17 +738,6 @@ static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer, boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) { boolean success = TRUE; -#if 1 -#else -#if defined(TARGET_SDL2) - // int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN; - int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN_DESKTOP; - int surface_flags_window = SURFACE_FLAGS; -#else - int surface_flags_fullscreen = SURFACE_FLAGS | SDL_FULLSCREEN; - int surface_flags_window = SURFACE_FLAGS; -#endif -#endif SDL_Surface *new_surface = NULL; SetWindowTitle(); @@ -740,28 +757,7 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) video_yoffset = fullscreen_yoffset; /* switch display to fullscreen mode, if available */ -#if 1 new_surface = SDLCreateScreen(backbuffer, TRUE); -#else - -#if defined(TARGET_SDL2) - sdl_window = SDL_CreateWindow(program.window_title, - SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, - fullscreen_width, fullscreen_height, - surface_flags_fullscreen); - if (sdl_window != NULL) - { - new_surface = SDL_GetWindowSurface(sdl_window); - - // SDL_UpdateWindowSurface(sdl_window); // immediately map window - // UpdateScreen(NULL); // immediately map window - } -#else - new_surface = SDL_SetVideoMode(fullscreen_width, fullscreen_height, - video.depth, surface_flags_fullscreen); -#endif -#endif if (new_surface == NULL) { @@ -790,113 +786,7 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) video_yoffset = 0; /* switch display to window mode */ -#if 1 new_surface = SDLCreateScreen(backbuffer, FALSE); -#else - -#if defined(TARGET_SDL2) - -#if USE_RENDERER - float screen_scaling_factor = 1.2; - int test_fullscreen = 0; - int surface_flags = (test_fullscreen ? surface_flags_fullscreen : - surface_flags_window); - - if ((*backbuffer)->surface) - SDL_FreeSurface((*backbuffer)->surface); - - if (sdl_texture) - SDL_DestroyTexture(sdl_texture); - - if (sdl_renderer) - SDL_DestroyRenderer(sdl_renderer); - - if (sdl_window) - SDL_DestroyWindow(sdl_window); - - sdl_window = SDL_CreateWindow(program.window_title, - SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, - (int)(screen_scaling_factor * video.width), - (int)(screen_scaling_factor * video.height), - surface_flags); - - if (sdl_window != NULL) - { - sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0); - - if (sdl_renderer != NULL) - { - SDL_RenderSetLogicalSize(sdl_renderer, video.width, video.height); - SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); - - sdl_texture = SDL_CreateTexture(sdl_renderer, - SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_STREAMING, - video.width, video.height); - - if (sdl_texture != NULL) - { -#if 1 - // (do not use alpha channel) - new_surface = SDL_CreateRGBSurface(0, video.width, video.height, 32, - 0x00FF0000, - 0x0000FF00, - 0x000000FF, - 0x00000000); -#else - // (this uses an alpha channel, which we don't want here) - new_surface = SDL_CreateRGBSurface(0, video.width, video.height, 32, - 0x00FF0000, - 0x0000FF00, - 0x000000FF, - 0xFF000000); -#endif - - if (new_surface == NULL) - Error(ERR_WARN, "SDL_CreateRGBSurface() failed: %s", - SDL_GetError()); - } - else - { - Error(ERR_WARN, "SDL_CreateTexture() failed: %s", SDL_GetError()); - } - } - else - { - Error(ERR_WARN, "SDL_CreateRenderer() failed: %s", SDL_GetError()); - } - } - else - { - Error(ERR_WARN, "SDL_CreateWindow() failed: %s", SDL_GetError()); - } - -#else - - if (sdl_window) - SDL_DestroyWindow(sdl_window); - - sdl_window = SDL_CreateWindow(program.window_title, - SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, - video.width, video.height, - surface_flags_window); - - if (sdl_window != NULL) - { - new_surface = SDL_GetWindowSurface(sdl_window); - - // SDL_UpdateWindowSurface(sdl_window); // immediately map window - // UpdateScreen(NULL); // immediately map window - } -#endif - -#else - new_surface = SDL_SetVideoMode(video.width, video.height, - video.depth, surface_flags_window); -#endif -#endif if (new_surface == NULL) { @@ -919,13 +809,14 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) #if defined(TARGET_SDL2) SDLRedrawWindow(); // map window - // UpdateScreen(NULL); // map window #endif -#if 1 +#ifdef DEBUG +#if defined(PLATFORM_WIN32) + // experimental drag and drop code + SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); -#if defined(PLATFORM_WIN32) { SDL_SysWMinfo wminfo; HWND hwnd; @@ -975,10 +866,6 @@ void SDLSetWindowScaling(int window_scaling_percent) int new_window_width = (int)(window_scaling_factor * video.width); int new_window_height = (int)(window_scaling_factor * video.height); -#if 0 - Error(ERR_DEBUG, "::: SDLSetWindowScaling(%d) ...", window_scaling_percent); -#endif - SDL_SetWindowSize(sdl_window, new_window_width, new_window_height); video.window_scaling_percent = window_scaling_percent; @@ -1023,20 +910,10 @@ void SDLSetWindowFullscreen(boolean fullscreen) int flags = (fullscreen ? SDL_WINDOW_FULLSCREEN : 0); #endif -#if 0 - Error(ERR_DEBUG, "::: SDL_SetWindowFullscreen(%d) ...", fullscreen); -#endif - if (SDL_SetWindowFullscreen(sdl_window, flags) == 0) - video.fullscreen_enabled = fullscreen; - -#if 0 - printf("::: SDLSetWindowFullscreen: %d, %d\n", - fullscreen, video.fullscreen_initial); -#endif + video.fullscreen_enabled = fullscreen_enabled = fullscreen; -#if 1 - // if game started in fullscreen mode, window will also get fullscreen size + // if screen size was changed in fullscreen mode, correct desktop window size if (!fullscreen && video.fullscreen_initial) { SDLSetWindowScaling(setup.window_scaling_percent); @@ -1045,7 +922,6 @@ void SDLSetWindowFullscreen(boolean fullscreen) video.fullscreen_initial = FALSE; } -#endif } void SDLRedrawWindow() @@ -1057,7 +933,6 @@ void SDLRedrawWindow() void SDLCreateBitmapContent(Bitmap *bitmap, int width, int height, int depth) { -#if 1 SDL_Surface *surface = SDL_CreateRGBSurface(SURFACE_FLAGS, width, height, depth, 0,0,0, 0); @@ -1067,23 +942,6 @@ void SDLCreateBitmapContent(Bitmap *bitmap, int width, int height, SDLSetNativeSurface(&surface); bitmap->surface = surface; - -#else - - SDL_Surface *surface_tmp, *surface_native; - - if ((surface_tmp = SDL_CreateRGBSurface(SURFACE_FLAGS, width, height, depth, - 0, 0, 0, 0)) - == NULL) - Error(ERR_EXIT, "SDL_CreateRGBSurface() failed: %s", SDL_GetError()); - - if ((surface_native = SDL_DisplayFormat(surface_tmp)) == NULL) - Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s", SDL_GetError()); - - SDL_FreeSurface(surface_tmp); - - new_bitmap->surface = surface_native; -#endif } void SDLFreeBitmapPointers(Bitmap *bitmap) @@ -1092,8 +950,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, @@ -1147,6 +1016,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) { @@ -1418,18 +1318,69 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, if (draw_border_function != NULL) draw_border_function(); -#if defined(TARGET_SDL2) - // SDL_UpdateWindowSurface(sdl_window); - // SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect2, 1); UpdateScreen(&dst_rect2); + } + } + } + else if (fade_mode == FADE_MODE_CURTAIN) + { + float xx; + int xx_final; + int xx_size = width / 2; + + SDL_BlitSurface(surface_target, &src_rect, surface_screen, &dst_rect); +#if defined(TARGET_SDL2) + SDL_SetSurfaceBlendMode(surface_source, SDL_BLENDMODE_NONE); #else - // SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height); - UpdateScreen(&dst_rect2); + SDL_SetAlpha(surface_source, 0, 0); /* disable alpha blending */ #endif + + for (xx = 0; xx < xx_size;) + { + time_last = time_current; + time_current = SDL_GetTicks(); + xx += xx_size * ((float)(time_current - time_last) / fade_delay); + xx_final = MIN(MAX(0, xx), xx_size); + + 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; + + /* draw new (target) image to screen buffer */ + SDL_BlitSurface(surface_target, &src_rect, surface_screen, &dst_rect); + + if (xx_final < xx_size) + { + src_rect.w = xx_size - xx_final; + src_rect.h = height; + + /* draw old (source) image to screen buffer (left side) */ + + src_rect.x = src_x + xx_final; + dst_rect.x = dst_x; + + SDL_BlitSurface(surface_source, &src_rect, surface_screen, &dst_rect); + + /* draw old (source) image to screen buffer (right side) */ + + src_rect.x = src_x + xx_size; + dst_rect.x = dst_x + xx_size + xx_final; + + SDL_BlitSurface(surface_source, &src_rect, surface_screen, &dst_rect); } + + if (draw_border_function != NULL) + draw_border_function(); + + /* only update the region of the screen that is affected from fading */ + UpdateScreen(&dst_rect2); } } - else + else /* fading in, fading out or cross-fading */ { float alpha; int alpha_final; @@ -1456,23 +1407,29 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, if (draw_border_function != NULL) draw_border_function(); -#if 1 /* only update the region of the screen that is affected from fading */ -#if defined(TARGET_SDL2) - // SDL_UpdateWindowSurface(sdl_window); - // SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect, 1); - UpdateScreen(&dst_rect); -#else - // SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height); UpdateScreen(&dst_rect); -#endif -#else - SDL_Flip(surface_screen); -#endif } } - Delay(post_delay); + if (post_delay > 0) + { + unsigned int time_post_delay; + + time_current = SDL_GetTicks(); + time_post_delay = time_current + post_delay; + + while (time_current < time_post_delay) + { + // do not wait longer than 10 ms at a time to be able to ... + Delay(MIN(10, time_post_delay - time_current)); + + // ... continue drawing global animations during post delay + UpdateScreen(NULL); + + time_current = SDL_GetTicks(); + } + } } void SDLDrawSimpleLine(Bitmap *dst_bitmap, int from_x, int from_y, @@ -1515,7 +1472,7 @@ void SDLDrawLine(Bitmap *dst_bitmap, int from_x, int from_y, sge_Line(dst_bitmap->surface, from_x, from_y, to_x, to_y, color); } -#if 0 +#if ENABLE_UNUSED_CODE void SDLDrawLines(SDL_Surface *surface, struct XY *points, int num_points, Uint32 color) { @@ -1600,7 +1557,7 @@ Pixel SDLGetPixel(Bitmap *src_bitmap, int x, int y) /* ========================================================================= */ /* The following functions were taken from the SGE library */ -/* (SDL Graphics Extension Library) by Anders Lindström */ +/* (SDL Graphics Extension Library) by Anders Lindström */ /* http://www.etek.chalmers.se/~e8cal1/sge/index.html */ /* ========================================================================= */ @@ -2123,17 +2080,11 @@ int zoomSurfaceRGBA_scaleDownBy2(SDL_Surface *src, SDL_Surface *dst) { int x, y; tColorRGBA *sp, *csp, *dp; -#if 0 - int sgap; -#endif int dgap; /* pointer setup */ sp = csp = (tColorRGBA *) src->pixels; dp = (tColorRGBA *) dst->pixels; -#if 0 - sgap = src->pitch - src->w * 4; -#endif dgap = dst->pitch - dst->w * 4; for (y = 0; y < dst->h; y++) @@ -2176,8 +2127,6 @@ int zoomSurfaceRGBA_scaleDownBy2(SDL_Surface *src, SDL_Surface *dst) return 0; } -#if 1 - int zoomSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst) { int x, y, *sax, *say, *csax, *csay; @@ -2190,11 +2139,6 @@ int zoomSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst) src->h == 2 * dst->h) return zoomSurfaceRGBA_scaleDownBy2(src, dst); -#if 0 - printf("::: zoomSurfaceRGBA: %d, %d -> %d, %d\n", - src->w, src->h, dst->w, dst->h); -#endif - /* variable setup */ sx = (float) src->w / (float) dst->w; sy = (float) src->h / (float) dst->h; @@ -2248,94 +2192,6 @@ int zoomSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst) return 0; } -#else - -int zoomSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst) -{ - int x, y, sx, sy, *sax, *say, *csax, *csay, csx, csy; - tColorRGBA *sp, *csp, *dp; -#if 0 - int sgap; -#endif - int dgap; - - /* use specialized zoom function when scaling down to exactly half size */ - if (src->w == 2 * dst->w && - src->h == 2 * dst->h) - return zoomSurfaceRGBA_scaleDownBy2(src, dst); - - /* variable setup */ - sx = (int) (65536.0 * (float) src->w / (float) dst->w); - sy = (int) (65536.0 * (float) src->h / (float) dst->h); - - /* allocate memory for row increments */ - sax = (int *)checked_malloc((dst->w + 1) * sizeof(Uint32)); - say = (int *)checked_malloc((dst->h + 1) * sizeof(Uint32)); - - /* precalculate row increments */ - csx = 0; - csax = sax; - for (x = 0; x <= dst->w; x++) - { - *csax = csx; - csax++; - csx &= 0xffff; - csx += sx; - } - - csy = 0; - csay = say; - for (y = 0; y <= dst->h; y++) - { - *csay = csy; - csay++; - csy &= 0xffff; - csy += sy; - } - - /* pointer setup */ - sp = csp = (tColorRGBA *) src->pixels; - dp = (tColorRGBA *) dst->pixels; -#if 0 - sgap = src->pitch - src->w * 4; -#endif - dgap = dst->pitch - dst->w * 4; - - csay = say; - for (y = 0; y < dst->h; y++) - { - sp = csp; - csax = sax; - - for (x = 0; x < dst->w; x++) - { - /* draw */ - *dp = *sp; - - /* advance source pointers */ - csax++; - sp += (*csax >> 16); - - /* advance destination pointer */ - dp++; - } - - /* advance source pointer */ - csay++; - csp = (tColorRGBA *) ((Uint8 *) csp + (*csay >> 16) * src->pitch); - - /* advance destination pointers */ - dp = (tColorRGBA *) ((Uint8 *) dp + dgap); - } - - free(sax); - free(say); - - return 0; -} - -#endif - /* ----------------------------------------------------------------------------- 8 bit zoomer @@ -2521,12 +2377,8 @@ SDL_Surface *zoomSurface(SDL_Surface *src, int dst_width, int dst_height) return zoom_dst; } -#if 1 - Bitmap *SDLZoomBitmap(Bitmap *src_bitmap, int dst_width, int dst_height) { -#if 1 - Bitmap *dst_bitmap = CreateBitmapStruct(); SDL_Surface **dst_surface = &dst_bitmap->surface; @@ -2543,70 +2395,8 @@ Bitmap *SDLZoomBitmap(Bitmap *src_bitmap, int dst_width, int dst_height) SDLSetNativeSurface(dst_surface); return dst_bitmap; - -#else - - Bitmap *dst_bitmap = CreateBitmapStruct(); - SDL_Surface *sdl_surface_tmp; - - dst_width = MAX(1, dst_width); /* prevent zero bitmap width */ - dst_height = MAX(1, dst_height); /* prevent zero bitmap height */ - - dst_bitmap->width = dst_width; - dst_bitmap->height = dst_height; - - print_timestamp_init("SDLZoomBitmap"); - - /* create zoomed temporary surface from source surface */ - sdl_surface_tmp = zoomSurface(src_bitmap->surface, dst_width, dst_height); - print_timestamp_time("zoomSurface"); - - /* create native format destination surface from zoomed temporary surface */ - dst_bitmap->surface = SDL_DisplayFormat(sdl_surface_tmp); - print_timestamp_time("SDL_DisplayFormat"); - - /* free temporary surface */ - SDL_FreeSurface(sdl_surface_tmp); - print_timestamp_time("SDL_FreeSurface"); - - print_timestamp_done("SDLZoomBitmap"); - - return dst_bitmap; - -#endif } -#else - -void SDLZoomBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap) -{ - SDL_Surface *sdl_surface_tmp; - int dst_width = dst_bitmap->width; - int dst_height = dst_bitmap->height; - - print_timestamp_init("SDLZoomBitmap"); - - /* throw away old destination surface */ - SDL_FreeSurface(dst_bitmap->surface); - print_timestamp_time("SDL_FreeSurface"); - - /* create zoomed temporary surface from source surface */ - sdl_surface_tmp = zoomSurface(src_bitmap->surface, dst_width, dst_height); - print_timestamp_time("zoomSurface"); - - /* create native format destination surface from zoomed temporary surface */ - dst_bitmap->surface = SDL_DisplayFormat(sdl_surface_tmp); - print_timestamp_time("SDL_DisplayFormat"); - - /* free temporary surface */ - SDL_FreeSurface(sdl_surface_tmp); - print_timestamp_time("SDL_FreeSurface"); - - print_timestamp_done("SDLZoomBitmap"); -} - -#endif - /* ========================================================================= */ /* load image to bitmap */ @@ -2634,21 +2424,12 @@ Bitmap *SDLLoadImage(char *filename) UPDATE_BUSY_STATE(); /* create native non-transparent surface for current image */ -#if 1 if ((new_bitmap->surface = SDLGetNativeSurface(sdl_image_tmp)) == NULL) { SetError("SDL_DisplayFormat(): %s", SDL_GetError()); return NULL; } -#else - if ((new_bitmap->surface = SDL_DisplayFormat(sdl_image_tmp)) == NULL) - { - SetError("SDL_DisplayFormat(): %s", SDL_GetError()); - - return NULL; - } -#endif print_timestamp_time("SDL_DisplayFormat (opaque)"); @@ -2657,21 +2438,13 @@ Bitmap *SDLLoadImage(char *filename) /* create native transparent surface for current image */ SDL_SetColorKey(sdl_image_tmp, SET_TRANSPARENT_PIXEL, SDL_MapRGB(sdl_image_tmp->format, 0x00, 0x00, 0x00)); -#if 1 - if ((new_bitmap->surface_masked = SDLGetNativeSurface(sdl_image_tmp)) == NULL) - { - SetError("SDL_DisplayFormat(): %s", SDL_GetError()); - return NULL; - } -#else - if ((new_bitmap->surface_masked = SDL_DisplayFormat(sdl_image_tmp)) == NULL) + if ((new_bitmap->surface_masked = SDLGetNativeSurface(sdl_image_tmp)) == NULL) { SetError("SDL_DisplayFormat(): %s", SDL_GetError()); return NULL; } -#endif print_timestamp_time("SDL_DisplayFormat (masked)"); @@ -2809,7 +2582,10 @@ void SDLNextEvent(Event *event) void SDLHandleWindowManagerEvent(Event *event) { +#ifdef DEBUG #if defined(PLATFORM_WIN32) + // experimental drag and drop code + SDL_SysWMEvent *syswmevent = (SDL_SysWMEvent *)event; SDL_SysWMmsg *syswmmsg = (SDL_SysWMmsg *)(syswmevent->msg); @@ -2847,6 +2623,7 @@ void SDLHandleWindowManagerEvent(Event *event) #endif } #endif +#endif } @@ -2985,5 +2762,3 @@ boolean SDLReadJoystick(int nr, int *x, int *y, boolean *b1, boolean *b2) return TRUE; } - -#endif /* TARGET_SDL */