GAPI fixes from Stefan Klug SDL-1.2
authorSam Lantinga <slouken@libsdl.org>
Mon, 16 Feb 2009 22:32:34 +0000
branchSDL-1.2
changeset 4162 3b7fc3416601
parent 4161 bd91db0b0b5d
child 4163 bec67d0b6645
GAPI fixes from Stefan Klug
src/events/SDL_keyboard.c
src/video/gapi/SDL_gapivideo.c
src/video/gapi/SDL_gapivideo.h
src/video/wincommon/SDL_sysevents.c
src/video/windib/SDL_dibevents.c
src/video/windib/SDL_dibvideo.c
src/video/windib/SDL_dibvideo.h
src/video/windib/SDL_gapidibvideo.h
--- a/src/events/SDL_keyboard.c	Fri Jan 30 01:40:44 2009 +0000
+++ b/src/events/SDL_keyboard.c	Mon Feb 16 22:32:34 2009 +0000
@@ -73,7 +73,7 @@
 	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)) {
--- a/src/video/gapi/SDL_gapivideo.c	Fri Jan 30 01:40:44 2009 +0000
+++ b/src/video/gapi/SDL_gapivideo.c	Mon Feb 16 22:32:34 2009 +0000
@@ -52,8 +52,11 @@
 #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_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 @@
 	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 @@
 		FreeLibrary(g_hGapiLib);
 		g_hGapiLib = 0;
 	}
+	SDL_free(device->hidden->gapiInfo);
 	SDL_free(device->hidden);
 	SDL_free(device);
 }
@@ -270,6 +280,15 @@
 		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 @@
 		}
 		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 @@
 	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 @@
 	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 @@
 
 	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 @@
 			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 @@
 			{
 			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 @@
 		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; i<NUM_MODELISTS; ++i ) {
@@ -548,39 +570,39 @@
 		}
 	}
 
-	vformat->BitsPerPixel = 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 @@
 
 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 @@
 	Uint32 Rmask, Gmask, Bmask; 
 	DWORD style; 
 	SDL_Rect allScreen;
+	SDL_ScreenOrientation systemOrientation;
 
 	if( bpp < 4 )
 	{
@@ -621,7 +644,7 @@
 			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 @@
 	}
 
 	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 @@
 	} 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 @@
 		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 @@
 		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 @@
 		}
 	}
 
-	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 @@
 		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 @@
 	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 @@
 		}
        }
 
+	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 @@
 	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 @@
 	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 @@
 	/* 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 @@
 
 }
 
+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 @@
 
     // 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 @@
 
 	// 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);
--- a/src/video/gapi/SDL_gapivideo.h	Fri Jan 30 01:40:44 2009 +0000
+++ b/src/video/gapi/SDL_gapivideo.h	Mon Feb 16 22:32:34 2009 +0000
@@ -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 @@
 #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 @@
 	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 @@
 	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 */
--- a/src/video/wincommon/SDL_sysevents.c	Fri Jan 30 01:40:44 2009 +0000
+++ b/src/video/wincommon/SDL_sysevents.c	Mon Feb 16 22:32:34 2009 +0000
@@ -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 @@
 
 #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 @@
 
 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 @@
 {
 
 #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 @@
 						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 @@
 				} 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(
--- a/src/video/windib/SDL_dibevents.c	Fri Jan 30 01:40:44 2009 +0000
+++ b/src/video/windib/SDL_dibevents.c	Mon Feb 16 22:32:34 2009 +0000
@@ -30,8 +30,16 @@
 #include "../../events/SDL_sysevents.h"
 #include "../../events/SDL_events_c.h"
 #include "../wincommon/SDL_lowvideo.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"
-#include "SDL_vkeys.h"
+#endif
 
 #ifndef WM_APP
 #define WM_APP	0x8000
@@ -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 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 @@
 		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 @@
 		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 @@
 				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 @@
 	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 @@
 	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 @@
 #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);
--- a/src/video/windib/SDL_dibvideo.c	Fri Jan 30 01:40:44 2009 +0000
+++ b/src/video/windib/SDL_dibvideo.c	Mon Feb 16 22:32:34 2009 +0000
@@ -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 @@
 {
 	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 @@
 		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 @@
 		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 @@
 	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 @@
 				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 @@
 			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 @@
 /* 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_ReleaseStaticColors(HWND window)
 {
-#ifdef SYSPAL_NOSTATIC
+#if defined(SYSPAL_NOSTATIC) && !defined(_WIN32_WCE)
 	HDC hdc;
 
 	hdc = GetDC(window);
--- a/src/video/windib/SDL_dibvideo.h	Fri Jan 30 01:40:44 2009 +0000
+++ b/src/video/windib/SDL_dibvideo.h	Mon Feb 16 22:32:34 2009 +0000
@@ -27,18 +27,10 @@
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 
-/* 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 @@
 #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 @@
     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 */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/windib/SDL_gapidibvideo.h	Mon Feb 16 22:32:34 2009 +0000
@@ -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 <windows.h>
+
+/* 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