X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=a72bdcc0cc80e5c52df9c2267c70f36802e714a5;hb=6e022fe74edcab8e9b6be32bcfdd7006f478e2ab;hp=f02264d9d27ef0fe5a9c997230bf9aecc3bb1379;hpb=d6a1a6cb31174ac804f9ad54a919d65478da588f;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index f02264d9..a72bdcc0 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -29,6 +29,8 @@ static SDL_Window *sdl_window = NULL; static SDL_Renderer *sdl_renderer = NULL; static SDL_Texture *sdl_texture = NULL; + +#define USE_RENDERER 1 #endif /* stuff needed to work around SDL/Windows fullscreen drawing bug */ @@ -42,12 +44,29 @@ static int video_yoffset; /* functions from SGE library */ void sge_Line(SDL_Surface *, Sint16, Sint16, Sint16, Sint16, Uint32); +#if defined(TARGET_SDL2) static void UpdateScreen(SDL_Rect *rect) { -#if 1 +#if USE_RENDERER SDL_Surface *screen = backbuffer->surface; +#if 1 + if (rect) + { + int bytes_x = screen->pitch / video.width; + int bytes_y = screen->pitch; + + SDL_UpdateTexture(sdl_texture, rect, + screen->pixels + rect->x * bytes_x + rect->y * bytes_y, + screen->pitch); + } + else + { + SDL_UpdateTexture(sdl_texture, NULL, screen->pixels, screen->pitch); + } +#else SDL_UpdateTexture(sdl_texture, NULL, screen->pixels, screen->pitch); +#endif SDL_RenderClear(sdl_renderer); SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL); SDL_RenderPresent(sdl_renderer); @@ -58,6 +77,7 @@ static void UpdateScreen(SDL_Rect *rect) SDL_UpdateWindowSurface(sdl_window); #endif } +#endif static void setFullscreenParameters(char *fullscreen_mode_string) { @@ -343,7 +363,7 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) new_surface = SDL_GetWindowSurface(sdl_window); // SDL_UpdateWindowSurface(sdl_window); // immediately map window - UpdateScreen(NULL); // immediately map window + // UpdateScreen(NULL); // immediately map window } #else new_surface = SDL_SetVideoMode(fullscreen_width, fullscreen_height, @@ -379,8 +399,8 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) /* switch display to window mode */ #if defined(TARGET_SDL2) -#if 1 - float scale_factor = 1; +#if USE_RENDERER + float scale_factor = 1.2; int test_fullscreen = 0; int surface_flags = (test_fullscreen ? surface_flags_fullscreen : surface_flags_window); @@ -408,11 +428,23 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) 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 + + printf("::: pitch == %d\n", new_surface->pitch); if (new_surface == NULL) Error(ERR_WARN, "SDL_CreateRGBSurface() failed: %s", @@ -444,7 +476,7 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) new_surface = SDL_GetWindowSurface(sdl_window); // SDL_UpdateWindowSurface(sdl_window); // immediately map window - UpdateScreen(NULL); // immediately map window + // UpdateScreen(NULL); // immediately map window } #endif @@ -470,6 +502,10 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) } } +#if defined(TARGET_SDL2) + UpdateScreen(NULL); // map window +#endif + #if 1 SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); @@ -549,7 +585,8 @@ void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap, dst_rect.w = width; dst_rect.h = height; - if (src_bitmap != backbuffer || dst_bitmap != window) + // if (src_bitmap != backbuffer || dst_bitmap != window) + if (!(src_bitmap == backbuffer && dst_bitmap == window)) SDL_BlitSurface((mask_mode == BLIT_MASKED ? src_bitmap->surface_masked : src_bitmap->surface), &src_rect, real_dst_bitmap->surface, &dst_rect);