diff options
Diffstat (limited to 'distrib/sdl-1.2.12/src/video/gapi/SDL_gapivideo.c')
-rw-r--r-- | distrib/sdl-1.2.12/src/video/gapi/SDL_gapivideo.c | 1232 |
1 files changed, 0 insertions, 1232 deletions
diff --git a/distrib/sdl-1.2.12/src/video/gapi/SDL_gapivideo.c b/distrib/sdl-1.2.12/src/video/gapi/SDL_gapivideo.c deleted file mode 100644 index 0dfce50..0000000 --- a/distrib/sdl-1.2.12/src/video/gapi/SDL_gapivideo.c +++ /dev/null @@ -1,1232 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 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" - -/* Pocket PC GAPI SDL video driver implementation; -Implemented by Dmitry Yakimov - support@activekitten.com -Inspired by http://arisme.free.fr/ports/SDL.php -*/ - -// TODO: copy surface on window when lost focus -// TODO: test buttons rotation -// TODO: test on be300 and HPC ( check WinDib fullscreen keys catching ) -// TODO: test on smartphones -// TODO: windib on SH3 PPC2000 landscape test -// TODO: optimize 8bpp landscape mode - -// there is some problems in runnings apps from a device landscape mode -// due to WinCE bugs. Some works and some - does not. -// TODO: finish Axim Dell X30 and user landscape mode, device landscape mode -// TODO: finish Axim Dell X30 user portrait, device landscape stylus conversion -// TODO: fix running GAPI apps from landscape mode - -// wince goes to portrait mode, but does not update video memory - - -#include "SDL.h" -#include "SDL_error.h" -#include "SDL_video.h" -#include "SDL_mouse.h" -#include "../SDL_sysvideo.h" -#include "../SDL_pixels_c.h" -#include "../../events/SDL_events_c.h" -#include "../wincommon/SDL_syswm_c.h" -#include "../wincommon/SDL_sysmouse_c.h" -#include "../windib/SDL_dibevents_c.h" - -#include "SDL_gapivideo.h" - -#define GAPIVID_DRIVER_NAME "gapi" - -#if defined(DEBUG) || defined (_DEBUG) || defined(NDEBUG) -#define REPORT_VIDEO_INFO 1 -#else -#define REPORT_VIDEO_INFO 0 -#endif - -// for testing with GapiEmu -#define USE_GAPI_EMU 0 -#define EMULATE_AXIM_X30 0 -#define WITHOUT_GAPI 0 - -#if USE_GAPI_EMU && !REPORT_VIDEO_INFO -#pragma message("Warning: Using GapiEmu in release build. I assume you'd like to set USE_GAPI_EMU to zero.") -#endif - -// defined and used in SDL_sysevents.c -extern HINSTANCE aygshell; -extern void SDL_UnregisterApp(); -extern int DIB_AddMode(_THIS, int bpp, int w, int h); - -/* 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); - -/* etc. */ -static void GAPI_UpdateRects(_THIS, int numrects, SDL_Rect *rects); - -static HMODULE g_hGapiLib = 0; -#define LINK(type,name,import) \ - if( g_hGapiLib ) \ - name = (PFN##type)GetProcAddress( g_hGapiLib, _T(import) ); - -static char g_bRawBufferAvailable = 0; - -/* GAPI driver bootstrap functions */ - -/* hi res definitions */ -typedef struct _RawFrameBufferInfo -{ - WORD wFormat; - WORD wBPP; - VOID *pFramePointer; - int cxStride; - int cyStride; - int cxPixels; - int cyPixels; -} RawFrameBufferInfo; - -static struct _RawFrameBufferInfo g_RawFrameBufferInfo = {0}; - -#define GETRAWFRAMEBUFFER 0x00020001 - -#define FORMAT_565 1 -#define FORMAT_555 2 -#define FORMAT_OTHER 3 - -/* Dell Axim x30 hangs when we use GAPI from landscape, - so lets avoid using GxOpenDisplay there via GETGXINFO trick - It seems that GAPI subsystem use the same ExtEscape code. -*/ -#define GETGXINFO 0x00020000 - -typedef struct GXDeviceInfo -{ -long Version; //00 (should filled with 100 before calling ExtEscape) -void * pvFrameBuffer; //04 -unsigned long cbStride; //08 -unsigned long cxWidth; //0c -unsigned long cyHeight; //10 -unsigned long cBPP; //14 -unsigned long ffFormat; //18 -char Unused[0x84-7*4]; -} GXDeviceInfo; - -static int GAPI_Available(void) -{ - // try to use VGA display, even on emulator - HDC hdc = GetDC(NULL); - int result = ExtEscape(hdc, GETRAWFRAMEBUFFER, 0, NULL, sizeof(RawFrameBufferInfo), (char *)&g_RawFrameBufferInfo); - ReleaseDC(NULL, hdc); - g_bRawBufferAvailable = result > 0; - -#if WITHOUT_GAPI - return g_bRawBufferAvailable; -#endif - -#if USE_GAPI_EMU - g_hGapiLib = LoadLibrary(_T("GAPI_Emu.dll")); - if( !g_hGapiLib ) - { - SDL_SetError("Gapi Emu not found!"); - } - return g_hGapiLib != 0; -#endif - - // try to find gx.dll - g_hGapiLib = LoadLibrary(_T("\\Windows\\gx.dll")); - if( !g_hGapiLib ) - { - g_hGapiLib = LoadLibrary(_T("gx.dll")); - if( !g_hGapiLib ) return g_bRawBufferAvailable; - } - - return(1); -} - -static int cmpmodes(const void *va, const void *vb) -{ - SDL_Rect *a = *(SDL_Rect **)va; - SDL_Rect *b = *(SDL_Rect **)vb; - if ( a->w == b->w ) - return b->h - a->h; - else - return b->w - a->w; -} - -static int GAPI_AddMode(_THIS, int bpp, int w, int h) -{ - SDL_Rect *mode; - int i, index; - int next_mode; - - /* Check to see if we already have this mode */ - if ( bpp < 8 ) { /* Not supported */ - return(0); - } - index = ((bpp+7)/8)-1; - for ( i=0; i<gapi->SDL_nummodes[index]; ++i ) { - mode = gapi->SDL_modelist[index][i]; - if ( (mode->w == w) && (mode->h == h) ) { - return(0); - } - } - - /* Set up the new video mode rectangle */ - mode = (SDL_Rect *)SDL_malloc(sizeof *mode); - if ( mode == NULL ) { - SDL_OutOfMemory(); - return(-1); - } - mode->x = 0; - mode->y = 0; - mode->w = w; - mode->h = h; - - /* Allocate the new list of modes, and fill in the new mode */ - next_mode = gapi->SDL_nummodes[index]; - gapi->SDL_modelist[index] = (SDL_Rect **) - SDL_realloc(gapi->SDL_modelist[index], (1+next_mode+1)*sizeof(SDL_Rect *)); - if ( gapi->SDL_modelist[index] == NULL ) { - SDL_OutOfMemory(); - gapi->SDL_nummodes[index] = 0; - SDL_free(mode); - return(-1); - } - gapi->SDL_modelist[index][next_mode] = mode; - gapi->SDL_modelist[index][next_mode+1] = NULL; - gapi->SDL_nummodes[index]++; - - return(0); -} - -static void GAPI_DeleteDevice(SDL_VideoDevice *device) -{ - if( g_hGapiLib ) - { - FreeLibrary(g_hGapiLib); - g_hGapiLib = 0; - } - SDL_free(device->hidden); - SDL_free(device); -} - -static SDL_VideoDevice *GAPI_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - - if( !g_hGapiLib && !g_bRawBufferAvailable) - { - if( !GAPI_Available() ) - { - SDL_SetError("GAPI dll is not found and VGA mode is not available!"); - return 0; - } - } - - /* Initialize all variables that we clean on shutdown */ - device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice)); - if ( device ) { - SDL_memset(device, 0, (sizeof *device)); - device->hidden = (struct SDL_PrivateVideoData *) - SDL_malloc((sizeof *device->hidden)); - } - if ( (device == NULL) || (device->hidden == NULL) ) { - SDL_OutOfMemory(); - if ( device ) { - SDL_free(device); - } - return(0); - } - SDL_memset(device->hidden, 0, (sizeof *device->hidden)); - - /* Set the function pointers */ - device->VideoInit = GAPI_VideoInit; - device->ListModes = GAPI_ListModes; - device->SetVideoMode = GAPI_SetVideoMode; - device->UpdateMouse = WIN_UpdateMouse; - device->CreateYUVOverlay = NULL; - device->SetColors = GAPI_SetColors; - device->UpdateRects = GAPI_UpdateRects; - 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; - - /* 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; - - /* Load gapi library */ -#define gx device->hidden->gxFunc - - LINK( GXOpenDisplay, gx.GXOpenDisplay, "?GXOpenDisplay@@YAHPAUHWND__@@K@Z" ) - LINK( GXCloseDisplay, gx.GXCloseDisplay, "?GXCloseDisplay@@YAHXZ" ) - LINK( GXBeginDraw, gx.GXBeginDraw, "?GXBeginDraw@@YAPAXXZ" ) - LINK( GXEndDraw, gx.GXEndDraw, "?GXEndDraw@@YAHXZ" ) - LINK( GXOpenInput, gx.GXOpenInput, "?GXOpenInput@@YAHXZ" ) - LINK( GXCloseInput, gx.GXCloseInput, "?GXCloseInput@@YAHXZ" ) - LINK( GXGetDisplayProperties, gx.GXGetDisplayProperties,"?GXGetDisplayProperties@@YA?AUGXDisplayProperties@@XZ" ) - LINK( GXGetDefaultKeys, gx.GXGetDefaultKeys, "?GXGetDefaultKeys@@YA?AUGXKeyList@@H@Z" ) - LINK( GXSuspend, gx.GXSuspend, "?GXSuspend@@YAHXZ" ) - LINK( GXResume, gx.GXResume, "?GXResume@@YAHXZ" ) - LINK( GXSetViewport, gx.GXSetViewport, "?GXSetViewport@@YAHKKKK@Z" ) - LINK( GXIsDisplayDRAMBuffer, gx.GXIsDisplayDRAMBuffer, "?GXIsDisplayDRAMBuffer@@YAHXZ" ) - - /* wrong gapi.dll */ - if( !gx.GXOpenDisplay ) - { - if( g_hGapiLib ) - { - FreeLibrary(g_hGapiLib); - g_hGapiLib = 0; - } - } - - if( !gx.GXOpenDisplay && !g_bRawBufferAvailable) - { - SDL_SetError("Error: damaged or unknown gapi.dll!\n"); - GAPI_DeleteDevice(device); - return 0; - } - - return device; -} - -VideoBootStrap GAPI_bootstrap = { - GAPIVID_DRIVER_NAME, "WinCE GAPI video driver", - GAPI_Available, GAPI_CreateDevice -}; - -static void FillStructs(_THIS, BOOL useVga) -{ -#ifdef _ARM_ - WCHAR oemstr[100]; -#endif - /* fill a device properties */ - - 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; - -#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)) - { - this->hidden->videoMem = (PIXEL*)0xac0755a0; - this->hidden->gxProperties.cbxPitch = -640; - this->hidden->gxProperties.cbyPitch = 2; - this->hidden->needUpdate = 0; - } -#if (EMULATE_AXIM_X30 == 0) - // buggy Dell Axim X30 - if( _tcsncmp(oemstr, L"Dell Axim X30", 13) == 0 ) -#endif - { - GXDeviceInfo gxInfo = {0}; - HDC hdc = GetDC(NULL); - int result; - - gxInfo.Version = 100; - 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; - } - } -#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; - - switch( g_RawFrameBufferInfo.wFormat ) - { - case FORMAT_565: - this->hidden->gxProperties.ffFormat = kfDirect565; - break; - case FORMAT_555: - this->hidden->gxProperties.ffFormat = kfDirect555; - break; - default: - /* unknown pixel format, try define by BPP! */ - switch( g_RawFrameBufferInfo.wBPP ) - { - case 4: - case 8: - this->hidden->gxProperties.ffFormat = kfDirect; - case 16: - this->hidden->gxProperties.ffFormat = kfDirect565; - default: - this->hidden->gxProperties.ffFormat = kfDirect; - break; - } - } - } - - if( this->hidden->gxProperties.cBPP != 16 ) - { - this->hidden->gapiOrientation = SDL_ORIENTATION_UP; - } else - if( (this->hidden->gxProperties.cbxPitch > 0) && (this->hidden->gxProperties.cbyPitch > 0 )) - { - this->hidden->gapiOrientation = SDL_ORIENTATION_UP; - } else - if( (this->hidden->gxProperties.cbxPitch > 0) && (this->hidden->gxProperties.cbyPitch < 0 )) - { - this->hidden->gapiOrientation = SDL_ORIENTATION_RIGHT; // ipaq 3660 - } else - if( (this->hidden->gxProperties.cbxPitch < 0) && (this->hidden->gxProperties.cbyPitch > 0 )) - { - this->hidden->gapiOrientation = SDL_ORIENTATION_LEFT; // ipaq 3800 - } -} - -static void GAPI_CreatePalette(int ncolors, SDL_Color *colors) -{ - // Setup a custom color palette - BYTE buffer[ sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY) ]; - int i; - LOGPALETTE* pLogical = (LOGPALETTE*)buffer; - PALETTEENTRY* entries = pLogical->palPalEntry; - HPALETTE hPalette; - HDC hdc; - - for (i = 0; i < ncolors; ++i) - { - // Find intensity by replicating the bit patterns over a byte - entries[i].peRed = colors[i].r; - entries[i].peGreen = colors[i].g; - entries[i].peBlue = colors[i].b; - entries[i].peFlags = 0; - } - - // Create the GDI palette object - pLogical->palVersion = 0x0300; - pLogical->palNumEntries = ncolors; - - hPalette = CreatePalette( pLogical ); - ASSERT(hPalette); - - - // Realize the palette - hdc = GetDC(0); - - SelectPalette( hdc, hPalette, FALSE ); - RealizePalette( hdc ); - - ReleaseDC( 0, hdc ); - DeleteObject( hPalette ); -} - -int GAPI_VideoInit(_THIS, SDL_PixelFormat *vformat) -{ - int i,bpp; - - /* Create the window */ - if ( DIB_CreateWindow(this) < 0 ) { - return(-1); - } - - if( g_hGapiLib ) - { - FillStructs(this, 0); - - // SDL does not supports 2/4bpp mode, so use 16 bpp - bpp = gapi->gxProperties.cBPP < 8 ? 16 : gapi->gxProperties.cBPP; - - /* set up normal and landscape mode */ - GAPI_AddMode(this, bpp, gapi->gxProperties.cyHeight, gapi->gxProperties.cxWidth); - GAPI_AddMode(this, bpp, gapi->gxProperties.cxWidth, gapi->gxProperties.cyHeight); - } - - /* add hi-res mode */ - if( g_bRawBufferAvailable && - !((gapi->gxProperties.cxWidth == (unsigned)g_RawFrameBufferInfo.cxPixels) && (gapi->gxProperties.cyHeight == (unsigned)g_RawFrameBufferInfo.cyPixels))) - { - FillStructs(this, 1); - - // SDL does not supports 2/4bpp mode, so use 16 bpp - bpp = gapi->gxProperties.cBPP < 8 ? 16 : gapi->gxProperties.cBPP; - - /* set up normal and landscape mode */ - GAPI_AddMode(this, bpp, gapi->gxProperties.cyHeight, gapi->gxProperties.cxWidth); - 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; - - /* Sort the mode lists */ - for ( i=0; i<NUM_MODELISTS; ++i ) { - if ( gapi->SDL_nummodes[i] > 0 ) { - SDL_qsort(gapi->SDL_modelist[i], gapi->SDL_nummodes[i], sizeof *gapi->SDL_modelist[i], cmpmodes); - } - } - - vformat->BitsPerPixel = this->hidden->gxProperties.cBPP < 8 ? 16 : (unsigned char)this->hidden->gxProperties.cBPP; - - // Get color mask - if (this->hidden->gxProperties.ffFormat & kfDirect565) { - vformat->BitsPerPixel = 16; - vformat->Rmask = 0x0000f800; - vformat->Gmask = 0x000007e0; - vformat->Bmask = 0x0000001f; - this->hidden->videoMode = GAPI_DIRECT_565; - } - else - if (this->hidden->gxProperties.ffFormat & kfDirect555) { - vformat->BitsPerPixel = 16; - vformat->Rmask = 0x00007c00; - vformat->Gmask = 0x000003e0; - vformat->Bmask = 0x0000001f; - this->hidden->videoMode = GAPI_DIRECT_555; - } - else - if ((this->hidden->gxProperties.ffFormat & kfDirect) && (this->hidden->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; - } - else - if (this->hidden->gxProperties.ffFormat & kfPalette) { - this->hidden->videoMode = GAPI_PALETTE; - } - - /* We're done! */ - return(0); -} - -SDL_Rect **GAPI_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) -{ - return(this->hidden->SDL_modelist[((format->BitsPerPixel+7)/8)-1]); -// 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; - DWORD style; - SDL_Rect allScreen; - - if( bpp < 4 ) - { - SDL_SetError("1 bpp and 2 bpp modes is not implemented yet!"); - return 0; - } - - /* 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 (this->hidden->gxProperties.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); - } - } - - gapi->userOrientation = SDL_ORIENTATION_UP; - video->flags = SDL_FULLSCREEN; /* Clear flags, GAPI supports fullscreen only */ - - /* GAPI or VGA? */ - if( g_hGapiLib ) - { - FillStructs(this, 0); - if( (((unsigned)width != gapi->gxProperties.cxWidth) || ((unsigned)height != gapi->gxProperties.cyHeight)) - && (((unsigned)width != gapi->gxProperties.cyHeight) || ((unsigned)height != gapi->gxProperties.cxWidth))) - FillStructs(this, 1); // gapi is found but we use VGA resolution - } else - FillStructs(this, 1); - - if ( !this->hidden->needUpdate && !this->hidden->videoMem) { - SDL_SetError("Couldn't get address of video memory, may be unsupported device or bug"); - return(NULL); - } - - /* detect user landscape mode */ - if( (width > height) && (GetSystemMetrics(SM_CXSCREEN) < GetSystemMetrics(SM_CYSCREEN))) - gapi->userOrientation = SDL_ORIENTATION_RIGHT; - - /* shall we apply hires fix? for example when we do not use hires resource */ - gapi->hiresFix = 0; - if( gapi->userOrientation == SDL_ORIENTATION_RIGHT ) - { - if( (width > GetSystemMetrics(SM_CYSCREEN)) || (height > GetSystemMetrics(SM_CXSCREEN))) - gapi->hiresFix = 1; - } else - if( (width > GetSystemMetrics(SM_CXSCREEN)) || (height > GetSystemMetrics(SM_CYSCREEN))) - if( !((width == GetSystemMetrics(SM_CYSCREEN)) && (height == GetSystemMetrics(SM_CXSCREEN)))) // user portrait, device landscape - gapi->hiresFix = 1; - - switch( gapi->userOrientation ) - { - case SDL_ORIENTATION_UP: - gapi->startOffset = 0; - gapi->dstLineStep = gapi->gxProperties.cbyPitch; - gapi->dstPixelStep = gapi->gxProperties.cbxPitch; - break; - case SDL_ORIENTATION_RIGHT: - switch( gapi->gapiOrientation ) - { - case SDL_ORIENTATION_UP: - case SDL_ORIENTATION_RIGHT: - case SDL_ORIENTATION_LEFT: - if( (this->hidden->videoMode == GAPI_MONO) ) - gapi->startOffset = -gapi->gxProperties.cbxPitch + 1; // monochrome mode - else - gapi->startOffset = gapi->gxProperties.cbyPitch * (gapi->gxProperties.cyHeight - 1); - - gapi->dstLineStep = gapi->gxProperties.cbxPitch; - gapi->dstPixelStep = -gapi->gxProperties.cbyPitch; - break; - } - } - - video->w = this->hidden->w = width; - video->h = this->hidden->h = height; - video->pitch = SDL_CalculatePitch(video); - - /* Small fix for WinCE/Win32 - when activating window - SDL_VideoSurface is equal to zero, so activating code - is not called properly for fullscreen windows because - macros WINDIB_FULLSCREEN uses SDL_VideoSurface - */ - SDL_VideoSurface = video; - - /* GAPI is always fullscreen, title bar is useless */ - style = 0; - - if (!SDL_windowid) - SetWindowLong(SDL_Window, GWL_STYLE, style); - - /* Allocate bitmap */ - if(gapiBuffer) - { - SDL_free(gapiBuffer); - gapiBuffer = NULL; - } - gapiBuffer = SDL_malloc(video->h * video->pitch); - video->pixels = gapiBuffer; - - if ( ! this->hidden->buffer ) { - SDL_SetError("Couldn't allocate buffer for requested mode"); - return(NULL); - } - - SDL_memset(gapiBuffer, 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); - - /* JC 14 Mar 2006 - Flush the message loop or this can cause big problems later - Especially if the user decides to use dialog boxes or assert()! - */ - WIN_FlushMessageQueue(); - - /* Open GAPI display */ - if( !gapi->useVga && this->hidden->useGXOpenDisplay ) - if( !gapi->gxFunc.GXOpenDisplay(SDL_Window, GX_FULLSCREEN) ) - { - SDL_SetError("Couldn't initialize GAPI"); - return(NULL); - } - -#if REPORT_VIDEO_INFO - printf("Video properties:\n"); - printf("display bpp: %d\n", gapi->gxProperties.cBPP); - printf("display width: %d\n", gapi->gxProperties.cxWidth); - printf("display height: %d\n", gapi->gxProperties.cyHeight); - printf("x pitch: %d\n", gapi->gxProperties.cbxPitch); - printf("y pitch: %d\n", gapi->gxProperties.cbyPitch); - printf("gapi flags: 0x%x\n", gapi->gxProperties.ffFormat); - - if( !gapi->useVga && this->hidden->useGXOpenDisplay && gapi->needUpdate) - { - gapi->videoMem = gapi->gxFunc.GXBeginDraw(); - gapi->gxFunc.GXEndDraw(); - } - - printf("video memory: 0x%x\n", gapi->videoMem); - printf("need update: %d\n", gapi->needUpdate); - printf("hi-res fix: %d\n", gapi->hiresFix); - printf("VGA is available on the device: %d\n", g_bRawBufferAvailable); - printf("use raw framebuffer: %d\n", gapi->useVga); - 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); -#endif - - - /* Blank screen */ - allScreen.x = allScreen.y = 0; - allScreen.w = video->w - 1; - allScreen.h = video->h - 1; - GAPI_UpdateRects(this, 1, &allScreen); - - /* 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 int updateLine8to8(_THIS, unsigned char *srcPointer, unsigned char *destPointer, int width, int height, int lines) -{ - if( gapi->dstPixelStep == 1) /* optimized blitting on most devices */ - { - SDL_memcpy(destPointer, srcPointer, width); - return 1; - } else - { - // TODO: read 4 pixels, write DWORD - int step = gapi->dstPixelStep; - while(width--) - { - *destPointer = *srcPointer++; - destPointer += step; - } - } - return 1; -} - -/* Video memory is very slow so lets optimize as much as possible */ -static int updateLine16to16(_THIS, PIXEL *srcPointer, PIXEL *destPointer, int width, int height, int lines) -{ - PIXEL *line1, *line2; - int step = gapi->dstPixelStep / 2; - - if( step == 1 ) /* optimized blitting on most devices */ - { - SDL_memcpy(destPointer, srcPointer, width * sizeof(PIXEL)); - return 1; - } - else - { - if( (gapi->gapiOrientation != SDL_ORIENTATION_UP) && - (gapi->userOrientation == SDL_ORIENTATION_UP )) // iPaq 3660/3800 and user orientation up - { - // to prevent data misalignment copy only one line - if( ((((unsigned)destPointer & 3) != 0) && (gapi->gapiOrientation == SDL_ORIENTATION_LEFT)) - || ((((unsigned)destPointer & 3) == 0) && (gapi->gapiOrientation != SDL_ORIENTATION_LEFT)) - || (lines == 1) ) - { - while(width--) - { - *destPointer = *srcPointer++; - destPointer += step; - } - return 1; - } - - /* read two lines at the same time, write DWORD */ - line1 = srcPointer; - line2 = srcPointer + SDL_VideoSurface->pitch / 2; - - if( gapi->gapiOrientation == SDL_ORIENTATION_LEFT ) - while(width--) // iPaq 3800 - { - *(DWORD*)destPointer =(*line2++ << 16) | *line1++; - destPointer += step; - } - else - { - destPointer += gapi->gxProperties.cbyPitch / 2; - - while(width--) // iPaq 3660 - { - *(DWORD*)destPointer =(*line1++ << 16) | *line2++; - destPointer += step; - } - } - return 2; - } else - { - // iPaq 3800 and user orientation landscape - if( gapi->gapiOrientation == SDL_ORIENTATION_LEFT ) - { - int w1; - - // to prevent data misalignment copy only one pixel - if( (((unsigned)destPointer & 3) == 0) && (width > 0)) - { - *destPointer-- = *srcPointer++; - width--; - } - - destPointer--; - - w1 = width / 2; - - while(w1--) - { - DWORD p = *(DWORD*)srcPointer; - *((DWORD*)destPointer) = (p << 16) | (p >> 16); - destPointer -= 2; - srcPointer += 2; - } - - if( width & 1 ) // copy the last pixel - { - destPointer++; - *destPointer = *srcPointer; - } - - return 1; - } - - // modern iPaqs and user orientation landscape - // read two pixels, write DWORD - - line1 = srcPointer; - line2 = srcPointer + SDL_VideoSurface->pitch / 2; - - if( (((unsigned)destPointer & 3) != 0) || (lines == 1) ) - { - while(width--) - { - *destPointer = *srcPointer++; - destPointer += step; - } - return 1; - } - - while(width--) - { - *(DWORD*)destPointer =(*line2++ << 16) | *line1++; - destPointer -= gapi->gxProperties.cbyPitch / 2; - } - return 2; - } - } -} - -// Color component masks for 565 -#define REDMASK (31<<11) -#define GREENMASK (63<<5) -#define BLUEMASK (31) - - -static int updateLine16to4(_THIS, PIXEL *srcPointer, unsigned char *destPointer, int width, int height, int lines, int yNibble, int xNibble) -{ - PIXEL *line1, *line2; - int step = gapi->dstPixelStep; - - if( gapi->userOrientation == SDL_ORIENTATION_UP ) - { - if( yNibble ) // copy bottom half of a line - { - while(width--) - { - PIXEL c1 = *srcPointer++; - c1 = ((c1 & REDMASK) >> 11) + ((c1 & GREENMASK) >> 5) + (c1 & BLUEMASK); - *destPointer = (*destPointer & 0x0F) | ((~(c1 >> 3) << 4)); - destPointer += step; - } - return 1; - } - - // either 1 pixel picture or tail, anyway this is the last line - if( lines == 1 ) - { - while(width--) - { - PIXEL c1 = *srcPointer++; - c1 = ((c1 & REDMASK) >> 11) + ((c1 & GREENMASK) >> 5) + (c1 & BLUEMASK); - *destPointer = (*destPointer & 0xF0) | ((~(c1 >> 3) & 0xF)); - destPointer += step; - } - return 1; - } - - line1 = srcPointer; - line2 = srcPointer + SDL_VideoSurface->pitch / 2; - - while(width--) - { - PIXEL c1 = *line1++; - PIXEL c2 = *line2++; - c1 = ((c1 & REDMASK) >> 11) + ((c1 & GREENMASK) >> 5) + (c1 & BLUEMASK); - c2 = ((c2 & REDMASK) >> 11) + ((c2 & GREENMASK) >> 5) + (c2 & BLUEMASK); - *destPointer = ~((c1 >> 3) + ((c2 >> 3) << 4)); - destPointer += step; - } - return 2; - } else - { - int w1; - w1 = width / 2; - - if( xNibble ) - { - // copy one pixel - PIXEL c1 = *srcPointer++; - c1 = ((c1 & REDMASK) >> 11) + ((c1 & GREENMASK) >> 5) + (c1 & BLUEMASK); - *destPointer = (*destPointer & 0xF0) | ((~(c1 >> 3) & 0xF)); - destPointer++; - } - - while(w1--) - { - PIXEL c1 = *srcPointer; - PIXEL c2 = *(srcPointer + 1); - c1 = ((c1 & REDMASK) >> 11) + ((c1 & GREENMASK) >> 5) + (c1 & BLUEMASK); - c2 = ((c2 & REDMASK) >> 11) + ((c2 & GREENMASK) >> 5) + (c2 & BLUEMASK); - *destPointer++ = ~((c2 >> 3) + ((c1 >> 3) << 4)); - srcPointer += 2; - } - - // copy tail - if( (width & 1) && !xNibble ) - { - PIXEL c1 = *srcPointer; - c1 = ((c1 & REDMASK) >> 11) + ((c1 & GREENMASK) >> 5) + (c1 & BLUEMASK); - *destPointer = (*destPointer & 0x0F) | ((~(c1 >> 3) << 4)); - } - - return 1; - } -} - -static void GAPI_UpdateRectsMono(_THIS, int numrects, SDL_Rect *rects) -{ - int i, height; - int linesProcessed; - int xNibble, yNibble; - - for (i=0; i<numrects; i++) - { - unsigned char *destPointer; - unsigned char *srcPointer; - - if( gapi->userOrientation == SDL_ORIENTATION_UP ) - destPointer = (unsigned char*) gapi->videoMem + gapi->startOffset - rects[i].y * gapi->gxProperties.cBPP / 8 + rects[i].x * gapi->dstPixelStep; - else - destPointer = (unsigned char*) gapi->videoMem + gapi->startOffset + rects[i].x * gapi->gxProperties.cBPP / 8 + rects[i].y * gapi->dstLineStep; - - srcPointer = ((unsigned char*) SDL_VideoSurface->pixels) + rects[i].y * SDL_VideoSurface->pitch + rects[i].x * 2; - yNibble = rects[i].y & 1; // TODO: only for 4 bpp - xNibble = rects[i].x & 1; - height = rects[i].h; - while (height > 0) - { - switch(gapi->gxProperties.cBPP) - { - case 2: // TODO - case 4: - linesProcessed = updateLine16to4(this, (PIXEL*) srcPointer, destPointer, rects[i].w, rects[i].h, height, yNibble, xNibble); - yNibble = 0; - } - height -= linesProcessed; - if( gapi->userOrientation == SDL_ORIENTATION_UP ) - destPointer--; // always fill 1 byte - else destPointer += gapi->dstLineStep; - srcPointer += SDL_VideoSurface->pitch * linesProcessed; // pitch in bytes - } - } -} - -static void GAPI_UpdateRectsColor(_THIS, int numrects, SDL_Rect *rects) -{ - int i, height; - int bytesPerPixel = (gapi->gxProperties.cBPP + 1) / 8; - int linesProcessed; - for (i=0; i<numrects; i++) { - unsigned char *destPointer = (unsigned char*) gapi->videoMem + gapi->startOffset + rects[i].y * gapi->dstLineStep + rects[i].x * gapi->dstPixelStep; - unsigned char *srcPointer = ((unsigned char*) SDL_VideoSurface->pixels) + rects[i].y * SDL_VideoSurface->pitch + rects[i].x * bytesPerPixel; - height = rects[i].h; - -// fprintf(stderr, "Starting rect %dx%d, dst=0x%x, w = %d, h = %d\n", rects[i].w, rects[i].h,destPointer,rects[i].w,rects[i].h); -// fflush(stderr); - linesProcessed = height; - - while (height > 0) { - switch(bytesPerPixel) - { - case 1: - linesProcessed = updateLine8to8(this, srcPointer, (unsigned char *) destPointer, rects[i].w, rects[i].h, height); - break; - case 2: -#pragma warning(disable: 4133) - linesProcessed = updateLine16to16(this, (PIXEL*) srcPointer, destPointer, rects[i].w, rects[i].h, height); - break; - } - height -= linesProcessed; - destPointer += gapi->dstLineStep * linesProcessed; - srcPointer += SDL_VideoSurface->pitch * linesProcessed; // pitch in bytes - } -// fprintf(stderr, "End of rect\n"); -// fflush(stderr); - } -} - - -static void GAPI_UpdateRects(_THIS, int numrects, SDL_Rect *rects) -{ - // we do not want to corrupt video memory - if( gapi->suspended ) return; - - if( gapi->needUpdate ) - gapi->videoMem = gapi->gxFunc.GXBeginDraw(); - - if( gapi->gxProperties.cBPP < 8 ) - GAPI_UpdateRectsMono(this, numrects, rects); - else - GAPI_UpdateRectsColor(this, numrects, rects); - - if( gapi->needUpdate ) - gapi->gxFunc.GXEndDraw(); -} - -/* Note: If we are terminated, this could be called in the middle of - another SDL video routine -- notably UpdateRects. -*/ -void GAPI_VideoQuit(_THIS) -{ - int i, j; - /* 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 (this->screen->pixels != NULL) - { - SDL_free(this->screen->pixels); - this->screen->pixels = NULL; - } - if ( screen_icn ) { - DestroyIcon(screen_icn); - screen_icn = NULL; - } - - DIB_DestroyWindow(this); - SDL_UnregisterApp(); - - SDL_Window = NULL; -#if defined(_WIN32_WCE) - -// Unload wince aygshell library to prevent leak - if( aygshell ) - { - FreeLibrary(aygshell); - aygshell = NULL; - } -#endif - - /* Free video mode lists */ - for ( i=0; i<NUM_MODELISTS; ++i ) { - if ( gapi->SDL_modelist[i] != NULL ) { - for ( j=0; gapi->SDL_modelist[i][j]; ++j ) - SDL_free(gapi->SDL_modelist[i][j]); - SDL_free(gapi->SDL_modelist[i]); - gapi->SDL_modelist[i] = NULL; - } - } - - } - -} - -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")); -} - -static void GAPI_WinPAINT(_THIS, HDC hdc) -{ - // draw current offscreen buffer on hdc - - int bpp = 16; // we always use either 8 or 16 bpp internally - HGDIOBJ prevObject; - unsigned short *bitmapData; - HBITMAP hb; - HDC srcDC; - - // Create a DIB - BYTE buffer[sizeof(BITMAPINFOHEADER) + 3 * sizeof(RGBQUAD)] = {0}; - BITMAPINFO* pBMI = (BITMAPINFO*)buffer; - BITMAPINFOHEADER* pHeader = &pBMI->bmiHeader; - DWORD* pColors = (DWORD*)&pBMI->bmiColors; - - // CreateDIBSection does not support 332 pixel format on wce - if( gapi->gxProperties.cBPP == 8 ) return; - - // DIB Header - pHeader->biSize = sizeof(BITMAPINFOHEADER); - pHeader->biWidth = this->hidden->w; - pHeader->biHeight = -this->hidden->h; - pHeader->biPlanes = 1; - pHeader->biBitCount = bpp; - pHeader->biCompression = BI_RGB; - pHeader->biSizeImage = (this->hidden->w * this->hidden->h * bpp) / 8; - - // Color masks - if( bpp == 16 ) - { - pColors[0] = REDMASK; - pColors[1] = GREENMASK; - pColors[2] = BLUEMASK; - pHeader->biCompression = BI_BITFIELDS; - } - // Create the DIB - hb = CreateDIBSection( 0, pBMI, DIB_RGB_COLORS, (void**)&bitmapData, 0, 0 ); - - // copy data - // FIXME: prevent misalignment, but I've never seen non aligned width of screen - memcpy(bitmapData, this->hidden->buffer, pHeader->biSizeImage); - srcDC = CreateCompatibleDC(hdc); - prevObject = SelectObject(srcDC, hb); - - BitBlt(hdc, 0, 0, this->hidden->w, this->hidden->h, srcDC, 0, 0, SRCCOPY); - - SelectObject(srcDC, prevObject); - DeleteObject(hb); - DeleteDC(srcDC); -} - -int GAPI_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) -{ - GAPI_CreatePalette(ncolors, colors); - return 1; -} |