Commit a437e285 authored by Sam Lantinga's avatar Sam Lantinga

*** empty log message ***

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40320
parent 75baede7
......@@ -45,7 +45,7 @@ III. Enjoy! :)
==============================================================================
IV. What is supported:
Keyboard (GEMDOS, BIOS, Ikbd)
Keyboard (GEMDOS, BIOS, GEM, Ikbd)
Mouse (XBIOS, GEM, Ikbd)
Video (XBIOS (Fullscreen), GEM (Windowed and Fullscreen))
Timer (VBL vector)
......@@ -61,7 +61,10 @@ Video Kbd Mouse Timer Jstick Joypads
xbios ikbd ikbd vbl ikbd hardware
xbios gemdos xbios vbl xbios hardware
xbios bios xbios vbl xbios hardware
gem gem gem vbl xbios hardware
gem gem gem(*) vbl xbios hardware
(*) GEM does not report relative mouse motion, so xbios mouse driver is used
to report this type event.
==============================================================================
V. Environment variables:
......@@ -108,6 +111,48 @@ SDL_JOYSTICK_ATARI:
Lightpen and analog paddle are 2 buttons, 2 axis controllers. The 2
buttons are those affected to 1 button joysticks on the same port.
==============================================================================
VI. More informations about drivers:
Xbios video:
Video chip is detected using the _VDO cookie.
Screen enhancers are not supported, but could be if you know how to
use them.
ST, STE, Mega ST, Mega STE:
320x200x4 bits, shades of grey, available only for the purpose
of testing SDL.
TT:
320x480x8 and 320x240x8 (software double-lined mode).
Falcon:
All modes supported by the current monitor (RVB or VGA).
Clones and any machine with monochrome monitor:
Not supported.
Gem video:
Automatically used if xbios not available.
All machines:
Only the current resolution, if 8 bits or higher depth.
IKBD keyboard, mouse and joystick driver:
Available if _MCH cookie is ST, Mega ST, STE, Mega STE, TT or Falcon.
Hades has an IKBD, but xbios is not available for video, so IKBD
driver is disabled.
Gemdos and bios keyboard driver:
Available on all machines.
Mouse and joystick xbios driver:
Available on all machines (I think).
Joypad driver:
Available if _MCH cookie is STE or Falcon.
VBL timer driver:
Available all machines (I think).
--
Patrice Mandin <pmandin@caramail.com>
http://membres.lycos.fr/pmandin/
......@@ -43,7 +43,8 @@ static char rcsid =
#include "SDL_events_c.h"
#include "SDL_gemvideo.h"
#include "SDL_gemevents_c.h"
#include "../ataricommon/SDL_atarikeys.h" /* for keyboard scancodes */
#include "SDL_atarikeys.h" /* for keyboard scancodes */
#include "SDL_xbiosinterrupt_s.h"
/* Defines */
......@@ -55,8 +56,6 @@ static unsigned char gem_currentkeyboard[ATARIBIOS_MAXKEYS];
static unsigned char gem_previouskeyboard[ATARIBIOS_MAXKEYS];
static unsigned char gem_currentascii[ATARIBIOS_MAXKEYS];
static short prevmousex, prevmousey, prevmouseb;
/* The translation tables from a console scancode to a SDL keysym */
static SDLKey keymap[ATARIBIOS_MAXKEYS];
......@@ -65,7 +64,7 @@ static SDLKey keymap[ATARIBIOS_MAXKEYS];
static SDL_keysym *TranslateKey(int scancode, int asciicode, SDL_keysym *keysym);
static int do_messages(_THIS, short *message);
static void do_keyboard(short kc, short ks);
static void do_mouse(_THIS, short mx, short my, short mb);
static void do_mouse(_THIS, short mx, short my, short mb, short ks);
/* Functions */
......@@ -124,22 +123,23 @@ void GEM_InitOSKeymap(_THIS)
keymap[SCANCODE_CAPSLOCK] = SDLK_CAPSLOCK;
/* Mouse init */
prevmousex = prevmousey = prevmouseb = 0;
GEM_mouse_relative = SDL_FALSE;
}
void GEM_PumpEvents(_THIS)
{
short mx, my, mb, dummy;
short mousex, mousey, mouseb, dummy;
short kstate, prevkc, prevks;
int i;
SDL_keysym keysym;
memset(gem_currentkeyboard,0,sizeof(gem_currentkeyboard));
prevkc = prevks = 0;
for (;;)
{
int quit, resultat;
short buffer[8], kc, ks;
short buffer[8], kc;
quit = 0;
......@@ -150,7 +150,7 @@ void GEM_PumpEvents(_THIS)
0,0,0,0,0,
buffer,
10,
&dummy,&dummy,&dummy,&ks,&kc,&dummy
&dummy,&dummy,&dummy,&kstate,&kc,&dummy
);
/* Message event ? */
......@@ -158,10 +158,14 @@ void GEM_PumpEvents(_THIS)
quit = do_messages(this, buffer);
/* Keyboard event ? */
if (resultat & MU_KEYBD)
do_keyboard(kc,ks);
else
do_keyboard(0,0);
if (resultat & MU_KEYBD) {
if ((prevkc != kc) || (prevks != kstate)) {
do_keyboard(kc,kstate);
} else {
/* Avoid looping, if repeating same key */
break;
}
}
/* Timer event ? */
if ((resultat & MU_TIMER) || quit)
......@@ -169,10 +173,10 @@ void GEM_PumpEvents(_THIS)
}
/* Update mouse */
graf_mkstate(&mx, &my, &mb, &dummy);
do_mouse(this, mx, my, mb);
graf_mkstate(&mousex, &mousey, &mouseb, &kstate);
do_mouse(this, mousex, mousey, mouseb, kstate);
/* Now generates keyboard events */
/* Now generate keyboard events */
for (i=0; i<ATARIBIOS_MAXKEYS; i++) {
/* Key pressed ? */
if (gem_currentkeyboard[i] && !gem_previouskeyboard[i])
......@@ -259,7 +263,6 @@ static int do_messages(_THIS, short *message)
static void do_keyboard(short kc, short ks)
{
int scancode, asciicode;
short dummy;
if (kc) {
scancode=(kc>>8) & 127;
......@@ -269,9 +272,6 @@ static void do_keyboard(short kc, short ks)
gem_currentascii[scancode]=asciicode;
}
if (!ks)
graf_mkstate(&dummy, &dummy, &dummy, &ks);
/* Read special keys */
if (ks & K_RSHIFT)
gem_currentkeyboard[SCANCODE_RIGHTSHIFT]=0xFF;
......@@ -283,16 +283,15 @@ static void do_keyboard(short kc, short ks)
gem_currentkeyboard[SCANCODE_LEFTALT]=0xFF;
}
static void do_mouse(_THIS, short mx, short my, short mb)
static void do_mouse(_THIS, short mx, short my, short mb, short ks)
{
static short prevmousex=0, prevmousey=0, prevmouseb=0;
/* Mouse motion ? */
if ((prevmousex!=mx) || (prevmousey!=my)) {
if (GEM_mouse_relative) {
short wind_pxy[8];
wind_get(GEM_handle, WF_WORKXYWH, &wind_pxy[0], &wind_pxy[1], &wind_pxy[2], &wind_pxy[3]);
SDL_PrivateMouseMotion(0, 1, mx-wind_pxy[0], my-wind_pxy[1]);
SDL_PrivateMouseMotion(0, 1, SDL_AtariXbios_mousex, SDL_AtariXbios_mousey);
SDL_AtariXbios_mousex = SDL_AtariXbios_mousey = 0;
} else {
SDL_PrivateMouseMotion(0, 1, mx, my);
}
......@@ -304,19 +303,29 @@ static void do_mouse(_THIS, short mx, short my, short mb)
if (prevmouseb!=mb) {
int i;
for (i=0;i<3;i++) {
for (i=0;i<2;i++) {
int curbutton, prevbutton;
curbutton = mb & (1<<i);
prevbutton = prevmouseb & (1<<i);
if (curbutton & !prevbutton) {
SDL_PrivateMouseButton(SDL_PRESSED, i, 0, 0);
if (curbutton && !prevbutton) {
SDL_PrivateMouseButton(SDL_PRESSED, i+1, 0, 0);
}
if (!curbutton & prevbutton) {
SDL_PrivateMouseButton(SDL_RELEASED, i, 0, 0);
if (!curbutton && prevbutton) {
SDL_PrivateMouseButton(SDL_RELEASED, i+1, 0, 0);
}
}
prevmouseb = mb;
}
/* Read special keys */
if (ks & K_RSHIFT)
gem_currentkeyboard[SCANCODE_RIGHTSHIFT]=0xFF;
if (ks & K_LSHIFT)
gem_currentkeyboard[SCANCODE_LEFTSHIFT]=0xFF;
if (ks & K_CTRL)
gem_currentkeyboard[SCANCODE_LEFTCONTROL]=0xFF;
if (ks & K_ALT)
gem_currentkeyboard[SCANCODE_LEFTALT]=0xFF;
}
......@@ -136,21 +136,26 @@ int GEM_ShowWMCursor(_THIS, WMcursor *cursor)
return 1;
}
#if 0
void GEM_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
{
/* This seems to work only on AES 3.4 (Falcon) */
EVNTREC warpevent;
warpevent.ap_event = APPEVNT_MOUSE;
warpevent.ap_value = (y << 16) | x;
warpevent.ap_value = (x << 16) | y;
appl_tplay(&warpevent, 1, 1000);
}
#endif
void GEM_CheckMouseMode(_THIS)
{
/* If the mouse is hidden and input is grabbed, we use relative mode */
if ( !(SDL_cursorstate & CURSOR_VISIBLE) &&
(this->input_grab != SDL_GRAB_OFF) ) {
(this->input_grab != SDL_GRAB_OFF) &&
(SDL_GetAppState() & SDL_APPACTIVE) ) {
GEM_mouse_relative = SDL_TRUE;
} else {
GEM_mouse_relative = SDL_FALSE;
......
......@@ -32,6 +32,7 @@ extern void GEM_FreeWMCursor(_THIS, WMcursor *cursor);
extern WMcursor *GEM_CreateWMCursor(_THIS,
Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y);
extern int GEM_ShowWMCursor(_THIS, WMcursor *cursor);
#if 0
extern void GEM_WarpWMCursor(_THIS, Uint16 x, Uint16 y);
extern void GEM_CheckMouseModeNoLock(_THIS);
#endif
extern void GEM_CheckMouseMode(_THIS);
......@@ -51,6 +51,7 @@ static char rcsid =
#include "SDL_sysvideo.h"
#include "SDL_pixels_c.h"
#include "SDL_events_c.h"
#include "SDL_cursor_c.h"
#include "SDL_ataric2p_s.h"
#include "SDL_ataric2p060_c.h"
......@@ -95,6 +96,9 @@ static int GEM_ToggleFullScreen(_THIS, int on);
/* Internal functions */
static void GEM_FreeBuffers(_THIS);
static void GEM_ClearScreen(_THIS);
static void GEM_LockScreen(_THIS);
static void GEM_UnlockScreen(_THIS);
static void refresh_window(_THIS, int winhandle, short *rect);
/* GEM driver bootstrap functions */
......@@ -174,11 +178,11 @@ static SDL_VideoDevice *GEM_CreateDevice(int devindex)
device->FreeWMCursor = GEM_FreeWMCursor;
device->CreateWMCursor = GEM_CreateWMCursor;
device->ShowWMCursor = GEM_ShowWMCursor;
device->WarpWMCursor = GEM_WarpWMCursor;
device->WarpWMCursor = NULL /*GEM_WarpWMCursor*/;
device->CheckMouseMode = GEM_CheckMouseMode;
/* Joystick */
SDL_AtariXbios_InstallVectors(ATARI_XBIOS_JOYSTICKEVENTS);
/* Joystick + Mouse relative motion */
SDL_AtariXbios_InstallVectors(ATARI_XBIOS_MOUSEEVENTS|ATARI_XBIOS_JOYSTICKEVENTS);
device->free = GEM_DeleteDevice;
......@@ -314,7 +318,7 @@ static void VDI_ReadExtInfo(_THIS, short *work_out)
tmp_p = (Uint16 *)&work_out[16];
for (i=0;i<256;i++) {
vdi_index[i] = *tmp_p++;
vdi_index[*tmp_p++] = i;
}
}
break;
......@@ -352,11 +356,11 @@ static void VDI_ReadExtInfo(_THIS, short *work_out)
}
}
}
}
/* Remove lower green bits for Intel endian screen */
if ((VDI_greenmask == ((7<<13)|3)) || (VDI_greenmask == ((7<<13)|7))) {
VDI_greenmask &= ~(7<<13);
}
/* Remove lower green bits for Intel endian screen */
if ((VDI_greenmask == ((7<<13)|3)) || (VDI_greenmask == ((7<<13)|7))) {
VDI_greenmask &= ~(7<<13);
}
break;
case VDI_CLUT_NONE:
......@@ -474,7 +478,7 @@ int GEM_VideoInit(_THIS, SDL_PixelFormat *vformat)
VDI_screen = NULL;
VDI_ReadExtInfo(this, work_out);
if (VDI_screen == NULL) {
VDI_pitch = VDI_w * ((VDI_bpp)>>3);
VDI_pitch = VDI_w * VDI_pixelsize;
VDI_format = VDI_FORMAT_UNKNOWN;
VDI_redmask = VDI_greenmask = VDI_bluemask = VDI_alphamask = 0;
}
......@@ -539,6 +543,56 @@ static void GEM_FreeBuffers(_THIS)
}
}
static void GEM_ClearScreen(_THIS)
{
short rgb[3]={0,0,0};
short oldrgb[3];
short pxy[4];
v_hide_c(VDI_handle);
vq_color(VDI_handle, vdi_index[0], 0, oldrgb);
vs_color(VDI_handle, vdi_index[0], rgb);
pxy[0] = pxy[1] = 0;
pxy[2] = VDI_w - 1;
pxy[3] = VDI_h - 1;
vsf_color(VDI_handle,0);
vsf_interior(VDI_handle,1);
vsf_perimeter(VDI_handle,0);
v_bar(VDI_handle,pxy);
vs_color(VDI_handle, vdi_index[0], oldrgb);
v_show_c(VDI_handle, 1);
}
static void GEM_LockScreen(_THIS)
{
if (!GEM_locked) {
/* Reserve memory space, used to be sure of compatibility */
form_dial( FMD_START, 0,0,0,0, 0,0,VDI_w,VDI_h);
/* Lock AES */
wind_update(BEG_UPDATE);
wind_update(BEG_MCTRL);
GEM_locked=SDL_TRUE;
}
}
static void GEM_UnlockScreen(_THIS)
{
if (GEM_locked) {
/* Restore screen memory, and send REDRAW to all apps */
form_dial( FMD_FINISH, 0,0,0,0, 0,0,VDI_w,VDI_h);
/* Unlock AES */
wind_update(END_MCTRL);
wind_update(END_UPDATE);
GEM_locked=SDL_FALSE;
}
}
SDL_Surface *GEM_SetVideoMode(_THIS, SDL_Surface *current,
int width, int height, int bpp, Uint32 flags)
{
......@@ -574,11 +628,22 @@ SDL_Surface *GEM_SetVideoMode(_THIS, SDL_Surface *current,
use_shadow=SDL_FALSE;
if (flags & SDL_FULLSCREEN) {
if (!VDI_screen) {
/* No access to real framebuffer, use shadow surface */
use_shadow=SDL_TRUE;
} else if (VDI_format==VDI_FORMAT_INTER) {
use_shadow=SDL_TRUE;
} else {
if (VDI_format==VDI_FORMAT_INTER) {
/* Real framebuffer, interleaved bitplanes,
use shadow surface */
use_shadow=SDL_TRUE;
} else if (flags & SDL_DOUBLEBUF) {
/* Real framebuffer, double-buffered,
use shadow surface */
use_shadow=SDL_TRUE;
modeflags |= SDL_DOUBLEBUF;
}
}
} else {
/* Windowed mode, always with shadow surface */
use_shadow=SDL_TRUE;
}
......@@ -595,30 +660,12 @@ SDL_Surface *GEM_SetVideoMode(_THIS, SDL_Surface *current,
/*--- Initialize screen ---*/
if (flags & SDL_FULLSCREEN) {
short rgb[3]={0,0,0};
short pxy[4];
if (!GEM_locked) {
/* Reserve memory space, used to be sure of compatibility */
form_dial( FMD_START, 0,0,0,0, 0,0,VDI_w,VDI_h);
/* Lock AES */
while (!wind_update(BEG_UPDATE|BEG_MCTRL));
GEM_locked=SDL_TRUE;
}
GEM_LockScreen(this);
/* Clear screen */
pxy[0] = pxy[1] = 0;
pxy[2] = VDI_w - 1;
pxy[3] = VDI_h - 1;
vs_color(VDI_handle, vdi_index[0], rgb);
vsf_color(VDI_handle,0);
vsf_interior(VDI_handle,1);
vsf_perimeter(VDI_handle,0);
v_bar(VDI_handle,pxy);
GEM_ClearScreen(this);
modeflags |= SDL_FULLSCREEN;
if (VDI_screen && (VDI_format==VDI_FORMAT_PACK)) {
if (VDI_screen && (VDI_format==VDI_FORMAT_PACK) && !use_shadow) {
modeflags |= SDL_HWSURFACE;
} else {
modeflags |= SDL_SWSURFACE;
......@@ -627,13 +674,7 @@ SDL_Surface *GEM_SetVideoMode(_THIS, SDL_Surface *current,
int posx,posy;
short x2,y2,w2,h2;
if (GEM_locked) {
/* Restore screen memory, and send REDRAW to all apps */
form_dial( FMD_FINISH, 0,0,0,0, 0,0,VDI_w,VDI_h);
/* Unlock AES */
wind_update(END_UPDATE|END_MCTRL);
GEM_locked=SDL_FALSE;
}
GEM_UnlockScreen(this);
/* Center our window */
posx = GEM_desk_x;
......@@ -722,6 +763,9 @@ static void GEM_UnlockHWSurface(_THIS, SDL_Surface *surface)
static void GEM_UpdateRectsFullscreen(_THIS, int numrects, SDL_Rect *rects)
{
SDL_Surface *surface;
MFDB mfdb_src;
short blitcoords[8];
int i;
surface = this->screen;
......@@ -734,48 +778,70 @@ static void GEM_UpdateRectsFullscreen(_THIS, int numrects, SDL_Rect *rects)
destscr += VDI_pitch * ((VDI_h - surface->h) >> 1);
destx = (VDI_w - surface->w) >> 1;
destx &= ~15;
destscr += VDI_pixelsize * destx;
destscr += destx;
/* Convert chunky to planar screen */
Atari_C2pConvert(
surface->pixels,
destscr,
surface->w,
surface->h,
SDL_FALSE,
surface->pitch,
VDI_pitch
);
}
} else {
MFDB mfdb_src;
short blitcoords[8];
int i;
for (i=0;i<numrects;i++) {
void *source,*destination;
int x1,x2;
mfdb_src.fd_addr=surface->pixels;
mfdb_src.fd_w=surface->w;
mfdb_src.fd_h=surface->h;
mfdb_src.fd_wdwidth=(surface->w) >> 4;
mfdb_src.fd_stand=0;
mfdb_src.fd_nplanes=surface->format->BitsPerPixel;
mfdb_src.fd_r1=0;
mfdb_src.fd_r2=0;
mfdb_src.fd_r3=0;
x1 = rects[i].x & ~15;
x2 = rects[i].x+rects[i].w;
if (x2 & 15) {
x2 = (x2 | 15) +1;
}
for ( i=0; i<numrects; ++i ) {
blitcoords[0] = rects[i].x;
blitcoords[1] = rects[i].y;
blitcoords[2] = blitcoords[0] + rects[i].w - 1;
blitcoords[3] = blitcoords[1] + rects[i].h - 1;
source = surface->pixels;
source += surface->pitch * rects[i].y;
source += x1;
destination = destscr;
destination += VDI_pitch * rects[i].y;
destination += x1;
/* Convert chunky to planar screen */
Atari_C2pConvert(
source,
destination,
x2-x1,
rects[i].h,
SDL_FALSE,
surface->pitch,
VDI_pitch
);
blitcoords[4] = rects[i].x + ((VDI_w - surface->w) >> 1);
blitcoords[5] = rects[i].y + ((VDI_h - surface->h) >> 1);
blitcoords[6] = blitcoords[4] + rects[i].w - 1;
blitcoords[7] = blitcoords[5] + rects[i].h - 1;
}
return;
}
vro_cpyfm(VDI_handle, S_ONLY, blitcoords, &mfdb_src, &VDI_dst_mfdb);
if (!(surface->flags & SDL_DOUBLEBUF)) {
return;
}
}
mfdb_src.fd_addr=surface->pixels;
mfdb_src.fd_w=surface->w;
mfdb_src.fd_h=surface->h;
mfdb_src.fd_wdwidth=(surface->w) >> 4;
mfdb_src.fd_stand=0;
mfdb_src.fd_nplanes=surface->format->BitsPerPixel;
mfdb_src.fd_r1=0;
mfdb_src.fd_r2=0;
mfdb_src.fd_r3=0;
for ( i=0; i<numrects; ++i ) {
blitcoords[0] = rects[i].x;
blitcoords[1] = rects[i].y;
blitcoords[2] = blitcoords[0] + rects[i].w - 1;
blitcoords[3] = blitcoords[1] + rects[i].h - 1;
blitcoords[4] = rects[i].x + ((VDI_w - surface->w) >> 1);
blitcoords[5] = rects[i].y + ((VDI_h - surface->h) >> 1);
blitcoords[6] = blitcoords[4] + rects[i].w - 1;
blitcoords[7] = blitcoords[5] + rects[i].h - 1;
vro_cpyfm(VDI_handle, S_ONLY, blitcoords, &mfdb_src, &VDI_dst_mfdb);
}
}
static void GEM_UpdateRectsWindowed(_THIS, int numrects, SDL_Rect *rects)
......@@ -810,6 +876,9 @@ static void GEM_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
static int GEM_FlipHWSurfaceFullscreen(_THIS, SDL_Surface *surface)
{
MFDB mfdb_src;
short blitcoords[8];
if (VDI_screen) {
if (VDI_format==VDI_FORMAT_INTER) {
void *destscr;
......@@ -820,7 +889,7 @@ static int GEM_FlipHWSurfaceFullscreen(_THIS, SDL_Surface *surface)
destscr += VDI_pitch * ((VDI_h - surface->h) >> 1);
destx = (VDI_w - surface->w) >> 1;
destx &= ~15;
destscr += VDI_pixelsize * destx;
destscr += destx;
/* Convert chunky to planar screen */
Atari_C2pConvert(
......@@ -832,32 +901,35 @@ static int GEM_FlipHWSurfaceFullscreen(_THIS, SDL_Surface *surface)
surface->pitch,
VDI_pitch
);
}
} else {
MFDB mfdb_src;
short blitcoords[8];
mfdb_src.fd_addr=surface->pixels;
mfdb_src.fd_w=surface->w;
mfdb_src.fd_h=surface->h;
mfdb_src.fd_wdwidth=(surface->w) >> 4;
mfdb_src.fd_stand=0;
mfdb_src.fd_nplanes=surface->format->BitsPerPixel;
mfdb_src.fd_r1=0;
mfdb_src.fd_r2=0;
mfdb_src.fd_r3=0;
blitcoords[0] = 0;
blitcoords[1] = 0;
blitcoords[2] = surface->w - 1;
blitcoords[3] = surface->h - 1;
blitcoords[4] = (VDI_w - surface->w) >> 1;
blitcoords[5] = (VDI_h - surface->h) >> 1;
blitcoords[6] = blitcoords[4] + surface->w - 1;
blitcoords[7] = blitcoords[5] + surface->h - 1;
return(0);
}
vro_cpyfm(VDI_handle, S_ONLY, blitcoords, &mfdb_src, &VDI_dst_mfdb);
if (!(surface->flags & SDL_DOUBLEBUF)) {
return(0);
}
}
mfdb_src.fd_addr=surface->pixels;
mfdb_src.fd_w=surface->w;
mfdb_src.fd_h=surface->h;
mfdb_src.fd_wdwidth=(surface->w) >> 4;
mfdb_src.fd_stand=0;
mfdb_src.fd_nplanes=surface->format->BitsPerPixel;
mfdb_src.fd_r1=0;
mfdb_src.fd_r2=0;
mfdb_src.fd_r3=0;
blitcoords[0] = 0;
blitcoords[1] = 0;
blitcoords[2] = surface->w - 1;
blitcoords[3] = surface->h - 1;
blitcoords[4] = (VDI_w - surface->w) >> 1;
blitcoords[5] = (VDI_h - surface->h) >> 1;
blitcoords[6] = blitcoords[4] + surface->w - 1;
blitcoords[7] = blitcoords[5] + surface->h - 1;
vro_cpyfm(VDI_handle, S_ONLY, blitcoords, &mfdb_src, &VDI_dst_mfdb);
return(0);
}
......@@ -894,7 +966,6 @@ static int GEM_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
return 1;
}
for(i = 0; i < ncolors; i++)
{
int r, g, b;
......@@ -918,18 +989,9 @@ static int GEM_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
static int GEM_ToggleFullScreen(_THIS, int on)
{
if (on) {
if (!GEM_locked) {
/* Lock AES */
while (!wind_update(BEG_UPDATE|BEG_MCTRL));
GEM_locked=SDL_TRUE;
}
GEM_LockScreen(this);
} else {
if (GEM_locked) {
/* Unlock AES */
wind_update(END_UPDATE|END_MCTRL);
GEM_locked=SDL_FALSE;
}
/* Redraw all screen */
GEM_UnlockScreen(this);
}
return(1);
......@@ -945,15 +1007,8 @@ void GEM_VideoQuit(_THIS)
GEM_FreeBuffers(this);
if (GEM_locked) {
/* Restore screen memory, and send REDRAW to all apps */
form_dial( FMD_FINISH, 0,0,0,0, 0,0,VDI_w,VDI_h);
/* Unlock AES */
wind_update(END_UPDATE|END_MCTRL);
GEM_locked=SDL_FALSE;
}
GEM_UnlockScreen(this);
/* Close AES application */
appl_exit();
/* Restore palette */
......@@ -990,7 +1045,7 @@ void GEM_wind_redraw(_THIS, int winhandle, short *inside)
short todo[4];
/* Tell AES we are going to update */
while (!wind_update(BEG_UPDATE));
wind_update(BEG_UPDATE);
v_hide_c(VDI_handle);
......
......@@ -639,7 +639,10 @@ static void XBIOS_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
int x1,x2;
x1 = rects[i].x & ~15;
x2 = ((rects[i].x+rects[i].w) | 15) +1;
x2 = rects[i].x+rects[i].w;
if (x2 & 15) {
x2 = (x2 | 15) +1;
}
source = surface->pixels;
source += surface->pitch * rects[i].y;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment