X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=19526fe0b5a3c1ff1847f019a7e2e0ed302db8cf;hb=1465ca1ffdf2104d25b9a46ca9bf8a3f175403fd;hp=edb861d9203bd13b0b8ca8be9f852204744cf314;hpb=e6bde4abb3952d4689917ce66d6bde79cd8df7fc;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index edb861d9..19526fe0 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -53,7 +53,7 @@ inline 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 */ - *window = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH); + *window = CreateBitmap(video.width, video.height, video.depth); } inline boolean SDLSetVideoMode(DrawBuffer *backbuffer, boolean fullscreen) @@ -65,10 +65,11 @@ inline boolean SDLSetVideoMode(DrawBuffer *backbuffer, boolean fullscreen) { /* switch display to fullscreen mode, if available */ DrawWindow window_old = *backbuffer; - DrawWindow window_new; + DrawWindow window_new = CreateBitmapStruct(); - if ((window_new = SDL_SetVideoMode(video.width, video.height, video.depth, - surface_flags)) == NULL) + if ((window_new->surface = SDL_SetVideoMode(video.width, video.height, + video.depth, surface_flags)) + == NULL) { /* switching display to fullscreen mode failed */ Error(ERR_WARN, "SDL_SetVideoMode() failed: %s", SDL_GetError()); @@ -80,7 +81,7 @@ inline boolean SDLSetVideoMode(DrawBuffer *backbuffer, boolean fullscreen) else { if (window_old) - SDL_FreeSurface(window_old); + FreeBitmap(window_old); *backbuffer = window_new; video.fullscreen_enabled = TRUE; @@ -92,10 +93,11 @@ inline boolean SDLSetVideoMode(DrawBuffer *backbuffer, boolean fullscreen) { /* switch display to window mode */ DrawWindow window_old = *backbuffer; - DrawWindow window_new; + DrawWindow window_new = CreateBitmapStruct(); - if ((window_new = SDL_SetVideoMode(video.width, video.height, video.depth, - surface_flags)) == NULL) + if ((window_new->surface = SDL_SetVideoMode(video.width, video.height, + video.depth, surface_flags)) + == NULL) { /* switching display to window mode failed -- should not happen */ Error(ERR_WARN, "SDL_SetVideoMode() failed: %s", SDL_GetError()); @@ -105,7 +107,7 @@ inline boolean SDLSetVideoMode(DrawBuffer *backbuffer, boolean fullscreen) else { if (window_old) - SDL_FreeSurface(window_old); + FreeBitmap(window_old); *backbuffer = window_new; video.fullscreen_enabled = FALSE; @@ -116,12 +118,12 @@ inline boolean SDLSetVideoMode(DrawBuffer *backbuffer, boolean fullscreen) return success; } -inline void SDLCopyArea(SDL_Surface *src_surface, SDL_Surface *dst_surface, +inline 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 dst_x, int dst_y, int copy_mode) { - SDL_Surface *surface = (dst_surface == window ? backbuffer : dst_surface); + Bitmap real_dst_bitmap = (dst_bitmap == window ? backbuffer : dst_bitmap); SDL_Rect src_rect, dst_rect; src_rect.x = src_x; @@ -134,17 +136,19 @@ inline void SDLCopyArea(SDL_Surface *src_surface, SDL_Surface *dst_surface, dst_rect.w = width; dst_rect.h = height; - if (src_surface != backbuffer || dst_surface != window) - SDL_BlitSurface(src_surface, &src_rect, surface, &dst_rect); + if (src_bitmap != backbuffer || dst_bitmap != window) + SDL_BlitSurface((copy_mode == SDLCOPYAREA_MASKED ? + src_bitmap->surface_masked : src_bitmap->surface), + &src_rect, real_dst_bitmap->surface, &dst_rect); - if (dst_surface == window) - SDL_UpdateRect(backbuffer, dst_x, dst_y, width, height); + if (dst_bitmap == window) + SDL_UpdateRect(backbuffer->surface, dst_x, dst_y, width, height); } -inline void SDLFillRectangle(SDL_Surface *dst_surface, int x, int y, +inline void SDLFillRectangle(Bitmap dst_bitmap, int x, int y, int width, int height, unsigned int color) { - SDL_Surface *surface = (dst_surface == window ? backbuffer : dst_surface); + Bitmap real_dst_bitmap = (dst_bitmap == window ? backbuffer : dst_bitmap); SDL_Rect rect; unsigned int color_r = (color >> 16) && 0xff; unsigned int color_g = (color >> 8) && 0xff; @@ -155,11 +159,12 @@ inline void SDLFillRectangle(SDL_Surface *dst_surface, int x, int y, rect.w = width; rect.h = height; - SDL_FillRect(surface, &rect, - SDL_MapRGB(surface->format, color_r, color_g, color_b)); + SDL_FillRect(real_dst_bitmap->surface, &rect, + SDL_MapRGB(real_dst_bitmap->surface->format, + color_r, color_g, color_b)); - if (dst_surface == window) - SDL_UpdateRect(backbuffer, x, y, width, height); + if (dst_bitmap == window) + SDL_UpdateRect(backbuffer->surface, x, y, width, height); } inline void SDLDrawSimpleLine(SDL_Surface *surface, int from_x, int from_y,