diff options
Diffstat (limited to '3rdparty/SDL/src/video/svga')
-rw-r--r-- | 3rdparty/SDL/src/video/svga/SDL_svgaevents.c | 412 | ||||
-rw-r--r-- | 3rdparty/SDL/src/video/svga/SDL_svgaevents_c.h | 35 | ||||
-rw-r--r-- | 3rdparty/SDL/src/video/svga/SDL_svgamouse.c | 33 | ||||
-rw-r--r-- | 3rdparty/SDL/src/video/svga/SDL_svgamouse_c.h | 26 | ||||
-rw-r--r-- | 3rdparty/SDL/src/video/svga/SDL_svgavideo.c | 584 | ||||
-rw-r--r-- | 3rdparty/SDL/src/video/svga/SDL_svgavideo.h | 58 |
6 files changed, 1148 insertions, 0 deletions
diff --git a/3rdparty/SDL/src/video/svga/SDL_svgaevents.c b/3rdparty/SDL/src/video/svga/SDL_svgaevents.c new file mode 100644 index 0000000..107a702 --- /dev/null +++ b/3rdparty/SDL/src/video/svga/SDL_svgaevents.c @@ -0,0 +1,412 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 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" + +/* Handle the event stream, converting X11 events into SDL events */ + +#include <vga.h> +#include <vgamouse.h> +#include <vgakeyboard.h> +#if defined(__LINUX__) +#include <linux/kd.h> +#include <linux/keyboard.h> +#elif defined(__FREEBSD__) +#include <sys/kbio.h> +#else +#error You must choose your operating system here +#endif + +#include "../../events/SDL_sysevents.h" +#include "../../events/SDL_events_c.h" +#include "SDL_svgavideo.h" +#include "SDL_svgaevents_c.h" + +/* The translation tables from a console scancode to a SDL keysym */ +#if defined(linux) +#define NUM_VGAKEYMAPS (1<<KG_CAPSSHIFT) +static Uint16 vga_keymap[NUM_VGAKEYMAPS][NR_KEYS]; +#elif defined(__FREEBSD__) +/* FIXME: Free the keymap when we shut down the video mode */ +static keymap_t *vga_keymap = NULL; +#else +#error You must choose your operating system here +#endif +static SDLKey keymap[128]; +static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym); + +/* Ugh, we have to duplicate the kernel's keysym mapping code... + Oh, it's not so bad. :-) + + FIXME: Add keyboard LED handling code + */ +#if defined(linux) +int SVGA_initkeymaps(int fd) +{ + struct kbentry entry; + int map, i; + + /* Load all the keysym mappings */ + for ( map=0; map<NUM_VGAKEYMAPS; ++map ) { + SDL_memset(vga_keymap[map], 0, NR_KEYS*sizeof(Uint16)); + for ( i=0; i<NR_KEYS; ++i ) { + entry.kb_table = map; + entry.kb_index = i; + if ( ioctl(fd, KDGKBENT, &entry) == 0 ) { + /* The "Enter" key is a special case */ + if ( entry.kb_value == K_ENTER ) { + entry.kb_value = K(KT_ASCII,13); + } + /* Handle numpad specially as well */ + if ( KTYP(entry.kb_value) == KT_PAD ) { + switch ( entry.kb_value ) { + case K_P0: + case K_P1: + case K_P2: + case K_P3: + case K_P4: + case K_P5: + case K_P6: + case K_P7: + case K_P8: + case K_P9: + vga_keymap[map][i]=entry.kb_value; + vga_keymap[map][i]+= '0'; + break; + case K_PPLUS: + vga_keymap[map][i]=K(KT_ASCII,'+'); + break; + case K_PMINUS: + vga_keymap[map][i]=K(KT_ASCII,'-'); + break; + case K_PSTAR: + vga_keymap[map][i]=K(KT_ASCII,'*'); + break; + case K_PSLASH: + vga_keymap[map][i]=K(KT_ASCII,'/'); + break; + case K_PENTER: + vga_keymap[map][i]=K(KT_ASCII,'\r'); + break; + case K_PCOMMA: + vga_keymap[map][i]=K(KT_ASCII,','); + break; + case K_PDOT: + vga_keymap[map][i]=K(KT_ASCII,'.'); + break; + default: + break; + } + } + /* Do the normal key translation */ + if ( (KTYP(entry.kb_value) == KT_LATIN) || + (KTYP(entry.kb_value) == KT_ASCII) || + (KTYP(entry.kb_value) == KT_LETTER) ) { + vga_keymap[map][i] = entry.kb_value; + } + } + } + } + return(0); +} +#elif defined(__FREEBSD__) +int SVGA_initkeymaps(int fd) +{ + vga_keymap = SDL_malloc(sizeof(keymap_t)); + if ( ! vga_keymap ) { + SDL_OutOfMemory(); + return(-1); + } + if (ioctl(fd, GIO_KEYMAP, vga_keymap) == -1) { + SDL_free(vga_keymap); + vga_keymap = NULL; + SDL_SetError("Unable to get keyboard map"); + return(-1); + } + return(0); +} +#else +#error You must choose your operating system here +#endif + +int posted = 0; + +void SVGA_mousecallback(int button, int dx, int dy, + int u1,int u2,int u3, int u4) +{ + if ( dx || dy ) { + posted += SDL_PrivateMouseMotion(0, 1, dx, dy); + } + if ( button & MOUSE_LEFTBUTTON ) { + if ( !(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(1)) ) { + posted += SDL_PrivateMouseButton(SDL_PRESSED, 1, 0, 0); + } + } else { + if ( (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(1)) ) { + posted += SDL_PrivateMouseButton(SDL_RELEASED, 1, 0, 0); + } + } + if ( button & MOUSE_MIDDLEBUTTON ) { + if ( !(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(2)) ) { + posted += SDL_PrivateMouseButton(SDL_PRESSED, 2, 0, 0); + } + } else { + if ( (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(2)) ) { + posted += SDL_PrivateMouseButton(SDL_RELEASED, 2, 0, 0); + } + } + if ( button & MOUSE_RIGHTBUTTON ) { + if ( !(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(3)) ) { + posted += SDL_PrivateMouseButton(SDL_PRESSED, 3, 0, 0); + } + } else { + if ( (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(3)) ) { + posted += SDL_PrivateMouseButton(SDL_RELEASED, 3, 0, 0); + } + } +} + +void SVGA_keyboardcallback(int scancode, int pressed) +{ + SDL_keysym keysym; + + if ( pressed ) { + posted += SDL_PrivateKeyboard(SDL_PRESSED, + TranslateKey(scancode, &keysym)); + } else { + posted += SDL_PrivateKeyboard(SDL_RELEASED, + TranslateKey(scancode, &keysym)); + } +} + +void SVGA_PumpEvents(_THIS) +{ + do { + posted = 0; + mouse_update(); + keyboard_update(); + } while ( posted ); +} + +void SVGA_InitOSKeymap(_THIS) +{ + int i; + + /* Initialize the BeOS key translation table */ + for ( i=0; i<SDL_arraysize(keymap); ++i ) + keymap[i] = SDLK_UNKNOWN; + + keymap[SCANCODE_ESCAPE] = SDLK_ESCAPE; + keymap[SCANCODE_1] = SDLK_1; + keymap[SCANCODE_2] = SDLK_2; + keymap[SCANCODE_3] = SDLK_3; + keymap[SCANCODE_4] = SDLK_4; + keymap[SCANCODE_5] = SDLK_5; + keymap[SCANCODE_6] = SDLK_6; + keymap[SCANCODE_7] = SDLK_7; + keymap[SCANCODE_8] = SDLK_8; + keymap[SCANCODE_9] = SDLK_9; + keymap[SCANCODE_0] = SDLK_0; + keymap[SCANCODE_MINUS] = SDLK_MINUS; + keymap[SCANCODE_EQUAL] = SDLK_EQUALS; + keymap[SCANCODE_BACKSPACE] = SDLK_BACKSPACE; + keymap[SCANCODE_TAB] = SDLK_TAB; + keymap[SCANCODE_Q] = SDLK_q; + keymap[SCANCODE_W] = SDLK_w; + keymap[SCANCODE_E] = SDLK_e; + keymap[SCANCODE_R] = SDLK_r; + keymap[SCANCODE_T] = SDLK_t; + keymap[SCANCODE_Y] = SDLK_y; + keymap[SCANCODE_U] = SDLK_u; + keymap[SCANCODE_I] = SDLK_i; + keymap[SCANCODE_O] = SDLK_o; + keymap[SCANCODE_P] = SDLK_p; + keymap[SCANCODE_BRACKET_LEFT] = SDLK_LEFTBRACKET; + keymap[SCANCODE_BRACKET_RIGHT] = SDLK_RIGHTBRACKET; + keymap[SCANCODE_ENTER] = SDLK_RETURN; + keymap[SCANCODE_LEFTCONTROL] = SDLK_LCTRL; + keymap[SCANCODE_A] = SDLK_a; + keymap[SCANCODE_S] = SDLK_s; + keymap[SCANCODE_D] = SDLK_d; + keymap[SCANCODE_F] = SDLK_f; + keymap[SCANCODE_G] = SDLK_g; + keymap[SCANCODE_H] = SDLK_h; + keymap[SCANCODE_J] = SDLK_j; + keymap[SCANCODE_K] = SDLK_k; + keymap[SCANCODE_L] = SDLK_l; + keymap[SCANCODE_SEMICOLON] = SDLK_SEMICOLON; + keymap[SCANCODE_APOSTROPHE] = SDLK_QUOTE; + keymap[SCANCODE_GRAVE] = SDLK_BACKQUOTE; + keymap[SCANCODE_LEFTSHIFT] = SDLK_LSHIFT; + keymap[SCANCODE_BACKSLASH] = SDLK_BACKSLASH; + keymap[SCANCODE_Z] = SDLK_z; + keymap[SCANCODE_X] = SDLK_x; + keymap[SCANCODE_C] = SDLK_c; + keymap[SCANCODE_V] = SDLK_v; + keymap[SCANCODE_B] = SDLK_b; + keymap[SCANCODE_N] = SDLK_n; + keymap[SCANCODE_M] = SDLK_m; + keymap[SCANCODE_COMMA] = SDLK_COMMA; + keymap[SCANCODE_PERIOD] = SDLK_PERIOD; + keymap[SCANCODE_SLASH] = SDLK_SLASH; + keymap[SCANCODE_RIGHTSHIFT] = SDLK_RSHIFT; + keymap[SCANCODE_KEYPADMULTIPLY] = SDLK_KP_MULTIPLY; + keymap[SCANCODE_LEFTALT] = SDLK_LALT; + keymap[SCANCODE_SPACE] = SDLK_SPACE; + keymap[SCANCODE_CAPSLOCK] = SDLK_CAPSLOCK; + keymap[SCANCODE_F1] = SDLK_F1; + keymap[SCANCODE_F2] = SDLK_F2; + keymap[SCANCODE_F3] = SDLK_F3; + keymap[SCANCODE_F4] = SDLK_F4; + keymap[SCANCODE_F5] = SDLK_F5; + keymap[SCANCODE_F6] = SDLK_F6; + keymap[SCANCODE_F7] = SDLK_F7; + keymap[SCANCODE_F8] = SDLK_F8; + keymap[SCANCODE_F9] = SDLK_F9; + keymap[SCANCODE_F10] = SDLK_F10; + keymap[SCANCODE_NUMLOCK] = SDLK_NUMLOCK; + keymap[SCANCODE_SCROLLLOCK] = SDLK_SCROLLOCK; + keymap[SCANCODE_KEYPAD7] = SDLK_KP7; + keymap[SCANCODE_CURSORUPLEFT] = SDLK_KP7; + keymap[SCANCODE_KEYPAD8] = SDLK_KP8; + keymap[SCANCODE_CURSORUP] = SDLK_KP8; + keymap[SCANCODE_KEYPAD9] = SDLK_KP9; + keymap[SCANCODE_CURSORUPRIGHT] = SDLK_KP9; + keymap[SCANCODE_KEYPADMINUS] = SDLK_KP_MINUS; + keymap[SCANCODE_KEYPAD4] = SDLK_KP4; + keymap[SCANCODE_CURSORLEFT] = SDLK_KP4; + keymap[SCANCODE_KEYPAD5] = SDLK_KP5; + keymap[SCANCODE_KEYPAD6] = SDLK_KP6; + keymap[SCANCODE_CURSORRIGHT] = SDLK_KP6; + keymap[SCANCODE_KEYPADPLUS] = SDLK_KP_PLUS; + keymap[SCANCODE_KEYPAD1] = SDLK_KP1; + keymap[SCANCODE_CURSORDOWNLEFT] = SDLK_KP1; + keymap[SCANCODE_KEYPAD2] = SDLK_KP2; + keymap[SCANCODE_CURSORDOWN] = SDLK_KP2; + keymap[SCANCODE_KEYPAD3] = SDLK_KP3; + keymap[SCANCODE_CURSORDOWNRIGHT] = SDLK_KP3; + keymap[SCANCODE_KEYPAD0] = SDLK_KP0; + keymap[SCANCODE_KEYPADPERIOD] = SDLK_KP_PERIOD; + keymap[SCANCODE_LESS] = SDLK_LESS; + keymap[SCANCODE_F11] = SDLK_F11; + keymap[SCANCODE_F12] = SDLK_F12; + keymap[SCANCODE_KEYPADENTER] = SDLK_KP_ENTER; + keymap[SCANCODE_RIGHTCONTROL] = SDLK_RCTRL; + keymap[SCANCODE_CONTROL] = SDLK_RCTRL; + keymap[SCANCODE_KEYPADDIVIDE] = SDLK_KP_DIVIDE; + keymap[SCANCODE_PRINTSCREEN] = SDLK_PRINT; + keymap[SCANCODE_RIGHTALT] = SDLK_RALT; + keymap[SCANCODE_BREAK] = SDLK_BREAK; + keymap[SCANCODE_BREAK_ALTERNATIVE] = SDLK_UNKNOWN; + keymap[SCANCODE_HOME] = SDLK_HOME; + keymap[SCANCODE_CURSORBLOCKUP] = SDLK_UP; + keymap[SCANCODE_PAGEUP] = SDLK_PAGEUP; + keymap[SCANCODE_CURSORBLOCKLEFT] = SDLK_LEFT; + keymap[SCANCODE_CURSORBLOCKRIGHT] = SDLK_RIGHT; + keymap[SCANCODE_END] = SDLK_END; + keymap[SCANCODE_CURSORBLOCKDOWN] = SDLK_DOWN; + keymap[SCANCODE_PAGEDOWN] = SDLK_PAGEDOWN; + keymap[SCANCODE_INSERT] = SDLK_INSERT; + keymap[SCANCODE_REMOVE] = SDLK_DELETE; + keymap[119] = SDLK_PAUSE; + keymap[SCANCODE_RIGHTWIN] = SDLK_RSUPER; + keymap[SCANCODE_LEFTWIN] = SDLK_LSUPER; + keymap[127] = SDLK_MENU; +} + +#if defined(linux) +static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym) +{ + /* Set the keysym information */ + keysym->scancode = scancode; + keysym->sym = keymap[scancode]; + keysym->mod = KMOD_NONE; + + /* If UNICODE is on, get the UNICODE value for the key */ + keysym->unicode = 0; + if ( SDL_TranslateUNICODE ) { + int map; + SDLMod modstate; + + modstate = SDL_GetModState(); + map = 0; + if ( modstate & KMOD_SHIFT ) { + map |= (1<<KG_SHIFT); + } + if ( modstate & KMOD_CTRL ) { + map |= (1<<KG_CTRL); + } + if ( modstate & KMOD_ALT ) { + map |= (1<<KG_ALT); + } + if ( modstate & KMOD_MODE ) { + map |= (1<<KG_ALTGR); + } + if ( KTYP(vga_keymap[map][scancode]) == KT_LETTER ) { + if ( modstate & KMOD_CAPS ) { + map ^= (1<<KG_SHIFT); + } + } + if ( KTYP(vga_keymap[map][scancode]) == KT_PAD ) { + if ( modstate & KMOD_NUM ) { + keysym->unicode=KVAL(vga_keymap[map][scancode]); + } + } else { + keysym->unicode = KVAL(vga_keymap[map][scancode]); + } + } + return(keysym); +} +#elif defined(__FREEBSD__) +static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym) +{ + /* Set the keysym information */ + keysym->scancode = scancode; + keysym->sym = keymap[scancode]; + keysym->mod = KMOD_NONE; + + /* If UNICODE is on, get the UNICODE value for the key */ + keysym->unicode = 0; + if ( SDL_TranslateUNICODE && vga_keymap ) { + int map; + SDLMod modstate; + + modstate = SDL_GetModState(); + map = 0; + if ( modstate & KMOD_SHIFT ) { + map += 1; + } + if ( modstate & KMOD_CTRL ) { + map += 2; + } + if ( modstate & KMOD_ALT ) { + map += 4; + } + if ( !(vga_keymap->key[scancode].spcl & (0x80 >> map)) ) { + keysym->unicode = vga_keymap->key[scancode].map[map]; + } + + } + return(keysym); +} +#else +#error You must choose your operating system here +#endif diff --git a/3rdparty/SDL/src/video/svga/SDL_svgaevents_c.h b/3rdparty/SDL/src/video/svga/SDL_svgaevents_c.h new file mode 100644 index 0000000..cd9f888 --- /dev/null +++ b/3rdparty/SDL/src/video/svga/SDL_svgaevents_c.h @@ -0,0 +1,35 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 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" + +#include "SDL_svgavideo.h" + +/* Variables and functions exported by SDL_sysevents.c to other parts + of the native video subsystem (SDL_sysvideo.c) +*/ +extern int SVGA_initkeymaps(int fd); +extern void SVGA_mousecallback(int button, int dx, int dy, + int u1,int u2,int u3, int u4); +extern void SVGA_keyboardcallback(int scancode, int pressed); + +extern void SVGA_InitOSKeymap(_THIS); +extern void SVGA_PumpEvents(_THIS); diff --git a/3rdparty/SDL/src/video/svga/SDL_svgamouse.c b/3rdparty/SDL/src/video/svga/SDL_svgamouse.c new file mode 100644 index 0000000..a82dbfd --- /dev/null +++ b/3rdparty/SDL/src/video/svga/SDL_svgamouse.c @@ -0,0 +1,33 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 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" + +#include "SDL_mouse.h" +#include "../../events/SDL_events_c.h" +#include "SDL_svgavideo.h" +#include "SDL_svgamouse_c.h" + + +/* The implementation dependent data for the window manager cursor */ +struct WMcursor { + int unused; +}; diff --git a/3rdparty/SDL/src/video/svga/SDL_svgamouse_c.h b/3rdparty/SDL/src/video/svga/SDL_svgamouse_c.h new file mode 100644 index 0000000..78fe8ab --- /dev/null +++ b/3rdparty/SDL/src/video/svga/SDL_svgamouse_c.h @@ -0,0 +1,26 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 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" + +#include "SDL_svgavideo.h" + +/* Functions to be exported */ diff --git a/3rdparty/SDL/src/video/svga/SDL_svgavideo.c b/3rdparty/SDL/src/video/svga/SDL_svgavideo.c new file mode 100644 index 0000000..58ea800 --- /dev/null +++ b/3rdparty/SDL/src/video/svga/SDL_svgavideo.c @@ -0,0 +1,584 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 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" + +/* SVGAlib based SDL video driver implementation. +*/ + +#include <unistd.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/ioctl.h> +#include <fcntl.h> + +#if defined(__LINUX__) +#include <linux/vt.h> +#elif defined(__FREEBSD__) +#include <sys/consio.h> +#else +#error You must choose your operating system here +#endif +#include <vga.h> +#include <vgamouse.h> +#include <vgakeyboard.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 "SDL_svgavideo.h" +#include "SDL_svgaevents_c.h" +#include "SDL_svgamouse_c.h" + +/* Initialization/Query functions */ +static int SVGA_VideoInit(_THIS, SDL_PixelFormat *vformat); +static SDL_Rect **SVGA_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags); +static SDL_Surface *SVGA_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags); +static int SVGA_SetColors(_THIS, int firstcolor, int ncolors, + SDL_Color *colors); +static void SVGA_VideoQuit(_THIS); + +/* Hardware surface functions */ +static int SVGA_AllocHWSurface(_THIS, SDL_Surface *surface); +static int SVGA_LockHWSurface(_THIS, SDL_Surface *surface); +static int SVGA_FlipHWSurface(_THIS, SDL_Surface *surface); +static void SVGA_UnlockHWSurface(_THIS, SDL_Surface *surface); +static void SVGA_FreeHWSurface(_THIS, SDL_Surface *surface); + +/* SVGAlib driver bootstrap functions */ + +static int SVGA_Available(void) +{ + /* Check to see if we are root and stdin is a virtual console */ + int console; + + /* SVGALib 1.9.x+ doesn't require root (via /dev/svga) */ + int svgalib2 = -1; + + /* See if we are connected to a virtual terminal */ + console = STDIN_FILENO; +#if 0 /* This is no longer needed, SVGAlib can switch consoles for us */ + if ( console >= 0 ) { + struct stat sb; + struct vt_mode dummy; + + if ( (fstat(console, &sb) < 0) || + (ioctl(console, VT_GETMODE, &dummy) < 0) ) { + console = -1; + } + } +#endif /* 0 */ + + /* See if SVGAlib 2.0 is available */ + svgalib2 = open("/dev/svga", O_RDONLY); + if (svgalib2 != -1) { + close(svgalib2); + } + + return(((svgalib2 != -1) || (geteuid() == 0)) && (console >= 0)); +} + +static void SVGA_DeleteDevice(SDL_VideoDevice *device) +{ + SDL_free(device->hidden); + SDL_free(device); +} + +static SDL_VideoDevice *SVGA_CreateDevice(int devindex) +{ + SDL_VideoDevice *device; + + /* 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 = SVGA_VideoInit; + device->ListModes = SVGA_ListModes; + device->SetVideoMode = SVGA_SetVideoMode; + device->SetColors = SVGA_SetColors; + device->UpdateRects = NULL; + device->VideoQuit = SVGA_VideoQuit; + device->AllocHWSurface = SVGA_AllocHWSurface; + device->CheckHWBlit = NULL; + device->FillHWRect = NULL; + device->SetHWColorKey = NULL; + device->SetHWAlpha = NULL; + device->LockHWSurface = SVGA_LockHWSurface; + device->UnlockHWSurface = SVGA_UnlockHWSurface; + device->FlipHWSurface = SVGA_FlipHWSurface; + device->FreeHWSurface = SVGA_FreeHWSurface; + device->SetCaption = NULL; + device->SetIcon = NULL; + device->IconifyWindow = NULL; + device->GrabInput = NULL; + device->GetWMInfo = NULL; + device->InitOSKeymap = SVGA_InitOSKeymap; + device->PumpEvents = SVGA_PumpEvents; + + device->free = SVGA_DeleteDevice; + + return device; +} + +VideoBootStrap SVGALIB_bootstrap = { + "svgalib", "SVGAlib", + SVGA_Available, SVGA_CreateDevice +}; + +static int SVGA_AddMode(_THIS, int mode, int actually_add) +{ + int i, j; + vga_modeinfo *modeinfo; + + modeinfo = vga_getmodeinfo(mode); + + i = modeinfo->bytesperpixel-1; + if ( i < 0 ) { + return 0; + } + if ( actually_add ) { + SDL_Rect saved_rect[2]; + int saved_mode[2]; + int b; + + /* Add the mode, sorted largest to smallest */ + b = 0; + j = 0; + while ( (SDL_modelist[i][j]->w > modeinfo->width) || + (SDL_modelist[i][j]->h > modeinfo->height) ) { + ++j; + } + /* Skip modes that are already in our list */ + if ( (SDL_modelist[i][j]->w == modeinfo->width) && + (SDL_modelist[i][j]->h == modeinfo->height) ) { + return(0); + } + /* Insert the new mode */ + saved_rect[b] = *SDL_modelist[i][j]; + saved_mode[b] = SDL_vgamode[i][j]; + SDL_modelist[i][j]->w = modeinfo->width; + SDL_modelist[i][j]->h = modeinfo->height; + SDL_vgamode[i][j] = mode; + /* Everybody scoot down! */ + if ( saved_rect[b].w && saved_rect[b].h ) { + for ( ++j; SDL_modelist[i][j]->w; ++j ) { + saved_rect[!b] = *SDL_modelist[i][j]; + saved_mode[!b] = SDL_vgamode[i][j]; + *SDL_modelist[i][j] = saved_rect[b]; + SDL_vgamode[i][j] = saved_mode[b]; + b = !b; + } + *SDL_modelist[i][j] = saved_rect[b]; + SDL_vgamode[i][j] = saved_mode[b]; + } + } else { + ++SDL_nummodes[i]; + } + return(1); +} + +static void SVGA_UpdateVideoInfo(_THIS) +{ + vga_modeinfo *modeinfo; + + this->info.wm_available = 0; + this->info.hw_available = (banked ? 0 : 1); + modeinfo = vga_getmodeinfo(vga_getcurrentmode()); + this->info.video_mem = modeinfo->memory; + /* FIXME: Add hardware accelerated blit information */ +#ifdef SVGALIB_DEBUG + printf("Hardware accelerated blit: %savailable\n", modeinfo->haveblit ? "" : "not "); +#endif +} + +int SVGA_VideoInit(_THIS, SDL_PixelFormat *vformat) +{ + int keyboard; + int i, j; + int mode, total_modes; + + /* Initialize all variables that we clean on shutdown */ + for ( i=0; i<NUM_MODELISTS; ++i ) { + SDL_nummodes[i] = 0; + SDL_modelist[i] = NULL; + SDL_vgamode[i] = NULL; + } + + /* Initialize the library */ + vga_disabledriverreport(); + if ( vga_init() < 0 ) { + SDL_SetError("Unable to initialize SVGAlib"); + return(-1); + } + vga_setmode(TEXT); + + /* Enable mouse and keyboard support */ + vga_setmousesupport(1); + keyboard = keyboard_init_return_fd(); + if ( keyboard < 0 ) { + SDL_SetError("Unable to initialize keyboard"); + return(-1); + } + if ( SVGA_initkeymaps(keyboard) < 0 ) { + return(-1); + } + keyboard_seteventhandler(SVGA_keyboardcallback); + + /* Determine the current screen size */ + this->info.current_w = 0; + this->info.current_h = 0; + + /* Determine the screen depth (use default 8-bit depth) */ + vformat->BitsPerPixel = 8; + + /* Enumerate the available fullscreen modes */ + total_modes = 0; + for ( mode=vga_lastmodenumber(); mode; --mode ) { + if ( vga_hasmode(mode) ) { + if ( SVGA_AddMode(this, mode, 0) ) { + ++total_modes; + } + } + } + if ( SVGA_AddMode(this, G320x200x256, 0) ) ++total_modes; + if ( total_modes == 0 ) { + SDL_SetError("No linear video modes available"); + return(-1); + } + for ( i=0; i<NUM_MODELISTS; ++i ) { + SDL_vgamode[i] = (int *)SDL_malloc(SDL_nummodes[i]*sizeof(int)); + if ( SDL_vgamode[i] == NULL ) { + SDL_OutOfMemory(); + return(-1); + } + SDL_modelist[i] = (SDL_Rect **) + SDL_malloc((SDL_nummodes[i]+1)*sizeof(SDL_Rect *)); + if ( SDL_modelist[i] == NULL ) { + SDL_OutOfMemory(); + return(-1); + } + for ( j=0; j<SDL_nummodes[i]; ++j ) { + SDL_modelist[i][j]=(SDL_Rect *)SDL_malloc(sizeof(SDL_Rect)); + if ( SDL_modelist[i][j] == NULL ) { + SDL_OutOfMemory(); + return(-1); + } + SDL_memset(SDL_modelist[i][j], 0, sizeof(SDL_Rect)); + } + SDL_modelist[i][j] = NULL; + } + for ( mode=vga_lastmodenumber(); mode; --mode ) { + if ( vga_hasmode(mode) ) { + SVGA_AddMode(this, mode, 1); + } + } + SVGA_AddMode(this, G320x200x256, 1); + + /* Free extra (duplicated) modes */ + for ( i=0; i<NUM_MODELISTS; ++i ) { + j = 0; + while ( SDL_modelist[i][j] && SDL_modelist[i][j]->w ) { + j++; + } + while ( SDL_modelist[i][j] ) { + SDL_free(SDL_modelist[i][j]); + SDL_modelist[i][j] = NULL; + j++; + } + } + + /* Fill in our hardware acceleration capabilities */ + SVGA_UpdateVideoInfo(this); + + /* We're done! */ + return(0); +} + +SDL_Rect **SVGA_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) +{ + return(SDL_modelist[((format->BitsPerPixel+7)/8)-1]); +} + +/* Various screen update functions available */ +static void SVGA_DirectUpdate(_THIS, int numrects, SDL_Rect *rects); +static void SVGA_BankedUpdate(_THIS, int numrects, SDL_Rect *rects); + +SDL_Surface *SVGA_SetVideoMode(_THIS, SDL_Surface *current, + int width, int height, int bpp, Uint32 flags) +{ + int mode; + int vgamode; + vga_modeinfo *modeinfo; + int screenpage_len; + + /* Free old pixels if we were in banked mode */ + if ( banked && current->pixels ) { + free(current->pixels); + current->pixels = NULL; + } + + /* Try to set the requested linear video mode */ + bpp = (bpp+7)/8-1; + for ( mode=0; SDL_modelist[bpp][mode]; ++mode ) { + if ( (SDL_modelist[bpp][mode]->w == width) && + (SDL_modelist[bpp][mode]->h == height) ) { + break; + } + } + if ( SDL_modelist[bpp][mode] == NULL ) { + SDL_SetError("Couldn't find requested mode in list"); + return(NULL); + } + vgamode = SDL_vgamode[bpp][mode]; + vga_setmode(vgamode); + vga_setpage(0); + + if ( (vga_setlinearaddressing() < 0) && (vgamode != G320x200x256) ) { + banked = 1; + } else { + banked = 0; + } + + modeinfo = vga_getmodeinfo(SDL_vgamode[bpp][mode]); + + /* Update hardware acceleration info */ + SVGA_UpdateVideoInfo(this); + + /* Allocate the new pixel format for the screen */ + bpp = (bpp+1)*8; + if ( (bpp == 16) && (modeinfo->colors == 32768) ) { + bpp = 15; + } + if ( ! SDL_ReallocFormat(current, bpp, 0, 0, 0, 0) ) { + return(NULL); + } + + /* Set up the new mode framebuffer */ + current->flags = SDL_FULLSCREEN; + if ( !banked ) { + current->flags |= SDL_HWSURFACE; + } + if ( bpp == 8 ) { + /* FIXME: What about DirectColor? */ + current->flags |= SDL_HWPALETTE; + } + current->w = width; + current->h = height; + current->pitch = modeinfo->linewidth; + if ( banked ) { + current->pixels = SDL_malloc(current->h * current->pitch); + if ( !current->pixels ) { + SDL_OutOfMemory(); + return(NULL); + } + } else { + current->pixels = vga_getgraphmem(); + } + + /* set double-buffering */ + if ( (flags & SDL_DOUBLEBUF) && !banked ) + { + /* length of one screen page in bytes */ + screenpage_len=current->h*modeinfo->linewidth; + + /* if start address should be aligned */ + if ( modeinfo->linewidth_unit ) + { + if ( screenpage_len % modeinfo->linewidth_unit ) + { + screenpage_len += modeinfo->linewidth_unit - ( screenpage_len % modeinfo->linewidth_unit ); + } + } + + /* if we heve enough videomemory = ak je dost videopamete */ + if ( modeinfo->memory > ( screenpage_len * 2 / 1024 ) ) + { + current->flags |= SDL_DOUBLEBUF; + flip_page = 0; + flip_offset[0] = 0; + flip_offset[1] = screenpage_len; + flip_address[0] = vga_getgraphmem(); + flip_address[1] = flip_address[0]+screenpage_len; + SVGA_FlipHWSurface(this,current); + } + } + + /* Set the blit function */ + if ( banked ) { + this->UpdateRects = SVGA_BankedUpdate; + } else { + this->UpdateRects = SVGA_DirectUpdate; + } + + /* Set up the mouse handler again (buggy SVGAlib 1.40) */ + mouse_seteventhandler(SVGA_mousecallback); + + /* We're done */ + return(current); +} + +/* We don't actually allow hardware surfaces other than the main one */ +static int SVGA_AllocHWSurface(_THIS, SDL_Surface *surface) +{ + return(-1); +} +static void SVGA_FreeHWSurface(_THIS, SDL_Surface *surface) +{ + return; +} + +/* We need to wait for vertical retrace on page flipped displays */ +static int SVGA_LockHWSurface(_THIS, SDL_Surface *surface) +{ + /* The waiting is done in SVGA_FlipHWSurface() */ + return(0); +} +static void SVGA_UnlockHWSurface(_THIS, SDL_Surface *surface) +{ + return; +} + +static int SVGA_FlipHWSurface(_THIS, SDL_Surface *surface) +{ + if ( !banked ) { + vga_setdisplaystart(flip_offset[flip_page]); + flip_page=!flip_page; + surface->pixels=flip_address[flip_page]; + vga_waitretrace(); + } + return(0); +} + +static void SVGA_DirectUpdate(_THIS, int numrects, SDL_Rect *rects) +{ + return; +} + +static void SVGA_BankedUpdate(_THIS, int numrects, SDL_Rect *rects) +{ + int i, j; + SDL_Rect *rect; + int page, vp; + int x, y, w, h; + unsigned char *src; + unsigned char *dst; + int bpp = this->screen->format->BytesPerPixel; + int pitch = this->screen->pitch; + + dst = vga_getgraphmem(); + for ( i=0; i < numrects; ++i ) { + rect = &rects[i]; + x = rect->x; + y = rect->y; + w = rect->w * bpp; + h = rect->h; + + vp = y * pitch + x * bpp; + src = (unsigned char *)this->screen->pixels + vp; + page = vp >> 16; + vp &= 0xffff; + vga_setpage(page); + for (j = 0; j < h; j++) { + if (vp + w > 0x10000) { + if (vp >= 0x10000) { + page++; + vga_setpage(page); + vp &= 0xffff; + } else { + SDL_memcpy(dst + vp, src, 0x10000 - vp); + page++; + vga_setpage(page); + SDL_memcpy(dst, src + 0x10000 - vp, + (vp + w) & 0xffff); + vp = (vp + pitch) & 0xffff; + src += pitch; + continue; + } + } + SDL_memcpy(dst + vp, src, w); + src += pitch; + vp += pitch; + } + } +} + +int SVGA_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) +{ + int i; + + for(i = 0; i < ncolors; i++) { + vga_setpalette(firstcolor + i, + colors[i].r>>2, + colors[i].g>>2, + colors[i].b>>2); + } + return(1); +} + +/* Note: If we are terminated, this could be called in the middle of + another SDL video routine -- notably UpdateRects. +*/ +void SVGA_VideoQuit(_THIS) +{ + int i, j; + + /* Reset the console video mode */ + if ( this->screen && (this->screen->w && this->screen->h) ) { + vga_setmode(TEXT); + } + keyboard_close(); + + /* Free video mode lists */ + for ( i=0; i<NUM_MODELISTS; ++i ) { + if ( SDL_modelist[i] != NULL ) { + for ( j=0; SDL_modelist[i][j]; ++j ) + SDL_free(SDL_modelist[i][j]); + SDL_free(SDL_modelist[i]); + SDL_modelist[i] = NULL; + } + if ( SDL_vgamode[i] != NULL ) { + SDL_free(SDL_vgamode[i]); + SDL_vgamode[i] = NULL; + } + } + if ( this->screen ) { + if ( banked && this->screen->pixels ) { + SDL_free(this->screen->pixels); + } + this->screen->pixels = NULL; + } +} + diff --git a/3rdparty/SDL/src/video/svga/SDL_svgavideo.h b/3rdparty/SDL/src/video/svga/SDL_svgavideo.h new file mode 100644 index 0000000..7fb86cb --- /dev/null +++ b/3rdparty/SDL/src/video/svga/SDL_svgavideo.h @@ -0,0 +1,58 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ +#include "SDL_config.h" + +#ifndef _SDL_svgavideo_h +#define _SDL_svgavideo_h + +#include "SDL_mouse.h" +#include "../SDL_sysvideo.h" + +/* Hidden "this" pointer for the video functions */ +#define _THIS SDL_VideoDevice *this + +/* Private display data */ +struct SDL_PrivateVideoData { +#define NUM_MODELISTS 4 /* 8, 16, 24, and 32 bits-per-pixel */ + int SDL_nummodes[NUM_MODELISTS]; + SDL_Rect **SDL_modelist[NUM_MODELISTS]; + int *SDL_vgamode[NUM_MODELISTS]; + + /* information for double-buffering */ + int flip_page; + int flip_offset[2]; + Uint8 *flip_address[2]; + + /* Set to 1 if we're in banked video mode */ + int banked; +}; +/* Old variable names */ +#define SDL_nummodes (this->hidden->SDL_nummodes) +#define SDL_modelist (this->hidden->SDL_modelist) +#define SDL_vgamode (this->hidden->SDL_vgamode) +#define flip_page (this->hidden->flip_page) +#define flip_offset (this->hidden->flip_offset) +#define flip_address (this->hidden->flip_address) +#define banked (this->hidden->banked) + +#endif /* _SDL_svgavideo_h */ + |