From 2be3a21f7db33230c685e107b1f0759f62f53585 Mon Sep 17 00:00:00 2001 From: Couriersud Date: Tue, 13 Jan 2009 21:17:38 +0000 Subject: [PATCH] Added DFB_VERSION_ATLEAST macro First attempt at replacing MakeSubSurface for pre 1.2.0 ==> Scaling not yet working --- src/video/directfb/SDL_DirectFB_events.c | 2 +- src/video/directfb/SDL_DirectFB_modes.c | 4 ++-- src/video/directfb/SDL_DirectFB_render.c | 12 ++++++------ src/video/directfb/SDL_DirectFB_video.h | 19 +++++++++++++------ src/video/directfb/SDL_DirectFB_window.c | 20 +++++++++++++++++--- 5 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/video/directfb/SDL_DirectFB_events.c b/src/video/directfb/SDL_DirectFB_events.c index fb3a928be..6d61a0679 100644 --- a/src/video/directfb/SDL_DirectFB_events.c +++ b/src/video/directfb/SDL_DirectFB_events.c @@ -48,7 +48,7 @@ static int DirectFB_TranslateButton(DFBInputDeviceButtonIdentifier button); static void DirectFB_SetContext(_THIS, SDL_WindowID id) { -#if (DIRECTFB_MAJOR_VERSION >= 1) +#if (DFB_VERSION_ATLEAST(1,0,0)) /* FIXME: does not work on 1.0/1.2 with radeon driver * the approach did work with the matrox driver * This has simply no effect. diff --git a/src/video/directfb/SDL_DirectFB_modes.c b/src/video/directfb/SDL_DirectFB_modes.c index 018fe7fab..5224203d0 100644 --- a/src/video/directfb/SDL_DirectFB_modes.c +++ b/src/video/directfb/SDL_DirectFB_modes.c @@ -335,7 +335,7 @@ DirectFB_InitModes(_THIS) display.current_mode = mode; display.driverdata = dispdata; -#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2) +#if (DFB_VERSION_ATLEAST(1,2,0)) dlc.flags = DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT | DLCONF_OPTIONS; @@ -438,7 +438,7 @@ DirectFB_SetDisplayMode(_THIS, SDL_DisplayMode * mode) SDL_DFB_DEBUG("Trace\n"); config.flags &= ~fail; SDL_DFB_CHECKERR(data->layer->SetConfiguration(data->layer, &config)); -#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2) +#if (DFB_VERSION_ATLEAST(1,2,0)) /* Need to call this twice ! */ SDL_DFB_CHECKERR(data->layer->SetConfiguration(data->layer, &config)); #endif diff --git a/src/video/directfb/SDL_DirectFB_render.c b/src/video/directfb/SDL_DirectFB_render.c index 6fea73026..687cba3f9 100644 --- a/src/video/directfb/SDL_DirectFB_render.c +++ b/src/video/directfb/SDL_DirectFB_render.c @@ -140,7 +140,7 @@ typedef struct IDirectFBPalette *palette; SDL_VideoDisplay *display; SDL_DirtyRectList dirty; -#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2) +#if (DFB_VERSION_ATLEAST(1,2,0)) DFBSurfaceRenderOptions render_options; #endif } DirectFB_TextureData; @@ -387,7 +387,7 @@ SDLToDFBPixelFormat(Uint32 format) case SDL_PIXELFORMAT_INDEX4MSB: return DSPF_UNKNOWN; case SDL_PIXELFORMAT_RGB444: -#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2) +#if (DFB_VERSION_ATLEAST(1,2,0)) return DSPF_RGB444; #else return DSPF_UNKNOWN; @@ -543,7 +543,7 @@ DirectFB_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) } } -#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2) +#if (DFB_VERSION_ATLEAST(1,2,0)) data->render_options = DSRO_NONE; #endif @@ -673,7 +673,7 @@ DirectFB_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) static int DirectFB_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture) { -#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2) +#if (DFB_VERSION_ATLEAST(1,2,0)) DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata; @@ -847,7 +847,7 @@ DirectFB_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2) PrepareDraw(renderer); /* Use antialiasing when available */ -#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2) +#if (DFB_VERSION_ATLEAST(1,2,0)) SDL_DFB_CHECKERR(data->surface->SetRenderOptions(data->surface, DSRO_ANTIALIAS)); #endif @@ -961,7 +961,7 @@ DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, data->blitFlags | flags)); -#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2) +#if (DFB_VERSION_ATLEAST(1,2,0)) SDL_DFB_CHECKERR(data->surface->SetRenderOptions(data->surface, texturedata-> render_options)); diff --git a/src/video/directfb/SDL_DirectFB_video.h b/src/video/directfb/SDL_DirectFB_video.h index ae8037fff..f27882bda 100644 --- a/src/video/directfb/SDL_DirectFB_video.h +++ b/src/video/directfb/SDL_DirectFB_video.h @@ -34,13 +34,20 @@ #define DEBUG 0 #define LOG_CHANNEL stdout -#if (DIRECTFB_MAJOR_VERSION < 1) -#error "SDL_DIRECTFB: Please compile against libdirectfb version >= 1.0.0" -#endif +#define DFB_VERSIONNUM(X, Y, Z) \ + ((X)*1000 + (Y)*100 + (Z)) + +#define DFB_COMPILEDVERSION \ + DFB_VERSIONNUM(DIRECTFB_MAJOR_VERSION, DIRECTFB_MINOR_VERSION, DIRECTFB_MICRO_VERSION) -#if (DIRECTFB_MAJOR_VERSION >= 1) && (DIRECTFB_MINOR_VERSION >= 0) && (DIRECTFB_MICRO_VERSION >= 0 ) -#define SDL_DIRECTFB_OPENGL 1 -#include +#define DFB_VERSION_ATLEAST(X, Y, Z) \ + (DFB_COMPILEDVERSION >= DFB_VERSIONNUM(X, Y, Z)) + +#if (DFB_VERSION_ATLEAST(1,0,0)) + #define SDL_DIRECTFB_OPENGL 1 + #include +#else + #error "SDL_DIRECTFB: Please compile against libdirectfb version >= 1.0.0" #endif #if SDL_DIRECTFB_OPENGL diff --git a/src/video/directfb/SDL_DirectFB_window.c b/src/video/directfb/SDL_DirectFB_window.c index 0f798f51a..4bb4324fd 100644 --- a/src/video/directfb/SDL_DirectFB_window.c +++ b/src/video/directfb/SDL_DirectFB_window.c @@ -420,14 +420,28 @@ DirectFB_AdjustWindowSurface(SDL_Window * window) } if (adjust) { - SDL_DFB_CHECKERR(windata->window->ResizeSurface(windata->window, +#if DFB_VERSION_ATLEAST(1,2,0) + SDL_DFB_CHECKERR(windata->window->ResizeSurface(windata->window, windata->size.w, windata->size.h)); - SDL_DFB_CHECKERR(windata->surface->MakeSubSurface(windata->surface, + SDL_DFB_CHECKERR(windata->surface->MakeSubSurface(windata->surface, windata-> window_surface, &windata->client)); - DirectFB_WM_RedrawLayout(window); +#else + /* recreate subsurface */ + windata->surface->ReleaseSource(windata->surface); + windata->window_surface->ReleaseSource(windata->window_surface); + SDL_DFB_RELEASE(windata->surface); + windata->surface = NULL; + SDL_DFB_CHECKERR(windata->window->ResizeSurface(windata->window, + windata->size.w, + windata->size.h)); + SDL_DFB_CHECKERR(windata->window_surface-> + GetSubSurface(windata->window_surface, &windata->client, + &windata->surface)); +#endif + DirectFB_WM_RedrawLayout(window); } error: return;