diff --git a/tools/SDL-1.2.14-gc/README b/tools/SDL-1.2.14-gc/README
deleted file mode 100644
index 8ce488fa9afb3695efd78c1cab3e61c3ed943631..0000000000000000000000000000000000000000
--- a/tools/SDL-1.2.14-gc/README
+++ /dev/null
@@ -1 +0,0 @@
-Once patched, run autogen.sh, configure with "./configure --without-x --disable-video-x11 --disable-video-fbcon --disable-video-aalib --disable-video-directfb --disable-video-opengl --enable-video-gc" and then compile.
diff --git a/tools/SDL-1.2.14-gc/SDL-1.2.14-gc.patch b/tools/SDL-1.2.14-gc/SDL-1.2.14-gc.patch
deleted file mode 100644
index 5b2b2cfa08a986fe6d0ae43afe3adf0fc36b7178..0000000000000000000000000000000000000000
--- a/tools/SDL-1.2.14-gc/SDL-1.2.14-gc.patch
+++ /dev/null
@@ -1,641 +0,0 @@
-From 8e6ada7bc33e3cc4e1c17821ea171bf0815a505d Mon Sep 17 00:00:00 2001
-From: Alam Arias <Alam.GBC@gmail.com>
-Date: Tue, 1 Dec 2009 19:31:57 -0500
-Subject: [PATCH] SDL GC hack
-
----
- configure.in                  |   17 ++
- include/SDL_config.h.in       |    1 +
- src/video/fbcon/SDL_fbgc.c    |  471 +++++++++++++++++++++++++++++++++++++++++
- src/video/fbcon/SDL_fbgc.h    |   35 +++
- src/video/fbcon/SDL_fbvideo.c |   10 +
- src/video/fbcon/SDL_fbvideo.h |   11 +
- 6 files changed, 545 insertions(+), 0 deletions(-)
- create mode 100644 src/video/fbcon/SDL_fbgc.c
- create mode 100644 src/video/fbcon/SDL_fbgc.h
-
-diff --git a/configure.in b/configure.in
-index a7e9b18..a8961ba 100644
---- a/configure.in
-+++ b/configure.in
-@@ -1227,6 +1227,22 @@ AC_HELP_STRING([--enable-video-fbcon], [use framebuffer console video driver [[d
-     fi
- }
- 
-+dnl See if we're running on Linux for the Nintendo GameCube/Wii
-+dnl FIXME, perform a real test here...
-+CheckGC()
-+{
-+    AC_ARG_ENABLE(video-gc,
-+AC_HELP_STRING([--enable-video-gc], [enable GameCube video support in FB [[default=no]]]),
-+                  , enable_video_gc=no)
-+    if test x$enable_video = xyes -a x$enable_video_gc = xyes -a x$video_fbcon = xyes; then
-+        video_gc=yes
-+        AC_MSG_RESULT($video_gc)
-+        if test x$video_gc = xyes; then
-+            AC_DEFINE(SDL_VIDEO_DRIVER_GC)
-+        fi
-+    fi
-+}
-+
- dnl Find DirectFB
- CheckDirectFB()
- {
-@@ -2322,6 +2338,7 @@ case "$host" in
-         CheckX11
-         CheckNANOX
-         CheckFBCON
-+        CheckGC
-         CheckDirectFB
-         CheckPS2GS
-         CheckPS3
-diff --git a/include/SDL_config.h.in b/include/SDL_config.h.in
-index 58593ca..e523e9b 100644
---- a/include/SDL_config.h.in
-+++ b/include/SDL_config.h.in
-@@ -262,6 +262,7 @@
- #undef SDL_VIDEO_DRIVER_DUMMY
- #undef SDL_VIDEO_DRIVER_FBCON
- #undef SDL_VIDEO_DRIVER_GAPI
-+#undef SDL_VIDEO_DRIVER_GC
- #undef SDL_VIDEO_DRIVER_GEM
- #undef SDL_VIDEO_DRIVER_GGI
- #undef SDL_VIDEO_DRIVER_IPOD
-diff --git a/src/video/fbcon/SDL_fbgc.c b/src/video/fbcon/SDL_fbgc.c
-new file mode 100644
-index 0000000..b3b72bb
---- /dev/null
-+++ b/src/video/fbcon/SDL_fbgc.c
-@@ -0,0 +1,471 @@
-+/*
-+    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"
-+
-+#ifdef SDL_VIDEO_DRIVER_GC
-+#include <errno.h>
-+#include "SDL_video.h"
-+#include "../SDL_blit.h"
-+#include "SDL_fbgc.h"
-+
-+static Uint32 r_Yr[256];
-+static Uint32 g_Yg_[256];
-+static Uint32 b_Yb[256];
-+static Uint32 r_Ur[256];
-+static Uint32 g_Ug_[256];
-+static Uint32 b_Ub[256];
-+/* static Uint32 r_Vr[256]; // space and cache optimisation */
-+#define r_Vr b_Ub
-+static Uint32 g_Vg_[256];
-+static Uint32 b_Vb[256];
-+
-+static Uint8 RGB16toY[1 << 16];
-+static Uint8 RGB16toU[1 << 16];
-+static Uint8 RGB16toV[1 << 16];
-+
-+#ifndef FBIOFLIPHACK
-+#define FBIOFLIPHACK	0x4623 /* gc-linux */
-+#endif
-+
-+#ifndef GC_BLACK
-+#define GC_BLACK 0x00800080
-+#endif
-+
-+#ifdef GC_DEBUG
-+#  define GC_DPRINTF(fmt, args...) \
-+	  fprintf(stderr,"DDD|%s: " fmt, __FUNCTION__ , ## args)
-+#else
-+#  define GC_DPRINTF(fmt, args...)
-+#endif
-+
-+SDL_bool GC_Test(_THIS)
-+{
-+	int fliptest;
-+	if (ioctl(console_fd, FBIOFLIPHACK, &fliptest))
-+		return SDL_TRUE;
-+	return SDL_FALSE;
-+}
-+
-+SDL_bool GC_Available(void)
-+{
-+	if (access("/sys/bus/of_platform/drivers/gcn-vifb", 0) == 0)
-+		return SDL_TRUE;
-+
-+	return SDL_FALSE;
-+}
-+
-+/*
-+ *
-+ * Color space handling.
-+ */
-+
-+#define RGB2YUV_SHIFT   16
-+#define RGB2YUV_LUMA    16
-+#define RGB2YUV_CHROMA 128
-+
-+#define Yr ((int)( 0.299*(1<<RGB2YUV_SHIFT)))
-+#define Yg ((int)( 0.587*(1<<RGB2YUV_SHIFT)))
-+#define Yb ((int)( 0.114*(1<<RGB2YUV_SHIFT)))
-+
-+#define Ur ((int)(-0.169*(1<<RGB2YUV_SHIFT)))
-+#define Ug ((int)(-0.331*(1<<RGB2YUV_SHIFT)))
-+#define Ub ((int)( 0.500*(1<<RGB2YUV_SHIFT)))
-+
-+#define Vr ((int)( 0.500*(1<<RGB2YUV_SHIFT)))	/* same as Ub */
-+#define Vg ((int)(-0.419*(1<<RGB2YUV_SHIFT)))
-+#define Vb ((int)(-0.081*(1<<RGB2YUV_SHIFT)))
-+
-+#define clamp(x, y, z) ((z < x) ? x : ((z > y) ? y : z))
-+
-+static void GC_InitRGB2YUVTables(void)
-+{
-+	unsigned int i;
-+	unsigned int r, g, b;
-+
-+	for (i = 0; i < 256; i++) {
-+		r_Yr[i] = Yr * i;
-+		g_Yg_[i] = Yg * i + (RGB2YUV_LUMA << RGB2YUV_SHIFT);
-+		b_Yb[i] = Yb * i;
-+		r_Ur[i] = Ur * i;
-+		g_Ug_[i] = Ug * i + (RGB2YUV_CHROMA << RGB2YUV_SHIFT);
-+		b_Ub[i] = Ub * i;
-+		r_Vr[i] = Vr * i;
-+		g_Vg_[i] = Vg * i + (RGB2YUV_CHROMA << RGB2YUV_SHIFT);
-+		b_Vb[i] = Vb * i;
-+	}
-+
-+	for (i = 0; i < 1 << 16; i++) {
-+		/* RGB565 */
-+		r = ((i >> 8) & 0xf8);
-+		g = ((i >> 3) & 0xfc);
-+		b = ((i << 3) & 0xf8);
-+		/* extend to 8bit */
-+		r |= (r >> 5);
-+		g |= (g >> 6);
-+		b |= (b >> 5);
-+
-+		RGB16toY[i] =
-+		    clamp(16, 235,
-+			  (r_Yr[r] + g_Yg_[g] + b_Yb[b]) >> RGB2YUV_SHIFT);
-+		RGB16toU[i] =
-+		    clamp(16, 240,
-+			  (r_Ur[r] + g_Ug_[g] + b_Ub[b]) >> RGB2YUV_SHIFT);
-+		RGB16toV[i] =
-+		    clamp(16, 240,
-+			  (r_Vr[r] + g_Vg_[g] + b_Vb[b]) >> RGB2YUV_SHIFT);
-+	}
-+}
-+
-+static inline Uint32 rgbrgb16toyuy2(Uint16 rgb1, Uint16 rgb2)
-+{
-+	register int Y1, Cb, Y2, Cr;
-+	Uint16 rgb;
-+
-+	/* fast path, thanks to bohdy */
-+	if (!(rgb1 | rgb2)) {
-+		return GC_BLACK;	/* black, black */
-+	}
-+
-+	if (rgb1 == rgb2) {
-+		/* fast path, thanks to isobel */
-+		Y1 = Y2 = RGB16toY[rgb1];
-+		Cb = RGB16toU[rgb1];
-+		Cr = RGB16toV[rgb1];
-+	} else {
-+		Y1 = RGB16toY[rgb1];
-+		Y2 = RGB16toY[rgb2];
-+
-+		/* RGB565 average */
-+		rgb = ((rgb1 >> 1) & 0xFBEF) + ((rgb2 >> 1) & 0xFBEF) +
-+		    ((rgb1 & rgb2) & 0x0821);
-+
-+		Cb = RGB16toU[rgb];
-+		Cr = RGB16toV[rgb];
-+	}
-+
-+	return (((char)Y1) << 24) | (((char)Cb) << 16) | (((char)Y2) << 8)
-+	    | (((char)Cr) << 0);
-+}
-+
-+/*
-+ *
-+ * Blitters.
-+ */
-+static void GC_UpdateRectRGB16(_THIS, SDL_Rect * rect, int pitch)
-+{
-+	int width, height, left, i, mod, mod32;
-+	Uint8 *src, *dst;
-+	Uint32 *src32, *dst32;
-+	Uint16 *rgb;
-+
-+	/* XXX case width < 2 needs special treatment */
-+
-+	/* in pixel units */
-+	left = rect->x & ~1;	/* 2 pixel align */
-+	width = (rect->w + 1) & ~1;	/* 2 pixel align in excess */
-+	height = rect->h;
-+
-+	/* in bytes, src and dest are 16bpp */
-+	src = shadow_mem + (rect->y * pitch) + left * 2;
-+	dst = flip_address[back_page] + page_offset +
-+		 (rect->y * pitch) + left * 2;
-+	mod = pitch - width * 2;
-+
-+	src32 = (Uint32 *) src;
-+	dst32 = (Uint32 *) dst;
-+	mod32 = mod / 4;
-+
-+	while (height--) {
-+		i = width / 2;
-+
-+		while (i--) {
-+			rgb = (Uint16 *) src32;
-+			*dst32++ = rgbrgb16toyuy2(rgb[0], rgb[1]);
-+			src32++;
-+		}
-+		src32 += mod32;
-+		dst32 += mod32;
-+	}
-+}
-+
-+void GC_Init(_THIS, SDL_PixelFormat *vformat)
-+{
-+	GC_InitRGB2YUVTables();
-+
-+	/* 16 bits per pixel */
-+	vformat->BitsPerPixel = 16;
-+	vformat->BytesPerPixel = 2;
-+	/* RGB565 */
-+	vformat->Rmask = 0x0000f800;
-+	vformat->Gmask = 0x000007e0;
-+	vformat->Bmask = 0x0000001f;
-+
-+	shadow_fb = 1;
-+}
-+
-+/*
-+ *
-+ * Video mode handling.
-+ */
-+
-+/* only 640x480 16bpp is currently supported */
-+const static SDL_Rect RECT_640x480 = { 0, 0, 640, 480 };
-+const static SDL_Rect *vid_modes[] = {
-+	&RECT_640x480,
-+	NULL
-+};
-+
-+static SDL_Rect **GC_ListModes(_THIS, SDL_PixelFormat * format, Uint32 flags)
-+{
-+	switch (format->BitsPerPixel) {
-+	case 16:
-+		return (SDL_Rect **) vid_modes;
-+	default:
-+		return NULL;
-+	}
-+}
-+
-+SDL_Surface *GC_SetVideoMode(_THIS, SDL_Surface * current,
-+			     int width, int height, int bpp, Uint32 flags)
-+{
-+	struct fb_fix_screeninfo finfo;
-+	struct fb_var_screeninfo vinfo;
-+	int i;
-+	Uint32 Rmask;
-+	Uint32 Gmask;
-+	Uint32 Bmask;
-+	Uint32 *p, *q;
-+	Uint32 yres;
-+
-+	GC_DPRINTF("Setting %dx%d %dbpp %smode\n", width, height, bpp,
-+			(flags & SDL_DOUBLEBUF)?"(doublebuf) ":"");
-+
-+	/* Set the terminal into graphics mode */
-+	if (FB_EnterGraphicsMode(this) < 0) {
-+		return (NULL);
-+	}
-+
-+	/* Restore the original palette */
-+	//FB_RestorePalette(this);
-+
-+	/* Set the video mode and get the final screen format */
-+	if (ioctl(console_fd, FBIOGET_VSCREENINFO, &vinfo) < 0) {
-+		SDL_SetError("Couldn't get console screen info");
-+		return (NULL);
-+	}
-+
-+	yres = vinfo.yres;
-+
-+	/* hack to center 640x480 resolution on PAL cubes */
-+	if (vinfo.xres == 640 && vinfo.yres == 576) {
-+		page_offset = ((576 - 480) / 2) * 640 * ((bpp + 7) / 8);
-+	} else {
-+		page_offset = 0;
-+	}
-+
-+	/* clear all video memory */
-+	p = (Uint32 *)mapped_mem;
-+	q = (Uint32 *)(mapped_mem + mapped_memlen);
-+	while (p < q)
-+		*p++ = GC_BLACK;
-+
-+	if ((vinfo.xres != width) || (vinfo.yres != height) ||
-+	    (vinfo.bits_per_pixel != bpp)) {
-+		vinfo.activate = FB_ACTIVATE_NOW;
-+		vinfo.accel_flags = 0;
-+		vinfo.bits_per_pixel = bpp;
-+		vinfo.xres = width;
-+		vinfo.xres_virtual = width;
-+		/* do not modify yres*, we use a fake 640x480 mode in PAL */
-+		//vinfo.yres = height;
-+		//vinfo.yres_virtual = 2*height;
-+		vinfo.xoffset = 0;
-+		vinfo.yoffset = 0;
-+		vinfo.red.length = vinfo.red.offset = 0;
-+		vinfo.green.length = vinfo.green.offset = 0;
-+		vinfo.blue.length = vinfo.blue.offset = 0;
-+		vinfo.transp.length = vinfo.transp.offset = 0;
-+
-+		if (ioctl(console_fd, FBIOPUT_VSCREENINFO, &vinfo) < 0) {
-+			SDL_SetError("Couldn't set console screen info");
-+			return (NULL);
-+		}
-+	} else {
-+		int maxheight;
-+
-+		/* Figure out how much video memory is available */
-+		maxheight = 2*yres;
-+		if (vinfo.yres_virtual > maxheight) {
-+			vinfo.yres_virtual = maxheight;
-+		}
-+	}
-+	cache_vinfo = vinfo;
-+
-+	Rmask = 0;
-+	for (i = 0; i < vinfo.red.length; ++i) {
-+		Rmask <<= 1;
-+		Rmask |= (0x00000001 << vinfo.red.offset);
-+	}
-+	Gmask = 0;
-+	for (i = 0; i < vinfo.green.length; ++i) {
-+		Gmask <<= 1;
-+		Gmask |= (0x00000001 << vinfo.green.offset);
-+	}
-+	Bmask = 0;
-+	for (i = 0; i < vinfo.blue.length; ++i) {
-+		Bmask <<= 1;
-+		Bmask |= (0x00000001 << vinfo.blue.offset);
-+	}
-+	if (!SDL_ReallocFormat(current, bpp, Rmask, Gmask, Bmask, 0)) {
-+		return (NULL);
-+	}
-+
-+	/* Get the fixed information about the console hardware.
-+	   This is necessary since finfo.line_length changes.
-+	 */
-+	if (ioctl(console_fd, FBIOGET_FSCREENINFO, &finfo) < 0) {
-+		SDL_SetError("Couldn't get console hardware info");
-+		return (NULL);
-+	}
-+
-+	/* Save hardware palette, if needed */
-+	//FB_SavePalette(this, &finfo, &vinfo);
-+
-+	/* Set up the new mode framebuffer */
-+	current->flags = SDL_FULLSCREEN;
-+	current->w = width;
-+	current->h = height;
-+	current->pitch = width * ((bpp + 7) / 8);
-+	current->pixels = shadow_mem;
-+
-+	flip_address[0] = mapped_mem;
-+	flip_address[1] = mapped_mem + current->pitch * yres;
-+
-+	back_page = 1;
-+	if (flags & SDL_DOUBLEBUF) {
-+		current->flags |= SDL_DOUBLEBUF;
-+		flip_pending = 1;
-+	} else {
-+		flip_pending = 0;
-+		/* make page 0 both the visible and back page */
-+		back_page = ioctl(console_fd, FBIOFLIPHACK, &back_page);
-+		if (back_page < 0)
-+			back_page = 0;
-+	}
-+
-+	/* Set the update rectangle function */
-+	switch (bpp) {
-+	case 16:
-+		GC_DPRINTF("Using 16bpp blitter\n");
-+		this->hidden->UpdateRect = GC_UpdateRectRGB16;
-+		break;
-+	default:
-+		GC_DPRINTF("Using NO blitter\n");
-+		this->hidden->UpdateRect = NULL;
-+		break;
-+	}
-+
-+	/* Handle OpenGL support */
-+#ifdef HAVE_OPENGL
-+	if (flags & SDL_OPENGL) {
-+		if (GC_GL_CreateWindow(this, width, height) == 0) {
-+			current->flags |= (SDL_OPENGL | SDL_FULLSCREEN);
-+		} else {
-+			current = NULL;
-+		}
-+	}
-+#endif				/* HAVE_OPENGL */
-+
-+	/* We're done */
-+	return (current);
-+}
-+
-+static int GC_FlipHWSurface(_THIS, SDL_Surface * surface)
-+{
-+	if (flip_pending) {
-+		/* SDL_UpdateRect was not called */
-+		SDL_UpdateRect(this->screen, 0, 0, 0, 0);
-+	}
-+
-+	/* flip video page as soon as possible */
-+	ioctl(console_fd, FBIOFLIPHACK, NULL);
-+	flip_pending = 1;
-+
-+	return (0);
-+}
-+
-+static void GC_WaitForFlipCompletion(_THIS)
-+{
-+	int visible_page;
-+	int result;
-+
-+	if (flip_pending) {
-+		flip_pending = 0;
-+		back_page ^= 1;
-+		visible_page = back_page;
-+		while (visible_page == back_page) {
-+			/* wait until back_page is not visible */
-+			result = ioctl(console_fd, FBIOFLIPHACK, &back_page);
-+			if (result < 0) {
-+				if ((errno == EINTR) || (errno == EAGAIN))
-+					continue;
-+				return; /* ioctl unsupported ... */
-+			}
-+			visible_page = result;
-+		}
-+		/*
-+		 * At this point the back_page is not visible. We can safely
-+		 * write to it without tearing.
-+		 */
-+	}
-+}
-+
-+static void GC_UpdateRects(_THIS, int numrects, SDL_Rect * rects)
-+{
-+	SDL_Surface *screen;
-+	int pitch;
-+
-+	/* external yuy2 fb is 16bpp */
-+
-+	screen = this->screen;
-+	pitch = screen->pitch;	/* this is the pitch of the shadow buffer */
-+
-+	if (this->hidden->UpdateRect) {
-+		GC_WaitForFlipCompletion(this);
-+		while (numrects--) {
-+			if (rects->w <= 0 || rects->h <= 0)
-+				continue;
-+			this->hidden->UpdateRect(this, rects, pitch);
-+			rects++;
-+		}
-+	}
-+}
-+
-+void GC_CreateDevice(SDL_VideoDevice *this)
-+{
-+	this->ListModes = GC_ListModes;
-+	this->SetVideoMode = GC_SetVideoMode;
-+	this->FlipHWSurface = GC_FlipHWSurface;
-+	this->UpdateRects = GC_UpdateRects;
-+}
-+
-+#endif
-diff --git a/src/video/fbcon/SDL_fbgc.h b/src/video/fbcon/SDL_fbgc.h
-new file mode 100644
-index 0000000..534a73e
---- /dev/null
-+++ b/src/video/fbcon/SDL_fbgc.h
-@@ -0,0 +1,35 @@
-+/*
-+    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"
-+
-+
-+#ifdef SDL_VIDEO_DRIVER_GC
-+/* Gamecube/Wii hardware setup for the SDL framebuffer console driver */
-+
-+#include "SDL_fbvideo.h"
-+
-+extern SDL_bool GC_Available(void);
-+extern void GC_CreateDevice(SDL_VideoDevice *this);
-+
-+extern SDL_bool GC_Test(_THIS);
-+extern void GC_Init(_THIS, SDL_PixelFormat *vformat);
-+#endif
-diff --git a/src/video/fbcon/SDL_fbvideo.c b/src/video/fbcon/SDL_fbvideo.c
-index 81a89da..328790e 100644
---- a/src/video/fbcon/SDL_fbvideo.c
-+++ b/src/video/fbcon/SDL_fbvideo.c
-@@ -272,6 +272,11 @@ static SDL_VideoDevice *FB_CreateDevice(int devindex)
- 
- 	this->free = FB_DeleteDevice;
- 
-+#ifdef SDL_VIDEO_DRIVER_GC
-+	if (GC_Available(this))
-+		GC_CreateDevice(this);
-+#endif
-+
- 	return this;
- }
- 
-@@ -784,6 +789,11 @@ static int FB_VideoInit(_THIS, SDL_PixelFormat *vformat)
- 		}
- 	}
- 
-+#ifdef SDL_VIDEO_DRIVER_GC
-+	if (GC_Test(this))
-+		GC_Init(this, vformat);
-+#endif
-+
- 	if (shadow_fb) {
- 		shadow_mem = (char *)SDL_malloc(mapped_memlen);
- 		if (shadow_mem == NULL) {
-diff --git a/src/video/fbcon/SDL_fbvideo.h b/src/video/fbcon/SDL_fbvideo.h
-index 03b9e94..74d1460 100644
---- a/src/video/fbcon/SDL_fbvideo.h
-+++ b/src/video/fbcon/SDL_fbvideo.h
-@@ -106,6 +106,12 @@ struct SDL_PrivateVideoData {
- 
- 	void (*wait_vbl)(_THIS);
- 	void (*wait_idle)(_THIS);
-+#ifdef SDL_VIDEO_DRIVER_GC
-+	void (*UpdateRect) (_THIS, SDL_Rect * rect, int pitch);
-+	int back_page;
-+	int page_offset;
-+	int flip_pending;
-+#endif
- };
- /* Old variable names */
- #define console_fd		(this->hidden->console_fd)
-@@ -147,6 +153,11 @@ struct SDL_PrivateVideoData {
- #define screen_palette		(this->hidden->screen_palette)
- #define wait_vbl		(this->hidden->wait_vbl)
- #define wait_idle		(this->hidden->wait_idle)
-+#ifdef SDL_VIDEO_DRIVER_GC
-+#define back_page		(this->hidden->back_page)
-+#define page_offset		(this->hidden->page_offset)
-+#define flip_pending		(this->hidden->flip_pending)
-+#endif
- 
- /* Accelerator types that are supported by the driver, but are not
-    necessarily in the kernel headers on the system we compile on.
--- 
-1.6.5
-
diff --git a/tools/SDL1.2.7_CE/SDL-1.27_CE.diff b/tools/SDL1.2.7_CE/SDL-1.27_CE.diff
deleted file mode 100644
index 196329b84b3bf920cf5df6a88204316ea3341cc3..0000000000000000000000000000000000000000
--- a/tools/SDL1.2.7_CE/SDL-1.27_CE.diff
+++ /dev/null
@@ -1,2260 +0,0 @@
-diff -ruN SDL-1.2.7-orig/src/audio/windib/SDL_dibaudio.c SDL-1.2.7/src/audio/windib/SDL_dibaudio.c
---- SDL-1.2.7-orig/src/audio/windib/SDL_dibaudio.c	Wed Feb 18 09:22:00 2004
-+++ SDL-1.2.7/src/audio/windib/SDL_dibaudio.c	Thu Nov 18 12:07:29 2004
-@@ -146,8 +146,16 @@
- 
- /* Set high priority for the audio thread */
- static void DIB_ThreadInit(_THIS)
--{
--	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
-+{
-+#ifdef _WIN32_WCE
-+#ifdef SH3
-+	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
-+#else
-+	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
-+#endif
-+#else
-+	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
-+#endif
- }
- 
- void DIB_WaitAudio(_THIS)
-diff -ruN SDL-1.2.7-orig/src/cpuinfo/SDL_cpuinfo.c SDL-1.2.7/src/cpuinfo/SDL_cpuinfo.c
---- SDL-1.2.7-orig/src/cpuinfo/SDL_cpuinfo.c	Tue Feb 10 07:31:36 2004
-+++ SDL-1.2.7/src/cpuinfo/SDL_cpuinfo.c	Fri Nov 19 20:53:01 2004
-@@ -38,6 +38,10 @@
- 
- #ifdef MACOSX
- #include <sys/sysctl.h> /* For AltiVec check */
-+#endif
-+
-+#if defined(_MSC_VER) && (defined(ARM) || defined(MIPS) || defined(SHx))
-+#undef _MSC_VER
- #endif
- 
- #define CPU_HAS_RDTSC	0x00000001
-diff -ruN SDL-1.2.7-orig/src/joystick/win32/SDL_mmjoystick.c SDL-1.2.7/src/joystick/win32/SDL_mmjoystick.c
---- SDL-1.2.7-orig/src/joystick/win32/SDL_mmjoystick.c	Wed Feb 18 09:22:02 2004
-+++ SDL-1.2.7/src/joystick/win32/SDL_mmjoystick.c	Fri Nov 19 20:47:22 2004
-@@ -37,6 +37,7 @@
- 
- #include <windows.h>
- #include <mmsystem.h>
-+#include <regstr.h>
- 
- #define MAX_JOYSTICKS	16
- #define MAX_AXES	6	/* each joystick can have up to 6 axes */
-@@ -51,6 +52,7 @@
- /* array to hold joystick ID values */
- static UINT	SYS_JoystickID[MAX_JOYSTICKS];
- static JOYCAPS	SYS_Joystick[MAX_JOYSTICKS];
-+static char	*SYS_JoystickName[MAX_JOYSTICKS];
- 
- /* The private structure used to keep track of a joystick */
- struct joystick_hwdata
-@@ -69,6 +71,78 @@
- /* Convert a win32 Multimedia API return code to a text message */
- static void SetMMerror(char *function, int code);
- 
-+static char *GetJoystickName(int index, const char *szRegKey)
-+{
-+	/* added 7/24/2004 by Eckhard Stolberg */
-+	/*
-+		see if there is a joystick for the current
-+		index (1-16) listed in the registry
-+	*/
-+	char *name = NULL;
-+	HKEY hKey;
-+	DWORD regsize;
-+	LONG regresult;
-+	unsigned char regkey[256];
-+	unsigned char regvalue[256];
-+	unsigned char regname[256];
-+
-+	sprintf(regkey, "%s\\%s\\%s",
-+		REGSTR_PATH_JOYCONFIG,
-+		szRegKey,
-+		REGSTR_KEY_JOYCURR);
-+	regresult = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
-+		(LPTSTR) &regkey, 0, KEY_READ, &hKey);
-+	if (regresult == ERROR_SUCCESS)
-+	{
-+		/*
-+			find the registry key name for the
-+			joystick's properties
-+		*/
-+		regsize = sizeof(regname);
-+		sprintf(regvalue,
-+			"Joystick%d%s", index+1,
-+			REGSTR_VAL_JOYOEMNAME);
-+		regresult = RegQueryValueExA(hKey,
-+			regvalue, 0, 0, (LPBYTE) &regname,
-+			(LPDWORD) &regsize);
-+		RegCloseKey(hKey);
-+		if (regresult == ERROR_SUCCESS)
-+		{
-+			/* open that registry key */
-+			sprintf(regkey, "%s\\%s",
-+				REGSTR_PATH_JOYOEM, regname);
-+			regresult = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
-+				regkey, 0, KEY_READ, &hKey);
-+			if (regresult == ERROR_SUCCESS)
-+			{
-+				/* find the size for the OEM name text */
-+				regsize = sizeof(regvalue);
-+				regresult =
-+					RegQueryValueExA(hKey,
-+					REGSTR_VAL_JOYOEMNAME,
-+					0, 0, NULL,
-+					(LPDWORD) &regsize);
-+				if (regresult == ERROR_SUCCESS)
-+				{
-+					/*
-+						allocate enough memory
-+						for the OEM name text ...
-+					*/
-+					name = (char *) malloc(regsize);
-+					/* ... and read it from the registry */
-+					regresult =
-+						RegQueryValueExA(hKey,
-+						REGSTR_VAL_JOYOEMNAME, 0, 0,
-+						(LPBYTE) name,
-+						(LPDWORD) &regsize);
-+					RegCloseKey(hKey);
-+				}
-+			}
-+		}
-+	}
-+	return(name);
-+}
-+
- 
- /* Function to scan the system for joysticks.
-  * This function should set SDL_numjoysticks to the number of available
-@@ -94,6 +168,7 @@
- 
- 	for ( i = 0; i < MAX_JOYSTICKS; i++ ) {
- 		SYS_JoystickID[i] = JOYSTICKID1 + i;
-+		SYS_JoystickName[i] = NULL;
- 	}
- 
- 
-@@ -110,6 +185,7 @@
- 			if ( result == JOYERR_NOERROR ) {
- 				SYS_JoystickID[numdevs] = SYS_JoystickID[i];
- 				SYS_Joystick[numdevs] = joycaps;
-+				SYS_JoystickName[numdevs] = GetJoystickName(numdevs, joycaps.szRegKey);
- 				numdevs++;
- 			}
- 		}
-@@ -120,8 +196,11 @@
- /* Function to get the device-dependent name of a joystick */
- const char *SDL_SYS_JoystickName(int index)
- {
--	/***-> test for invalid index ? */
-+	if ( SYS_JoystickName[index] != NULL ) {
-+		return(SYS_JoystickName[index]);
-+	} else {
- 	return(SYS_Joystick[index].szPname);
-+	}
- }
- 
- /* Function to open a joystick for use.
-@@ -292,7 +371,12 @@
- /* Function to perform any system-specific joystick related cleanup */
- void SDL_SYS_JoystickQuit(void)
- {
--	return;
-+	int i;
-+	for (i = 0; i < MAX_JOYSTICKS; i++) {
-+		if ( SYS_JoystickName[i] != NULL ) {
-+			free(SYS_JoystickName[i]);
-+		}
-+	}
- }
- 
- 
-diff -ruN SDL-1.2.7-orig/src/video/SDL_sysvideo.h SDL-1.2.7/src/video/SDL_sysvideo.h
---- SDL-1.2.7-orig/src/video/SDL_sysvideo.h	Wed Feb 18 09:22:04 2004
-+++ SDL-1.2.7/src/video/SDL_sysvideo.h	Thu Nov 18 12:08:48 2004
-@@ -361,6 +361,9 @@
- #endif
- #ifdef ENABLE_WINDIB
- extern VideoBootStrap WINDIB_bootstrap;
-+#endif
-+#ifdef ENABLE_WINGAPI
-+extern VideoBootStrap WINGAPI_bootstrap;
- #endif
- #ifdef ENABLE_DIRECTX
- extern VideoBootStrap DIRECTX_bootstrap;
-diff -ruN SDL-1.2.7-orig/src/video/SDL_video.c SDL-1.2.7/src/video/SDL_video.c
---- SDL-1.2.7-orig/src/video/SDL_video.c	Wed Feb 18 09:22:04 2004
-+++ SDL-1.2.7/src/video/SDL_video.c	Thu Nov 18 12:11:01 2004
-@@ -80,6 +80,9 @@
- #endif
- #ifdef ENABLE_DIRECTX
- 	&DIRECTX_bootstrap,
-+#endif
-+#ifdef ENABLE_WINGAPI
-+	&WINGAPI_bootstrap,
- #endif
- #ifdef ENABLE_WINDIB
- 	&WINDIB_bootstrap,
-diff -ruN SDL-1.2.7-orig/src/video/wincommon/SDL_sysevents.c SDL-1.2.7/src/video/wincommon/SDL_sysevents.c
---- SDL-1.2.7-orig/src/video/wincommon/SDL_sysevents.c	Wed Feb 18 09:22:10 2004
-+++ SDL-1.2.7/src/video/wincommon/SDL_sysevents.c	Thu Nov 18 12:28:03 2004
-@@ -40,6 +40,9 @@
- #include "SDL_lowvideo.h"
- #include "SDL_syswm_c.h"
- #include "SDL_main.h"
-+#ifdef _WIN32_CE
-+#include "SDL_dibvideo.h"
-+#endif
- 
- #ifdef WMMSG_DEBUG
- #include "wmmsg.h"
-@@ -173,6 +176,39 @@
- 	SDL_SetModState(state);
- #endif /* !NO_GETKEYBOARDSTATE */
- }
-+
-+#ifdef _WIN32_CE
-+void transform(SDL_RotateAttr rotate, char ozone, Sint16 *x, Sint16 *y) {
-+	Sint16 rotatedX;
-+	Sint16 rotatedY;
-+
-+	if (ozone) {
-+		*x = *x * 2;
-+		*y = *y * 2;
-+	}
-+
-+	switch(rotate) {
-+		case SDL_ROTATE_NONE:
-+			break;
-+		case SDL_ROTATE_LEFT:
-+			if (!SDL_VideoSurface)
-+				break;
-+			rotatedX = SDL_VideoSurface->w - *y;
-+			rotatedY = *x;
-+			*x = rotatedX;
-+			*y = rotatedY;
-+			break;
-+		case SDL_ROTATE_RIGHT:
-+			if (!SDL_VideoSurface)
-+				break;
-+			rotatedX = *y;
-+			rotatedY = SDL_VideoSurface->h - *x;
-+			*x = rotatedX;
-+			*y = rotatedY;
-+			break;
-+	}
-+}
-+#endif
- 
- /* The main Win32 event handler
- DJM: This is no longer static as (DX5/DIB)_CreateWindow needs it
-@@ -273,7 +309,11 @@
- 						SetCursorPos(center.x, center.y);
- 						posted = SDL_PrivateMouseMotion(0, 1, x, y);
- 					}
--				} else {
-+				} else {
-+#ifdef _WIN32_CE
-+					if (SDL_VideoSurface)
-+						transform(rotation, ozoneHack, &x, &y);
-+#endif
- 					posted = SDL_PrivateMouseMotion(0, 0, x, y);
- 				}
- 			}
-@@ -361,8 +401,16 @@
- 					x = 0; y = 0;
- 				} else {
- 					x = (Sint16)LOWORD(lParam);
--					y = (Sint16)HIWORD(lParam);
--				}
-+					y = (Sint16)HIWORD(lParam);
-+#ifdef _WIN32_CE
-+					if (SDL_VideoSurface)
-+						transform(rotation, ozoneHack, &x, &y);
-+#endif
-+				}
-+#ifdef _WIN32_WCE
-+				/* Since stylus movements are not continuous */
-+				posted = SDL_PrivateMouseMotion(0, 0, x, y);
-+#endif
- 				posted = SDL_PrivateMouseButton(
- 							state, button, x, y);
- 			}
-diff -ruN SDL-1.2.7-orig/src/video/wincommon/SDL_sysmouse.c SDL-1.2.7/src/video/wincommon/SDL_sysmouse.c
---- SDL-1.2.7-orig/src/video/wincommon/SDL_sysmouse.c	Sat Aug 30 13:13:12 2003
-+++ SDL-1.2.7/src/video/wincommon/SDL_sysmouse.c	Thu Nov 18 12:29:20 2004
-@@ -250,12 +250,16 @@
- 
- /* Check to see if we need to enter or leave mouse relative mode */
- void WIN_CheckMouseMode(_THIS)
--{
-+{
-+#ifdef _WIN32_WCE
-+		mouse_relative = 0;
-+#else
-         /* If the mouse is hidden and input is grabbed, we use relative mode */
-         if ( !(SDL_cursorstate & CURSOR_VISIBLE) &&
-              (this->input_grab != SDL_GRAB_OFF) ) {
-                 mouse_relative = 1;
-         } else {
-                 mouse_relative = 0;
--        }
-+        }
-+#endif
- }
-diff -ruN SDL-1.2.7-orig/src/video/windib/SDL_dibevents.c SDL-1.2.7/src/video/windib/SDL_dibevents.c
---- SDL-1.2.7-orig/src/video/windib/SDL_dibevents.c	Wed Feb 18 09:22:10 2004
-+++ SDL-1.2.7/src/video/windib/SDL_dibevents.c	Thu Nov 18 13:12:28 2004
-@@ -58,6 +58,29 @@
- /* DJM: If the user setup the window for us, we want to save his window proc,
-    and give him a chance to handle some messages. */
- static WNDPROC userWindowProc = NULL;
-+
-+#ifdef _WIN32_WCE
-+
-+WPARAM rotateKey(WPARAM key, SDL_RotateAttr direction) {
-+	if (direction != SDL_ROTATE_LEFT)
-+		return key;
-+
-+	switch (key) {
-+		case 0x26: /* up */
-+			return 0x27;
-+		case 0x27: /* right */
-+			return 0x28;
-+		case 0x28: /* down */
-+			return 0x25;
-+		case 0x25: /* left */
-+			return 0x26;
-+	}
-+
-+	return key;
-+}
-+
-+#endif
-+
- 
- /* The main Win32 event handler */
- LONG
-@@ -69,6 +92,16 @@
- 		case WM_SYSKEYDOWN:
- 		case WM_KEYDOWN: {
- 			SDL_keysym keysym;
-+
-+#ifdef _WIN32_WCE
-+			// Drop GAPI artefacts
-+			if (wParam == 0x84 || wParam == 0x5B)
-+				return 0;
-+
-+			// Rotate key if necessary
-+			if (rotation != SDL_ROTATE_NONE)
-+				wParam = rotateKey(wParam, rotation);	
-+#endif
- 
- 			/* Ignore repeated keys */
- 			if ( lParam&REPEATED_KEYMASK ) {
-@@ -129,6 +162,16 @@
- 		case WM_KEYUP: {
- 			SDL_keysym keysym;
- 
-+#ifdef _WIN32_WCE
-+			// Drop GAPI artefacts
-+			if (wParam == 0x84 || wParam == 0x5B)
-+				return 0;
-+
-+			// Rotate key if necessary
-+			if (rotation != SDL_ROTATE_NONE)
-+				wParam = rotateKey(wParam, rotation);
-+#endif
-+
- 			switch (wParam) {
- 				case VK_CONTROL:
- 					if ( lParam&EXTENDED_KEYMASK )
-@@ -333,7 +376,16 @@
- 	VK_keymap[VK_APPS] = SDLK_MENU;
- 
- 	prev_shiftstates[0] = FALSE;
--	prev_shiftstates[1] = FALSE;
-+	prev_shiftstates[1] = FALSE;
-+
-+#ifdef _WIN32_WCE
-+	/* Hardcode the 4 magic keys to F1 F2 F3 F4 - the actual location of the keys varies ... */
-+	VK_keymap[0xC1] = SDLK_F1;
-+	VK_keymap[0xC2] = SDLK_F2;
-+	VK_keymap[0xC3] = SDLK_F3;
-+	VK_keymap[0xC4] = SDLK_F4;
-+#endif
-+
- }
- 
- static SDL_keysym *TranslateKey(UINT vkey, UINT scancode, SDL_keysym *keysym, int pressed)
-@@ -364,9 +416,15 @@
- {
- #ifndef CS_BYTEALIGNCLIENT
- #define CS_BYTEALIGNCLIENT	0
-+#endif
-+#ifdef _WIN32_CE
-+	SDL_RegisterApp("SDL_app", CS_BYTEALIGNCLIENT | CS_HREDRAW | CS_VREDRAW, 0);
-+#else
-+	SDL_RegisterApp("SDL_app", CS_BYTEALIGNCLIENT, 0);
- #endif
--	SDL_RegisterApp("SDL_app", CS_BYTEALIGNCLIENT, 0);
--	if ( SDL_windowid ) {
-+	if ( SDL_windowid ) {
-+// FIXME 
-+#ifndef _WIN32_WCE
- 		SDL_Window = (HWND)strtol(SDL_windowid, NULL, 0);
- 
-       /* DJM: we want all event's for the user specified
-@@ -375,11 +433,19 @@
-       if (SDL_Window) {
-          userWindowProc = (WNDPROC)GetWindowLong(SDL_Window, GWL_WNDPROC);
-          SetWindowLong(SDL_Window, GWL_WNDPROC, (LONG)WinMessage);
--      }
--	} else {
-+      }
-+ #endif
-+	} else {
-+#ifdef _WIN32_WCE
-+
-+		SDL_Window = CreateWindow(SDL_Appname, SDL_Appname, (WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX),
-+						0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), 
-+						NULL, NULL, SDL_Instance, NULL);
-+#else
- 		SDL_Window = CreateWindow(SDL_Appname, SDL_Appname,
-                         (WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX),
--                        CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, SDL_Instance, NULL);
-+                        CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, SDL_Instance, NULL);
-+#endif
- 		if ( SDL_Window == NULL ) {
- 			SDL_SetError("Couldn't create window");
- 			return(-1);
-diff -ruN SDL-1.2.7-orig/src/video/windib/SDL_dibvideo.c SDL-1.2.7/src/video/windib/SDL_dibvideo.c
---- SDL-1.2.7-orig/src/video/windib/SDL_dibvideo.c	Wed Feb 18 09:22:10 2004
-+++ SDL-1.2.7/src/video/windib/SDL_dibvideo.c	Mon Aug  8 18:27:52 2005
-@@ -29,15 +29,26 @@
- #include <stdlib.h>
- #include <malloc.h>
- #include <windows.h>
--#if defined(WIN32_PLATFORM_PSPC)
-+#if (defined (UNDER_CE) && (UNDER_CE >= 420))
- #include <aygshell.h>                      // Add Pocket PC includes
- #pragma comment( lib, "aygshell" )         // Link Pocket PC library
- #endif
-+
-+#ifdef _MSC_VER
-+#pragma warning(disable: 4244)
-+#define inline __inline
-+#endif
-+
- 
- /* Not yet in the mingw32 cross-compile headers */
- #ifndef CDS_FULLSCREEN
- #define CDS_FULLSCREEN	4
- #endif
-+
-+#ifndef WS_THICKFRAME
-+#define WS_THICKFRAME 0
-+#endif
-+
- 
- #include "SDL.h"
- #include "SDL_mutex.h"
-@@ -55,7 +66,18 @@
- #ifdef _WIN32_WCE
- #define NO_GETDIBITS
- #define NO_CHANGEDISPLAYSETTINGS
--#define NO_GAMMA_SUPPORT
-+#define NO_GAMMA_SUPPORT
-+
-+/* uncomment this line if you target WinCE 3.x platform: */
-+//#define NO_SETDIBCOLORTABLE
-+
-+/* these 2 variables are used to suport paletted DIBs on WinCE 3.x that 
-+   does not implement SetDIBColorTable, and when SetDIBColorTable is not working.
-+   Slow. DIB is recreated every time.
-+*/
-+static BITMAPINFO *last_bitmapinfo;
-+static void** last_bits;
-+
- #endif
- #ifndef WS_MAXIMIZE
- #define WS_MAXIMIZE	0
-@@ -96,6 +118,13 @@
- 
- /* helper fn */
- static int DIB_SussScreenDepth();
-+
-+#ifdef _WIN32_WCE
-+void DIB_ShowTaskBar(BOOL taskBarShown);
-+#ifdef ENABLE_WINGAPI
-+extern void GAPI_GrabHardwareKeys(BOOL grab);
-+#endif
-+#endif
- 
- /* DIB driver bootstrap functions */
- 
-@@ -352,6 +381,9 @@
- 
- 	/* Fill in some window manager capabilities */
- 	this->info.wm_available = 1;
-+
-+	/* Rotation information */
-+	rotation = SDL_ROTATE_NONE;
- 
- 	/* We're done! */
- 	return(0);
-@@ -370,7 +402,43 @@
- 	}
- #endif
- }
--
-+
-+#ifdef _WIN32_WCE
-+
-+void DIB_ShowTaskBar(BOOL taskBarShown) {
-+#if (UNDER_CE < 420)
-+	// Hide taskbar, WinCE 2.x style - from EasyCE
-+	HKEY hKey=0;
-+	DWORD dwValue = 0;
-+	unsigned long lSize = sizeof( DWORD );
-+	DWORD dwType = REG_DWORD;
-+	HWND hWnd;
-+
-+	RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("\\software\\microsoft\\shell"), 0, KEY_ALL_ACCESS, &hKey );
-+	RegQueryValueEx( hKey, TEXT("TBOpt"), 0, &dwType, (BYTE*)&dwValue, &lSize );
-+	if (taskBarShown)
-+		dwValue &= 0xFFFFFFFF - 8;	// reset bit to show taskbar
-+    else 
-+		dwValue |= 8;	// set bit to hide taskbar
-+	RegSetValueEx( hKey, TEXT("TBOpt"), 0, REG_DWORD, (BYTE*)&dwValue, lSize );
-+	hWnd = FindWindow( TEXT("HHTaskBar"), NULL );
-+	SendMessage(hWnd, WM_COMMAND, 0x03EA, 0 );
-+	SetForegroundWindow(SDL_Window);
-+#else
-+	if (taskBarShown) 
-+		SHFullScreen(SDL_Window, SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON | SHFS_SHOWSTARTICON);
-+	else 
-+		SHFullScreen(SDL_Window, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);
-+#endif
-+	if (FindWindow(TEXT("HHTaskBar"), NULL)) { // is it valid for HPC ?
-+		if (taskBarShown) 
-+			ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOWNORMAL);
-+		else 
-+			ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_HIDE);
-+	}
-+}
-+
-+#endif
- 
- /*
-   Helper fn to work out which screen depth windows is currently using.
-@@ -444,7 +512,8 @@
- 
- 
- /* Various screen update functions available */
--static void DIB_NormalUpdate(_THIS, int numrects, SDL_Rect *rects);
-+static void DIB_NormalUpdate(_THIS, int numrects, SDL_Rect *rects);
-+static void DIB_RotatedUpdate(_THIS, int numrects, SDL_Rect *rects);
- 
- SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current,
- 				int width, int height, int bpp, Uint32 flags)
-@@ -463,12 +532,20 @@
- 	HDC hdc;
- 	RECT bounds;
- 	int x, y;
--	Uint32 Rmask, Gmask, Bmask;
--
-+	Uint32 Rmask, Gmask, Bmask;
-+#ifdef _WIN32_CE
-+	int screenWidth, screenHeight;
-+#endif
-+#ifdef UNDER_CE
-+	int	i;
-+#endif
-+
-+#ifdef HAVE_OPENGL
- 	/* Clean up any GL context that may be hanging around */
- 	if ( current->flags & SDL_OPENGL ) {
- 		WIN_GL_ShutDown(this);
--	}
-+	}
-+#endif
- 
- 	/* Recalculate the bitmasks if necessary */
- 	if ( bpp == current->format->BitsPerPixel ) {
-@@ -517,20 +594,16 @@
- 	video->h = height;
- 	video->pitch = SDL_CalculatePitch(video);
- 
--#ifdef WIN32_PLATFORM_PSPC
-+#ifdef _WIN32_CE
- 	 /* Stuff to hide that $#!^%#$ WinCE taskbar in fullscreen... */
- 	if ( flags & SDL_FULLSCREEN ) {
- 		if ( !(prev_flags & SDL_FULLSCREEN) ) {
--			SHFullScreen(SDL_Window, SHFS_HIDETASKBAR);
--			SHFullScreen(SDL_Window, SHFS_HIDESIPBUTTON);
--			ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_HIDE);
-+			DIB_ShowTaskBar(FALSE);
- 		}
- 		video->flags |= SDL_FULLSCREEN;
- 	} else {
- 		if ( prev_flags & SDL_FULLSCREEN ) {
--			SHFullScreen(SDL_Window, SHFS_SHOWTASKBAR);
--			SHFullScreen(SDL_Window, SHFS_SHOWSIPBUTTON);
--			ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOWNORMAL);
-+			DIB_ShowTaskBar(TRUE);
- 		}
- 	}
- #endif
-@@ -640,28 +713,82 @@
- 			((Uint32*)binfo->bmiColors)[0] = video->format->Rmask;
- 			((Uint32*)binfo->bmiColors)[1] = video->format->Gmask;
- 			((Uint32*)binfo->bmiColors)[2] = video->format->Bmask;
--		} else {
-+		} else {
-+#ifdef UNDER_CE
-+			binfo->bmiHeader.biCompression = BI_RGB;	/* 332 */
-+			if ( video->format->palette ) {
-+				binfo->bmiHeader.biClrUsed = video->format->palette->ncolors;
-+				for(i=0; i<video->format->palette->ncolors; i++)
-+				{
-+					binfo->bmiColors[i].rgbRed=i&(7<<5);
-+					binfo->bmiColors[i].rgbGreen=(i&(7<<2))<<3;
-+					binfo->bmiColors[i].rgbBlue=(i&3)<<5;
-+					binfo->bmiColors[i].rgbReserved=0;
-+			   }
-+			}
-+#else
- 			binfo->bmiHeader.biCompression = BI_RGB;	/* BI_BITFIELDS for 565 vs 555 */
- 			if ( video->format->palette ) {
- 				memset(binfo->bmiColors, 0,
- 					video->format->palette->ncolors*sizeof(RGBQUAD));
--			}
-+			}
-+#endif
- 		}
- 
- 		/* Create the offscreen bitmap buffer */
--		hdc = GetDC(SDL_Window);
-+		hdc = GetDC(SDL_Window);
-+#ifdef _WIN32_CE
-+		/* See if we need to rotate the buffer (WinCE specific) */
-+		screenWidth = GetDeviceCaps(hdc, HORZRES);
-+		screenHeight = GetDeviceCaps(hdc, VERTRES);
-+		rotation = SDL_ROTATE_NONE;
-+		work_pixels = NULL;
-+		if (rotation_pixels) {
-+		free(rotation_pixels);
-+			rotation_pixels = NULL;
-+		}
-+
-+		if ((flags & SDL_FULLSCREEN) && (width>height) && (width > screenWidth) ) {
-+			/* OK, we rotate the screen */
-+		video->pixels = malloc(video->h * video->pitch);
-+			rotation_pixels = video->pixels;
-+			if (video->pixels)
-+				rotation = SDL_ROTATE_LEFT;
-+			OutputDebugString(TEXT("will rotate\r\n"));
-+		}
-+		screen_bmp = CreateDIBSection(hdc, binfo, DIB_RGB_COLORS,
-+			(rotation == SDL_ROTATE_NONE ? (void **)(&video->pixels) : (void**)&work_pixels), NULL, 0);
-+#else
- 		screen_bmp = CreateDIBSection(hdc, binfo, DIB_RGB_COLORS,
--					(void **)(&video->pixels), NULL, 0);
--		ReleaseDC(SDL_Window, hdc);
--		free(binfo);
-+					(void **)(&video->pixels), NULL, 0);
-+#endif
-+		ReleaseDC(SDL_Window, hdc);
-+#ifdef UNDER_CE
-+/* keep bitmapinfo for palette in 8-bit modes for devices that don't have SetDIBColorTable */
-+		last_bits = (rotation == SDL_ROTATE_NONE ? (void **)(&video->pixels) : (void**)&work_pixels);
-+		if(last_bitmapinfo)
-+			free(last_bitmapinfo);
-+		if(is16bitmode)
-+		{
-+			last_bitmapinfo = 0;
-+			free(binfo);
-+		} else
-+			last_bitmapinfo = binfo;
-+#else
-+		free(binfo);
-+#endif
- 		if ( screen_bmp == NULL ) {
- 			if ( video != current ) {
- 				SDL_FreeSurface(video);
- 			}
- 			SDL_SetError("Couldn't create DIB section");
- 			return(NULL);
--		}
--		this->UpdateRects = DIB_NormalUpdate;
-+		}
-+#ifdef _WIN32_CE
-+		this->UpdateRects = (work_pixels ? DIB_RotatedUpdate : DIB_NormalUpdate);
-+#else
-+		this->UpdateRects = DIB_NormalUpdate;
-+#endif
- 
- 		/* Set video surface flags */
- 		if ( bpp <= 8 ) {
-@@ -695,7 +822,15 @@
- 		bounds.left = SDL_windowX;
- 		bounds.top = SDL_windowY;
- 		bounds.right = SDL_windowX+video->w;
--		bounds.bottom = SDL_windowY+video->h;
-+		bounds.bottom = SDL_windowY+video->h;
-+#ifdef UNDER_CE
-+		if(rotation != SDL_ROTATE_NONE)
-+		{   
-+			int t=bounds.right;
-+			bounds.right = bounds.bottom;
-+			bounds.bottom=t;
-+		}
-+#endif
- 		AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), FALSE, 0);
- 		width = bounds.right-bounds.left;
- 		height = bounds.bottom-bounds.top;
-@@ -709,8 +844,10 @@
- 			x = (GetSystemMetrics(SM_CXSCREEN)-width)/2;
- 			y = (GetSystemMetrics(SM_CYSCREEN)-height)/2;
- 		} else {
--			x = y = -1;
--			swp_flags |= SWP_NOMOVE;
-+			x = y = -1;
-+#ifndef UNDER_CE
-+			swp_flags |= SWP_NOMOVE;
-+#endif
- 		}
- 		if ( y < 0 ) { /* Cover up title bar for more client area */
- 			y -= GetSystemMetrics(SM_CYCAPTION)/2;
-@@ -719,19 +856,44 @@
- 			top = HWND_TOPMOST;
- 		} else {
- 			top = HWND_NOTOPMOST;
--		}
--		SetWindowPos(SDL_Window, top, x, y, width, height, swp_flags);
-+		}
-+#ifdef _WIN32_CE
-+		if (flags & SDL_FULLSCREEN) {
-+/* When WinCE program switches resolution from larger to smaller we should move its window so it would be visible in fullscreen */
-+//			SetWindowPos(SDL_Window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
-+			DIB_ShowTaskBar(FALSE);
-+			if(x>0) x=0;	// remove space from the left side of a screen in 320x200 mode
-+			if(y>0) y=0;
-+			SetWindowPos(SDL_Window, HWND_TOPMOST, x, y, width, height, SWP_NOCOPYBITS);
-+			ShowWindow(SDL_Window, SW_SHOW);
-+		}
-+		else
-+			SetWindowPos(SDL_Window, top, x, y, width, height, swp_flags);
-+#else
-+		SetWindowPos(SDL_Window, top, x, y, width, height, swp_flags);
-+#endif
- 		SDL_resizing = 0;
- 		SetForegroundWindow(SDL_Window);
- 	}
- 
- 	/* Set up for OpenGL */
--	if ( flags & SDL_OPENGL ) {
-+	if ( flags & SDL_OPENGL ) {
-+#ifdef HAVE_OPENGL
- 		if ( WIN_GL_SetupWindow(this) < 0 ) {
- 			return(NULL);
- 		}
--		video->flags |= SDL_OPENGL;
--	}
-+		video->flags |= SDL_OPENGL;
-+#else
-+		return NULL;
-+#endif
-+	}
-+
-+#ifdef ENABLE_WINGAPI
-+	/* Grab hardware keys if necessary */
-+	if ( flags & SDL_FULLSCREEN ) {
-+		GAPI_GrabHardwareKeys(TRUE);
-+	}
-+#endif
- 
- 	/* We're live! */
- 	return(video);
-@@ -754,22 +916,169 @@
- {
- 	return;
- }
-+
-+#ifdef _WIN32_CE
-+ 
-+static inline void rotateBlit(unsigned short *src, unsigned short *dest, SDL_Rect *rect, int pitch) {
-+	int i=rect->w, j=rect->h;
-+	src+=i;
-+
-+	for (;i--;) {
-+		register unsigned short *S=src--;
-+// I use loop unrolling to spedup things a little
-+		int cnt = j;
-+		if(cnt&1)
-+		{
-+			*(dest++) = *S;
-+			S+=pitch;
-+		}
-+		cnt>>=1;
-+		if(cnt&1)
-+		{
-+			*(dest++) = *S;
-+			S+=pitch;
-+			*(dest++) = *S;
-+			S+=pitch;
-+		}
-+		cnt>>=1;
-+		for (; cnt--; ) {
-+			*(dest++) = *S;
-+			S+=pitch;
-+			*(dest++) = *S;
-+			S+=pitch;
-+			*(dest++) = *S;
-+			S+=pitch;
-+			*(dest++) = *S;
-+			S+=pitch;
-+		}
-+	}
-+/* tiny optimization
-+	int i, j;
-+	src+=rect->w;
-+
-+	for (i=0; i<rect->w; i++) {
-+		register unsigned short *S=src--;
-+		for (j=0; j<rect->h; j++) {
-+			*(dest++) = *S;
-+			S+=pitch;
-+		}
-+	}
-+*/
-+/* original unoptimized version
-+	int i, j;
-+
-+	for (i=0; i<rect->w; i++) {
-+		for (j=0; j<rect->h; j++) {
-+			dest[i * rect->h + j] = src[pitch * j + (rect->w - i)];
-+		}
-+	}
-+*/
-+}
-+
-+static inline void rotateBlit8(unsigned char *src, unsigned char *dest, SDL_Rect *rect, int pitch) {
-+	int i=rect->w, j=rect->h;
-+	src+=i;
-+
-+	for (;i--;) {
-+		register unsigned char *S=src--;
-+// I use loop unrolling to spedup things a little
-+		int cnt = j;
-+		if(cnt&1)
-+		{
-+			*(dest++) = *S;
-+			S+=pitch;
-+		}
-+		cnt>>=1;
-+		if(cnt&1)
-+		{
-+			*(dest++) = *S;
-+			S+=pitch;
-+			*(dest++) = *S;
-+			S+=pitch;
-+		}
-+		cnt>>=1;
-+		for (; cnt--; ) {
-+			*(dest++) = *S;
-+			S+=pitch;
-+			*(dest++) = *S;
-+			S+=pitch;
-+			*(dest++) = *S;
-+			S+=pitch;
-+			*(dest++) = *S;
-+			S+=pitch;
-+		}
-+	}
-+}
-+
-+static void DIB_RotatedUpdate(_THIS, int numrects, SDL_Rect *rects) 
-+{
-+	HDC hdc, mdc;
-+	HBITMAP hb, old;
-+	int i;
-+
-+	hdc = GetDC(SDL_Window);
-+	if ( screen_pal ) {
-+		SelectPalette(hdc, screen_pal, FALSE);
-+	}
-+	mdc = CreateCompatibleDC(hdc);
-+	/*SelectObject(mdc, screen_bmp);*/
-+	if(this->screen->format->BytesPerPixel == 2) {
-+		for ( i=0; i<numrects; ++i ) {	
-+			unsigned short *src = (unsigned short*)this->screen->pixels;
-+			rotateBlit(src + (this->screen->w * rects[i].y) + rects[i].x, work_pixels, &rects[i], this->screen->w);		
-+			hb = CreateBitmap(rects[i].h, rects[i].w, 1, 16, work_pixels);
-+			old = (HBITMAP)SelectObject(mdc, hb);
-+			BitBlt(hdc, rects[i].y, this->screen->w - (rects[i].x + rects[i].w), rects[i].h, rects[i].w,
-+					mdc, 0, 0, SRCCOPY);
-+			SelectObject(mdc, old);
-+			DeleteObject(hb);
-+		}
-+	} else {
-+		if ( screen_pal ) {
-+			SelectPalette(mdc, screen_pal, FALSE);
-+		}
-+		for ( i=0; i<numrects; ++i ) {	
-+			unsigned char *src = (unsigned char*)this->screen->pixels;
-+			rotateBlit8(src + (this->screen->w * rects[i].y) + rects[i].x, work_pixels, &rects[i], this->screen->w);
-+			hb = CreateBitmap(rects[i].h, rects[i].w, 1, 8, work_pixels);
-+			old = (HBITMAP)SelectObject(mdc, hb);
-+			BitBlt(hdc, rects[i].y, this->screen->w - (rects[i].x + rects[i].w), rects[i].h, rects[i].w,
-+					mdc, 0, 0, SRCCOPY);
-+			SelectObject(mdc, old);
-+			DeleteObject(hb); 
-+		}
-+	}
-+	DeleteDC(mdc);
-+	ReleaseDC(SDL_Window, hdc);
-+}
-+#endif
-+
- 
- static void DIB_NormalUpdate(_THIS, int numrects, SDL_Rect *rects)
- {
- 	HDC hdc, mdc;
--	int i;
-+	int i;
-+#ifdef _WIN32_CE
-+	HBITMAP old;
-+#endif
- 
- 	hdc = GetDC(SDL_Window);
- 	if ( screen_pal ) {
- 		SelectPalette(hdc, screen_pal, FALSE);
- 	}
--	mdc = CreateCompatibleDC(hdc);
--	SelectObject(mdc, screen_bmp);
-+	mdc = CreateCompatibleDC(hdc);
-+#ifdef _WIN32_CE
-+	old = (HBITMAP)SelectObject(mdc, screen_bmp);
-+#else
-+	SelectObject(mdc, screen_bmp);
-+#endif
- 	for ( i=0; i<numrects; ++i ) {
- 		BitBlt(hdc, rects[i].x, rects[i].y, rects[i].w, rects[i].h,
- 					mdc, rects[i].x, rects[i].y, SRCCOPY);
--	}
-+	}
-+#ifdef _WIN32_CE
-+	SelectObject(mdc, old);
-+#endif
- 	DeleteDC(mdc);
- 	ReleaseDC(SDL_Window, hdc);
- }
-@@ -778,11 +1087,11 @@
- {
- 	RGBQUAD *pal;
- 	int i;
--#ifndef _WIN32_WCE
--	HDC hdc, mdc;
--#else
--	HDC hdc;
--#endif
-+	HDC hdc, mdc;
-+#if defined(UNDER_CE) && defined(NO_SETDIBCOLORTABLE)
-+	if(last_bitmapinfo==0)
-+		return 0;
-+#endif
- 
- 	/* Update the display palette */
- 	hdc = GetDC(SDL_Window);
-@@ -811,14 +1120,38 @@
- 	}
- 
- 	/* Set the DIB palette and update the display */
--#ifndef _WIN32_WCE
--	mdc = CreateCompatibleDC(hdc);
-+	mdc = CreateCompatibleDC(hdc);
-+#ifdef UNDER_CE
-+#ifdef NO_SETDIBCOLORTABLE
-+	if(1)
-+#else
-+/* BUG: For some reason SetDIBColorTable is not working when screen is not rotated */
-+	if(rotation == SDL_ROTATE_NONE && last_bitmapinfo)
-+#endif
-+	{
-+		DeleteObject(screen_bmp);
-+		last_bitmapinfo->bmiHeader.biClrUsed=256;
-+		for ( i=firstcolor; i<firstcolor+ncolors; ++i )
-+			last_bitmapinfo->bmiColors[i]=pal[i];
-+		screen_bmp = CreateDIBSection(hdc, last_bitmapinfo, DIB_RGB_COLORS,
-+			last_bits, NULL, 0);
-+    }
-+#else
- 	SelectObject(mdc, screen_bmp);
--	SetDIBColorTable(mdc, firstcolor, ncolors, pal);
-+	SetDIBColorTable(mdc, firstcolor, ncolors, pal);
-+#endif
-+#ifndef UNDER_CE
- 	BitBlt(hdc, 0, 0, this->screen->w, this->screen->h,
--	       mdc, 0, 0, SRCCOPY);
-+	       mdc, 0, 0, SRCCOPY);
-+#else
-+	{
-+		SDL_Rect rect;
-+		rect.x=0; rect.y=0;
-+		rect.w=this->screen->w; rect.h=this->screen->h;
-+// Fixme: screen flickers:		(this->UpdateRects)(this, 1, &rect) ;
-+	}
-+#endif
- 	DeleteDC(mdc);
--#endif
- 	ReleaseDC(SDL_Window, hdc);
- 	return(1);
- }
-@@ -937,27 +1270,27 @@
- 
- void DIB_VideoQuit(_THIS)
- {
--	/* Destroy the window and everything associated with it */
-+	/* Destroy the window and everything associated with it */
-+#ifdef _WIN32_CE
-+	DIB_ShowTaskBar(TRUE);
-+#ifdef ENABLE_WINGAPI
-+	GAPI_GrabHardwareKeys(FALSE);
-+#endif
-+#endif
- 	if ( SDL_Window ) {
- 		/* Delete the screen bitmap (also frees screen->pixels) */
- 		if ( this->screen ) {
--#ifdef WIN32_PLATFORM_PSPC
--			if ( this->screen->flags & SDL_FULLSCREEN ) {
--				/* Unhide taskbar, etc. */
--				SHFullScreen(SDL_Window, SHFS_SHOWTASKBAR);
--				SHFullScreen(SDL_Window, SHFS_SHOWSIPBUTTON);
--				ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOWNORMAL);
--			}
--#endif
- #ifndef NO_CHANGEDISPLAYSETTINGS
- 			if ( this->screen->flags & SDL_FULLSCREEN ) {
- 				ChangeDisplaySettings(NULL, 0);
- 				ShowWindow(SDL_Window, SW_HIDE);
- 			}
--#endif
-+#endif
-+#ifdef HAVE_OPENGL
- 			if ( this->screen->flags & SDL_OPENGL ) {
- 				WIN_GL_ShutDown(this);
--			}
-+			}
-+#endif
- 			this->screen->pixels = NULL;
- 		}
- 		if ( screen_bmp ) {
-diff -ruN SDL-1.2.7-orig/src/video/windib/SDL_dibvideo.h SDL-1.2.7/src/video/windib/SDL_dibvideo.h
---- SDL-1.2.7-orig/src/video/windib/SDL_dibvideo.h	Wed Feb 18 09:22:10 2004
-+++ SDL-1.2.7/src/video/windib/SDL_dibvideo.h	Thu Nov 18 13:13:42 2004
-@@ -29,11 +29,26 @@
- #define _SDL_dibvideo_h
- 
- #include <windows.h>
-+
-+//#ifdef _WIN32_CE
-+/* Rotation direction */
-+typedef enum {
-+	SDL_ROTATE_NONE,
-+	SDL_ROTATE_LEFT,
-+	SDL_ROTATE_RIGHT
-+} SDL_RotateAttr;
-+//#endif
- 
- /* Private display data */
- struct SDL_PrivateVideoData {
-     HBITMAP screen_bmp;
--    HPALETTE screen_pal;
-+    HPALETTE screen_pal;
-+//#ifdef _WIN32_CE
-+	void *work_pixels; /* if the display needs to be rotated, memory allocated by the API */
-+	void *rotation_pixels; /* if the display needs to be rotated, memory allocated by the code */
-+	SDL_RotateAttr rotation;
-+	char ozoneHack; /* force stylus translation if running without Hi Res flag */
-+//#endif
- 
- #define NUM_MODELISTS	4		/* 8, 16, 24, and 32 bits-per-pixel */
-     int SDL_nummodes[NUM_MODELISTS];
-@@ -43,6 +58,12 @@
- #define screen_bmp		(this->hidden->screen_bmp)
- #define screen_pal		(this->hidden->screen_pal)
- #define SDL_nummodes		(this->hidden->SDL_nummodes)
--#define SDL_modelist		(this->hidden->SDL_modelist)
-+#define SDL_modelist		(this->hidden->SDL_modelist)
-+//#ifdef _WIN32_CE
-+#define work_pixels			(this->hidden->work_pixels)
-+#define rotation			(this->hidden->rotation)
-+#define rotation_pixels		(this->hidden->rotation_pixels)
-+#define ozoneHack			(this->hidden->ozoneHack)
-+//#endif
- 
- #endif /* _SDL_dibvideo_h */
-diff -ruN SDL-1.2.7-orig/src/video/wingapi/SDL_gapivideo.c SDL-1.2.7/src/video/wingapi/SDL_gapivideo.c
---- SDL-1.2.7-orig/src/video/wingapi/SDL_gapivideo.c	Wed Dec 31 19:00:00 1969
-+++ SDL-1.2.7/src/video/wingapi/SDL_gapivideo.c	Thu Nov 18 13:43:27 2004
-@@ -0,0 +1,956 @@
-+/*
-+    SDL - Simple DirectMedia Layer
-+    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
-+
-+    This library is free software; you can redistribute it and/or
-+    modify it under the terms of the GNU Library General Public
-+    License as published by the Free Software Foundation; either
-+    version 2 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
-+    Library General Public License for more details.
-+
-+    You should have received a copy of the GNU Library General Public
-+    License along with this library; if not, write to the Free
-+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+
-+    Sam Lantinga
-+    slouken@libsdl.org
-+*/
-+
-+#ifdef SAVE_RCSID
-+static char rcsid =
-+ "@(#) $Id: SDL_gapivideo.c,v 1.5 2004/02/29 21:54:11 lemure Exp $";
-+#endif
-+
-+/* Dummy SDL video driver implementation; this is just enough to make an
-+ *  SDL-based application THINK it's got a working video driver, for
-+ *  applications that call SDL_Init(SDL_INIT_VIDEO) when they don't need it,
-+ *  and also for use as a collection of stubs when porting SDL to a new
-+ *  platform for which you haven't yet written a valid video driver.
-+ *
-+ * This is also a great way to determine bottlenecks: if you think that SDL
-+ *  is a performance problem for a given platform, enable this driver, and
-+ *  then see if your application runs faster without video overhead.
-+ *
-+ * Initial work by Ryan C. Gordon (icculus@linuxgames.com). A good portion
-+ *  of this was cut-and-pasted from Stephane Peter's work in the AAlib
-+ *  SDL video driver.  Renamed to "DUMMY" by Sam Lantinga.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <malloc.h>
-+#include <windows.h>
-+
-+/* Not yet in the mingw32 cross-compile headers */
-+#ifndef CDS_FULLSCREEN
-+#define CDS_FULLSCREEN	4
-+#endif
-+
-+#ifndef WS_THICKFRAME
-+#define WS_THICKFRAME 0
-+#endif
-+
-+#include "SDL.h"
-+#include "SDL_mutex.h"
-+#include "SDL_syswm.h"
-+#include "SDL_sysvideo.h"
-+#include "SDL_sysevents.h"
-+#include "SDL_events_c.h"
-+#include "SDL_pixels_c.h"
-+#include "SDL_syswm_c.h"
-+#include "SDL_sysmouse_c.h"
-+#include "SDL_dibevents_c.h"
-+#include "SDL_gapivideo.h"
-+
-+#if defined(WIN32_PLATFORM_PSPC)
-+#include <aygshell.h>                      // Add Pocket PC includes
-+#pragma comment( lib, "aygshell" )         // Link Pocket PC library
-+#endif
-+
-+#ifdef _WIN32_WCE
-+extern void DIB_ShowTaskBar(BOOL taskBarShown);
-+#endif
-+
-+
-+/* Initialization/Query functions */
-+static int GAPI_VideoInit(_THIS, SDL_PixelFormat *vformat);
-+static SDL_Rect **GAPI_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
-+static SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
-+static int GAPI_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
-+static void GAPI_VideoQuit(_THIS);
-+
-+
-+/* Hardware surface functions */
-+static int GAPI_AllocHWSurface(_THIS, SDL_Surface *surface);
-+static int GAPI_LockHWSurface(_THIS, SDL_Surface *surface);
-+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_RealizePalette(_THIS);
-+static void GAPI_PaletteChanged(_THIS, HWND window);
-+static void GAPI_WinPAINT(_THIS, HDC hdc);
-+
-+static void GAPI_UpdateRects(_THIS, int numrects, SDL_Rect *rects); 
-+/*static void GAPI_UpdateRectsMono(_THIS, int numrects, SDL_Rect *rects);*/
-+
-+static int GAPI_Available(void);
-+static SDL_VideoDevice *GAPI_CreateDevice(int devindex);
-+
-+void GAPI_GrabHardwareKeys(BOOL grab);
-+
-+VideoBootStrap WINGAPI_bootstrap = {
-+	"wingapi", "WinCE GAPI",
-+	GAPI_Available, GAPI_CreateDevice
-+};
-+
-+/* 2003 SE GAPI emulation */
-+
-+#define GETRAWFRAMEBUFFER   0x00020001
-+
-+#define FORMAT_565 1
-+#define FORMAT_555 2
-+#define FORMAT_OTHER 3
-+
-+static void* _OzoneFrameBuffer = NULL;
-+static struct GXDisplayProperties _OzoneDisplayProperties;
-+static char _OzoneAvailable = 0;
-+
-+typedef struct _RawFrameBufferInfo
-+{
-+   WORD wFormat;
-+   WORD wBPP;
-+   VOID *pFramePointer;
-+   int  cxStride;
-+   int  cyStride;
-+   int  cxPixels;
-+   int  cyPixels;
-+} RawFrameBufferInfo;
-+
-+
-+struct GXDisplayProperties Ozone_GetDisplayProperties(void) {
-+	return _OzoneDisplayProperties;
-+}
-+
-+int Ozone_OpenDisplay(HWND window, unsigned long flag) {
-+	return 1;
-+}
-+
-+int Ozone_CloseDisplay(void) {
-+	return 1;
-+}
-+
-+void* Ozone_BeginDraw(void) {
-+	return _OzoneFrameBuffer;
-+}
-+
-+int Ozone_EndDraw(void) {
-+	return 1;
-+}
-+
-+int Ozone_Suspend(void) {
-+	return 1;
-+}
-+
-+int Ozone_Resume(void) {
-+	return 1;
-+}
-+
-+static HINSTANCE checkOzone(tGXDisplayProperties *gxGetDisplayProperties, tGXOpenDisplay *gxOpenDisplay,
-+					  tGXVoidFunction *gxCloseDisplay, tGXBeginDraw *gxBeginDraw, 
-+					  tGXVoidFunction *gxEndDraw, tGXVoidFunction *gxSuspend, tGXVoidFunction *gxResume) {
-+#ifdef ARM
-+
-+	int result;
-+	RawFrameBufferInfo frameBufferInfo;
-+	HDC hdc = GetDC(NULL);
-+	result = ExtEscape(hdc, GETRAWFRAMEBUFFER, 0, NULL, sizeof(RawFrameBufferInfo), (char *)&frameBufferInfo);
-+	ReleaseDC(NULL, hdc);
-+	if (result < 0)
-+		return NULL;
-+	OutputDebugString(TEXT("Running on Ozone\r\n"));
-+	_OzoneAvailable = 1;
-+
-+	// Initializing global parameters
-+	_OzoneFrameBuffer = frameBufferInfo.pFramePointer;
-+	_OzoneDisplayProperties.cBPP = frameBufferInfo.wBPP;
-+	_OzoneDisplayProperties.cbxPitch = frameBufferInfo.cxStride;
-+	_OzoneDisplayProperties.cbyPitch = frameBufferInfo.cyStride;
-+	_OzoneDisplayProperties.cxWidth = frameBufferInfo.cxPixels;
-+	_OzoneDisplayProperties.cyHeight = frameBufferInfo.cyPixels;
-+	if (frameBufferInfo.wFormat == FORMAT_565)
-+		_OzoneDisplayProperties.ffFormat = kfDirect565;
-+	else
-+	if (frameBufferInfo.wFormat == FORMAT_555)
-+		_OzoneDisplayProperties.ffFormat = kfDirect555;
-+	else {
-+		OutputDebugString(TEXT("Ozone unknown screen format"));
-+		return NULL;
-+	}
-+
-+	if (gxGetDisplayProperties)
-+		*gxGetDisplayProperties = Ozone_GetDisplayProperties;
-+	if (gxOpenDisplay)
-+		*gxOpenDisplay = Ozone_OpenDisplay;
-+	if (gxCloseDisplay)
-+		*gxCloseDisplay = Ozone_CloseDisplay;
-+	if (gxBeginDraw)
-+		*gxBeginDraw = Ozone_BeginDraw;
-+	if (gxEndDraw)
-+		*gxEndDraw = Ozone_EndDraw;
-+	if (gxSuspend)
-+		*gxSuspend = Ozone_Suspend;
-+	if (gxResume)
-+		*gxResume = Ozone_Resume;
-+
-+	return (HINSTANCE)1;
-+
-+#else
-+
-+	return NULL;
-+
-+#endif
-+}
-+
-+int getScreenWidth() {
-+	return (_OzoneFrameBuffer ? _OzoneDisplayProperties.cxWidth : GetSystemMetrics(SM_CXSCREEN));
-+}
-+
-+int getScreenHeight() {
-+	return (_OzoneFrameBuffer ? _OzoneDisplayProperties.cyHeight : GetSystemMetrics(SM_CYSCREEN));
-+}
-+
-+
-+/* Check GAPI library */
-+
-+#define IMPORT(Handle,Variable,Type,Function, Store) \
-+        Variable = GetProcAddress(Handle, TEXT(Function)); \
-+		if (!Variable) { \
-+			FreeLibrary(Handle); \
-+			return NULL; \
-+		} \
-+		if (Store) \
-+			*Store = (Type)Variable;
-+
-+static HINSTANCE checkGAPI(tGXDisplayProperties *gxGetDisplayProperties, tGXOpenDisplay *gxOpenDisplay,
-+					  tGXVoidFunction *gxCloseDisplay, tGXBeginDraw *gxBeginDraw, 
-+					  tGXVoidFunction *gxEndDraw, tGXVoidFunction *gxSuspend, tGXVoidFunction *gxResume,
-+					  BOOL bypassOzone) {
-+	HMODULE gapiLibrary;
-+	FARPROC proc;
-+	HINSTANCE result;
-+	// FIXME paletted !
-+	tGXDisplayProperties temp_gxGetDisplayProperties;
-+
-+	// Workaround for Windows Mobile 2003 SE
-+	_OzoneFrameBuffer = NULL;
-+	if (!bypassOzone) {
-+		result = checkOzone(gxGetDisplayProperties, gxOpenDisplay, gxCloseDisplay, gxBeginDraw, gxEndDraw, gxSuspend, gxResume);
-+		if (result)
-+			return result;
-+	}
-+
-+	gapiLibrary = LoadLibrary(TEXT("gx.dll"));
-+	if (!gapiLibrary)
-+		return NULL;
-+
-+	IMPORT(gapiLibrary, proc, tGXDisplayProperties, "?GXGetDisplayProperties@@YA?AUGXDisplayProperties@@XZ", gxGetDisplayProperties)
-+	IMPORT(gapiLibrary, proc, tGXOpenDisplay, "?GXOpenDisplay@@YAHPAUHWND__@@K@Z", gxOpenDisplay)
-+	IMPORT(gapiLibrary, proc, tGXVoidFunction, "?GXCloseDisplay@@YAHXZ", gxCloseDisplay)
-+	IMPORT(gapiLibrary, proc, tGXBeginDraw, "?GXBeginDraw@@YAPAXXZ", gxBeginDraw)
-+	IMPORT(gapiLibrary, proc, tGXVoidFunction, "?GXEndDraw@@YAHXZ", gxEndDraw)
-+	IMPORT(gapiLibrary, proc, tGXVoidFunction, "?GXSuspend@@YAHXZ", gxSuspend)
-+	IMPORT(gapiLibrary, proc, tGXVoidFunction, "?GXResume@@YAHXZ", gxResume)
-+	
-+	// FIXME paletted ! for the moment we just bail out	
-+	if (!gxGetDisplayProperties) {
-+		IMPORT(gapiLibrary, proc, tGXDisplayProperties, "?GXGetDisplayProperties@@YA?AUGXDisplayProperties@@XZ", &temp_gxGetDisplayProperties)
-+		if (temp_gxGetDisplayProperties().ffFormat & kfPalette) {
-+			FreeLibrary(gapiLibrary);
-+			return NULL;
-+		}
-+		FreeLibrary(gapiLibrary);		
-+		gapiLibrary = (HINSTANCE)1;
-+	}
-+	
-+	return gapiLibrary;
-+}
-+
-+
-+/* GAPI driver bootstrap functions */
-+
-+static int GAPI_Available(void)
-+{
-+	/* Check if the GAPI library is available */
-+
-+	if (!checkGAPI(NULL, NULL, NULL, NULL, NULL, NULL, NULL, FALSE)) {
-+		OutputDebugString(TEXT("GAPI driver not available\r\n"));
-+		return 0;
-+	}
-+	else {
-+		OutputDebugString(TEXT("GAPI driver available\r\n"));
-+		return 1;
-+	}
-+}
-+
-+static void GAPI_DeleteDevice(SDL_VideoDevice *device)
-+{
-+	if (device && device->hidden && device->hidden->gapiFuncs.dynamicGXCloseDisplay)
-+		device->hidden->gapiFuncs.dynamicGXCloseDisplay();
-+
-+	if (device && device->hidden)	
-+		free(device->hidden);
-+	if (device)
-+		free(device);
-+
-+}
-+
-+static SDL_VideoDevice *GAPI_CreateDevice(int devindex)
-+{
-+	SDL_VideoDevice *device;
-+
-+	/* Initialize all variables that we clean on shutdown */
-+	device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice));
-+	if ( device ) {
-+		memset(device, 0, (sizeof *device));
-+		device->hidden = (struct SDL_PrivateVideoData *)
-+				malloc((sizeof *device->hidden));
-+	}
-+	if ( (device == NULL) || (device->hidden == NULL) ) {
-+		SDL_OutOfMemory();
-+		if ( device ) {
-+			free(device);
-+		}
-+		return(0);
-+	}
-+	memset(device->hidden, 0, (sizeof *device->hidden));
-+
-+	/* Set GAPI pointers */
-+
-+	checkGAPI(&device->hidden->gapiFuncs.dynamicGXGetDisplayProperties, 
-+			  &device->hidden->gapiFuncs.dynamicGXOpenDisplay, 
-+			  &device->hidden->gapiFuncs.dynamicGXCloseDisplay, 
-+			  &device->hidden->gapiFuncs.dynamicGXBeginDraw, 
-+			  &device->hidden->gapiFuncs.dynamicGXEndDraw, 
-+			  &device->hidden->gapiFuncs.dynamicGXSuspend, 
-+			  &device->hidden->gapiFuncs.dynamicGXResume, 
-+			  FALSE);
-+	device->hidden->displayProps = device->hidden->gapiFuncs.dynamicGXGetDisplayProperties();
-+
-+	/* Set the function pointers */
-+
-+	device->VideoInit = GAPI_VideoInit;
-+	device->ListModes = GAPI_ListModes;
-+	device->SetVideoMode = GAPI_SetVideoMode;
-+	device->UpdateMouse = WIN_UpdateMouse;
-+	device->SetColors = GAPI_SetColors;
-+	device->UpdateRects = NULL;
-+	device->VideoQuit = GAPI_VideoQuit;
-+	device->AllocHWSurface = GAPI_AllocHWSurface;
-+	device->CheckHWBlit = NULL;
-+	device->FillHWRect = NULL;
-+	device->SetHWColorKey = NULL;
-+	device->SetHWAlpha = NULL;
-+	device->LockHWSurface = GAPI_LockHWSurface;
-+	device->UnlockHWSurface = GAPI_UnlockHWSurface;
-+	device->FlipHWSurface = NULL;
-+	device->FreeHWSurface = GAPI_FreeHWSurface;
-+	device->SetCaption = WIN_SetWMCaption;
-+	device->SetIcon = WIN_SetWMIcon;
-+	device->IconifyWindow = WIN_IconifyWindow;
-+	device->GrabInput = WIN_GrabInput;
-+	device->GetWMInfo = WIN_GetWMInfo;
-+	device->FreeWMCursor = WIN_FreeWMCursor;
-+	device->CreateWMCursor = WIN_CreateWMCursor;
-+	device->ShowWMCursor = WIN_ShowWMCursor;
-+	device->WarpWMCursor = WIN_WarpWMCursor;
-+	device->CheckMouseMode = WIN_CheckMouseMode;
-+	device->InitOSKeymap = DIB_InitOSKeymap;
-+	device->PumpEvents = DIB_PumpEvents;
-+
-+	device->SetColors = GAPI_SetColors;
-+
-+	/* Set up the windows message handling functions */
-+	WIN_RealizePalette = GAPI_RealizePalette;
-+	WIN_PaletteChanged = GAPI_PaletteChanged;
-+	WIN_WinPAINT = GAPI_WinPAINT;
-+	HandleMessage = DIB_HandleMessage;
-+
-+	device->free = GAPI_DeleteDevice;
-+	
-+	
-+	/*
-+	device->VideoInit = GAPI_VideoInit;
-+	device->ListModes = GAPI_ListModes;
-+	device->SetVideoMode = GAPI_SetVideoMode;
-+	device->CreateYUVOverlay = NULL;
-+	device->SetColors = DUMMY_SetColors;
-+	device->UpdateRects = DUMMY_UpdateRects;
-+	device->VideoQuit = DUMMY_VideoQuit;
-+	device->AllocHWSurface = DUMMY_AllocHWSurface;
-+	device->CheckHWBlit = NULL;
-+	device->FillHWRect = NULL;
-+	device->SetHWColorKey = NULL;
-+	device->SetHWAlpha = NULL;
-+	device->LockHWSurface = DUMMY_LockHWSurface;
-+	device->UnlockHWSurface = DUMMY_UnlockHWSurface;
-+	device->FlipHWSurface = NULL;
-+	device->FreeHWSurface = DUMMY_FreeHWSurface;
-+	device->SetCaption = NULL;
-+	device->SetIcon = NULL;
-+	device->IconifyWindow = NULL;
-+	device->GrabInput = NULL;
-+	device->GetWMInfo = NULL;
-+	device->InitOSKeymap = DUMMY_InitOSKeymap;
-+	device->PumpEvents = DUMMY_PumpEvents;
-+
-+	device->free = DUMMY_DeleteDevice;
-+	*/
-+
-+	return device;
-+}
-+
-+
-+int GAPI_VideoInit(_THIS, SDL_PixelFormat *vformat)
-+{
-+
-+	/* Create the window */
-+	if ( DIB_CreateWindow(this) < 0 ) {
-+		return(-1);
-+	}
-+
-+	vformat->BitsPerPixel = (unsigned char)displayProperties.cBPP;	
-+
-+	// Get color mask
-+	if (displayProperties.ffFormat & kfDirect565) {
-+		vformat->BitsPerPixel = 16;
-+		vformat->Rmask = 0x0000f800;
-+		vformat->Gmask = 0x000007e0;
-+		vformat->Bmask = 0x0000001f;
-+		videoMode = GAPI_DIRECT_565;
-+	}
-+	else
-+	if (displayProperties.ffFormat & kfDirect555) {
-+		vformat->BitsPerPixel = 16;
-+		vformat->Rmask = 0x00007c00;
-+		vformat->Gmask = 0x000003e0;
-+		vformat->Bmask = 0x0000001f;
-+		videoMode = GAPI_DIRECT_555;
-+	}
-+	else
-+	if ((displayProperties.ffFormat & kfDirect) && (displayProperties.cBPP <= 8)) {
-+		// We'll perform the conversion
-+		vformat->BitsPerPixel = 24;
-+		vformat->Rmask = 0x00ff0000;
-+		vformat->Gmask = 0x0000ff00;
-+		vformat->Bmask = 0x000000ff;
-+		if (displayProperties.ffFormat & kfDirectInverted)
-+			invert = (1 << displayProperties.cBPP) - 1;
-+		colorscale = displayProperties.cBPP < 8 ? 8 - displayProperties.cBPP : 0;
-+		videoMode = GAPI_MONO;
-+	}
-+	else
-+	if (displayProperties.ffFormat & kfPalette) {
-+		videoMode = GAPI_PALETTE;
-+	}
-+
-+	/* Set UpdateRect callback */
-+	// FIXME
-+	/*
-+	if (videoMode != GAPI_MONO)
-+		this->UpdateRects = GAPI_UpdateRects;
-+	else
-+		this->UpdateRects = GAPI_UpdateRectsMono;
-+	*/
-+
-+	this->UpdateRects = GAPI_UpdateRects;
-+	
-+	/* We're done! */
-+	return(0);
-+}
-+
-+SDL_Rect **GAPI_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
-+{
-+   	 return (SDL_Rect **) -1;
-+}
-+
-+SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current,
-+				int width, int height, int bpp, Uint32 flags)
-+{
-+	SDL_Surface *video;
-+	Uint32 Rmask, Gmask, Bmask;
-+	Uint32 prev_flags;
-+	DWORD style;
-+	const DWORD directstyle =
-+			(WS_POPUP);
-+	const DWORD windowstyle = 
-+			(WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX);
-+	const DWORD resizestyle =
-+			(WS_THICKFRAME|WS_MAXIMIZEBOX);
-+	int screenWidth, screenHeight;
-+	BOOL was_visible;
-+
-+	/* We negociate legacy GAPI if we want a screen that fits in QVGA */
-+	if (_OzoneAvailable && _OzoneFrameBuffer && (width <= GetSystemMetrics(SM_CXSCREEN) || width <= GetSystemMetrics(SM_CYSCREEN)) &&
-+						     (height <= GetSystemMetrics(SM_CXSCREEN) || height <= GetSystemMetrics(SM_CYSCREEN))) {
-+			OutputDebugString(TEXT("Ozone workaround, switching back to GAPI\r\n"));
-+			ozoneHack = 0;
-+			checkGAPI(&this->hidden->gapiFuncs.dynamicGXGetDisplayProperties, 
-+				&this->hidden->gapiFuncs.dynamicGXOpenDisplay, 
-+				&this->hidden->gapiFuncs.dynamicGXCloseDisplay, 
-+				&this->hidden->gapiFuncs.dynamicGXBeginDraw, 
-+				&this->hidden->gapiFuncs.dynamicGXEndDraw, 
-+				&this->hidden->gapiFuncs.dynamicGXSuspend, 
-+				&this->hidden->gapiFuncs.dynamicGXResume, 
-+				TRUE);
-+			this->hidden->displayProps = this->hidden->gapiFuncs.dynamicGXGetDisplayProperties();
-+	}
-+	/* Otherwise we'll use the new system call */
-+	if (_OzoneAvailable && !_OzoneFrameBuffer && (width > GetSystemMetrics(SM_CXSCREEN) && width > GetSystemMetrics(SM_CYSCREEN)) && 
-+		                                         (height > GetSystemMetrics(SM_CXSCREEN) && height > GetSystemMetrics(SM_CYSCREEN))) {
-+			OutputDebugString(TEXT("Ozone workaround, switching back to true Ozone\r\n"));
-+			checkGAPI(&this->hidden->gapiFuncs.dynamicGXGetDisplayProperties, 
-+				&this->hidden->gapiFuncs.dynamicGXOpenDisplay, 
-+				&this->hidden->gapiFuncs.dynamicGXCloseDisplay, 
-+				&this->hidden->gapiFuncs.dynamicGXBeginDraw, 
-+				&this->hidden->gapiFuncs.dynamicGXEndDraw, 
-+				&this->hidden->gapiFuncs.dynamicGXSuspend, 
-+				&this->hidden->gapiFuncs.dynamicGXResume, 
-+				FALSE);
-+			this->hidden->displayProps = this->hidden->gapiFuncs.dynamicGXGetDisplayProperties();
-+	}
-+	/* Which will need a tiny input hack if the original code does not have the "Hi Res" aware ressource property set */
-+	ozoneHack = 0;
-+	if (_OzoneFrameBuffer && (GetSystemMetrics(SM_CXSCREEN) != (signed) _OzoneDisplayProperties.cxWidth ||
-+							  GetSystemMetrics(SM_CYSCREEN) != (signed) _OzoneDisplayProperties.cyHeight)) {
-+				OutputDebugString(TEXT("Running true Ozone with stylus hack\r\n"));
-+				ozoneHack = 1;
-+	}
-+
-+	/* See whether or not we should center the window */
-+	was_visible = IsWindowVisible(SDL_Window);
-+
-+	/* Recalculate bitmasks if necessary */
-+	if (bpp == current->format->BitsPerPixel) {
-+		video = current;
-+	}
-+	else {
-+		switch(bpp) {
-+			case 8:
-+				Rmask = 0;
-+				Gmask = 0;
-+				Bmask = 0;
-+				break;
-+			case 15:				
-+			case 16:
-+				/* Default is 565 unless the display is specifically 555 */
-+				if (displayProperties.ffFormat & kfDirect555) {
-+					Rmask = 0x00007c00;
-+					Gmask = 0x000003e0;
-+					Bmask = 0x0000001f;
-+				}
-+				else {
-+					Rmask = 0x0000f800;
-+					Gmask = 0x000007e0;
-+					Bmask = 0x0000001f;
-+				}
-+				break;
-+			case 24:
-+			case 32:
-+				Rmask = 0x00ff0000;
-+				Gmask = 0x0000ff00;
-+				Bmask = 0x000000ff;
-+				break;
-+			default:
-+				SDL_SetError("Unsupported Bits Per Pixel format requested");
-+				return NULL;
-+		}
-+		video = SDL_CreateRGBSurface(SDL_SWSURFACE,
-+					0, 0, bpp, Rmask, Gmask, Bmask, 0);
-+		if ( video == NULL ) {
-+			SDL_OutOfMemory();
-+			return(NULL);
-+		}
-+	}
-+	
-+	/* Fill in part of the video surface */
-+	prev_flags = video->flags;
-+	video->flags = 0;	/* Clear flags */
-+	video->w = width;
-+	video->h = height;
-+	video->pitch = SDL_CalculatePitch(video);
-+	mainSurfaceWidth = width;
-+	mainSurfaceHeight = height;	
-+
-+//#ifdef WIN32_PLATFORM_PSPC
-+	/* Hide taskbar */	
-+	if ( flags & SDL_FULLSCREEN ) {
-+		if ( !(prev_flags & SDL_FULLSCREEN) ) {
-+			//SHFullScreen(SDL_Window, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);
-+			//ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_HIDE);
-+			DIB_ShowTaskBar(FALSE);
-+		}
-+		video->flags |= SDL_FULLSCREEN;
-+	} else {
-+		if ( prev_flags & SDL_FULLSCREEN ) {
-+			//SHFullScreen(SDL_Window, SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON | SHFS_SHOWSTARTICON);
-+			//ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOWNORMAL);
-+			DIB_ShowTaskBar(TRUE);
-+		}
-+	}
-+//#endif
-+
-+	/* Reset the palette and create a new one if necessary */	
-+	if (screenPal != NULL) {
-+		DeleteObject(screenPal);
-+		screenPal = NULL;
-+	}
-+
-+	/* See if we need to create a translation palette */
-+	if (convertPalette != NULL) {
-+		free(convertPalette);
-+	}
-+	if (bpp == 8) {
-+		OutputDebugString(TEXT("creating palette\r\n"));
-+		convertPalette = (unsigned short*)malloc(256 * sizeof(unsigned short));
-+	}
-+
-+	if (displayProperties.ffFormat & kfPalette) {
-+		/* Will only be able to support 256 colors in this mode */
-+		// FIXME
-+		//screenPal = GAPI_CreatePalette();
-+	}
-+
-+	/* Set Window style */
-+	style = GetWindowLong(SDL_Window, GWL_STYLE);
-+	if ( (video->flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) {
-+		style &= ~windowstyle;
-+		style |= directstyle;
-+	} else {
-+		if ( flags & SDL_NOFRAME ) {
-+			style &= ~windowstyle;
-+			style |= directstyle;
-+			video->flags |= SDL_NOFRAME;
-+		} else {
-+			style &= ~directstyle;
-+			style |= windowstyle;
-+			if ( flags & SDL_RESIZABLE ) {
-+				style |= resizestyle;
-+				video->flags |= SDL_RESIZABLE;
-+			}
-+		}
-+#if WS_MAXIMIZE
-+		if (IsZoomed(SDL_Window)) style |= WS_MAXIMIZE;
-+#endif
-+	}
-+
-+	if (!SDL_windowid)
-+		SetWindowLong(SDL_Window, GWL_STYLE, style);
-+
-+	/* Allocate bitmap */
-+	if (gapiBuffer) {
-+		free(gapiBuffer);
-+		gapiBuffer = NULL;
-+	}
-+	gapiBuffer = malloc(video->h * video->pitch);
-+	video->pixels = gapiBuffer;
-+
-+	/* See if we will rotate */
-+	rotation = SDL_ROTATE_NONE;
-+	screenWidth = getScreenWidth();
-+	screenHeight = getScreenHeight();
-+	if ((flags & SDL_FULLSCREEN) && 
-+		(width > screenWidth && width <= screenHeight)
-+		) 
-+	{
-+			rotation = SDL_ROTATE_LEFT;
-+	}
-+	/* Compute the different drawing properties */
-+	switch(rotation) {
-+		case SDL_ROTATE_NONE:
-+			dstPixelstep = displayProperties.cbxPitch;
-+			dstLinestep = displayProperties.cbyPitch;
-+			startOffset = 0;
-+			break;
-+		case SDL_ROTATE_LEFT:
-+			dstPixelstep = -displayProperties.cbyPitch;
-+			dstLinestep = displayProperties.cbxPitch;
-+			startOffset = displayProperties.cbyPitch * (displayProperties.cyHeight - 1);
-+			break;
-+		case SDL_ROTATE_RIGHT:
-+			dstPixelstep = displayProperties.cbyPitch;
-+			dstLinestep = -displayProperties.cbxPitch;
-+			startOffset = displayProperties.cbxPitch * (displayProperties.cxWidth - 1);
-+			break;
-+	}
-+	/* Compute padding */
-+	padWidth = 0;
-+	padHeight = 0;
-+	if (rotation == SDL_ROTATE_NONE) {
-+		if (getScreenWidth() > width)
-+			padWidth = (getScreenWidth() - width) / 2;
-+		if (getScreenHeight() > height)
-+			padHeight = (getScreenHeight() - height) / 2;
-+	}
-+	else {
-+		if (getScreenWidth() > height)
-+			padWidth = (getScreenWidth() - height) / 2;
-+		if (getScreenHeight() > width)
-+			padHeight = (getScreenHeight() - width) / 2;
-+	}
-+	srcLinestep = video->pitch;
-+	srcPixelstep = (bpp == 15 ? 2 : bpp / 8);
-+	
-+	MoveWindow(SDL_Window, 0, 0, getScreenWidth(), getScreenHeight(), FALSE);
-+	ShowWindow(SDL_Window, SW_SHOW);
-+
-+	/* Resize the window */
-+	//if ( SDL_windowid == NULL ) {
-+	if (0) {
-+		HWND top;
-+		UINT swp_flags;
-+		RECT bounds;
-+		int x,y;
-+
-+		SDL_resizing = 1;
-+		bounds.left = 0;
-+		bounds.top = 0;
-+		bounds.right = video->w;
-+		bounds.bottom = video->h;
-+		AdjustWindowRectEx(&bounds, GetWindowLong(SDL_Window, GWL_STYLE), FALSE, 0);
-+		width = bounds.right-bounds.left;
-+		height = bounds.bottom-bounds.top;
-+		x = (getScreenWidth()-width)/2;
-+		y = (getScreenHeight()-height)/2;
-+		if ( y < 0 ) { /* Cover up title bar for more client area */
-+			y -= GetSystemMetrics(SM_CYCAPTION)/2;
-+		}
-+		swp_flags = (SWP_FRAMECHANGED | SWP_SHOWWINDOW);
-+		if ( was_visible && !(flags & SDL_FULLSCREEN) ) {
-+			swp_flags |= SWP_NOMOVE;
-+		}
-+		if ( flags & SDL_FULLSCREEN ) {
-+			top = HWND_TOPMOST;
-+		} else {
-+			top = HWND_NOTOPMOST;
-+		}
-+
-+		if (flags & SDL_FULLSCREEN) {
-+			SetWindowPos(SDL_Window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
-+			ShowWindow(SDL_Window, SW_SHOW);
-+		}
-+		else
-+			SetWindowPos(SDL_Window, top, x, y, width, height, swp_flags);
-+		
-+		SDL_resizing = 0;
-+		SetForegroundWindow(SDL_Window);
-+	}
-+	
-+	/* Open GAPI display */
-+	GXOpenDisplay(SDL_Window, (flags & SDL_FULLSCREEN ? GX_FULLSCREEN : 0));
-+
-+	/* Grab hardware keys if necessary */
-+	if (flags & SDL_FULLSCREEN)
-+		GAPI_GrabHardwareKeys(TRUE);
-+
-+	/* Blank screen */
-+	memset(GXBeginDraw(), 0, getScreenWidth() * getScreenHeight() * 2);
-+	GXEndDraw();
-+
-+	/* We're done */
-+	return(video);
-+}
-+
-+/* We don't actually allow hardware surfaces other than the main one */
-+static int GAPI_AllocHWSurface(_THIS, SDL_Surface *surface)
-+{
-+	return(-1);
-+}
-+static void GAPI_FreeHWSurface(_THIS, SDL_Surface *surface)
-+{
-+	return;
-+}
-+
-+/* We need to wait for vertical retrace on page flipped displays */
-+static int GAPI_LockHWSurface(_THIS, SDL_Surface *surface)
-+{
-+	return(0);
-+}
-+
-+static void GAPI_UnlockHWSurface(_THIS, SDL_Surface *surface)
-+{
-+	return;
-+}
-+
-+static void updateLine(_THIS, unsigned char *srcPointer, unsigned char *destPointer, int width) {
-+	// FIXME, we assume everything is in the correct format, either 16 bits 565 or 555, or 8 bits
-+	int i;
-+	for (i=0; i<width; i++) {
-+		if (!convertPalette) {
-+			*(unsigned short*)destPointer = *(unsigned short*)srcPointer;
-+		}
-+		else {
-+			*(unsigned short*)destPointer = convertPalette[*srcPointer];
-+		}
-+			
-+		destPointer += dstPixelstep;
-+		srcPointer += srcPixelstep;
-+	}
-+}
-+
-+static void GAPI_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
-+{
-+	int i;
-+	unsigned char *screenBuffer;
-+
-+	screenBuffer = GXBeginDraw();
-+
-+	for (i=0; i<numrects; i++) {
-+		unsigned char *destPointer = screenBuffer + startOffset + ((rects[i].x + padWidth) * dstPixelstep) + ((rects[i].y + padHeight) * dstLinestep);
-+		unsigned char *srcPointer = (unsigned char*)gapiBuffer + (rects[i].x * srcPixelstep) + (rects[i].y * srcLinestep);
-+		int height = rects[i].h;
-+
-+		while (height) {
-+			updateLine(this, srcPointer, destPointer, rects[i].w);
-+			destPointer += dstLinestep;
-+			srcPointer += srcLinestep;
-+			height--;
-+		}
-+	}
-+
-+	GXEndDraw();
-+}
-+
-+/*
-+#define ADVANCE_PARTIAL(address, step) \
-+	bitshift += displayProperties.cBPP;             \
-+	if(bitshift >= 8)                  \
-+	{                                  \
-+		bitshift = 0;                  \
-+		bitmask = (1<<displayProperties.cBPP)-1;    \
-+		address += step;               \
-+	}                                  \
-+	else                               \
-+		bitmask <<= displayProperties.cBPP;
-+
-+#define ADVANCE_REV_PARTIAL(address, step)        \
-+	bitshift -= gxdp.cBPP;                        \
-+	if(bitshift < 0)                              \
-+	{                                             \
-+		bitshift = 8-displayProperties.cBPP;                   \
-+		bitmask = ((1<<displayProperties.cBPP)-1)<<bitshift;   \
-+		address += step;                          \
-+	}                                             \
-+	else                                          \
-+		bitmask >>= displayProperties.cBPP;
-+
-+
-+static void GAPI_UpdateRectsMono(_THIS, int numrects, SDL_Rect *rects)
-+{
-+	int i;
-+	unsigned char *screenBuffer;
-+
-+	screenBuffer = GXBeginDraw();
-+
-+	for (i=0; i<numrects; i++) {
-+		unsigned char *destPointer = screenBuffer + startOffset + (rects[i].x * dstPixelstep) + (rects[i].y * dstLinestep);
-+		unsigned char *srcPointer = (unsigned char*)gapiBuffer + (rects[i].x * srcPixelstep) + (rects[i].y * srcLinestep);
-+		unsigned char bitmask;
-+		int bitshift;
-+
-+		int height = rects[i].h;
-+		while (height) {
-+			updateLine(_THIS, srcPointer, destPointer, rects[i].w);
-+			destPointer += dstLinestep;
-+			srcPointer += srcLinestep;
-+			height--;
-+		}
-+	}
-+
-+	GXEndDraw();
-+}
-+*/
-+
-+/* -------------------------------------------------------------------------------- */
-+// Global fixme for paletted mode !
-+
-+#define COLORCONV565(r,g,b) (((r&0xf8)<<(11-3))|((g&0xfc)<<(5-2))|((b&0xf8)>>3))
-+
-+#define COLORCONV555(r,g,b) (((r&0xf8)<<(10-3))|((g&0xf8)<<(5-2))|((b&0xf8)>>3))
-+
-+int GAPI_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
-+{
-+	int i;
-+	/* Convert colors to appropriate 565 or 555 mapping */
-+	for (i=0; i<ncolors; i++) 
-+		convertPalette[firstcolor + i] = (videoMode == GAPI_DIRECT_565 ? 
-+			COLORCONV565(colors[i].r, colors[i].g, colors[i].b) :
-+			COLORCONV555(colors[i].r, colors[i].g, colors[i].b));
-+	return(1);
-+}
-+
-+static void GAPI_RealizePalette(_THIS)
-+{
-+	OutputDebugString(TEXT("GAPI_RealizePalette NOT IMPLEMENTED !\r\n"));
-+}
-+
-+static void GAPI_PaletteChanged(_THIS, HWND window)
-+{
-+	OutputDebugString(TEXT("GAPI_PaletteChanged NOT IMPLEMENTED !\r\n"));
-+}
-+
-+/* Exported for the windows message loop only */
-+static void GAPI_WinPAINT(_THIS, HDC hdc)
-+{
-+	OutputDebugString(TEXT("GAPI_WinPAINT NOT IMPLEMENTED !\r\n"));
-+}
-+
-+
-+/* Note:  If we are terminated, this could be called in the middle of
-+   another SDL video routine -- notably UpdateRects.
-+*/
-+void GAPI_VideoQuit(_THIS)
-+{
-+	/* Destroy the window and everything associated with it */
-+	if ( SDL_Window ) {
-+		/* Delete the screen bitmap (also frees screen->pixels) */
-+		if ( this->screen ) {
-+//#ifdef WIN32_PLATFORM_PSPC
-+			if ( this->screen->flags & SDL_FULLSCREEN ) {
-+				/* Unhide taskbar, etc. */
-+				//SHFullScreen(SDL_Window, SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON | SHFS_SHOWSTARTICON);
-+				//ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOWNORMAL);
-+				DIB_ShowTaskBar(TRUE);
-+				GAPI_GrabHardwareKeys(FALSE);
-+			}
-+//#endif
-+
-+			if (this->screen->pixels != NULL)
-+			{
-+				free(this->screen->pixels);
-+				this->screen->pixels = NULL;
-+			}
-+
-+			if (GXCloseDisplay)
-+				GXCloseDisplay();
-+		}
-+	}
-+}
-+
-+void GAPI_GrabHardwareKeys(BOOL grab) {
-+	HINSTANCE GAPI_handle;
-+	tGXVoidFunction GAPIActionInput;
-+
-+	GAPI_handle = LoadLibrary(TEXT("gx.dll"));
-+	if (!GAPI_handle)
-+		return;
-+	GAPIActionInput = (tGXVoidFunction)GetProcAddress(GAPI_handle, (grab ? TEXT("?GXOpenInput@@YAHXZ") : TEXT("?GXCloseInput@@YAHXZ")));
-+	if (GAPIActionInput) {
-+		GAPIActionInput();
-+	}
-+	FreeLibrary(GAPI_handle);
-+}
-diff -ruN SDL-1.2.7-orig/src/video/wingapi/SDL_gapivideo.h SDL-1.2.7/src/video/wingapi/SDL_gapivideo.h
---- SDL-1.2.7-orig/src/video/wingapi/SDL_gapivideo.h	Wed Dec 31 19:00:00 1969
-+++ SDL-1.2.7/src/video/wingapi/SDL_gapivideo.h	Sun May 30 17:57:48 2004
-@@ -0,0 +1,192 @@
-+/*
-+    SDL - Simple DirectMedia Layer
-+    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
-+
-+    This library is free software; you can redistribute it and/or
-+    modify it under the terms of the GNU Library General Public
-+    License as published by the Free Software Foundation; either
-+    version 2 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
-+    Library General Public License for more details.
-+
-+    You should have received a copy of the GNU Library General Public
-+    License along with this library; if not, write to the Free
-+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+
-+    Sam Lantinga
-+    slouken@libsdl.org
-+*/
-+
-+#ifdef SAVE_RCSID
-+static char rcsid =
-+ "@(#) $Id: SDL_gapivideo.h,v 1.1 2004/02/02 23:25:35 lemure Exp $";
-+#endif
-+
-+#ifndef _SDL_gapivideo_h
-+#define _SDL_gapivideo_h
-+
-+#include <windows.h>
-+
-+/* -------------------------------------------------------------------------------------------- */
-+
-+/* From gx.h, since it's not really C compliant */
-+
-+struct GXDisplayProperties {
-+    DWORD cxWidth;
-+    DWORD cyHeight;         // notice lack of 'th' in the word height.
-+    long cbxPitch;          // number of bytes to move right one x pixel - can be negative.
-+    long cbyPitch;          // number of bytes to move down one y pixel - can be negative.
-+    long cBPP;              // # of bits in each pixel
-+    DWORD ffFormat;         // format flags.
-+};
-+
-+struct GXKeyList {
-+    short vkUp;             // key for up
-+    POINT ptUp;             // x,y position of key/button.  Not on screen but in screen coordinates.
-+    short vkDown;
-+    POINT ptDown;
-+    short vkLeft;
-+    POINT ptLeft;
-+    short vkRight;
-+    POINT ptRight;
-+    short vkA;
-+    POINT ptA;
-+    short vkB;
-+    POINT ptB;
-+    short vkC;
-+    POINT ptC;
-+    short vkStart;
-+    POINT ptStart;
-+};
-+
-+#define kfLandscape	0x8			// Screen is rotated 270 degrees
-+#define kfPalette	0x10		// Pixel values are indexes into a palette
-+#define kfDirect	0x20		// Pixel values contain actual level information
-+#define kfDirect555	0x40		// 5 bits each for red, green and blue values in a pixel.
-+#define kfDirect565	0x80		// 5 red bits, 6 green bits and 5 blue bits per pixel
-+#define kfDirect888	0x100		// 8 bits each for red, green and blue values in a pixel.
-+#define kfDirect444	0x200		// 4 red, 4 green, 4 blue
-+#define kfDirectInverted 0x400
-+
-+#define GX_FULLSCREEN	0x01		// for OpenDisplay()
-+
-+/* -------------------------------------------------------------------------------------------- */
-+
-+/* Rotation direction */
-+typedef enum {
-+	SDL_ROTATE_NONE,
-+	SDL_ROTATE_LEFT,
-+	SDL_ROTATE_RIGHT
-+} SDL_RotateAttr;
-+
-+/* GAPI video mode */
-+typedef enum {
-+	GAPI_NONE = 0,
-+	GAPI_DIRECT_565,
-+	GAPI_DIRECT_555,
-+	GAPI_MONO,
-+	GAPI_PALETTE
-+} SDL_GAPIVideoMode;
-+
-+
-+/* Hidden "this" pointer for the video functions */
-+#define _THIS	SDL_VideoDevice *this
-+
-+/* GAPI functions definitions */
-+
-+typedef struct GXDisplayProperties (*tGXDisplayProperties)(void);
-+typedef int (*tGXOpenDisplay)(HWND, unsigned long);
-+typedef void* (*tGXBeginDraw)(void);
-+typedef int (*tGXVoidFunction)(void);
-+
-+/* Private display data */
-+
-+struct GAPI_funcs {
-+	tGXDisplayProperties dynamicGXGetDisplayProperties;
-+	tGXOpenDisplay	dynamicGXOpenDisplay;
-+	tGXVoidFunction	dynamicGXCloseDisplay;
-+	tGXBeginDraw	dynamicGXBeginDraw;
-+	tGXVoidFunction	dynamicGXEndDraw;
-+	tGXVoidFunction	dynamicGXSuspend;
-+	tGXVoidFunction	dynamicGXResume;
-+};
-+
-+struct GAPI_properties {
-+	unsigned char invert;
-+	int colorscale;
-+	int dstPixelstep;
-+	int dstLinestep;
-+	int startOffset;
-+	SDL_GAPIVideoMode videoMode;
-+};
-+
-+#define MAX_CLR         0x100
-+
-+struct palette_properties {
-+	unsigned char *palRed;
-+	unsigned char *palGreen;
-+	unsigned char *palBlue;
-+	unsigned short *pal;
-+};
-+
-+
-+struct SDL_PrivateVideoData {
-+	/* --- <Hack> --- begin with DIB private structure to allow DIB events code sharing */
-+	HBITMAP screen_bmp;
-+    HPALETTE screen_pal;
-+	void *work_pixels; /* if the display needs to be rotated, memory allocated by the API */
-+	void *rotation_pixels; /* if the display needs to be rotated, memory allocated by the code */
-+	SDL_RotateAttr rotation;
-+	char ozoneHack; /* force stylus translation if running without Hi Res flag */
-+
-+#define NUM_MODELISTS	4		/* 8, 16, 24, and 32 bits-per-pixel */
-+    int SDL_nummodes[NUM_MODELISTS];
-+    SDL_Rect **SDL_modelist[NUM_MODELISTS];
-+
-+	/* --- </Hack> --- */
-+
-+    int w, h;
-+    void *gapiBuffer;
-+	HPALETTE screenPal;
-+	struct GAPI_funcs gapiFuncs;
-+	struct GAPI_properties gapiProperties;
-+	struct GXDisplayProperties displayProps;
-+	int srcLinestep;
-+	int srcPixelstep;
-+
-+	int padWidth;
-+	int padHeight;
-+
-+	unsigned short *convertPalette;
-+};
-+
-+#define gapiBuffer (this->hidden->gapiBuffer)
-+#define mainSurfaceWidth (this->hidden->w)
-+#define mainSurfaceHeight (this->hidden->h)
-+#define rotation (this->hidden->rotation)
-+#define ozoneHack (this->hidden->ozoneHack)
-+#define displayProperties (this->hidden->displayProps)
-+#define screenPal (this->hidden->screenPal)
-+#define GXGetDisplayProperties (this->hidden->gapiFuncs.dynamicGXGetDisplayProperties)
-+#define GXOpenDisplay (this->hidden->gapiFuncs.dynamicGXOpenDisplay)
-+#define GXCloseDisplay (this->hidden->gapiFuncs.dynamicGXCloseDisplay)
-+#define GXBeginDraw (this->hidden->gapiFuncs.dynamicGXBeginDraw)
-+#define GXEndDraw (this->hidden->gapiFuncs.dynamicGXEndDraw)
-+#define GXSuspend (this->hidden->gapiFuncs.dynamicGXSuspend)
-+#define GXResume (this->hidden->gapiFuncs.dynamicGXResume)
-+#define invert (this->hidden->gapiProperties.invert)
-+#define colorscale (this->hidden->gapiProperties.colorscale)
-+#define videoMode (this->hidden->gapiProperties.videoMode)
-+#define srcPixelstep (this->hidden->srcPixelstep)
-+#define srcLinestep (this->hidden->srcLinestep)
-+#define dstPixelstep (this->hidden->gapiProperties.dstPixelstep)
-+#define dstLinestep (this->hidden->gapiProperties.dstLinestep)
-+#define startOffset (this->hidden->gapiProperties.startOffset)
-+#define padWidth (this->hidden->padWidth)
-+#define padHeight (this->hidden->padHeight)
-+#define convertPalette (this->hidden->convertPalette)
-+
-+#endif /* _SDL_gapivideo_h */
diff --git a/tools/SDL1.2.7_CE/VisualCEv2.zip b/tools/SDL1.2.7_CE/VisualCEv2.zip
deleted file mode 100644
index 816382e3b9ed7cb863f90be6334aa4b57535c6bd..0000000000000000000000000000000000000000
Binary files a/tools/SDL1.2.7_CE/VisualCEv2.zip and /dev/null differ