From b6da4b6d692435d7b47649ce324fab9ad3c08462 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 16 Feb 2009 22:32:34 +0000 Subject: [PATCH] GAPI fixes from Stefan Klug --- src/events/SDL_keyboard.c | 2 +- src/video/gapi/SDL_gapivideo.c | 202 ++++++++++++++++------------ src/video/gapi/SDL_gapivideo.h | 30 ++--- src/video/wincommon/SDL_sysevents.c | 39 ++++-- src/video/windib/SDL_dibevents.c | 86 +++++++----- src/video/windib/SDL_dibvideo.c | 26 +++- src/video/windib/SDL_dibvideo.h | 31 ++--- src/video/windib/SDL_gapidibvideo.h | 56 ++++++++ 8 files changed, 293 insertions(+), 179 deletions(-) create mode 100644 src/video/windib/SDL_gapidibvideo.h diff --git a/src/events/SDL_keyboard.c b/src/events/SDL_keyboard.c index 4c87a8cee..60e7a66fc 100644 --- a/src/events/SDL_keyboard.c +++ b/src/events/SDL_keyboard.c @@ -73,7 +73,7 @@ int SDL_KeyboardInit(void) SDL_EnableKeyRepeat(0, 0); /* Allow environment override to disable special lock-key behavior */ - env = getenv("SDL_NO_LOCK_KEYS"); + env = SDL_getenv("SDL_NO_LOCK_KEYS"); SDL_NoLockKeys = 0; if (env) { switch (SDL_atoi(env)) { diff --git a/src/video/gapi/SDL_gapivideo.c b/src/video/gapi/SDL_gapivideo.c index e67dd65ee..34e3b129e 100644 --- a/src/video/gapi/SDL_gapivideo.c +++ b/src/video/gapi/SDL_gapivideo.c @@ -52,8 +52,11 @@ Inspired by http://arisme.free.fr/ports/SDL.php #include "../wincommon/SDL_sysmouse_c.h" #include "../windib/SDL_dibevents_c.h" +#include "../windib/SDL_gapidibvideo.h" #include "SDL_gapivideo.h" +#define gapi this->hidden->gapiInfo + #define GAPIVID_DRIVER_NAME "gapi" #if defined(DEBUG) || defined (_DEBUG) || defined(NDEBUG) @@ -98,6 +101,7 @@ static void GAPI_UnlockHWSurface(_THIS, SDL_Surface *surface); static void GAPI_FreeHWSurface(_THIS, SDL_Surface *surface); /* Windows message handling functions, will not be processed */ +static void GAPI_Activate(_THIS, BOOL active, BOOL minimized); static void GAPI_RealizePalette(_THIS); static void GAPI_PaletteChanged(_THIS, HWND window); static void GAPI_WinPAINT(_THIS, HDC hdc); @@ -160,6 +164,11 @@ static int GAPI_Available(void) ReleaseDC(NULL, hdc); g_bRawBufferAvailable = result > 0; + //My Asus MyPAL 696 reports the RAWFRAMEBUFFER as available, but with a size of 0 x 0 + if(g_RawFrameBufferInfo.cxPixels <= 0 || g_RawFrameBufferInfo.cyPixels <= 0){ + g_bRawBufferAvailable = 0; + } + #if WITHOUT_GAPI return g_bRawBufferAvailable; #endif @@ -247,6 +256,7 @@ static void GAPI_DeleteDevice(SDL_VideoDevice *device) FreeLibrary(g_hGapiLib); g_hGapiLib = 0; } + SDL_free(device->hidden->gapiInfo); SDL_free(device->hidden); SDL_free(device); } @@ -270,6 +280,15 @@ static SDL_VideoDevice *GAPI_CreateDevice(int devindex) SDL_memset(device, 0, (sizeof *device)); device->hidden = (struct SDL_PrivateVideoData *) SDL_malloc((sizeof *device->hidden)); + if(device->hidden){ + SDL_memset(device->hidden, 0, (sizeof *device->hidden)); + device->hidden->gapiInfo = (GapiInfo *)SDL_malloc((sizeof(GapiInfo))); + if(device->hidden->gapiInfo == NULL) + { + SDL_free(device->hidden); + device->hidden = NULL; + } + } } if ( (device == NULL) || (device->hidden == NULL) ) { SDL_OutOfMemory(); @@ -278,7 +297,7 @@ static SDL_VideoDevice *GAPI_CreateDevice(int devindex) } return(0); } - SDL_memset(device->hidden, 0, (sizeof *device->hidden)); + SDL_memset(device->hidden->gapiInfo, 0, (sizeof *device->hidden->gapiInfo)); /* Set the function pointers */ device->VideoInit = GAPI_VideoInit; @@ -312,6 +331,7 @@ static SDL_VideoDevice *GAPI_CreateDevice(int devindex) device->PumpEvents = DIB_PumpEvents; /* Set up the windows message handling functions */ + WIN_Activate = GAPI_Activate; WIN_RealizePalette = GAPI_RealizePalette; WIN_PaletteChanged = GAPI_PaletteChanged; WIN_WinPAINT = GAPI_WinPAINT; @@ -320,7 +340,7 @@ static SDL_VideoDevice *GAPI_CreateDevice(int devindex) device->free = GAPI_DeleteDevice; /* Load gapi library */ -#define gx device->hidden->gxFunc +#define gx device->hidden->gapiInfo->gxFunc LINK( GXOpenDisplay, gx.GXOpenDisplay, "?GXOpenDisplay@@YAHPAUHWND__@@K@Z" ) LINK( GXCloseDisplay, gx.GXCloseDisplay, "?GXCloseDisplay@@YAHXZ" ) @@ -369,23 +389,23 @@ static void FillStructs(_THIS, BOOL useVga) if( !useVga ) { - this->hidden->gxProperties = this->hidden->gxFunc.GXGetDisplayProperties(); - this->hidden->needUpdate = 1; - this->hidden->hiresFix = 0; - this->hidden->useVga = 0; - this->hidden->useGXOpenDisplay = 1; + gapi->gxProperties = gapi->gxFunc.GXGetDisplayProperties(); + gapi->needUpdate = 1; + gapi->hiresFix = 0; + gapi->useVga = 0; + gapi->useGXOpenDisplay = 1; #ifdef _ARM_ /* check some devices and extract addition info */ SystemParametersInfo( SPI_GETOEMINFO, sizeof( oemstr ), oemstr, 0 ); // buggy iPaq38xx - if ((oemstr[12] == 'H') && (oemstr[13] == '3') && (oemstr[14] == '8') && (this->hidden->gxProperties.cbxPitch > 0)) + if ((oemstr[12] == 'H') && (oemstr[13] == '3') && (oemstr[14] == '8') && (gapi->gxProperties.cbxPitch > 0)) { - this->hidden->videoMem = (PIXEL*)0xac0755a0; - this->hidden->gxProperties.cbxPitch = -640; - this->hidden->gxProperties.cbyPitch = 2; - this->hidden->needUpdate = 0; + gapi->videoMem = (PIXEL*)0xac0755a0; + gapi->gxProperties.cbxPitch = -640; + gapi->gxProperties.cbyPitch = 2; + gapi->needUpdate = 0; } #if (EMULATE_AXIM_X30 == 0) // buggy Dell Axim X30 @@ -400,36 +420,36 @@ static void FillStructs(_THIS, BOOL useVga) result = ExtEscape(hdc, GETGXINFO, 0, NULL, sizeof(gxInfo), (char *)&gxInfo); if( result > 0 ) { - this->hidden->useGXOpenDisplay = 0; - this->hidden->videoMem = gxInfo.pvFrameBuffer; - this->hidden->needUpdate = 0; - this->hidden->gxProperties.cbxPitch = 2; - this->hidden->gxProperties.cbyPitch = 480; - this->hidden->gxProperties.cxWidth = gxInfo.cxWidth; - this->hidden->gxProperties.cyHeight = gxInfo.cyHeight; - this->hidden->gxProperties.ffFormat = gxInfo.ffFormat; + gapi->useGXOpenDisplay = 0; + gapi->videoMem = gxInfo.pvFrameBuffer; + gapi->needUpdate = 0; + gapi->gxProperties.cbxPitch = 2; + gapi->gxProperties.cbyPitch = 480; + gapi->gxProperties.cxWidth = gxInfo.cxWidth; + gapi->gxProperties.cyHeight = gxInfo.cyHeight; + gapi->gxProperties.ffFormat = gxInfo.ffFormat; } } #endif } else { - this->hidden->needUpdate = 0; - this->hidden->hiresFix = 0; - this->hidden->gxProperties.cBPP = g_RawFrameBufferInfo.wBPP; - this->hidden->gxProperties.cbxPitch = g_RawFrameBufferInfo.cxStride; - this->hidden->gxProperties.cbyPitch = g_RawFrameBufferInfo.cyStride; - this->hidden->gxProperties.cxWidth = g_RawFrameBufferInfo.cxPixels; - this->hidden->gxProperties.cyHeight = g_RawFrameBufferInfo.cyPixels; - this->hidden->videoMem = g_RawFrameBufferInfo.pFramePointer; - this->hidden->useVga = 1; + gapi->needUpdate = 0; + gapi->hiresFix = 0; + gapi->gxProperties.cBPP = g_RawFrameBufferInfo.wBPP; + gapi->gxProperties.cbxPitch = g_RawFrameBufferInfo.cxStride; + gapi->gxProperties.cbyPitch = g_RawFrameBufferInfo.cyStride; + gapi->gxProperties.cxWidth = g_RawFrameBufferInfo.cxPixels; + gapi->gxProperties.cyHeight = g_RawFrameBufferInfo.cyPixels; + gapi->videoMem = g_RawFrameBufferInfo.pFramePointer; + gapi->useVga = 1; switch( g_RawFrameBufferInfo.wFormat ) { case FORMAT_565: - this->hidden->gxProperties.ffFormat = kfDirect565; + gapi->gxProperties.ffFormat = kfDirect565; break; case FORMAT_555: - this->hidden->gxProperties.ffFormat = kfDirect555; + gapi->gxProperties.ffFormat = kfDirect555; break; default: /* unknown pixel format, try define by BPP! */ @@ -437,31 +457,31 @@ static void FillStructs(_THIS, BOOL useVga) { case 4: case 8: - this->hidden->gxProperties.ffFormat = kfDirect; + gapi->gxProperties.ffFormat = kfDirect; case 16: - this->hidden->gxProperties.ffFormat = kfDirect565; + gapi->gxProperties.ffFormat = kfDirect565; default: - this->hidden->gxProperties.ffFormat = kfDirect; + gapi->gxProperties.ffFormat = kfDirect; break; } } } - if( this->hidden->gxProperties.cBPP != 16 ) + if( gapi->gxProperties.cBPP != 16 ) { - this->hidden->gapiOrientation = SDL_ORIENTATION_UP; + gapi->gapiOrientation = SDL_ORIENTATION_UP; } else - if( (this->hidden->gxProperties.cbxPitch > 0) && (this->hidden->gxProperties.cbyPitch > 0 )) + if( (gapi->gxProperties.cbxPitch > 0) && (gapi->gxProperties.cbyPitch > 0 )) { - this->hidden->gapiOrientation = SDL_ORIENTATION_UP; + gapi->gapiOrientation = SDL_ORIENTATION_UP; } else - if( (this->hidden->gxProperties.cbxPitch > 0) && (this->hidden->gxProperties.cbyPitch < 0 )) + if( (gapi->gxProperties.cbxPitch > 0) && (gapi->gxProperties.cbyPitch < 0 )) { - this->hidden->gapiOrientation = SDL_ORIENTATION_RIGHT; // ipaq 3660 + gapi->gapiOrientation = SDL_ORIENTATION_RIGHT; // ipaq 3660 } else - if( (this->hidden->gxProperties.cbxPitch < 0) && (this->hidden->gxProperties.cbyPitch > 0 )) + if( (gapi->gxProperties.cbxPitch < 0) && (gapi->gxProperties.cbyPitch > 0 )) { - this->hidden->gapiOrientation = SDL_ORIENTATION_LEFT; // ipaq 3800 + gapi->gapiOrientation = SDL_ORIENTATION_LEFT; // ipaq 3800 } } @@ -537,9 +557,11 @@ int GAPI_VideoInit(_THIS, SDL_PixelFormat *vformat) GAPI_AddMode(this, bpp, gapi->gxProperties.cxWidth, gapi->gxProperties.cyHeight); } - /* Determine the current screen size */ - this->info.current_w = gapi->gxProperties.cxWidth; - this->info.current_h = gapi->gxProperties.cyHeight; + /* Determine the current screen size. + * This is NOT necessarily the size of the Framebuffer or GAPI, as they return + * the displaysize in ORIENTATION_UP */ + this->info.current_w = GetSystemMetrics(SM_CXSCREEN); + this->info.current_h = GetSystemMetrics(SM_CYSCREEN); /* Sort the mode lists */ for ( i=0; iBitsPerPixel = this->hidden->gxProperties.cBPP < 8 ? 16 : (unsigned char)this->hidden->gxProperties.cBPP; + vformat->BitsPerPixel = gapi->gxProperties.cBPP < 8 ? 16 : (unsigned char)gapi->gxProperties.cBPP; // Get color mask - if (this->hidden->gxProperties.ffFormat & kfDirect565) { + if (gapi->gxProperties.ffFormat & kfDirect565) { vformat->BitsPerPixel = 16; vformat->Rmask = 0x0000f800; vformat->Gmask = 0x000007e0; vformat->Bmask = 0x0000001f; - this->hidden->videoMode = GAPI_DIRECT_565; + gapi->videoMode = GAPI_DIRECT_565; } else - if (this->hidden->gxProperties.ffFormat & kfDirect555) { + if (gapi->gxProperties.ffFormat & kfDirect555) { vformat->BitsPerPixel = 16; vformat->Rmask = 0x00007c00; vformat->Gmask = 0x000003e0; vformat->Bmask = 0x0000001f; - this->hidden->videoMode = GAPI_DIRECT_555; + gapi->videoMode = GAPI_DIRECT_555; } else - if ((this->hidden->gxProperties.ffFormat & kfDirect) && (this->hidden->gxProperties.cBPP < 8)) { + if ((gapi->gxProperties.ffFormat & kfDirect) && (gapi->gxProperties.cBPP < 8)) { // We'll perform the conversion vformat->BitsPerPixel = 16; vformat->Rmask = 0x0000f800; // 16 bit 565 vformat->Gmask = 0x000007e0; vformat->Bmask = 0x0000001f; - if (this->hidden->gxProperties.ffFormat & kfDirectInverted) - this->hidden->invert = (1 << this->hidden->gxProperties.cBPP) - 1; - this->hidden->colorscale = this->hidden->gxProperties.cBPP < 8 ? 8 - this->hidden->gxProperties.cBPP : 0; - this->hidden->videoMode = GAPI_MONO; + if (gapi->gxProperties.ffFormat & kfDirectInverted) + gapi->invert = (1 << gapi->gxProperties.cBPP) - 1; + gapi->colorscale = gapi->gxProperties.cBPP < 8 ? 8 - gapi->gxProperties.cBPP : 0; + gapi->videoMode = GAPI_MONO; } else - if (this->hidden->gxProperties.ffFormat & kfPalette) { - this->hidden->videoMode = GAPI_PALETTE; + if (gapi->gxProperties.ffFormat & kfPalette) { + gapi->videoMode = GAPI_PALETTE; } /* We're done! */ @@ -589,7 +611,7 @@ int GAPI_VideoInit(_THIS, SDL_PixelFormat *vformat) SDL_Rect **GAPI_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) { - return(this->hidden->SDL_modelist[((format->BitsPerPixel+7)/8)-1]); + return(gapi->SDL_modelist[((format->BitsPerPixel+7)/8)-1]); // return (SDL_Rect **) -1; } @@ -600,6 +622,7 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, Uint32 Rmask, Gmask, Bmask; DWORD style; SDL_Rect allScreen; + SDL_ScreenOrientation systemOrientation; if( bpp < 4 ) { @@ -621,7 +644,7 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, case 15: case 16: /* Default is 565 unless the display is specifically 555 */ - if (this->hidden->gxProperties.ffFormat & kfDirect555) { + if (gapi->gxProperties.ffFormat & kfDirect555) { Rmask = 0x00007c00; Gmask = 0x000003e0; Bmask = 0x0000001f; @@ -651,7 +674,7 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, } gapi->userOrientation = SDL_ORIENTATION_UP; - gapi->systemOrientation = SDL_ORIENTATION_UP; + systemOrientation = SDL_ORIENTATION_UP; video->flags = SDL_FULLSCREEN; /* Clear flags, GAPI supports fullscreen only */ /* GAPI or VGA? */ @@ -664,7 +687,7 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, } else FillStructs(this, 1); - if ( !this->hidden->needUpdate && !this->hidden->videoMem) { + if ( !gapi->needUpdate && !gapi->videoMem) { SDL_SetError("Couldn't get address of video memory, may be unsupported device or bug"); return(NULL); } @@ -674,11 +697,11 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, gapi->userOrientation = SDL_ORIENTATION_RIGHT; if(GetSystemMetrics(SM_CYSCREEN) < GetSystemMetrics(SM_CXSCREEN)) - gapi->systemOrientation = SDL_ORIENTATION_RIGHT; + systemOrientation = SDL_ORIENTATION_RIGHT; /* shall we apply hires fix? for example when we do not use hires resource */ gapi->hiresFix = 0; - if( gapi->systemOrientation == gapi->userOrientation ) + if( systemOrientation == gapi->userOrientation ) { if( (width > GetSystemMetrics(SM_CXSCREEN)) || (height > GetSystemMetrics(SM_CYSCREEN))) gapi->hiresFix = 1; @@ -700,7 +723,7 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, case SDL_ORIENTATION_UP: case SDL_ORIENTATION_RIGHT: case SDL_ORIENTATION_LEFT: - if( (this->hidden->videoMode == GAPI_MONO) ) + if( (gapi->videoMode == GAPI_MONO) ) gapi->startOffset = -gapi->gxProperties.cbxPitch + 1; // monochrome mode else gapi->startOffset = gapi->gxProperties.cbyPitch * (gapi->gxProperties.cyHeight - 1); @@ -711,8 +734,8 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, } } - video->w = this->hidden->w = width; - video->h = this->hidden->h = height; + video->w = gapi->w = width; + video->h = gapi->h = height; video->pitch = SDL_CalculatePitch(video); /* Small fix for WinCE/Win32 - when activating window @@ -729,20 +752,20 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, SetWindowLong(SDL_Window, GWL_STYLE, style); /* Allocate bitmap */ - if(gapiBuffer) + if( gapi->buffer ) { - SDL_free(gapiBuffer); - gapiBuffer = NULL; + SDL_free( gapi->buffer ); + gapi->buffer = NULL; } - gapiBuffer = SDL_malloc(video->h * video->pitch); - video->pixels = gapiBuffer; + gapi->buffer = SDL_malloc(video->h * video->pitch); + video->pixels = gapi->buffer; - if ( ! this->hidden->buffer ) { + if ( ! gapi->buffer ) { SDL_SetError("Couldn't allocate buffer for requested mode"); return(NULL); } - SDL_memset(gapiBuffer, 255, video->h * video->pitch); + SDL_memset(gapi->buffer, 255, video->h * video->pitch); MoveWindow(SDL_Window, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), FALSE); ShowWindow(SDL_Window, SW_SHOW); SetForegroundWindow(SDL_Window); @@ -754,9 +777,9 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, WIN_FlushMessageQueue(); /* Open GAPI display */ - if( !gapi->useVga && this->hidden->useGXOpenDisplay && !this->hidden->alreadyGXOpened ) + if( !gapi->useVga && gapi->useGXOpenDisplay && !gapi->alreadyGXOpened ) { - this->hidden->alreadyGXOpened = 1; + gapi->alreadyGXOpened = 1; if( !gapi->gxFunc.GXOpenDisplay(SDL_Window, GX_FULLSCREEN) ) { SDL_SetError("Couldn't initialize GAPI"); @@ -764,6 +787,11 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, } } + if(gapi->useVga) + gapi->coordinateTransform = (4 - systemOrientation + gapi->userOrientation) % 4; + else + gapi->coordinateTransform = gapi->userOrientation; + #if REPORT_VIDEO_INFO printf("Video properties:\n"); printf("display bpp: %d\n", gapi->gxProperties.cBPP); @@ -775,11 +803,11 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, printf("y pitch: %d\n", gapi->gxProperties.cbyPitch); printf("gapi flags: 0x%x\n", gapi->gxProperties.ffFormat); printf("user orientation: %d\n", gapi->userOrientation); - printf("system orientation: %d\n", gapi->userOrientation); + printf("system orientation: %d\n", systemOrientation); printf("gapi orientation: %d\n", gapi->gapiOrientation); - if( !gapi->useVga && this->hidden->useGXOpenDisplay && gapi->needUpdate) + if( !gapi->useVga && gapi->useGXOpenDisplay && gapi->needUpdate) { gapi->videoMem = gapi->gxFunc.GXBeginDraw(); gapi->gxFunc.GXEndDraw(); @@ -793,6 +821,7 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, printf("video surface bpp: %d\n", video->format->BitsPerPixel); printf("video surface width: %d\n", video->w); printf("video surface height: %d\n", video->h); + printf("mouse/arrows transformation angle: %d\n", gapi->coordinateTransform); #endif @@ -1143,8 +1172,8 @@ void GAPI_VideoQuit(_THIS) /* Destroy the window and everything associated with it */ if ( SDL_Window ) { - if ((g_hGapiLib != 0) && this && this->hidden && this->hidden->gxFunc.GXCloseDisplay && !this->hidden->useVga) - this->hidden->gxFunc.GXCloseDisplay(); + if ((g_hGapiLib != 0) && this && gapi && gapi->gxFunc.GXCloseDisplay && !gapi->useVga) + gapi->gxFunc.GXCloseDisplay(); if (this->screen->pixels != NULL) { @@ -1184,6 +1213,11 @@ void GAPI_VideoQuit(_THIS) } +static void GAPI_Activate(_THIS, BOOL active, BOOL minimized) +{ + //Nothing to do here (as far as I know) +} + static void GAPI_RealizePalette(_THIS) { OutputDebugString(TEXT("GAPI_RealizePalette NOT IMPLEMENTED !\r\n")); @@ -1215,12 +1249,12 @@ static void GAPI_WinPAINT(_THIS, HDC hdc) // DIB Header pHeader->biSize = sizeof(BITMAPINFOHEADER); - pHeader->biWidth = this->hidden->w; - pHeader->biHeight = -this->hidden->h; + pHeader->biWidth = gapi->w; + pHeader->biHeight = -gapi->h; pHeader->biPlanes = 1; pHeader->biBitCount = bpp; pHeader->biCompression = BI_RGB; - pHeader->biSizeImage = (this->hidden->w * this->hidden->h * bpp) / 8; + pHeader->biSizeImage = (gapi->w * gapi->h * bpp) / 8; // Color masks if( bpp == 16 ) @@ -1235,11 +1269,11 @@ static void GAPI_WinPAINT(_THIS, HDC hdc) // copy data // FIXME: prevent misalignment, but I've never seen non aligned width of screen - memcpy(bitmapData, this->hidden->buffer, pHeader->biSizeImage); + memcpy(bitmapData, gapi->buffer, pHeader->biSizeImage); srcDC = CreateCompatibleDC(hdc); prevObject = SelectObject(srcDC, hb); - BitBlt(hdc, 0, 0, this->hidden->w, this->hidden->h, srcDC, 0, 0, SRCCOPY); + BitBlt(hdc, 0, 0, gapi->w, gapi->h, srcDC, 0, 0, SRCCOPY); SelectObject(srcDC, prevObject); DeleteObject(hb); diff --git a/src/video/gapi/SDL_gapivideo.h b/src/video/gapi/SDL_gapivideo.h index c041d2952..514bb76a7 100644 --- a/src/video/gapi/SDL_gapivideo.h +++ b/src/video/gapi/SDL_gapivideo.h @@ -27,6 +27,7 @@ #include "SDL_mouse.h" #include "SDL_mutex.h" #include "../SDL_sysvideo.h" +#include "../windib/SDL_gapidibvideo.h" /* From gx.h, since it's not really C compliant */ @@ -100,13 +101,6 @@ struct GapiFunc #define GX_NORMALKEYS 0x02 #define GX_LANDSCAPEKEYS 0x03 -typedef enum -{ - SDL_ORIENTATION_UP, - SDL_ORIENTATION_DOWN, - SDL_ORIENTATION_LEFT, - SDL_ORIENTATION_RIGHT -} SDL_ScreenOrientation; /* GAPI video mode */ typedef enum { @@ -117,26 +111,26 @@ typedef enum { GAPI_PALETTE } GAPIVideoMode; -/* Hidden "this" pointer for the video functions */ -#define _THIS SDL_VideoDevice *this - typedef unsigned short PIXEL; /* Private display data begin with DIB private structure to allow DIB events code sharing */ -struct SDL_PrivateVideoData { - HBITMAP screen_bmp; - HPALETTE screen_pal; +struct GapiInfo { + /* Rotation which has to be applied to the key (arrow keys) and mouse events measured in quarters of a circle + * counter clockwise */ + int coordinateTransform; + char hiresFix; /* using hires mode without defining hires resource */ + int invert; //TODO this is only written but never read, so it should be removed #define NUM_MODELISTS 4 /* 8, 16, 24, and 32 bits-per-pixel */ int SDL_nummodes[NUM_MODELISTS]; SDL_Rect **SDL_modelist[NUM_MODELISTS]; + + // The orientation of the video mode user wants to get // Probably restricted to UP and RIGHT SDL_ScreenOrientation userOrientation; - int invert; - char hiresFix; // using hires mode without defining hires resource // -------------- int useGXOpenDisplay; /* use GXOpenDispplay */ int alreadyGXOpened; @@ -158,14 +152,8 @@ struct SDL_PrivateVideoData { int startOffset; // in bytes int useVga; int suspended; // do not pu anything into video memory - // The orientation of the system, as defined by SM_CXSCREEN and SM_CYSCREEN - // User can change it by using 'screen layout' in system options - // Restricted to UP or RIGHT - enum SDL_ScreenOrientation systemOrientation; }; -#define gapiBuffer this->hidden->buffer -#define gapi this->hidden #endif /* _SDL_gapivideo_h */ diff --git a/src/video/wincommon/SDL_sysevents.c b/src/video/wincommon/SDL_sysevents.c index 2e365ff52..377980192 100644 --- a/src/video/wincommon/SDL_sysevents.c +++ b/src/video/wincommon/SDL_sysevents.c @@ -50,9 +50,13 @@ #include "wmmsg.h" #endif -#ifdef _WIN32_WCE +#include "../windib/SDL_gapidibvideo.h" + +#ifdef SDL_VIDEO_DRIVER_GAPI #include "../gapi/SDL_gapivideo.h" +#endif +#ifdef _WIN32_WCE #define IsZoomed(HWND) 1 #define NO_GETKEYBOARDSTATE #if _WIN32_WCE < 420 @@ -103,6 +107,9 @@ ToUnicodeFN SDL_ToUnicode = ToUnicode9xME; #if defined(_WIN32_WCE) +//AdjustWindowRect is not available under WinCE 2003 +#define AdjustWindowRect(a,b,c) (AdjustWindowRectEx((a),(b),(c),0)) + // dynamically load aygshell dll because we want SDL to work on HPC and be300 HINSTANCE aygshell = NULL; BOOL (WINAPI *SHFullScreen)(HWND hwndRequester, DWORD dwState) = 0; @@ -211,15 +218,19 @@ void WIN_FlushMessageQueue() static void SDL_RestoreGameMode(void) { -#ifdef _WIN32_WCE +#ifdef _WIN32_WCE //Under ce we don't minimize, therefore no restore + +#ifdef SDL_VIDEO_DRIVER_GAPI SDL_VideoDevice *this = current_video; if(SDL_strcmp(this->name, "gapi") == 0) { - if( this->hidden->suspended ) + if( this->hidden->gapiInfo->suspended ) { - this->hidden->suspended = 0; + this->hidden->gapiInfo->suspended = 0; } } +#endif + #else ShowWindow(SDL_Window, SW_RESTORE); #endif @@ -234,14 +245,18 @@ static void SDL_RestoreDesktopMode(void) { #ifdef _WIN32_WCE + +#ifdef SDL_VIDEO_DRIVER_GAPI SDL_VideoDevice *this = current_video; if(SDL_strcmp(this->name, "gapi") == 0) { - if( !this->hidden->suspended ) + if( !this->hidden->gapiInfo->suspended ) { - this->hidden->suspended = 1; + this->hidden->gapiInfo->suspended = 1; } } +#endif + #else /* WinCE does not have a taskbar, so minimizing is not convenient */ ShowWindow(SDL_Window, SW_MINIMIZE); @@ -459,9 +474,9 @@ LRESULT CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) posted = SDL_PrivateMouseMotion(0, 1, x, y); } } else { -#ifdef _WIN32_WCE - if (SDL_VideoSurface) - GapiTransform(this->hidden->userOrientation, this->hidden->hiresFix, &x, &y); +#ifdef SDL_VIDEO_DRIVER_GAPI + if (SDL_VideoSurface && this->hidden->gapiInfo) + GapiTransform(this->hidden->gapiInfo->coordinateTransform, this->hidden->gapiInfo->hiresFix, &x, &y); #endif posted = SDL_PrivateMouseMotion(0, 0, x, y); } @@ -564,9 +579,9 @@ LRESULT CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) } else { x = (Sint16)LOWORD(lParam); y = (Sint16)HIWORD(lParam); -#ifdef _WIN32_WCE - if (SDL_VideoSurface) - GapiTransform(this->hidden->userOrientation, this->hidden->hiresFix, &x, &y); +#ifdef SDL_VIDEO_DRIVER_GAPI + if (SDL_VideoSurface && this->hidden->gapiInfo) + GapiTransform(this->hidden->gapiInfo->coordinateTransform, this->hidden->gapiInfo->hiresFix, &x, &y); #endif } posted = SDL_PrivateMouseButton( diff --git a/src/video/windib/SDL_dibevents.c b/src/video/windib/SDL_dibevents.c index 9dde7e28b..a216cf3f0 100644 --- a/src/video/windib/SDL_dibevents.c +++ b/src/video/windib/SDL_dibevents.c @@ -30,9 +30,17 @@ #include "../../events/SDL_sysevents.h" #include "../../events/SDL_events_c.h" #include "../wincommon/SDL_lowvideo.h" -#include "SDL_dibvideo.h" +#include "SDL_gapidibvideo.h" #include "SDL_vkeys.h" +#ifdef SDL_VIDEO_DRIVER_GAPI +#include "../gapi/SDL_gapivideo.h" +#endif + +#ifdef SDL_VIDEO_DRIVER_WINDIB +#include "SDL_dibvideo.h" +#endif + #ifndef WM_APP #define WM_APP 0x8000 #endif @@ -44,6 +52,7 @@ /* The translation table from a Microsoft VK keysym to a SDL keysym */ static SDLKey VK_keymap[SDLK_LAST]; static SDL_keysym *TranslateKey(WPARAM vkey, UINT scancode, SDL_keysym *keysym, int pressed); +static SDLKey Arrows_keymap[4]; /* Masks for processing the windows KEYDOWN and KEYUP messages */ #define REPEATED_KEYMASK (1<<30) @@ -59,22 +68,21 @@ static SDL_keysym *TranslateKey(WPARAM vkey, UINT scancode, SDL_keysym *keysym, static WNDPROCTYPE userWindowProc = NULL; -#ifdef _WIN32_WCE +#ifdef SDL_VIDEO_DRIVER_GAPI -WPARAM rotateKey(WPARAM key,SDL_ScreenOrientation direction) +WPARAM rotateKey(WPARAM key,int direction) { - if (direction != SDL_ORIENTATION_LEFT) - return key; - + if(direction ==0 ) return key; + switch (key) { case 0x26: /* up */ - return 0x27; + return Arrows_keymap[(2 + direction) % 4]; case 0x27: /* right */ - return 0x28; + return Arrows_keymap[(1 + direction) % 4]; case 0x28: /* down */ - return 0x25; + return Arrows_keymap[direction % 4]; case 0x25: /* left */ - return 0x26; + return Arrows_keymap[(3 + direction) % 4]; } return key; @@ -93,14 +101,15 @@ LRESULT DIB_HandleMessage(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar case WM_KEYDOWN: { SDL_keysym keysym; -#ifdef _WIN32_WCE - // Drop GAPI artefacts - if (wParam == 0x84 || wParam == 0x5B) - return 0; +#ifdef SDL_VIDEO_DRIVER_GAPI + if(this->hidden->gapiInfo) + { + // Drop GAPI artefacts + if (wParam == 0x84 || wParam == 0x5B) + return 0; - // Rotate key if necessary - if (this->hidden->orientation != SDL_ORIENTATION_UP) - wParam = rotateKey(wParam, this->hidden->orientation); + wParam = rotateKey(wParam, this->hidden->gapiInfo->coordinateTransform); + } #endif /* Ignore repeated keys */ if ( lParam&REPEATED_KEYMASK ) { @@ -167,14 +176,15 @@ LRESULT DIB_HandleMessage(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar case WM_KEYUP: { SDL_keysym keysym; -#ifdef _WIN32_WCE - // Drop GAPI artifacts - if (wParam == 0x84 || wParam == 0x5B) - return 0; - - // Rotate key if necessary - if (this->hidden->orientation != SDL_ORIENTATION_UP) - wParam = rotateKey(wParam, this->hidden->orientation); +#ifdef SDL_VIDEO_DRIVER_GAPI + if(this->hidden->gapiInfo) + { + // Drop GAPI artifacts + if (wParam == 0x84 || wParam == 0x5B) + return 0; + + wParam = rotateKey(wParam, this->hidden->gapiInfo->coordinateTransform); + } #endif switch (wParam) { @@ -222,12 +232,11 @@ LRESULT DIB_HandleMessage(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar TranslateKey(wParam,HIWORD(lParam),&keysym,0)); } return(0); - #if defined(SC_SCREENSAVE) && defined(SC_MONITORPOWER) case WM_SYSCOMMAND: { const DWORD val = (DWORD) (wParam & 0xFFF0); if ((val == SC_SCREENSAVE) || (val == SC_MONITORPOWER)) { - if (!allow_screensaver) { + if (this->hidden->dibInfo && !allow_screensaver) { /* Note that this doesn't stop anything on Vista if the screensaver has a password. */ return(0); @@ -430,6 +439,11 @@ void DIB_InitOSKeymap(_THIS) VK_keymap[VK_SNAPSHOT] = SDLK_PRINT; VK_keymap[VK_CANCEL] = SDLK_BREAK; VK_keymap[VK_APPS] = SDLK_MENU; + + Arrows_keymap[3] = 0x25; + Arrows_keymap[2] = 0x26; + Arrows_keymap[1] = 0x27; + Arrows_keymap[0] = 0x28; } #define EXTKEYPAD(keypad) ((scancode & 0x100)?(mvke):(keypad)) @@ -485,9 +499,19 @@ static SDL_keysym *TranslateKey(WPARAM vkey, UINT scancode, SDL_keysym *keysym, keysym->scancode = (unsigned char) scancode; keysym->mod = KMOD_NONE; keysym->unicode = 0; + + if ((vkey == VK_RETURN) && (scancode & 0x100)) { + /* No VK_ code for the keypad enter key */ + keysym->sym = SDLK_KP_ENTER; + } + else { + keysym->sym = VK_keymap[SDL_MapVirtualKey(scancode, vkey)]; + } + if ( pressed && SDL_TranslateUNICODE ) { #ifdef NO_GETKEYBOARDSTATE /* Uh oh, better hope the vkey is close enough.. */ + if((keysym->sym == vkey) || (vkey > 0x7f)) keysym->unicode = vkey; #else BYTE keystate[256]; @@ -501,14 +525,6 @@ static SDL_keysym *TranslateKey(WPARAM vkey, UINT scancode, SDL_keysym *keysym, #endif /* NO_GETKEYBOARDSTATE */ } - if ((vkey == VK_RETURN) && (scancode & 0x100)) { - /* No VK_ code for the keypad enter key */ - keysym->sym = SDLK_KP_ENTER; - } - else { - keysym->sym = VK_keymap[SDL_MapVirtualKey(scancode, vkey)]; - } - #if 0 { HKL hLayoutCurrent = GetKeyboardLayout(0); diff --git a/src/video/windib/SDL_dibvideo.c b/src/video/windib/SDL_dibvideo.c index 47de20a3e..d96149963 100644 --- a/src/video/windib/SDL_dibvideo.c +++ b/src/video/windib/SDL_dibvideo.c @@ -34,6 +34,7 @@ #include "../SDL_pixels_c.h" #include "../../events/SDL_sysevents.h" #include "../../events/SDL_events_c.h" +#include "SDL_gapidibvideo.h" #include "SDL_dibvideo.h" #include "../wincommon/SDL_syswm_c.h" #include "../wincommon/SDL_sysmouse_c.h" @@ -128,6 +129,9 @@ static void DIB_DeleteDevice(SDL_VideoDevice *device) { if ( device ) { if ( device->hidden ) { + if ( device->hidden->dibInfo ) { + SDL_free( device->hidden->dibInfo ); + } SDL_free(device->hidden); } if ( device->gl_data ) { @@ -147,6 +151,16 @@ static SDL_VideoDevice *DIB_CreateDevice(int devindex) SDL_memset(device, 0, (sizeof *device)); device->hidden = (struct SDL_PrivateVideoData *) SDL_malloc((sizeof *device->hidden)); + if(device->hidden){ + SDL_memset(device->hidden, 0, (sizeof *device->hidden)); + device->hidden->dibInfo = (DibInfo *)SDL_malloc((sizeof(DibInfo))); + if(device->hidden->dibInfo == NULL) + { + SDL_free(device->hidden); + device->hidden = NULL; + } + } + device->gl_data = (struct SDL_PrivateGLData *) SDL_malloc((sizeof *device->gl_data)); } @@ -156,7 +170,7 @@ static SDL_VideoDevice *DIB_CreateDevice(int devindex) DIB_DeleteDevice(device); return(NULL); } - SDL_memset(device->hidden, 0, (sizeof *device->hidden)); + SDL_memset(device->hidden->dibInfo, 0, (sizeof *device->hidden->dibInfo)); SDL_memset(device->gl_data, 0, (sizeof *device->gl_data)); /* Set the function pointers */ @@ -347,6 +361,8 @@ int DIB_VideoInit(_THIS, SDL_PixelFormat *vformat) this->hidden->supportRotation = ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_TEST, NULL) == DISP_CHANGE_SUCCESSFUL; #endif /* Query for the desktop resolution */ + SDL_desktop_mode.dmSize = sizeof(SDL_desktop_mode); + SDL_desktop_mode.dmDriverExtra = 0; EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &SDL_desktop_mode); this->info.current_w = SDL_desktop_mode.dmPelsWidth; this->info.current_h = SDL_desktop_mode.dmPelsHeight; @@ -744,7 +760,7 @@ SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current, video->flags |= SDL_RESIZABLE; } } -#if WS_MAXIMIZE +#if WS_MAXIMIZE && !defined(_WIN32_WCE) if (IsZoomed(SDL_Window)) style |= WS_MAXIMIZE; #endif } @@ -1006,7 +1022,7 @@ int DIB_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) entry->peBlue = colors[i].b; entry->peFlags = PC_NOCOLLAPSE; } -#ifdef SYSPAL_NOSTATIC +#if defined(SYSPAL_NOSTATIC) && !defined(_WIN32_WCE) /* Check to make sure black and white are in position */ if ( GetSystemPaletteUse(hdc) != SYSPAL_NOSTATIC256 ) { moved_entries += CheckPaletteEntry(screen_logpal, 0, 0x00, 0x00, 0x00); @@ -1227,7 +1243,7 @@ void DIB_VideoQuit(_THIS) /* Exported for the windows message loop only */ static void DIB_GrabStaticColors(HWND window) { -#ifdef SYSPAL_NOSTATIC +#if defined(SYSPAL_NOSTATIC) && !defined(_WIN32_WCE) HDC hdc; hdc = GetDC(window); @@ -1240,7 +1256,7 @@ static void DIB_GrabStaticColors(HWND window) } static void DIB_ReleaseStaticColors(HWND window) { -#ifdef SYSPAL_NOSTATIC +#if defined(SYSPAL_NOSTATIC) && !defined(_WIN32_WCE) HDC hdc; hdc = GetDC(window); diff --git a/src/video/windib/SDL_dibvideo.h b/src/video/windib/SDL_dibvideo.h index 2f9bc092f..9cee442d8 100644 --- a/src/video/windib/SDL_dibvideo.h +++ b/src/video/windib/SDL_dibvideo.h @@ -27,18 +27,10 @@ #define WIN32_LEAN_AND_MEAN #include -/* for PDA */ -typedef enum -{ - SDL_ORIENTATION_UP, - SDL_ORIENTATION_DOWN, - SDL_ORIENTATION_LEFT, - SDL_ORIENTATION_RIGHT -} SDL_ScreenOrientation; /* Private display data */ -struct SDL_PrivateVideoData { - HBITMAP screen_bmp; +struct DibInfo { + HBITMAP screen_bmp; HPALETTE screen_pal; LOGPALETTE *screen_logpal; BOOL grab_palette; @@ -46,11 +38,8 @@ struct SDL_PrivateVideoData { #define NUM_MODELISTS 4 /* 8, 16, 24, and 32 bits-per-pixel */ int SDL_nummodes[NUM_MODELISTS]; SDL_Rect **SDL_modelist[NUM_MODELISTS]; - - SDL_ScreenOrientation orientation; + #ifdef _WIN32_WCE - int invert; /* do to remove, used by GAPI driver! */ - char hiresFix; /* using hires mode without defining hires resource */ int supportRotation; /* for Pocket PC devices */ DWORD origRotation; /* for Pocket PC devices */ #endif @@ -59,12 +48,12 @@ struct SDL_PrivateVideoData { int allow_screensaver; }; /* Old variable names */ -#define screen_bmp (this->hidden->screen_bmp) -#define screen_pal (this->hidden->screen_pal) -#define screen_logpal (this->hidden->screen_logpal) -#define grab_palette (this->hidden->grab_palette) -#define SDL_nummodes (this->hidden->SDL_nummodes) -#define SDL_modelist (this->hidden->SDL_modelist) -#define allow_screensaver (this->hidden->allow_screensaver) +#define screen_bmp (this->hidden->dibInfo->screen_bmp) +#define screen_pal (this->hidden->dibInfo->screen_pal) +#define screen_logpal (this->hidden->dibInfo->screen_logpal) +#define grab_palette (this->hidden->dibInfo->grab_palette) +#define SDL_nummodes (this->hidden->dibInfo->SDL_nummodes) +#define SDL_modelist (this->hidden->dibInfo->SDL_modelist) +#define allow_screensaver (this->hidden->dibInfo->allow_screensaver) #endif /* _SDL_dibvideo_h */ diff --git a/src/video/windib/SDL_gapidibvideo.h b/src/video/windib/SDL_gapidibvideo.h new file mode 100644 index 000000000..019e57798 --- /dev/null +++ b/src/video/windib/SDL_gapidibvideo.h @@ -0,0 +1,56 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2009 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ +#include "SDL_config.h" + +#ifndef _SDL_gapidibvideo_h +#define _SDL_gapidibvideo_h + +#define WIN32_LEAN_AND_MEAN +#include + +/* Hidden "this" pointer for the video functions */ +#define _THIS SDL_VideoDevice *this + +/* typedef these to be able to define pointers, but still force everybody who + * wants to access them to include the corresponding header */ +typedef struct GapiInfo GapiInfo; +typedef struct DibInfo DibInfo; + +/* for PDA */ +typedef enum +{ + SDL_ORIENTATION_UP, + SDL_ORIENTATION_DOWN, + SDL_ORIENTATION_LEFT, + SDL_ORIENTATION_RIGHT +} SDL_ScreenOrientation; + +/* Private display data shared by gapi and windib*/ +struct SDL_PrivateVideoData { + int supportRotation; /* for Pocket PC devices */ + DWORD origRotation; /* for Pocket PC devices */ + + GapiInfo* gapiInfo; + DibInfo* dibInfo; +}; + +#endif