From e5367ee42312c8835125438511d8479aa2daa094 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Tue, 3 Dec 2013 14:20:52 +0100 Subject: [PATCH] rnd-20131203-1-src --- Makefile | 6 +-- src/conftime.h | 2 +- src/events.c | 16 +++++- src/events.h | 5 ++ src/init.c | 93 +++++++++++++++++++++++++++++++++ src/libgame/sdl.c | 129 ++++++++++++++++++++++++++++++++++++++++++---- src/libgame/sdl.h | 17 ++++-- src/netserv.c | 3 +- src/network.c | 5 ++ src/screens.c | 20 +++++++ 10 files changed, 276 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 173f5cd5..df2f7662 100644 --- a/Makefile +++ b/Makefile @@ -176,10 +176,10 @@ dist-build-win32: @BUILD_DIST=TRUE $(MAKE) cross-win32 dist-build-macosx: - # (this is done by "dist-package-macosx" target) +# (this is done by "dist-package-macosx" target) dist-build-macosx-ppc: - # (this is done by "dist-package-macosx-ppc" target) +# (this is done by "dist-package-macosx-ppc" target) dist-package-unix: ./Scripts/make_dist.sh unix . @@ -239,4 +239,4 @@ tags: $(MAKE_CMD) tags depend dep: - $(MAKE_CMD) depend + $(MAKE_CMD) TARGET=$(DEFAULT_TARGET) depend diff --git a/src/conftime.h b/src/conftime.h index c416a512..ff48912e 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "2013-12-01 16:17" +#define COMPILE_DATE_STRING "2013-12-03 14:17" diff --git a/src/events.c b/src/events.c index 122311d1..75e32c71 100644 --- a/src/events.c +++ b/src/events.c @@ -39,7 +39,7 @@ static unsigned int playfield_cursor_delay = 0; /* event filter addition for SDL2: as SDL2 does not have a function to enable or disable keyboard auto-repeat, filter repeated keyboard events instead */ -int FilterEvents(const Event *event) +static int FilterEventsExt(const Event *event) { MotionEvent *motion; @@ -74,6 +74,18 @@ int FilterEvents(const Event *event) return 1; } +#if defined(TARGET_SDL2) +int FilterEvents(void *userdata, Event *event) +{ + return FilterEventsExt(event); +} +#else +int FilterEvents(const Event *event) +{ + return FilterEventsExt(event); +} +#endif + /* to prevent delay problems, skip mouse motion events if the very next event is also a mouse motion event (and therefore effectively only handling the last of a row of mouse motion events in the event queue) */ @@ -115,7 +127,7 @@ static boolean NextValidEvent(Event *event) NextEvent(event); - if (FilterMouseMotionEvents(event)) + if (FilterEventsExt(event)) handle_this_event = TRUE; if (SkipPressedMouseMotionEvent(event)) diff --git a/src/events.h b/src/events.h index c66145c6..5cff3183 100644 --- a/src/events.h +++ b/src/events.h @@ -16,7 +16,12 @@ #include "main.h" +#if defined(TARGET_SDL2) +int FilterEvents(void *, Event *); +#else int FilterEvents(const Event *); +#endif + void EventLoop(void); void HandleOtherEvents(Event *); void ClearEventQueue(void); diff --git a/src/init.c b/src/init.c index 423ad314..30735032 100644 --- a/src/init.c +++ b/src/init.c @@ -5313,6 +5313,7 @@ void Execute_Command(char *command) #if DEBUG #if defined(TARGET_SDL) +#if !defined(TARGET_SDL2) else if (strEqual(command, "SDL_ListModes")) { SDL_Rect **modes; @@ -5347,6 +5348,7 @@ void Execute_Command(char *command) exit(0); } #endif +#endif #endif else @@ -5642,6 +5644,91 @@ void InitGfx() font_height = getFontHeight(FC_RED); + + + + + + + + +#if 0 + Delay(1000); + +#if 0 + Bitmap new_bitmap; + printf("::: MARK 1.1\n"); + new_bitmap.surface = SDL_LoadBMP("TEST.bmp"); + printf("::: MARK 1.2\n"); +#endif + + char *filename = getCustomImageFilename("RocksFontSmall.pcx"); + + printf("::: FILENAME == '%s'\n", filename); + +#if 1 + Bitmap *new_bitmap = LoadImage(filename); +#else +#if 1 + Bitmap *new_bitmap = CreateBitmapStruct(); + SDL_Surface *sdl_image_tmp; + sdl_image_tmp = IMG_Load(filename); + new_bitmap->surface = SDL_DisplayFormat(sdl_image_tmp); + +#else + SDL_Surface *sdl_image_tmp = IMG_Load(filename); + SDL_Surface *sdl_image = SDL_DisplayFormat(sdl_image_tmp); +#endif +#endif + + // SDL_Surface *image = SDL_LoadBMP("TEST.bmp"); + // SDL_LoadBMP("TEST.bmp"); + + // bitmap_font_initial->surface = SDL_LoadBMP("TEST.bmp"); + +#if 0 + printf("::: MARK 1 [%08x, %08xd]\n", + (unsigned int)bitmap_font_initial->surface, + (unsigned int)backbuffer->surface); +#endif + + // SDL_BlitSurface(image, NULL, backbuffer->surface, NULL); + // SDL_BlitSurface(new_bitmap.surface, NULL,backbuffer->surface, NULL); + SDL_BlitSurface(new_bitmap->surface, NULL,backbuffer->surface, NULL); + // SDL_BlitSurface(sdl_image, NULL,backbuffer->surface, NULL); + // SDL_BlitSurface(bitmap_font_initial->surface, NULL,backbuffer->surface, NULL); + +#if 0 + printf("::: MARK 1 [%08x, %08xd, %08xd]\n", + (unsigned int)bitmap_font_initial->surface, + (unsigned int)backbuffer->surface, + (unsigned int)image); +#endif + + extern SDL_Window *sdl_window; + SDL_UpdateWindowSurface(sdl_window); + +#if 1 +#if 0 + SDL_BlitSurface(bitmap_font_initial->surface, NULL,backbuffer->surface, NULL); +#endif + // SDL_UpdateWindowSurface(sdl_window); + + Delay(1000); + exit(0); +#endif +#endif + + + + + + + + + + + #if 1 DrawInitText(getWindowTitleString(), 20, FC_YELLOW); #else @@ -6485,8 +6572,14 @@ void CloseAllAndExit(int exit_value) FreeAllImages(); #if defined(TARGET_SDL) +#if defined(TARGET_SDL2) + // !!! TODO !!! + // set a flag to tell the network server thread to quit and wait for it + // using SDL_WaitThread() +#else if (network_server) /* terminate network server */ SDL_KillThread(server_thread); +#endif #endif CloseVideoDisplay(); diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index b9309408..26cc7a7b 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -24,8 +24,12 @@ /* video functions */ /* ========================================================================= */ -/* functions from SGE library */ -void sge_Line(SDL_Surface *, Sint16, Sint16, Sint16, Sint16, Uint32); +/* SDL internal variables */ +#if defined(TARGET_SDL2) +// static SDL_Window *sdl_window = NULL; +SDL_Window *sdl_window = NULL; +// static SDL_Renderer *sdl_renderer = NULL; +#endif /* stuff needed to work around SDL/Windows fullscreen drawing bug */ static int fullscreen_width; @@ -35,6 +39,9 @@ static int fullscreen_yoffset; static int video_xoffset; static int video_yoffset; +/* functions from SGE library */ +void sge_Line(SDL_Surface *, Sint16, Sint16, Sint16, Sint16, Uint32); + static void setFullscreenParameters(char *fullscreen_mode_string) { struct ScreenModeInfo *fullscreen_mode; @@ -88,23 +95,44 @@ static void SDLSetWindowIcon(char *basename) SDL_SetColorKey(surface, SET_TRANSPARENT_PIXEL, SDL_MapRGB(surface->format, 0x00, 0x00, 0x00)); +#if defined(TARGET_SDL2) + SDL_SetWindowIcon(sdl_window, surface); +#else SDL_WM_SetIcon(surface, NULL); #endif +#endif } +#if defined(TARGET_SDL2) +SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface) +{ + if (backbuffer == NULL || + backbuffer->surface == NULL) + return NULL; + + return SDL_ConvertSurface(surface, backbuffer->surface->format, 0); +} +#endif + void SDLInitVideoDisplay(void) { +#if !defined(TARGET_SDL2) if (!strEqual(setup.system.sdl_videodriver, ARG_DEFAULT)) SDL_putenv(getStringCat2("SDL_VIDEODRIVER=", setup.system.sdl_videodriver)); SDL_putenv("SDL_VIDEO_CENTERED=1"); +#endif /* initialize SDL video */ if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) Error(ERR_EXIT, "SDL_InitSubSystem() failed: %s", SDL_GetError()); /* set default SDL depth */ +#if !defined(TARGET_SDL2) video.default_depth = SDL_GetVideoInfo()->vfmt->BitsPerPixel; +#else + video.default_depth = 32; // (how to determine video depth in SDL2?) +#endif } void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, @@ -147,8 +175,13 @@ void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, video.fullscreen_mode_current = NULL; #endif +#if !defined(TARGET_SDL2) /* get available hardware supported fullscreen modes */ modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE); +#else + // (for now, no display modes in SDL2 -- change this later) + modes = NULL; +#endif if (modes == NULL) { @@ -219,7 +252,11 @@ void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, Error(ERR_EXIT, "setting video mode failed"); /* set window and icon title */ +#if defined(TARGET_SDL2) + SDL_SetWindowTitle(sdl_window, program.window_title); +#else SDL_WM_SetCaption(program.window_title, program.window_title); +#endif /* SDL cannot directly draw to the visible video framebuffer like X11, but always uses a backbuffer, which is then blitted to the visible @@ -245,8 +282,13 @@ void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) { boolean success = TRUE; +#if defined(TARGET_SDL2) + int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN; + int surface_flags_window = SURFACE_FLAGS; +#else int surface_flags_fullscreen = SURFACE_FLAGS | SDL_FULLSCREEN; int surface_flags_window = SURFACE_FLAGS; +#endif SDL_Surface *new_surface = NULL; if (*backbuffer == NULL) @@ -264,9 +306,24 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) video_yoffset = fullscreen_yoffset; /* switch display to fullscreen mode, if available */ - if ((new_surface = SDL_SetVideoMode(fullscreen_width, fullscreen_height, - video.depth, surface_flags_fullscreen)) - == NULL) +#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 + } +#else + new_surface = SDL_SetVideoMode(fullscreen_width, fullscreen_height, + video.depth, surface_flags_fullscreen); +#endif + + if (new_surface == NULL) { /* switching display to fullscreen mode failed */ Error(ERR_WARN, "SDL_SetVideoMode() failed: %s", SDL_GetError()); @@ -293,9 +350,24 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) video_yoffset = 0; /* switch display to window mode */ - if ((new_surface = SDL_SetVideoMode(video.width, video.height, - video.depth, surface_flags_window)) - == NULL) +#if defined(TARGET_SDL2) + 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 + } +#else + new_surface = SDL_SetVideoMode(video.width, video.height, + video.depth, surface_flags_window); +#endif + + if (new_surface == NULL) { /* switching display to window mode failed -- should not happen */ Error(ERR_WARN, "SDL_SetVideoMode() failed: %s", SDL_GetError()); @@ -396,8 +468,13 @@ void SDLCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap, src_bitmap->surface_masked : src_bitmap->surface), &src_rect, real_dst_bitmap->surface, &dst_rect); +#if defined(TARGET_SDL2) + if (dst_bitmap == window) + SDL_UpdateWindowSurface(sdl_window); +#else if (dst_bitmap == window) SDL_UpdateRect(backbuffer->surface, dst_x, dst_y, width, height); +#endif } void SDLFillRectangle(Bitmap *dst_bitmap, int x, int y, int width, int height, @@ -419,8 +496,13 @@ void SDLFillRectangle(Bitmap *dst_bitmap, int x, int y, int width, int height, SDL_FillRect(real_dst_bitmap->surface, &rect, color); +#if defined(TARGET_SDL2) + if (dst_bitmap == window) + SDL_UpdateWindowSurface(sdl_window); +#else if (dst_bitmap == window) SDL_UpdateRect(backbuffer->surface, x, y, width, height); +#endif } void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, @@ -464,6 +546,9 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, if (initialization_needed) { +#if defined(TARGET_SDL2) + unsigned int flags = 0; +#else unsigned int flags = SDL_SRCALPHA; /* use same surface type as screen surface */ @@ -471,6 +556,7 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, flags |= SDL_HWSURFACE; else flags |= SDL_SWSURFACE; +#endif /* create surface for temporary copy of screen buffer (source) */ if ((surface_source = @@ -546,7 +632,11 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, int i; SDL_BlitSurface(surface_source, &src_rect, surface_screen, &dst_rect); +#if defined(TARGET_SDL2) + SDL_SetSurfaceBlendMode(surface_target, SDL_BLENDMODE_NONE); +#else SDL_SetAlpha(surface_target, 0, 0); /* disable alpha blending */ +#endif ypos[0] = -GetSimpleRandom(16); @@ -648,7 +738,11 @@ 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); +#else SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height); +#endif } } } @@ -668,7 +762,12 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, SDL_BlitSurface(surface_source, &src_rect, surface_screen, &dst_rect); /* draw new (target) image to screen buffer using alpha blending */ +#if defined(TARGET_SDL2) + SDL_SetSurfaceAlphaMod(surface_target, alpha_final); + SDL_SetSurfaceBlendMode(surface_target, SDL_BLENDMODE_BLEND); +#else SDL_SetAlpha(surface_target, SDL_SRCALPHA, alpha_final); +#endif SDL_BlitSurface(surface_target, &src_rect, surface_screen, &dst_rect); if (draw_border_function != NULL) @@ -676,7 +775,11 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, #if 1 /* only update the region of the screen that is affected from fading */ +#if defined(TARGET_SDL2) + SDL_UpdateWindowSurface(sdl_window); +#else SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height); +#endif #else SDL_Flip(surface_screen); #endif @@ -1770,8 +1873,10 @@ void SDLSetMouseCursor(struct MouseCursorInfo *cursor_info) void SDLOpenAudio(void) { +#if !defined(TARGET_SDL2) if (!strEqual(setup.system.sdl_audiodriver, ARG_DEFAULT)) SDL_putenv(getStringCat2("SDL_AUDIODRIVER=", setup.system.sdl_audiodriver)); +#endif if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) { @@ -1896,6 +2001,8 @@ static void SDLCloseJoystick(int nr) return; SDL_JoystickClose(sdl_joystick[nr]); + + sdl_joystick[nr] = NULL; } static boolean SDLCheckJoystickOpened(int nr) @@ -1903,7 +2010,11 @@ static boolean SDLCheckJoystickOpened(int nr) if (nr < 0 || nr > MAX_PLAYERS) return FALSE; +#if defined(TARGET_SDL2) + return (sdl_joystick[nr] != NULL ? TRUE : FALSE); +#else return (SDL_JoystickOpened(nr) ? TRUE : FALSE); +#endif } void HandleJoystickEvent(Event *event) @@ -1940,7 +2051,7 @@ void SDLInitJoysticks() { sdl_joystick_subsystem_initialized = TRUE; - if (SDL_Init(SDL_INIT_JOYSTICK) < 0) + if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) < 0) { Error(ERR_EXIT, "SDL_Init() failed: %s", SDL_GetError()); return; diff --git a/src/libgame/sdl.h b/src/libgame/sdl.h index c99539b6..71e68331 100644 --- a/src/libgame/sdl.h +++ b/src/libgame/sdl.h @@ -25,7 +25,11 @@ /* definitions needed for "system.c" */ +#if defined(TARGET_SDL2) +#define SURFACE_FLAGS (0) +#else #define SURFACE_FLAGS (SDL_SWSURFACE) +#endif #if defined(TARGET_SDL2) #define SET_TRANSPARENT_PIXEL (SDL_TRUE) @@ -35,13 +39,14 @@ #define UNSET_TRANSPARENT_PIXEL (0) #endif -#if defined(TARGET_SDL2) -#define SDL_DisplayFormat(s) (s) -#endif - /* system dependent definitions */ +#if defined(TARGET_SDL2) +#define TARGET_STRING "SDL2" +#else #define TARGET_STRING "SDL" +#endif + #define FULLSCREEN_STATUS FULLSCREEN_AVAILABLE #define CURSOR_MAX_WIDTH 32 @@ -393,6 +398,10 @@ struct MouseCursorInfo /* SDL function definitions */ +#if defined(TARGET_SDL2) +SDL_Surface *SDL_DisplayFormat(SDL_Surface *); +#endif + void SDLInitVideoDisplay(void); void SDLInitVideoBuffer(DrawBuffer **, DrawWindow **, boolean); boolean SDLSetVideoMode(DrawBuffer **, boolean); diff --git a/src/netserv.c b/src/netserv.c index b895a303..121377e2 100644 --- a/src/netserv.c +++ b/src/netserv.c @@ -614,7 +614,8 @@ void NetworkServer(int port, int serveronly) #if defined(TARGET_SDL) if ((sl = SDLNet_CheckSockets(fds, 500000)) < 1) { - Error(ERR_NETWORK_SERVER, SDLNet_GetError()); + Error(ERR_NETWORK_SERVER, "SDLNet_CheckSockets failed: %s", + SDLNet_GetError()); perror("SDLNet_CheckSockets"); } diff --git a/src/network.c b/src/network.c index b13e4c9a..823d1b50 100644 --- a/src/network.c +++ b/src/network.c @@ -130,7 +130,12 @@ static void StartNetworkServer(int port) static int p; p = port; +#if defined(TARGET_SDL2) + server_thread = SDL_CreateThread(NetworkServerThread, + "NetworkServerThread", &p); +#else server_thread = SDL_CreateThread(NetworkServerThread, &p); +#endif network_server = TRUE; #else diff --git a/src/screens.c b/src/screens.c index 8c387852..4a4dffdd 100644 --- a/src/screens.c +++ b/src/screens.c @@ -2969,9 +2969,16 @@ void DrawInfoScreen_Version() #if defined(TARGET_SDL) int xstart3 = mSX + 29 * xstep; SDL_version sdl_version_compiled; +#if defined(TARGET_SDL2) + SDL_version sdl_version_linked_ext; +#endif const SDL_version *sdl_version_linked; +#if defined(TARGET_SDL2) + const char *driver_name = NULL; +#else int driver_name_len = 8; char driver_name[driver_name_len]; +#endif #endif SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_VERSION); @@ -3011,7 +3018,12 @@ void DrawInfoScreen_Version() DrawTextF(xstart3, ystart2, font_header, "linked"); SDL_VERSION(&sdl_version_compiled); +#if defined(TARGET_SDL2) + SDL_GetVersion(&sdl_version_linked_ext); + sdl_version_linked = &sdl_version_linked_ext; +#else sdl_version_linked = SDL_Linked_Version(); +#endif ystart2 += 2 * ystep; DrawTextF(xstart1, ystart2, font_text, "SDL"); @@ -3071,14 +3083,22 @@ void DrawInfoScreen_Version() DrawTextF(xstart2, ystart2, font_header, "Requested"); DrawTextF(xstart3, ystart2, font_header, "Used"); +#if defined(TARGET_SDL2) + driver_name = SDL_GetVideoDriver(0); +#else SDL_VideoDriverName(driver_name, driver_name_len); +#endif ystart2 += 2 * ystep; DrawTextF(xstart1, ystart2, font_text, "SDL_VideoDriver"); DrawTextF(xstart2, ystart2, font_text, "%s", setup.system.sdl_videodriver); DrawTextF(xstart3, ystart2, font_text, "%s", driver_name); +#if defined(TARGET_SDL2) + driver_name = SDL_GetAudioDriver(0); +#else SDL_AudioDriverName(driver_name, driver_name_len); +#endif ystart2 += ystep; DrawTextF(xstart1, ystart2, font_text, "SDL_AudioDriver"); -- 2.34.1