Commit 28c9fb92 authored by Ryan C. Gordon's avatar Ryan C. Gordon

Removed AmigaOS code for 1.3 branch.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402215
parent 2ec5b5b3
...@@ -190,15 +190,3 @@ AIX: -= NOT YET SUPPORTED =- ...@@ -190,15 +190,3 @@ AIX: -= NOT YET SUPPORTED =-
More information on this port is available at: More information on this port is available at:
http://www.kom.e-technik.tu-darmstadt.de/~griff/SDL/ http://www.kom.e-technik.tu-darmstadt.de/~griff/SDL/
AmigaOS: -= NOT YET SUPPORTED =-
The OpenGL support isn't implemented yet.
SDL_WM_GrabInput() is not implemented.
Does anyone know how to do this? SDL_WM_GrabInput() is designed
to prevent the user from switching input and mouse focus away from
the SDL application.
Continuous relative mouse motion is not implemented.
The AmigaOS port was done by Gabriele.Greco@galactica.it
...@@ -14,7 +14,7 @@ and 2D framebuffer across multiple platforms. ...@@ -14,7 +14,7 @@ and 2D framebuffer across multiple platforms.
The current version supports Linux, Windows, Windows CE, BeOS, MacOS, The current version supports Linux, Windows, Windows CE, BeOS, MacOS,
Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX. Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX.
The code contains support for AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64, The code contains support for Dreamcast, Atari, AIX, OSF/Tru64,
RISC OS, SymbianOS, and OS/2, but these are not officially supported. RISC OS, SymbianOS, and OS/2, but these are not officially supported.
SDL is written in C, but works with C++ natively, and has bindings to SDL is written in C, but works with C++ natively, and has bindings to
......
This is the porting of 1.2.0 version of SDL (the latest stable one)
to AmigaOS/68k.
All the bugs known of the past version have been corrected. And I've
added all the new SDL features.
This version of SDL needs Cybergraphx V3 (r69+) or CyberGraphX V4
and AHI v3+. Probably it works also with P96 or CGXAga, but it's
untested.
This version is available as linked library for SAS/C and GCC, only 68k this
time, a powerup (ppcemu compatible) and a morphos version will be ready quite
soon (i hope).
Implemented:
- 8/16/24/32bit video modes, both fullscreen and windowed.
- Hardware surfaces.
- CGX blitting acceleration.
- CGX colorkey blitting acceleration.
- AHI audio (8/16 bit, with any audio format), always uses unit 0 for now.
- Thread support (maybe not 100% compatible with other implementations)
- Semaphores
- Window resizing and backdrop windows (NEW)
- Joystick/Joypad support.
To do:
- CDRom audio playing support
- OpenGL (A guy was working on it but I've lost his tracks :( )
The SAS/C library is distributed with debug info attached, to strip debug info
simply add STRIPDEBUG argument to the linker.
NOTE: SDL includes debug output using kprintf, to disable it add to your
project a function like this:
void kprintf(char *a,...)
{
}
Otherwise you can redirect the debug to a console window with sushi, sashimi or
similar tools (the default output is the internal serial port).
For info, support, bugfix and other feel free to mail me:
Gabriele Greco (gabriele.greco@aruba.it)
You can find also a small SDL Amiga page at:
http://ggreco.interfree.it/sdl.html
...@@ -38,7 +38,7 @@ and 2D framebuffer across multiple platforms. ...@@ -38,7 +38,7 @@ and 2D framebuffer across multiple platforms.
The current version supports Linux, Windows, Windows CE, BeOS, MacOS, The current version supports Linux, Windows, Windows CE, BeOS, MacOS,
Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX. Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX.
The code contains support for AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64, The code contains support for Dreamcast, Atari, AIX, OSF/Tru64,
RISC OS, SymbianOS, and OS/2, but these are not officially supported. RISC OS, SymbianOS, and OS/2, but these are not officially supported.
SDL is written in C, but works with C++ natively, and has bindings to SDL is written in C, but works with C++ natively, and has bindings to
......
...@@ -26,9 +26,7 @@ ...@@ -26,9 +26,7 @@
#include "SDL_platform.h" #include "SDL_platform.h"
/* Add any platform that doesn't build using the configure system */ /* Add any platform that doesn't build using the configure system */
#if defined(__AMIGA__) #if defined(__DREAMCAST__)
#include "SDL_config_amiga.h"
#elif defined(__DREAMCAST__)
#include "SDL_config_dreamcast.h" #include "SDL_config_dreamcast.h"
#elif defined(__MACOSX__) #elif defined(__MACOSX__)
#include "SDL_config_macosx.h" #include "SDL_config_macosx.h"
......
...@@ -149,7 +149,6 @@ ...@@ -149,7 +149,6 @@
#undef SDL_VIDEO_DISABLED #undef SDL_VIDEO_DISABLED
/* Enable various audio drivers */ /* Enable various audio drivers */
#undef SDL_AUDIO_DRIVER_AHI
#undef SDL_AUDIO_DRIVER_ALSA #undef SDL_AUDIO_DRIVER_ALSA
#undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC #undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC
#undef SDL_AUDIO_DRIVER_ARTS #undef SDL_AUDIO_DRIVER_ARTS
...@@ -195,7 +194,6 @@ ...@@ -195,7 +194,6 @@
/* Enable various input drivers */ /* Enable various input drivers */
#undef SDL_INPUT_TSLIB #undef SDL_INPUT_TSLIB
#undef SDL_JOYSTICK_AMIGA
#undef SDL_JOYSTICK_BEOS #undef SDL_JOYSTICK_BEOS
#undef SDL_JOYSTICK_DC #undef SDL_JOYSTICK_DC
#undef SDL_JOYSTICK_DINPUT #undef SDL_JOYSTICK_DINPUT
...@@ -220,7 +218,6 @@ ...@@ -220,7 +218,6 @@
#undef SDL_LOADSO_WIN32 #undef SDL_LOADSO_WIN32
/* Enable various threading systems */ /* Enable various threading systems */
#undef SDL_THREAD_AMIGA
#undef SDL_THREAD_BEOS #undef SDL_THREAD_BEOS
#undef SDL_THREAD_DC #undef SDL_THREAD_DC
#undef SDL_THREAD_EPOC #undef SDL_THREAD_EPOC
...@@ -233,7 +230,6 @@ ...@@ -233,7 +230,6 @@
#undef SDL_THREAD_WIN32 #undef SDL_THREAD_WIN32
/* Enable various timer systems */ /* Enable various timer systems */
#undef SDL_TIMER_AMIGA
#undef SDL_TIMER_BEOS #undef SDL_TIMER_BEOS
#undef SDL_TIMER_DC #undef SDL_TIMER_DC
#undef SDL_TIMER_DUMMY #undef SDL_TIMER_DUMMY
...@@ -248,7 +244,6 @@ ...@@ -248,7 +244,6 @@
/* Enable various video drivers */ /* Enable various video drivers */
#undef SDL_VIDEO_DRIVER_BWINDOW #undef SDL_VIDEO_DRIVER_BWINDOW
#undef SDL_VIDEO_DRIVER_COCOA #undef SDL_VIDEO_DRIVER_COCOA
#undef SDL_VIDEO_DRIVER_CYBERGRAPHICS
#undef SDL_VIDEO_DRIVER_DC #undef SDL_VIDEO_DRIVER_DC
#undef SDL_VIDEO_DRIVER_DIRECTFB #undef SDL_VIDEO_DRIVER_DIRECTFB
#undef SDL_VIDEO_DRIVER_DUMMY #undef SDL_VIDEO_DRIVER_DUMMY
......
/*
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
*/
#ifndef _SDL_config_amiga_h
#define _SDL_config_amiga_h
#include "SDL_platform.h"
/* This is a set of defines to configure the SDL features */
#define SDL_HAS_64BIT_TYPE 1
/* Useful headers */
#define HAVE_SYS_TYPES_H 1
#define HAVE_STDIO_H 1
#define STDC_HEADERS 1
#define HAVE_STRING_H 1
#define HAVE_INTTYPES_H 1
#define HAVE_SIGNAL_H 1
/* C library functions */
#define HAVE_MALLOC 1
#define HAVE_CALLOC 1
#define HAVE_REALLOC 1
#define HAVE_FREE 1
#define HAVE_ALLOCA 1
#define HAVE_GETENV 1
#define HAVE_PUTENV 1
#define HAVE_MEMSET 1
#define HAVE_MEMCPY 1
#define HAVE_MEMMOVE 1
#define HAVE_MEMCMP 1
/* Enable various audio drivers */
#define SDL_AUDIO_DRIVER_AHI 1
#define SDL_AUDIO_DRIVER_DISK 1
#define SDL_AUDIO_DRIVER_DUMMY 1
/* Enable various cdrom drivers */
#define SDL_CDROM_DUMMY 1
/* Enable various input drivers */
#define SDL_JOYSTICK_AMIGA 1
/* Enable various shared object loading systems */
#define SDL_LOADSO_DUMMY 1
/* Enable various threading systems */
#define SDL_THREAD_AMIGA 1
/* Enable various timer systems */
#define SDL_TIMER_AMIGA 1
/* Enable various video drivers */
#define SDL_VIDEO_DRIVER_CYBERGRAPHICS 1
#define SDL_VIDEO_DRIVER_DUMMY 1
/* Enable OpenGL support */
#define SDL_VIDEO_OPENGL 1
#endif /* _SDL_config_amiga_h */
...@@ -29,10 +29,6 @@ ...@@ -29,10 +29,6 @@
#undef __AIX__ #undef __AIX__
#define __AIX__ 1 #define __AIX__ 1
#endif #endif
#if defined(AMIGA) || defined(__AMIGA) || defined(__amigados__)
#undef __AMIGA__
#define __AMIGA__ 1
#endif
#if defined(__BEOS__) #if defined(__BEOS__)
#undef __BEOS__ #undef __BEOS__
#define __BEOS__ 1 #define __BEOS__ 1
......
/*
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"
#ifdef SDL_JOYSTICK_AMIGA
/* This is the system specific header for the SDL joystick API */
#include <libraries/lowlevel.h>
#if defined(__SASC) || defined(STORMC4_WOS)
#include <proto/exec.h>
#include <proto/lowlevel.h>
#include <proto/graphics.h>
#else
#include <inline/exec.h>
#include <inline/lowlevel.h>
#include <inline/graphics.h>
#endif
#include "mydebug.h"
extern struct ExecBase *SysBase;
extern struct GfxBase *GfxBase;
#include "SDL_joystick.h"
#include "../SDL_sysjoystick.h"
#include "../SDL_joystick_c.h"
/* Function to scan the system for joysticks.
* This function should set SDL_numjoysticks to the number of available
* joysticks. Joystick 0 should be the system default joystick.
* It should return 0, or -1 on an unrecoverable fatal error.
*/
/* Amiga specific datas */
struct Library *LowLevelBase = NULL;
ULONG joybut[] = {
JPF_BUTTON_RED,
JPF_BUTTON_BLUE,
JPF_BUTTON_PLAY,
JPF_BUTTON_YELLOW,
JPF_BUTTON_GREEN,
JPF_BUTTON_FORWARD,
JPF_BUTTON_REVERSE,
};
struct joystick_hwdata
{
ULONG joystate;
};
int
SDL_SYS_JoystickInit(void)
{
if (!LowLevelBase) {
if (LowLevelBase = OpenLibrary("lowlevel.library", 37))
return 2;
} else
return 2;
D(bug("%ld joysticks available.\n", SDL_numjoysticks));
return 0;
}
/* Function to get the device-dependent name of a joystick */
const char *
SDL_SYS_JoystickName(int index)
{
if (index < 2 && LowLevelBase) {
switch (index) {
case 0:
return "Port 1 Amiga Joystick/Joypad";
case 1:
return "Port 2 Amiga Joystick/Joypad";
}
}
SDL_SetError("No joystick available with that index");
return (NULL);
}
/* Function to open a joystick for use.
The joystick to open is specified by the index field of the joystick.
This should fill the nbuttons and naxes fields of the joystick structure.
It returns 0, or -1 if there is an error.
*/
int
SDL_SYS_JoystickOpen(SDL_Joystick * joystick)
{
ULONG temp, i;
D(bug("Opening joystick %ld\n", joystick->index));
if (!(joystick->hwdata = SDL_malloc(sizeof(struct joystick_hwdata))))
return -1;
/* This loop is to check if the controller is a joypad */
for (i = 0; i < 20; i++) {
temp = ReadJoyPort(joystick->index ^ 1); // fix to invert amiga joyports
WaitTOF();
}
if ((temp & JP_TYPE_MASK) == JP_TYPE_GAMECTLR)
joystick->nbuttons = 7;
else
joystick->nbuttons = 3;
joystick->nhats = 0;
joystick->nballs = 0;
joystick->naxes = 2;
joystick->hwdata->joystate = 0L;
return 0;
}
/* Function to update the state of a joystick - called as a device poll.
* This function shouldn't update the joystick structure directly,
* but instead should call SDL_PrivateJoystick*() to deliver events
* and update joystick device state.
*/
void
SDL_SYS_JoystickUpdate(SDL_Joystick * joystick)
{
ULONG data;
int i;
if (joystick->index < 2) {
data = ReadJoyPort(joystick->index);
if (data & JP_DIRECTION_MASK) {
if (data & JPF_JOY_DOWN) {
if (!(joystick->hwdata->joystate & JPF_JOY_DOWN))
SDL_PrivateJoystickAxis(joystick, 0, 127);
} else if (data & JPF_JOY_UP) {
if (!(joystick->hwdata->joystate & JPF_JOY_UP))
SDL_PrivateJoystickAxis(joystick, 0, -127);
} else if (joystick->hwdata->
joystate & (JPF_JOY_UP | JPF_JOY_DOWN))
SDL_PrivateJoystickAxis(joystick, 0, 0);
if (data & JPF_JOY_LEFT) {
if (!(joystick->hwdata->joystate & JPF_JOY_LEFT))
SDL_PrivateJoystickAxis(joystick, 1, -127);
} else if (data & JPF_JOY_RIGHT) {
if (!(joystick->hwdata->joystate & JPF_JOY_RIGHT))
SDL_PrivateJoystickAxis(joystick, 1, 127);
} else if (joystick->hwdata->
joystate & (JPF_JOY_LEFT | JPF_JOY_RIGHT))
SDL_PrivateJoystickAxis(joystick, 1, 0);
} else if (joystick->hwdata->
joystate & (JPF_JOY_LEFT | JPF_JOY_RIGHT)) {
SDL_PrivateJoystickAxis(joystick, 1, 0);
} else if (joystick->hwdata->joystate & (JPF_JOY_UP | JPF_JOY_DOWN)) {
SDL_PrivateJoystickAxis(joystick, 0, 0);
}
for (i = 0; i < joystick->nbuttons; i++) {
if ((data & joybut[i])) {
if (i == 1)
data &= (~(joybut[2]));
if (!(joystick->hwdata->joystate & joybut[i]))
SDL_PrivateJoystickButton(joystick, i, SDL_PRESSED);
} else if (joystick->hwdata->joystate & joybut[i])
SDL_PrivateJoystickButton(joystick, i, SDL_RELEASED);
}
joystick->hwdata->joystate = data;
}
return;
}
/* Function to close a joystick after use */
void
SDL_SYS_JoystickClose(SDL_Joystick * joystick)
{
if (joystick->hwdata)
SDL_free(joystick->hwdata);
return;
}
/* Function to perform any system-specific joystick related cleanup */
void
SDL_SYS_JoystickQuit(void)
{
if (LowLevelBase) {
CloseLibrary(LowLevelBase);
LowLevelBase = NULL;
SDL_numjoysticks = 0;
}
return;
}
#endif /* SDL_JOYSTICK_AMIGA */
/* vi: set ts=4 sw=4 expandtab: */
...@@ -27,8 +27,6 @@ ...@@ -27,8 +27,6 @@
/* Need the definitions of SYS_ThreadHandle */ /* Need the definitions of SYS_ThreadHandle */
#if SDL_THREADS_DISABLED #if SDL_THREADS_DISABLED
#include "generic/SDL_systhread_c.h" #include "generic/SDL_systhread_c.h"
#elif SDL_THREAD_AMIGA
#include "amigaos/SDL_systhread_c.h"
#elif SDL_THREAD_BEOS #elif SDL_THREAD_BEOS
#include "beos/SDL_systhread_c.h" #include "beos/SDL_systhread_c.h"
#elif SDL_THREAD_DC #elif SDL_THREAD_DC
......
/*
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"
/* An implementation of semaphores using mutexes and condition variables */
#include "SDL_thread.h"
#include "SDL_systhread_c.h"
struct SDL_semaphore
{
struct SignalSemaphore Sem;
};
#undef D
#define D(x)
SDL_sem *
SDL_CreateSemaphore(Uint32 initial_value)
{
SDL_sem *sem;
sem = (SDL_sem *) SDL_malloc(sizeof(*sem));
if (!sem) {
SDL_OutOfMemory();
return (0);
}
D(bug("Creating semaphore %lx...\n", sem));
SDL_memset(sem, 0, sizeof(*sem));
InitSemaphore(&sem->Sem);
return (sem);
}
void
SDL_DestroySemaphore(SDL_sem * sem)
{
D(bug("Destroying semaphore %lx...\n", sem));
if (sem) {
// Condizioni per liberare i task in attesa?
SDL_free(sem);
}
}
int
SDL_SemTryWait(SDL_sem * sem)
{
if (!sem) {
SDL_SetError("Passed a NULL semaphore");
return -1;
}
D(bug("TryWait semaphore...%lx\n", sem));
ObtainSemaphore(&sem->Sem);
// ReleaseSemaphore(&sem->Sem);
return 1;
}
int
SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout)
{
int retval;
if (!sem) {
SDL_SetError("Passed a NULL semaphore");
return -1;
}
D(bug("WaitTimeout (%ld) semaphore...%lx\n", timeout, sem));
/* A timeout of 0 is an easy case */
if (timeout == 0) {
ObtainSemaphore(&sem->Sem);
return 1;
}
if (!(retval = AttemptSemaphore(&sem->Sem))) {
SDL_Delay(timeout);
retval = AttemptSemaphore(&sem->Sem);
}
if (retval == TRUE) {
// ReleaseSemaphore(&sem->Sem);
retval = 1;
}
return retval;
}
int
SDL_SemWait(SDL_sem * sem)
{
ObtainSemaphore(&sem->Sem);
return 0;
}
Uint32
SDL_SemValue(SDL_sem * sem)
{
Uint32 value;
value = 0;
if (sem) {
#ifdef STORMC4_WOS
value = sem->Sem.ssppc_SS.ss_NestCount;
#else
value = sem->Sem.ss_NestCount;
#endif
}
return value;
}
int
SDL_SemPost(SDL_sem * sem)
{
if (!sem) {
SDL_SetError("Passed a NULL semaphore");
return -1;
}
D(bug("SemPost semaphore...%lx\n", sem));
ReleaseSemaphore(&sem->Sem);
return 0;
}
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
/* BeOS thread management routines for SDL */
#include "SDL_mutex.h"
#include "SDL_thread.h"
#include "../SDL_thread_c.h"
#include "../SDL_systhread.h"
#include "mydebug.h"
typedef struct
{
int (*func) (void *);
void *data;
SDL_Thread *info;
struct Task *wait;
} thread_args;
#ifndef MORPHOS
#if defined(__SASC) && !defined(__PPC__)
__saveds __asm Uint32
RunThread(register __a0 char *args)
#elif defined(__PPC__)
Uint32
RunThread(char *args)
#else
Uint32 __saveds
RunThread(char *args __asm("a0"))
#endif
{
#ifdef STORMC4_WOS
thread_args *data = (thread_args *) args;
#else
thread_args *data = (thread_args *) atol(args);
#endif
struct Task *Father;
D(bug("Received data: %lx\n", data));
Father = data->wait;
SDL_RunThread(data);
Signal(Father, SIGBREAKF_CTRL_F);
D(bug("Thread with data %lx ended\n", data));
return (0);
}
#else
#include <emul/emulinterface.h>
Uint32
RunTheThread(void)
{
thread_args *data = (thread_args *) atol((char *) REG_A0);
struct Task *Father;
D(bug("Received data: %lx\n", data));
Father = data->wait;
SDL_RunThread(data);
Signal(Father, SIGBREAKF_CTRL_F);
D(bug("Thread with data %lx ended\n", data));
return (0);
}
struct EmulLibEntry RunThreadStruct = {
TRAP_LIB,
0,
(ULONG) RunTheThread
};
void *RunThread = &RunThreadStruct;
#endif
int
SDL_SYS_CreateThread(SDL_Thread * thread, void *args)
{
/* Create the thread and go! */
char buffer[20];
D(bug("Sending %lx to the new thread...\n", args));
if (args)
SDL_snprintf(buffer, SDL_arraysize(buffer), "%ld", args);
#ifdef STORMC4_WOS
thread->handle = CreateTaskPPCTags(TASKATTR_CODE, RunThread,
TASKATTR_NAME, "SDL subtask",
TASKATTR_STACKSIZE, 100000,
(args ? TASKATTR_R3 : TAG_IGNORE),
args, TASKATTR_INHERITR2, TRUE,
TAG_DONE);
#else
thread->handle = (struct Task *) CreateNewProcTags(NP_Output, Output(),
NP_Name,
(ULONG) "SDL subtask",
NP_CloseOutput, FALSE,
NP_StackSize, 20000,
NP_Entry,
(ULONG) RunThread,
args ? NP_Arguments :
TAG_IGNORE,
(ULONG) buffer,
TAG_DONE);
#endif
if (!thread->handle) {
SDL_SetError("Not enough resources to create thread");
return (-1);
}
return (0);
}
void
SDL_SYS_SetupThread(void)
{
}
Uint32
SDL_ThreadID(void)
{
return ((Uint32) FindTask(NULL));
}
void
SDL_SYS_WaitThread(SDL_Thread * thread)
{
SetSignal(0L, SIGBREAKF_CTRL_F | SIGBREAKF_CTRL_C);
Wait(SIGBREAKF_CTRL_F | SIGBREAKF_CTRL_C);
}
void
SDL_SYS_KillThread(SDL_Thread * thread)
{
Signal((struct Task *) thread->handle, SIGBREAKF_CTRL_C);
}
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
#include <exec/exec.h>
#include <dos/dos.h>
#include <dos/dostags.h>
#if defined (__SASC) || defined(STORMC4_WOS)
#include <proto/dos.h>
#include <proto/exec.h>
#else
#include <inline/dos.h>
#include <inline/exec.h>
#endif
#include "mydebug.h"
extern struct ExecBase *SysBase;
extern struct DosLibrary *DOSBase;
#ifdef STORMC4_WOS
#include <proto/powerpc.h>
/* use powerpc.library functions instead og exec */
#define SYS_ThreadHandle struct TaskPPC *
#define Signal SignalPPC
#define Wait WaitPPC
#define Task TaskPPC
#define FindTask FindTaskPPC
#define SetSignal SetSignalPPC
#define InitSemaphore InitSemaphorePPC
#define ObtainSemaphore ObtainSemaphorePPC
#define AttemptSemaphore AttemptSemaphorePPC
#define ReleaseSemaphore ReleaseSemaphorePPC
#define SignalSemaphore SignalSemaphorePPC
#else
#define SYS_ThreadHandle struct Task *
#endif /*STORMC4_WOS */
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
/* System independent thread management routines for SDL */
#include "SDL_mutex.h"
#include "SDL_thread.h"
#include "../SDL_thread_c.h"
#include "../SDL_systhread.h"
#define ARRAY_CHUNKSIZE 32
/* The array of threads currently active in the application
(except the main thread)
The manipulation of an array here is safer than using a linked list.
*/
static int SDL_maxthreads = 0;
static int SDL_numthreads = 0;
static SDL_Thread **SDL_Threads = NULL;
static struct SignalSemaphore thread_lock;
int thread_lock_created = 0;
int
SDL_ThreadsInit(void)
{
InitSemaphore(&thread_lock);
thread_lock_created = 1;
return 0;
}
/* This should never be called...
If this is called by SDL_Quit(), we don't know whether or not we should
clean up threads here. If any threads are still running after this call,
they will no longer have access to any per-thread data.
*/
void
SDL_ThreadsQuit()
{
thread_lock_created = 0;
}
/* Routines for manipulating the thread list */
static void
SDL_AddThread(SDL_Thread * thread)
{
SDL_Thread **threads;
/* WARNING:
If the very first threads are created simultaneously, then
there could be a race condition causing memory corruption.
In practice, this isn't a problem because by definition there
is only one thread running the first time this is called.
*/
if (!thread_lock_created) {
if (SDL_ThreadsInit() < 0) {
return;
}
}
ObtainSemaphore(&thread_lock);
/* Expand the list of threads, if necessary */
#ifdef DEBUG_THREADS
printf("Adding thread (%d already - %d max)\n",
SDL_numthreads, SDL_maxthreads);
#endif
if (SDL_numthreads == SDL_maxthreads) {
threads =
(SDL_Thread **) SDL_malloc((SDL_maxthreads + ARRAY_CHUNKSIZE) *
(sizeof *threads));
if (threads == NULL) {
SDL_OutOfMemory();
goto done;
}
SDL_memcpy(threads, SDL_Threads, SDL_numthreads * (sizeof *threads));
SDL_maxthreads += ARRAY_CHUNKSIZE;
if (SDL_Threads) {
SDL_free(SDL_Threads);
}
SDL_Threads = threads;
}
SDL_Threads[SDL_numthreads++] = thread;
done:
ReleaseSemaphore(&thread_lock);
}
static void
SDL_DelThread(SDL_Thread * thread)
{
int i;
if (thread_lock_created) {
ObtainSemaphore(&thread_lock);
for (i = 0; i < SDL_numthreads; ++i) {
if (thread == SDL_Threads[i]) {
break;
}
}
if (i < SDL_numthreads) {
--SDL_numthreads;
while (i < SDL_numthreads) {
SDL_Threads[i] = SDL_Threads[i + 1];
++i;
}
#ifdef DEBUG_THREADS
printf("Deleting thread (%d left - %d max)\n",
SDL_numthreads, SDL_maxthreads);
#endif
}
ReleaseSemaphore(&thread_lock);
}
}
/* The default (non-thread-safe) global error variable */
static SDL_error SDL_global_error;
/* Routine to get the thread-specific error variable */
SDL_error *
SDL_GetErrBuf(void)
{
SDL_error *errbuf;
errbuf = &SDL_global_error;
if (SDL_Threads) {
int i;
Uint32 this_thread;
this_thread = SDL_ThreadID();
ObtainSemaphore(&thread_lock);
for (i = 0; i < SDL_numthreads; ++i) {
if (this_thread == SDL_Threads[i]->threadid) {
errbuf = &SDL_Threads[i]->errbuf;
break;
}
}
ReleaseSemaphore(&thread_lock);
}
return (errbuf);
}
/* Arguments and callback to setup and run the user thread function */
typedef struct
{
int (*func) (void *);
void *data;
SDL_Thread *info;
struct Task *wait;
} thread_args;
void
SDL_RunThread(void *data)
{
thread_args *args;
int (*userfunc) (void *);
void *userdata;
int *statusloc;
/* Perform any system-dependent setup
- this function cannot fail, and cannot use SDL_SetError()
*/
SDL_SYS_SetupThread();
/* Get the thread id */
args = (thread_args *) data;
args->info->threadid = SDL_ThreadID();
/* Figure out what function to run */
userfunc = args->func;
userdata = args->data;
statusloc = &args->info->status;
/* Wake up the parent thread */
Signal(args->wait, SIGBREAKF_CTRL_E);
/* Run the function */
*statusloc = userfunc(userdata);
}
SDL_Thread *
SDL_CreateThread(int (*fn) (void *), void *data)
{
SDL_Thread *thread;
thread_args *args;
int ret;
/* Allocate memory for the thread info structure */
thread = (SDL_Thread *) SDL_malloc(sizeof(*thread));
if (thread == NULL) {
SDL_OutOfMemory();
return (NULL);
}
SDL_memset(thread, 0, (sizeof *thread));
thread->status = -1;
/* Set up the arguments for the thread */
args = (thread_args *) SDL_malloc(sizeof(*args));
if (args == NULL) {
SDL_OutOfMemory();
SDL_free(thread);
return (NULL);
}
args->func = fn;
args->data = data;
args->info = thread;
args->wait = FindTask(NULL);
if (args->wait == NULL) {
SDL_free(thread);
SDL_free(args);
SDL_OutOfMemory();
return (NULL);
}
/* Add the thread to the list of available threads */
SDL_AddThread(thread);
D(bug("Starting thread...\n"));
/* Create the thread and go! */
ret = SDL_SYS_CreateThread(thread, args);
if (ret >= 0) {
D(bug("Waiting for thread CTRL_E...\n"));
/* Wait for the thread function to use arguments */
Wait(SIGBREAKF_CTRL_E);
D(bug(" Arrived."));
} else {
/* Oops, failed. Gotta free everything */
SDL_DelThread(thread);
SDL_free(thread);
thread = NULL;
}
SDL_free(args);
/* Everything is running now */
return (thread);
}
void
SDL_WaitThread(SDL_Thread * thread, int *status)
{
if (thread) {
SDL_SYS_WaitThread(thread);
if (status) {
*status = thread->status;
}
SDL_DelThread(thread);
SDL_free(thread);
}
}
Uint32
SDL_GetThreadID(SDL_Thread * thread)
{
Uint32 id;
if (thread) {
id = thread->threadid;
} else {
id = SDL_ThreadID();
}
return (id);
}
void
SDL_KillThread(SDL_Thread * thread)
{
if (thread) {
SDL_SYS_KillThread(thread);
SDL_WaitThread(thread, NULL);
}
}
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
#ifdef SDL_TIMER_AMIGA
#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <exec/types.h>
#ifdef __SASC
#include <proto/dos.h>
#include <clib/graphics_protos.h>
#include <pragmas/graphics.h>
#include <clib/exec_protos.h>
#include <pragmas/exec.h>
#elif defined(STORMC4_WOS)
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/graphics.h>
#else
#include <inline/dos.h>
#include <inline/exec.h>
#include <inline/graphics.h>
#endif
#include "mydebug.h"
extern struct DosLibrary *DOSBase;
extern struct ExecBase *SysBase;
static struct GfxBase *GfxBase;
#include "SDL_timer.h"
#include "../SDL_timer_c.h"
/* The first ticks value of the application */
#if !defined(__PPC__) || defined(STORMC4_WOS) || defined(MORPHOS)
static clock_t start;
void
SDL_StartTicks(void)
{
/* Set first ticks value */
start = clock();
}
Uint32
SDL_GetTicks(void)
{
clock_t ticks;
ticks = clock() - start;
#ifdef __SASC
// CLOCKS_PER_SEC == 1000 !
return (ticks);
#else
// CLOCKS_PER_SEC != 1000 !
return ticks * (1000 / CLOCKS_PER_SEC);
#endif
}
void
SDL_Delay(Uint32 ms)
{
// Do a busy wait if time is less than 50ms
if (ms < 50) {
clock_t to_wait = clock();
#ifndef __SASC
ms *= (CLOCKS_PER_SEC / 1000);
#endif
to_wait += ms;
while (clock() < to_wait);
} else {
Delay(ms / 20);
}
}
#else
ULONG MY_CLOCKS_PER_SEC;
void PPC_TimerInit(void);
APTR MyTimer;
ULONG start[2];
void
SDL_StartTicks(void)
{
/* Set first ticks value */
if (!MyTimer)
PPC_TimerInit();
PPCGetTimerObject(MyTimer, PPCTIMERTAG_CURRENTTICKS, start);
start[1] >>= 10;
start[1] |= ((result[0] & 0x3ff) << 22);
start[0] >>= 10;
}
Uint32
SDL_GetTicks(void)
{
ULONG result[2];
PPCGetTimerObject(MyTimer, PPCTIMERTAG_CURRENTTICKS, result);
// PPCAsr64p(result,10);
// Non va, la emulo:
result[1] >>= 10;
result[1] |= ((result[0] & 0x3ff) << 22);
// Non mi interessa piu' result[0]
return result[1] * 1000 / MY_CLOCKS_PER_SEC;
}
void
SDL_Delay(Uint32 ms)
{
// Do a busy wait if time is less than 50ms
if (ms < 50) {
ULONG to_wait[2], actual[2];
PPCGetTimerObject(MyTimer, PPCTIMERTAG_CURRENTTICKS, result);
actual[1] = 0;
to_wait[1] += ms * 1000 / MY_CLOCKS_PER_SEC;
while (actual[1] < to_wait[1]) {
PPCGetTimerObject(MyTimer, PPCTIMERTAG_CURRENTTICKS, actual);
}
} else {
Delay(ms / 50);
}
}
void
PPC_TimerInit(void)
{
struct TagItem tags[] = {
PPCTIMERTAG_CPU, TRUE,
TAG_DONE, 0
};
if (MyTimer = PPCCreateTimerObject(tags)) {
ULONG result[2];
PPCGetTimerObject(MyTimer, PPCTIMERTAG_TICKSPERSEC, result);
D(bug("Timer inizializzato, TPS: %lu - %lu\n", result[0], result[1]));
// PPCAsr64p(result,10);
result[1] >>= 10;
result[1] |= ((result[0] & 0x3ff) << 22);
result[0] >>= 10;
D(bug("Shiftato TPS: %lu - %lu\n", result[0], result[1]));
MY_CLOCKS_PER_SEC = result[1];
PPCGetTimerObject(MyTimer, PPCTIMERTAG_CURRENTTICKS, result);
D(bug("Current ticks: %lu - %lu\n", result[0], result[1]));
result[1] >>= 10;
result[1] |= ((result[0] & 0x3ff) << 22);
result[0] >>= 10;
// PPCAsr64p(result,10);
D(bug("Shiftato: %lu - %lu\n", result[0], result[1]));
} else {
D(bug("Errore nell'inizializzazione del timer!\n"));
}
}
#endif
#include "SDL_thread.h"
/* Data to handle a single periodic alarm */
static int timer_alive = 0;
static SDL_Thread *timer_thread = NULL;
static int
RunTimer(void *unused)
{
D(bug("SYSTimer: Entering RunTimer loop..."));
if (GfxBase == NULL)
GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 37);
while (timer_alive) {
if (SDL_timer_running) {
SDL_ThreadedTimerCheck();
}
if (GfxBase)
WaitTOF(); // Check the timer every fifth of seconds. Was SDL_Delay(1)->BusyWait!
else
Delay(1);
}
D(bug("SYSTimer: EXITING RunTimer loop..."));
return (0);
}
/* This is only called if the event thread is not running */
int
SDL_SYS_TimerInit(void)
{
D(bug("Creating thread for the timer (NOITIMER)...\n"));
timer_alive = 1;
timer_thread = SDL_CreateThread(RunTimer, NULL);
if (timer_thread == NULL) {
D(bug("Creazione del thread fallita...\n"));
return (-1);
}
return (SDL_SetTimerThreaded(1));
}
void
SDL_SYS_TimerQuit(void)
{
timer_alive = 0;
if (timer_thread) {
SDL_WaitThread(timer_thread, NULL);
timer_thread = NULL;
}
}
int
SDL_SYS_StartTimer(void)
{
SDL_SetError("Internal logic error: AmigaOS uses threaded timer");
return (-1);
}
void
SDL_SYS_StopTimer(void)
{
return;
}
#endif /* SDL_TIMER_AMIGA */
/* vi: set ts=4 sw=4 expandtab: */
...@@ -344,9 +344,6 @@ extern VideoBootStrap WIN32_bootstrap; ...@@ -344,9 +344,6 @@ extern VideoBootStrap WIN32_bootstrap;
#if SDL_VIDEO_DRIVER_BWINDOW #if SDL_VIDEO_DRIVER_BWINDOW
extern VideoBootStrap BWINDOW_bootstrap; extern VideoBootStrap BWINDOW_bootstrap;
#endif #endif
#if SDL_VIDEO_DRIVER_CYBERGRAPHICS
extern VideoBootStrap CGX_bootstrap;
#endif
#if SDL_VIDEO_DRIVER_PHOTON #if SDL_VIDEO_DRIVER_PHOTON
extern VideoBootStrap ph_bootstrap; extern VideoBootStrap ph_bootstrap;
#endif #endif
......
...@@ -82,9 +82,6 @@ static VideoBootStrap *bootstrap[] = { ...@@ -82,9 +82,6 @@ static VideoBootStrap *bootstrap[] = {
#if SDL_VIDEO_DRIVER_BWINDOW #if SDL_VIDEO_DRIVER_BWINDOW
&BWINDOW_bootstrap, &BWINDOW_bootstrap,
#endif #endif
#if SDL_VIDEO_DRIVER_CYBERGRAPHICS
&CGX_bootstrap,
#endif
#if SDL_VIDEO_DRIVER_PHOTON #if SDL_VIDEO_DRIVER_PHOTON
&ph_bootstrap, &ph_bootstrap,
#endif #endif
......
/*
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"
/* Handle the event stream, converting Amiga events into SDL events */
#include "SDL.h"
#include "SDL_syswm.h"
#include "../SDL_sysvideo.h"
#include "../../events/SDL_sysevents.h"
#include "../../events/SDL_events_c.h"
#include "SDL_cgxvideo.h"
#include "SDL_cgxmodes_c.h"
#include "SDL_cgximage_c.h"
#include "SDL_cgxwm_c.h"
#include "SDL_amigaevents_c.h"
/* The translation tables from an Amiga keysym to a SDL keysym */
static SDLKey MISC_keymap[256];
SDL_keysym *amiga_TranslateKey(int code, SDL_keysym * keysym);
struct IOStdReq *ConReq = NULL;
struct MsgPort *ConPort = NULL;
/* Note: The X server buffers and accumulates mouse motion events, so
the motion event generated by the warp may not appear exactly as we
expect it to. We work around this (and improve performance) by only
warping the pointer when it reaches the edge, and then wait for it.
*/
#define MOUSE_FUDGE_FACTOR 8
#if 0
static inline int
amiga_WarpedMotion(_THIS, struct IntuiMessage *m)
{
int w, h, i;
int deltax, deltay;
int posted;
w = SDL_VideoSurface->w;
h = SDL_VideoSurface->h;
deltax = xevent->xmotion.x - mouse_last.x;
deltay = xevent->xmotion.y - mouse_last.y;
#ifdef DEBUG_MOTION
printf("Warped mouse motion: %d,%d\n", deltax, deltay);
#endif
mouse_last.x = xevent->xmotion.x;
mouse_last.y = xevent->xmotion.y;
posted = SDL_PrivateMouseMotion(0, 1, deltax, deltay);
if ((xevent->xmotion.x < MOUSE_FUDGE_FACTOR) ||
(xevent->xmotion.x > (w - MOUSE_FUDGE_FACTOR)) ||
(xevent->xmotion.y < MOUSE_FUDGE_FACTOR) ||
(xevent->xmotion.y > (h - MOUSE_FUDGE_FACTOR))) {
/* Get the events that have accumulated */
while (XCheckTypedEvent(SDL_Display, MotionNotify, xevent)) {
deltax = xevent->xmotion.x - mouse_last.x;
deltay = xevent->xmotion.y - mouse_last.y;
#ifdef DEBUG_MOTION
printf("Extra mouse motion: %d,%d\n", deltax, deltay);
#endif
mouse_last.x = xevent->xmotion.x;
mouse_last.y = xevent->xmotion.y;
posted += SDL_PrivateMouseMotion(0, 1, deltax, deltay);
}
mouse_last.x = w / 2;
mouse_last.y = h / 2;
XWarpPointer(SDL_Display, None, SDL_Window, 0, 0, 0, 0,
mouse_last.x, mouse_last.y);
for (i = 0; i < 10; ++i) {
XMaskEvent(SDL_Display, PointerMotionMask, xevent);
if ((xevent->xmotion.x >
(mouse_last.x - MOUSE_FUDGE_FACTOR)) &&
(xevent->xmotion.x <
(mouse_last.x + MOUSE_FUDGE_FACTOR)) &&
(xevent->xmotion.y >
(mouse_last.y - MOUSE_FUDGE_FACTOR)) &&
(xevent->xmotion.y < (mouse_last.y + MOUSE_FUDGE_FACTOR))) {
break;
}
#ifdef DEBUG_XEVENTS
printf("Lost mouse motion: %d,%d\n", xevent->xmotion.x,
xevent->xmotion.y);
#endif
}
#ifdef DEBUG_XEVENTS
if (i == 10) {
printf("Warning: didn't detect mouse warp motion\n");
}
#endif
}
return (posted);
}
#endif
static int
amiga_GetButton(int code)
{
switch (code) {
case IECODE_MBUTTON:
return SDL_BUTTON_MIDDLE;
case IECODE_RBUTTON:
return SDL_BUTTON_RIGHT;
default:
return SDL_BUTTON_LEFT;
}
}
static int
amiga_DispatchEvent(_THIS, struct IntuiMessage *msg)
{
int class = msg->Class, code = msg->Code;
int posted;
posted = 0;
switch (class) {
/* Gaining mouse coverage? */
case IDCMP_ACTIVEWINDOW:
posted = SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
break;
/* Losing mouse coverage? */
case IDCMP_INACTIVEWINDOW:
posted = SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
break;
#if 0
/* Gaining input focus? */
case IDCMP_ACTIVEWINDOW:
posted = SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS);
/* Queue entry into fullscreen mode */
switch_waiting = 0x01 | SDL_FULLSCREEN;
switch_time = SDL_GetTicks() + 1500;
break;
/* Losing input focus? */
case IDCMP_INACTIVEWINDOW:
posted = SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS);
/* Queue leaving fullscreen mode */
switch_waiting = 0x01;
switch_time = SDL_GetTicks() + 200;
break;
#endif
/* Mouse motion? */
case IDCMP_MOUSEMOVE:
if (SDL_VideoSurface) {
posted = SDL_PrivateMouseMotion(0, 0,
msg->MouseX -
SDL_Window->BorderLeft,
msg->MouseY -
SDL_Window->BorderTop);
}
break;
/* Mouse button press? */
case IDCMP_MOUSEBUTTONS:
if (!(code & IECODE_UP_PREFIX)) {
posted = SDL_PrivateMouseButton(SDL_PRESSED,
amiga_GetButton(code), 0, 0);
}
/* Mouse button release? */
else {
code &= ~IECODE_UP_PREFIX;
posted = SDL_PrivateMouseButton(SDL_RELEASED,
amiga_GetButton(code), 0, 0);
}
break;
case IDCMP_RAWKEY:
/* Key press? */
if (!(code & IECODE_UP_PREFIX)) {
SDL_keysym keysym;
posted = SDL_PrivateKeyboard(SDL_PRESSED,
amiga_TranslateKey(code, &keysym));
} else {
/* Key release? */
SDL_keysym keysym;
code &= ~IECODE_UP_PREFIX;
/* Check to see if this is a repeated key */
/* if ( ! X11_KeyRepeat(SDL_Display, &xevent) ) */
posted = SDL_PrivateKeyboard(SDL_RELEASED,
amiga_TranslateKey(code, &keysym));
}
break;
/* Have we been iconified? */
#if 0
case UnmapNotify:
{
#ifdef DEBUG_XEVENTS
printf("UnmapNotify!\n");
#endif
posted =
SDL_PrivateAppActive(0, SDL_APPACTIVE | SDL_APPINPUTFOCUS);
}
break;
/* Have we been restored? */
case MapNotify:
{
#ifdef DEBUG_XEVENTS
printf("MapNotify!\n");
#endif
posted = SDL_PrivateAppActive(1, SDL_APPACTIVE);
if (SDL_VideoSurface &&
(SDL_VideoSurface->flags & SDL_FULLSCREEN)) {
CGX_EnterFullScreen(this);
} else {
X11_GrabInputNoLock(this, this->input_grab);
}
if (SDL_VideoSurface) {
CGX_RefreshDisplay(this);
}
}
break;
case Expose:
if (SDL_VideoSurface && (xevent.xexpose.count == 0)) {
CGX_RefreshDisplay(this);
}
break;
#endif
/* Have we been resized? */
case IDCMP_NEWSIZE:
SDL_PrivateResize(SDL_Window->Width - SDL_Window->BorderLeft -
SDL_Window->BorderRight,
SDL_Window->Height - SDL_Window->BorderTop -
SDL_Window->BorderBottom);
break;
/* Have we been requested to quit? */
case IDCMP_CLOSEWINDOW:
posted = SDL_PrivateQuit();
break;
/* Do we need to refresh ourselves? */
default:
{
/* Only post the event if we're watching for it */
if (SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE) {
SDL_SysWMmsg wmmsg;
SDL_VERSION(&wmmsg.version);
#if 0
wmmsg.subsystem = SDL_SYSWM_CGX;
wmmsg.event.xevent = xevent;
#endif
posted = SDL_PrivateSysWMEvent(&wmmsg);
}
}
break;
}
ReplyMsg((struct Message *) msg);
return (posted);
}
void
amiga_PumpEvents(_THIS)
{
int pending;
struct IntuiMessage *m;
/* Keep processing pending events */
pending = 0;
while (m = (struct IntuiMessage *) GetMsg(SDL_Window->UserPort)) {
amiga_DispatchEvent(this, m);
++pending;
}
}
void
amiga_InitKeymap(void)
{
int i;
/* Map the miscellaneous keys */
for (i = 0; i < SDL_arraysize(MISC_keymap); ++i)
MISC_keymap[i] = SDLK_UNKNOWN;
/* These X keysyms have 0xFF as the high byte */
MISC_keymap[65] = SDLK_BACKSPACE;
MISC_keymap[66] = SDLK_TAB;
MISC_keymap[70] = SDLK_CLEAR;
MISC_keymap[70] = SDLK_DELETE;
MISC_keymap[68] = SDLK_RETURN;
// MISC_keymap[XK_Pause&0xFF] = SDLK_PAUSE;
MISC_keymap[69] = SDLK_ESCAPE;
MISC_keymap[70] = SDLK_DELETE;
/*
SDLK_SPACE = 32,
SDLK_MINUS = 45,
SDLK_LESS = 60,
SDLK_COMMA = 44,
SDLK_PERIOD = 46,
SDLK_0 = 48,
SDLK_1 = 49,
SDLK_2 = 50,
SDLK_3 = 51,
SDLK_4 = 52,
SDLK_5 = 53,
SDLK_6 = 54,
SDLK_7 = 55,
SDLK_8 = 56,
SDLK_9 = 57,
SDLK_BACKQUOTE = 96,
SDLK_BACKSLASH = 92,
SDLK_a = 97,
SDLK_b = 98,
SDLK_c = 99,
SDLK_d = 100,
SDLK_e = 101,
SDLK_f = 102,
SDLK_g = 103,
SDLK_h = 104,
SDLK_i = 105,
SDLK_j = 106,
SDLK_k = 107,
SDLK_l = 108,
SDLK_m = 109,
SDLK_n = 110,
SDLK_o = 111,
SDLK_p = 112,
SDLK_q = 113,
SDLK_r = 114,
SDLK_s = 115,
SDLK_t = 116,
SDLK_u = 117,
SDLK_v = 118,
SDLK_w = 119,
SDLK_x = 120,
SDLK_y = 121,
SDLK_z = 122,
*/
MISC_keymap[15] = SDLK_KP0; /* Keypad 0-9 */
MISC_keymap[29] = SDLK_KP1;
MISC_keymap[30] = SDLK_KP2;
MISC_keymap[31] = SDLK_KP3;
MISC_keymap[45] = SDLK_KP4;
MISC_keymap[46] = SDLK_KP5;
MISC_keymap[47] = SDLK_KP6;
MISC_keymap[61] = SDLK_KP7;
MISC_keymap[62] = SDLK_KP8;
MISC_keymap[63] = SDLK_KP9;
MISC_keymap[60] = SDLK_KP_PERIOD;
MISC_keymap[92] = SDLK_KP_DIVIDE;
MISC_keymap[93] = SDLK_KP_MULTIPLY;
MISC_keymap[74] = SDLK_KP_MINUS;
MISC_keymap[94] = SDLK_KP_PLUS;
MISC_keymap[67] = SDLK_KP_ENTER;
// MISC_keymap[XK_KP_Equal&0xFF] = SDLK_KP_EQUALS;
MISC_keymap[76] = SDLK_UP;
MISC_keymap[77] = SDLK_DOWN;
MISC_keymap[78] = SDLK_RIGHT;
MISC_keymap[79] = SDLK_LEFT;
/*
MISC_keymap[XK_Insert&0xFF] = SDLK_INSERT;
MISC_keymap[XK_Home&0xFF] = SDLK_HOME;
MISC_keymap[XK_End&0xFF] = SDLK_END;
*/
// Mappati sulle parentesi del taastierino
MISC_keymap[90] = SDLK_PAGEUP;
MISC_keymap[91] = SDLK_PAGEDOWN;
MISC_keymap[80] = SDLK_F1;
MISC_keymap[81] = SDLK_F2;
MISC_keymap[82] = SDLK_F3;
MISC_keymap[83] = SDLK_F4;
MISC_keymap[84] = SDLK_F5;
MISC_keymap[85] = SDLK_F6;
MISC_keymap[86] = SDLK_F7;
MISC_keymap[87] = SDLK_F8;
MISC_keymap[88] = SDLK_F9;
MISC_keymap[89] = SDLK_F10;
// MISC_keymap[XK_F11&0xFF] = SDLK_F11;
// MISC_keymap[XK_F12&0xFF] = SDLK_F12;
// MISC_keymap[XK_F13&0xFF] = SDLK_F13;
// MISC_keymap[XK_F14&0xFF] = SDLK_F14;
// MISC_keymap[XK_F15&0xFF] = SDLK_F15;
// MISC_keymap[XK_Num_Lock&0xFF] = SDLK_NUMLOCK;
MISC_keymap[98] = SDLK_CAPSLOCK;
// MISC_keymap[XK_Scroll_Lock&0xFF] = SDLK_SCROLLOCK;
MISC_keymap[97] = SDLK_RSHIFT;
MISC_keymap[96] = SDLK_LSHIFT;
MISC_keymap[99] = SDLK_LCTRL;
MISC_keymap[99] = SDLK_LCTRL;
MISC_keymap[101] = SDLK_RALT;
MISC_keymap[100] = SDLK_LALT;
// MISC_keymap[XK_Meta_R&0xFF] = SDLK_RMETA;
// MISC_keymap[XK_Meta_L&0xFF] = SDLK_LMETA;
MISC_keymap[103] = SDLK_LSUPER; /* Left "Windows" */
MISC_keymap[102] = SDLK_RSUPER; /* Right "Windows */
MISC_keymap[95] = SDLK_HELP;
}
SDL_keysym *
amiga_TranslateKey(int code, SDL_keysym * keysym)
{
#ifdef STORMC4_WOS
static struct Library *KeymapBase = NULL; /* Linking failed in WOS version if ConsoleDevice was used */
#else
static struct Library *ConsoleDevice = NULL;
#endif
/* Get the raw keyboard scancode */
keysym->scancode = code;
keysym->sym = MISC_keymap[code];
#ifdef DEBUG_KEYS
fprintf(stderr, "Translating key 0x%.4x (%d)\n", xsym, xkey->keycode);
#endif
/* Get the translated SDL virtual keysym */
if (keysym->sym == SDLK_UNKNOWN) {
#ifdef STORMC4_WOS
if (!KeymapBase)
#else
if (!ConsoleDevice)
#endif
{
#ifdef STORMC4_WOS
KeymapBase = OpenLibrary("keymap.library", 0L);
#else
if (ConPort = CreateMsgPort()) {
if (ConReq =
CreateIORequest(ConPort, sizeof(struct IOStdReq))) {
if (!OpenDevice
("console.device", -1,
(struct IORequest *) ConReq, 0))
ConsoleDevice = (struct Library *) ConReq->io_Device;
else {
DeleteIORequest(ConReq);
ConReq = NULL;
}
} else {
DeleteMsgPort(ConPort);
ConPort = NULL;
}
}
#endif
}
#ifdef STORMC4_WOS
if (KeymapBase)
#else
if (ConsoleDevice)
#endif
{
struct InputEvent event;
long actual;
char buffer[5];
event.ie_Qualifier = 0;
event.ie_Class = IECLASS_RAWKEY;
event.ie_SubClass = 0L;
event.ie_Code = code;
event.ie_X = event.ie_Y = 0;
event.ie_EventAddress = NULL;
event.ie_NextEvent = NULL;
event.ie_Prev1DownCode = event.ie_Prev1DownQual =
event.ie_Prev2DownCode = event.ie_Prev2DownQual = 0;
#ifdef STORMC4_WOS
if ((actual = MapRawKey(&event, buffer, 5, NULL)) >= 0)
#else
if ((actual = RawKeyConvert(&event, buffer, 5, NULL)) >= 0)
#endif
{
if (actual > 1) {
D(bug("Warning (%ld) character conversion!\n", actual));
} else if (actual == 1) {
keysym->sym = *buffer;
D(bug("Converted rawcode %ld to <%lc>\n", code, *buffer));
// Bufferizzo x le successive chiamate!
MISC_keymap[code] = *buffer;
}
}
}
}
keysym->mod = KMOD_NONE;
/* If UNICODE is on, get the UNICODE value for the key */
keysym->unicode = 0;
if (SDL_TranslateUNICODE) {
#if 0
static XComposeStatus state;
/* Until we handle the IM protocol, use XLookupString() */
unsigned char keybuf[32];
if (XLookupString(xkey, (char *) keybuf, sizeof(keybuf),
NULL, &state)) {
keysym->unicode = keybuf[0];
}
#endif
}
return (keysym);
}
void
amiga_InitOSKeymap(_THIS)
{
amiga_InitKeymap();
}
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
#include "SDL_cgxvideo.h"
/* Functions to be exported */
extern void amiga_InitOSKeymap(_THIS);
extern void amiga_PumpEvents(_THIS);
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
#include "SDL_mouse.h"
#include "../../events/SDL_events_c.h"
#include "../SDL_cursor_c.h"
#include "SDL_amigamouse_c.h"
/* The implementation dependent data for the window manager cursor */
typedef void *WMCursor;
void
amiga_FreeWMCursor(_THIS, WMcursor * cursor)
{
}
WMcursor *
amiga_CreateWMCursor(_THIS,
Uint8 * data, Uint8 * mask, int w, int h, int hot_x,
int hot_y)
{
return (WMcursor *) 1; // Amiga has an Hardware cursor, so it's ok to return something unuseful but true
}
int
amiga_ShowWMCursor(_THIS, WMcursor * cursor)
{
/* Don't do anything if the display is gone */
if (SDL_Display == NULL) {
return (0);
}
/* Set the Amiga prefs cursor cursor, or blank if cursor is NULL */
if (SDL_Window) {
SDL_Lock_EventThread();
if (cursor == NULL) {
if (SDL_BlankCursor != NULL) {
// Hide cursor HERE
SetPointer(SDL_Window, (UWORD *) SDL_BlankCursor, 1, 1, 0, 0);
}
} else {
// Show cursor
ClearPointer(SDL_Window);
}
SDL_Unlock_EventThread();
}
return (1);
}
void
amiga_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
{
/* FIXME: Not implemented */
}
/* Check to see if we need to enter or leave mouse relative mode */
void
amiga_CheckMouseMode(_THIS)
{
}
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
#include "SDL_cgxvideo.h"
/* Functions to be exported */
extern void amiga_FreeWMCursor(_THIS, WMcursor * cursor);
extern WMcursor *amiga_CreateWMCursor(_THIS,
Uint8 * data, Uint8 * mask, int w,
int h, int hot_x, int hot_y);
extern int amiga_ShowWMCursor(_THIS, WMcursor * cursor);
extern void amiga_WarpWMCursor(_THIS, Uint16 x, Uint16 y);
extern void amiga_CheckMouseMode(_THIS);
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
#include "SDL_endian.h"
#include "SDL_video.h"
#include "../SDL_sysvideo.h"
#include "../SDL_blit.h"
#include "SDL_cgxvideo.h"
static int CGX_HWAccelBlit(SDL_Surface * src, SDL_Rect * srcrect,
SDL_Surface * dst, SDL_Rect * dstrect);
// These are needed to avoid register troubles with gcc -O2!
#if defined(__SASC) || defined(__PPC__) || defined(MORPHOS)
#define BMKBRP(a,b,c,d,e,f,g,h,i,j) BltMaskBitMapRastPort(a,b,c,d,e,f,g,h,i,j)
#define BBRP(a,b,c,d,e,f,g,h,i) BltBitMapRastPort(a,b,c,d,e,f,g,h,i)
#define BBB(a,b,c,d,e,f,g,h,i,j,k) BltBitMap(a,b,c,d,e,f,g,h,i,j,k)
#else
void
BMKBRP(struct BitMap *a, WORD b, WORD c, struct RastPort *d, WORD e, WORD f,
WORD g, WORD h, UBYTE i, APTR j)
{
BltMaskBitMapRastPort(a, b, c, d, e, f, g, h, i, j);
}
void
BBRP(struct BitMap *a, WORD b, WORD c, struct RastPort *d, WORD e, WORD f,
WORD g, WORD h, UBYTE i)
{
BltBitMapRastPort(a, b, c, d, e, f, g, h, i);
}
void
BBB(struct BitMap *a, WORD b, WORD c, struct BitMap *d, WORD e, WORD f,
WORD g, WORD h, UBYTE i, UBYTE j, UWORD * k)
{
BltBitMap(a, b, c, d, e, f, g, h, i, j, k);
}
#endif
int
CGX_SetHWColorKey(_THIS, SDL_Surface * surface, Uint32 key)
{
if (surface->hwdata) {
if (surface->hwdata->mask)
SDL_free(surface->hwdata->mask);
if (surface->hwdata->mask =
SDL_malloc(RASSIZE(surface->w, surface->h))) {
Uint32 pitch, ok = 0;
APTR lock;
SDL_memset(surface->hwdata->mask, 255,
RASSIZE(surface->w, surface->h));
D(bug
("Building colorkey mask: color: %ld, size: %ld x %ld, %ld bytes...Bpp:%ld\n",
key, surface->w, surface->h, RASSIZE(surface->w,
surface->h),
surface->format->BytesPerPixel));
if (lock =
LockBitMapTags(surface->hwdata->bmap, LBMI_BASEADDRESS,
(ULONG) & surface->pixels,
LBMI_BYTESPERROW, (ULONG) & pitch, TAG_DONE)) {
switch (surface->format->BytesPerPixel) {
case 1:
{
unsigned char k = key;
register int i, j, t;
register unsigned char *dest =
surface->hwdata->mask, *map = surface->pixels;
pitch -= surface->w;
for (i = 0; i < surface->h; i++) {
for (t = 128, j = 0; j < surface->w; j++) {
if (*map == k)
*dest &= ~t;
t >>= 1;
if (t == 0) {
dest++;
t = 128;
}
map++;
}
map += pitch;
}
}
break;
case 2:
{
Uint16 k = key, *mapw;
register int i, j, t;
register unsigned char *dest =
surface->hwdata->mask, *map = surface->pixels;
for (i = surface->h; i; --i) {
mapw = (Uint16 *) map;
for (t = 128, j = surface->w; j; --j) {
if (*mapw == k)
*dest &= ~t;
t >>= 1;
if (t == 0) {
dest++;
t = 128;
}
mapw++;
}
map += pitch;
}
}
break;
case 4:
{
Uint32 *mapl;
register int i, j, t;
register unsigned char *dest =
surface->hwdata->mask, *map = surface->pixels;
for (i = surface->h; i; --i) {
mapl = (Uint32 *) map;
for (t = 128, j = surface->w; j; --j) {
if (*mapl == key)
*dest &= ~t;
t >>= 1;
if (t == 0) {
dest++;
t = 128;
}
mapl++;
}
map += pitch;
}
}
break;
default:
D(bug("Pixel mode non supported for color key..."));
SDL_free(surface->hwdata->mask);
surface->hwdata->mask = NULL;
ok = -1;
}
UnLockBitMap(lock);
D(bug("...Colorkey built!\n"));
return ok;
}
}
}
D(bug("HW colorkey not supported for this depth\n"));
return -1;
}
int
CGX_CheckHWBlit(_THIS, SDL_Surface * src, SDL_Surface * dst)
{
// Doesn't support yet alpha blitting
if (src->hwdata && !(src->flags & (SDL_SRCALPHA))) {
D(bug("CheckHW blit... OK!\n"));
if ((src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY) {
if (CGX_SetHWColorKey(this, src, src->format->colorkey) < 0) {
src->flags &= ~SDL_HWACCEL;
return -1;
}
}
src->flags |= SDL_HWACCEL;
src->map->hw_blit = CGX_HWAccelBlit;
return 1;
} else
src->flags &= ~SDL_HWACCEL;
D(bug("CheckHW blit... NO!\n"));
return 0;
}
static int temprp_init = 0;
static struct RastPort temprp;
static int
CGX_HWAccelBlit(SDL_Surface * src, SDL_Rect * srcrect,
SDL_Surface * dst, SDL_Rect * dstrect)
{
struct SDL_VideoDevice *this = src->hwdata->videodata;
// D(bug("Accel blit!\n"));
if (src->flags & SDL_SRCCOLORKEY && src->hwdata->mask) {
if (dst == SDL_VideoSurface) {
BMKBRP(src->hwdata->bmap, srcrect->x, srcrect->y,
SDL_RastPort, dstrect->x + SDL_Window->BorderLeft,
dstrect->y + SDL_Window->BorderTop, srcrect->w,
srcrect->h, 0xc0, src->hwdata->mask);
} else if (dst->hwdata) {
if (!temprp_init) {
InitRastPort(&temprp);
temprp_init = 1;
}
temprp.BitMap = (struct BitMap *) dst->hwdata->bmap;
BMKBRP(src->hwdata->bmap, srcrect->x, srcrect->y,
&temprp, dstrect->x, dstrect->y,
srcrect->w, srcrect->h, 0xc0, src->hwdata->mask);
}
} else if (dst == SDL_VideoSurface) {
BBRP(src->hwdata->bmap, srcrect->x, srcrect->y, SDL_RastPort,
dstrect->x + SDL_Window->BorderLeft,
dstrect->y + SDL_Window->BorderTop, srcrect->w, srcrect->h,
0xc0);
} else if (dst->hwdata)
BBB(src->hwdata->bmap, srcrect->x, srcrect->y, dst->hwdata->bmap,
dstrect->x, dstrect->y, srcrect->w, srcrect->h, 0xc0, 0xff, NULL);
return 0;
}
int
CGX_FillHWRect(_THIS, SDL_Surface * dst, SDL_Rect * dstrect, Uint32 color)
{
if (dst == SDL_VideoSurface) {
FillPixelArray(SDL_RastPort, dstrect->x + SDL_Window->BorderLeft,
dstrect->y + SDL_Window->BorderTop, dstrect->w,
dstrect->h, color);
} else if (dst->hwdata) {
if (!temprp_init) {
InitRastPort(&temprp);
temprp_init = 1;
}
temprp.BitMap = (struct BitMap *) dst->hwdata->bmap;
FillPixelArray(&temprp, dstrect->x, dstrect->y, dstrect->w,
dstrect->h, color);
}
return 0;
}
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
/* StormMesa implementation of SDL OpenGL support */
#include "SDL_cgxgl_c.h"
#include "SDL_cgxvideo.h"
#if SDL_VIDEO_OPENGL
AmigaMesaContext glcont = NULL;
#endif
/* Init OpenGL */
int
CGX_GL_Init(_THIS)
{
#if SDL_VIDEO_OPENGL
int i = 0;
struct TagItem attributes[14]; /* 14 should be more than enough :) */
struct Window *win = (struct Window *) SDL_Window;
// default config. Always used...
attributes[i].ti_Tag = AMA_Window;
attributes[i++].ti_Data = (unsigned long) win;
attributes[i].ti_Tag = AMA_Left;
attributes[i++].ti_Data = 0;
attributes[i].ti_Tag = AMA_Bottom;
attributes[i++].ti_Data = 0;
attributes[i].ti_Tag = AMA_Width;
attributes[i++].ti_Data = win->Width - win->BorderLeft - win->BorderRight;
attributes[i].ti_Tag = AMA_Height;
attributes[i++].ti_Data =
win->Height - win->BorderBottom - win->BorderTop;
attributes[i].ti_Tag = AMA_DirectRender;
attributes[i++].ti_Data = GL_TRUE;
// double buffer ?
attributes[i].ti_Tag = AMA_DoubleBuf;
if (this->gl_config.double_buffer) {
attributes[i++].ti_Data = GL_TRUE;
} else {
attributes[i++].ti_Data = GL_FALSE;
}
// RGB(A) Mode ?
attributes[i].ti_Tag = AMA_RGBMode;
if (this->gl_config.red_size != 0 &&
this->gl_config.blue_size != 0 && this->gl_config.green_size != 0) {
attributes[i++].ti_Data = GL_TRUE;
} else {
attributes[i++].ti_Data = GL_FALSE;
}
// no depth buffer ?
if (this->gl_config.depth_size == 0) {
attributes[i].ti_Tag = AMA_NoDepth;
attributes[i++].ti_Data = GL_TRUE;
}
// no stencil buffer ?
if (this->gl_config.stencil_size == 0) {
attributes[i].ti_Tag = AMA_NoStencil;
attributes[i++].ti_Data = GL_TRUE;
}
// no accum buffer ?
if (this->gl_config.accum_red_size != 0 &&
this->gl_config.accum_blue_size != 0 &&
this->gl_config.accum_green_size != 0) {
attributes[i].ti_Tag = AMA_NoAccum;
attributes[i++].ti_Data = GL_TRUE;
}
// done...
attributes[i].ti_Tag = TAG_DONE;
glcont = AmigaMesaCreateContext(attributes);
if (glcont == NULL) {
SDL_SetError("Couldn't create OpenGL context");
return (-1);
}
this->gl_data->gl_active = 1;
this->gl_config.driver_loaded = 1;
return (0);
#else
SDL_SetError("OpenGL support not configured");
return (-1);
#endif
}
/* Quit OpenGL */
void
CGX_GL_Quit(_THIS)
{
#if SDL_VIDEO_OPENGL
if (glcont != NULL) {
AmigaMesaDestroyContext(glcont);
glcont = NULL;
this->gl_data->gl_active = 0;
this->gl_config.driver_loaded = 0;
}
#endif
}
/* Attach context to another window */
int
CGX_GL_Update(_THIS)
{
#if SDL_VIDEO_OPENGL
struct TagItem tags[2];
struct Window *win = (struct Window *) SDL_Window;
if (glcont == NULL) {
return -1; //should never happen
}
tags[0].ti_Tag = AMA_Window;
tags[0].ti_Data = (unsigned long) win;
tags[1].ti_Tag = TAG_DONE;
AmigaMesaSetRast(glcont, tags);
return 0;
#else
SDL_SetError("OpenGL support not configured");
return -1;
#endif
}
#if SDL_VIDEO_OPENGL
/* Make the current context active */
int
CGX_GL_MakeCurrent(_THIS)
{
if (glcont == NULL)
return -1;
AmigaMesaMakeCurrent(glcont, glcont->buffer);
return 0;
}
void
CGX_GL_SwapBuffers(_THIS)
{
AmigaMesaSwapBuffers(glcont);
}
int
CGX_GL_GetAttribute(_THIS, SDL_GLattr attrib, int *value)
{
GLenum mesa_attrib;
switch (attrib) {
case SDL_GL_RED_SIZE:
mesa_attrib = GL_RED_BITS;
break;
case SDL_GL_GREEN_SIZE:
mesa_attrib = GL_GREEN_BITS;
break;
case SDL_GL_BLUE_SIZE:
mesa_attrib = GL_BLUE_BITS;
break;
case SDL_GL_ALPHA_SIZE:
mesa_attrib = GL_ALPHA_BITS;
break;
case SDL_GL_DOUBLEBUFFER:
mesa_attrib = GL_DOUBLEBUFFER;
break;
case SDL_GL_DEPTH_SIZE:
mesa_attrib = GL_DEPTH_BITS;
break;
case SDL_GL_STENCIL_SIZE:
mesa_attrib = GL_STENCIL_BITS;
break;
case SDL_GL_ACCUM_RED_SIZE:
mesa_attrib = GL_ACCUM_RED_BITS;
break;
case SDL_GL_ACCUM_GREEN_SIZE:
mesa_attrib = GL_ACCUM_GREEN_BITS;
break;
case SDL_GL_ACCUM_BLUE_SIZE:
mesa_attrib = GL_ACCUM_BLUE_BITS;
break;
case SDL_GL_ACCUM_ALPHA_SIZE:
mesa_attrib = GL_ACCUM_ALPHA_BITS;
break;
default:
return -1;
}
AmigaMesaGetConfig(glcont->visual, mesa_attrib, value);
return 0;
}
void *
CGX_GL_GetProcAddress(_THIS, const char *proc)
{
void *func = NULL;
func = AmiGetGLProc(proc);
return func;
}
int
CGX_GL_LoadLibrary(_THIS, const char *path)
{
/* Library is always open */
this->gl_config.driver_loaded = 1;
return 0;
}
#endif /* SDL_VIDEO_OPENGL */
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
/* StormMesa implementation of SDL OpenGL support */
#include "../SDL_sysvideo.h"
#define _THIS SDL_VideoDevice *_this
#if SDL_VIDEO_OPENGL
#include <GL/Amigamesa.h>
extern void *AmiGetGLProc(const char *proc);
#endif /* SDL_VIDEO_OPENGL */
struct SDL_PrivateGLData
{
int gl_active;
};
/* OpenGL functions */
extern int CGX_GL_Init(_THIS);
extern void CGX_GL_Quit(_THIS);
extern int CGX_GL_Update(_THIS);
#if SDL_VIDEO_OPENGL
extern int CGX_GL_MakeCurrent(_THIS);
extern int CGX_GL_GetAttribute(_THIS, SDL_GLattr attrib, int *value);
extern void CGX_GL_SwapBuffers(_THIS);
extern void *CGX_GL_GetProcAddress(_THIS, const char *proc);
extern int CGX_GL_LoadLibrary(_THIS, const char *path);
#endif
#undef _THIS
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
#include "SDL_endian.h"
#include "SDL_cgximage_c.h"
#ifdef HAVE_KSTAT
#include <kstat.h>
#endif
#ifdef USE_CGX_WRITELUTPIXEL
#if defined(__SASC) || defined(__PPC__)
#define WLUT WriteLUTPixelArray
#else
void
WLUT(APTR a, UWORD b, UWORD c, UWORD d, struct RastPort *e, APTR f, UWORD g,
UWORD h, UWORD i, UWORD l, UBYTE m)
{
WriteLUTPixelArray(a, b, c, d, e, f, g, h, i, l, m);
}
#endif
#endif
/* Various screen update functions available */
static void CGX_NormalUpdate(_THIS, int numrects, SDL_Rect * rects);
static void CGX_FakeUpdate(_THIS, int numrects, SDL_Rect * rects);
BOOL SafeDisp = TRUE, SafeChange = TRUE;
struct MsgPort *safeport = NULL, *dispport = NULL;
ULONG safe_sigbit, disp_sigbit;
int use_picasso96 = 1;
int
CGX_SetupImage(_THIS, SDL_Surface * screen)
{
SDL_Ximage = NULL;
if (screen->flags & SDL_HWSURFACE) {
ULONG pitch;
if (!screen->hwdata) {
if (!(screen->hwdata = SDL_malloc(sizeof(struct private_hwdata))))
return -1;
D(bug("Creating system accel struct\n"));
}
screen->hwdata->lock = NULL;
screen->hwdata->allocated = 0;
screen->hwdata->mask = NULL;
screen->hwdata->bmap = SDL_RastPort->BitMap;
screen->hwdata->videodata = this;
if (!(screen->hwdata->lock = LockBitMapTags(screen->hwdata->bmap,
LBMI_BASEADDRESS,
(ULONG) & screen->
pixels,
LBMI_BYTESPERROW,
(ULONG) & pitch,
TAG_DONE))) {
SDL_free(screen->hwdata);
screen->hwdata = NULL;
return -1;
} else {
UnLockBitMap(screen->hwdata->lock);
screen->hwdata->lock = NULL;
}
screen->pitch = pitch;
this->UpdateRects = CGX_FakeUpdate;
D(bug
("Accel video image configured (%lx, pitch %ld).\n",
screen->pixels, screen->pitch));
return 0;
}
screen->pixels = SDL_malloc(screen->h * screen->pitch);
if (screen->pixels == NULL) {
SDL_OutOfMemory();
return (-1);
}
SDL_Ximage = screen->pixels;
if (SDL_Ximage == NULL) {
SDL_SetError("Couldn't create XImage");
return (-1);
}
this->UpdateRects = CGX_NormalUpdate;
return (0);
}
void
CGX_DestroyImage(_THIS, SDL_Surface * screen)
{
if (SDL_Ximage) {
SDL_free(SDL_Ximage);
SDL_Ximage = NULL;
}
if (screen) {
screen->pixels = NULL;
if (screen->hwdata) {
SDL_free(screen->hwdata);
screen->hwdata = NULL;
}
}
}
/* This is a hack to see whether this system has more than 1 CPU */
static int
num_CPU(void)
{
return 1;
}
int
CGX_ResizeImage(_THIS, SDL_Surface * screen, Uint32 flags)
{
int retval;
D(bug("Calling ResizeImage()\n"));
CGX_DestroyImage(this, screen);
if (flags & SDL_INTERNALOPENGL) { /* No image when using GL */
retval = 0;
} else {
retval = CGX_SetupImage(this, screen);
/* We support asynchronous blitting on the display */
if (flags & SDL_ASYNCBLIT) {
if (num_CPU() > 1) {
screen->flags |= SDL_ASYNCBLIT;
}
}
}
return (retval);
}
int
CGX_AllocHWSurface(_THIS, SDL_Surface * surface)
{
D(bug
("Alloc HW surface...%ld x %ld x %ld!\n", surface->w, surface->h,
this->hidden->depth));
if (surface == SDL_VideoSurface) {
D(bug("Allocation skipped, it's system one!\n"));
return 0;
}
if (!surface->hwdata) {
if (!(surface->hwdata = SDL_malloc(sizeof(struct private_hwdata))))
return -1;
}
surface->hwdata->mask = NULL;
surface->hwdata->lock = NULL;
surface->hwdata->videodata = this;
surface->hwdata->allocated = 0;
if (surface->hwdata->bmap =
AllocBitMap(surface->w, surface->h, this->hidden->depth,
BMF_MINPLANES, SDL_Display->RastPort.BitMap)) {
surface->hwdata->allocated = 1;
surface->flags |= SDL_HWSURFACE;
D(bug("...OK\n"));
return 0;
} else {
SDL_free(surface->hwdata);
surface->hwdata = NULL;
}
return (-1);
}
void
CGX_FreeHWSurface(_THIS, SDL_Surface * surface)
{
if (surface && surface != SDL_VideoSurface && surface->hwdata) {
D(bug("Free hw surface.\n"));
if (surface->hwdata->mask)
SDL_free(surface->hwdata->mask);
if (surface->hwdata->bmap && surface->hwdata->allocated)
FreeBitMap(surface->hwdata->bmap);
SDL_free(surface->hwdata);
surface->hwdata = NULL;
surface->pixels = NULL;
D(bug("end of free hw surface\n"));
}
return;
}
int
CGX_LockHWSurface(_THIS, SDL_Surface * surface)
{
if (surface->hwdata) {
// D(bug("Locking a bitmap...\n"));
if (!surface->hwdata->lock) {
Uint32 pitch;
if (!
(surface->hwdata->lock =
LockBitMapTags(surface->hwdata->bmap, LBMI_BASEADDRESS,
(ULONG) & surface->pixels,
LBMI_BYTESPERROW, (ULONG) & pitch, TAG_DONE)))
return -1;
// surface->pitch e' a 16bit!
surface->pitch = pitch;
if (!currently_fullscreen && surface == SDL_VideoSurface)
surface->pixels =
((char *) surface->pixels) +
(surface->pitch *
(SDL_Window->BorderTop + SDL_Window->TopEdge) +
surface->format->BytesPerPixel *
(SDL_Window->BorderLeft + SDL_Window->LeftEdge));
}
D(
else
bug("Already locked!!!\n"));
}
return (0);
}
void
CGX_UnlockHWSurface(_THIS, SDL_Surface * surface)
{
if (surface->hwdata && surface->hwdata->lock) {
UnLockBitMap(surface->hwdata->lock);
surface->hwdata->lock = NULL;
// surface->pixels=NULL;
}
}
int
CGX_FlipHWSurface(_THIS, SDL_Surface * surface)
{
static int current = 0;
if (this->hidden->dbuffer) {
if (!SafeChange) {
Wait(disp_sigbit);
// Non faccio nulla, vuoto solo la porta
while (GetMsg(dispport) != NULL);
SafeChange = TRUE;
}
if (ChangeScreenBuffer(SDL_Display, this->hidden->SB[current ^ 1])) {
surface->hwdata->bmap = SDL_RastPort->BitMap =
this->hidden->SB[current]->sb_BitMap;
SafeChange = FALSE;
SafeDisp = FALSE;
current ^= 1;
}
if (!SafeDisp) {
Wait(safe_sigbit);
while (GetMsg(safeport) != NULL);
SafeDisp = TRUE;
}
}
return (0);
}
/* Byte-swap the pixels in the display image */
static void
CGX_SwapAllPixels(SDL_Surface * screen)
{
int x, y;
switch (screen->format->BytesPerPixel) {
case 2:
{
Uint16 *spot;
for (y = 0; y < screen->h; ++y) {
spot = (Uint16 *) ((Uint8 *) screen->pixels +
y * screen->pitch);
for (x = 0; x < screen->w; ++x, ++spot) {
*spot = SDL_Swap16(*spot);
}
}
}
break;
case 4:
{
Uint32 *spot;
for (y = 0; y < screen->h; ++y) {
spot = (Uint32 *) ((Uint8 *) screen->pixels +
y * screen->pitch);
for (x = 0; x < screen->w; ++x, ++spot) {
*spot = SDL_Swap32(*spot);
}
}
}
break;
default:
/* should never get here */
break;
}
}
static void
CGX_SwapPixels(SDL_Surface * screen, int numrects, SDL_Rect * rects)
{
int i;
int x, minx, maxx;
int y, miny, maxy;
switch (screen->format->BytesPerPixel) {
case 2:
{
Uint16 *spot;
for (i = 0; i < numrects; ++i) {
minx = rects[i].x;
maxx = rects[i].x + rects[i].w;
miny = rects[i].y;
maxy = rects[i].y + rects[i].h;
for (y = miny; y < maxy; ++y) {
spot = (Uint16 *) ((Uint8 *) screen->pixels +
y * screen->pitch + minx * 2);
for (x = minx; x < maxx; ++x, ++spot) {
*spot = SDL_Swap16(*spot);
}
}
}
}
break;
case 4:
{
Uint32 *spot;
for (i = 0; i < numrects; ++i) {
minx = rects[i].x;
maxx = rects[i].x + rects[i].w;
miny = rects[i].y;
maxy = rects[i].y + rects[i].h;
for (y = miny; y < maxy; ++y) {
spot = (Uint32 *) ((Uint8 *) screen->pixels +
y * screen->pitch + minx * 4);
for (x = minx; x < maxx; ++x, ++spot) {
*spot = SDL_Swap32(*spot);
}
}
}
}
break;
default:
/* should never get here */
break;
}
}
#ifdef __SASC
#define USE_WPA WritePixelArray
#else
void
USE_WPA(char *a, int b, int c, int d, struct RastPort *e, int f, int g,
int h, int i, Uint32 l)
{
WritePixelArray(a, b, c, d, e, f, g, h, i, l);
}
#endif
static void
CGX_FakeUpdate(_THIS, int numrects, SDL_Rect * rects)
{
}
static void
CGX_NormalUpdate(_THIS, int numrects, SDL_Rect * rects)
{
int i, format, customroutine = 0;
#ifndef USE_CGX_WRITELUTPIXEL
int bpp;
#endif
if (this->hidden->same_format && !use_picasso96) {
format = RECTFMT_RAW;
} else
switch (this->screen->format->BytesPerPixel) {
case 4:
format = RECTFMT_RGBA;
break;
case 3:
format = RECTFMT_RGB;
break;
case 2:
customroutine = 1;
break;
case 1:
// D(bug("soft depth: 8 hardbpp: %ld\n",this->hidden->depth));
if (this->hidden->depth > 8) {
#ifndef USE_CGX_WRITELUTPIXEL
if (this->hidden->depth > 32)
customroutine = 4;
else if (this->hidden->depth > 16) {
bpp = this->hidden->BytesPerPixel; // That one is the only one that needs bpp
customroutine = 2; // The slow one!
} else
customroutine = 3;
#else
customroutine = 2;
#endif
// format=RECTFMT_LUT8; Vecchia funzione x usare la WritePixelArray.
} else
customroutine = 1;
break;
default:
D(bug("Unable to blit this surface!\n"));
return;
}
/* Check for endian-swapped X server, swap if necessary (VERY slow!) */
if (swap_pixels && ((this->screen->format->BytesPerPixel % 2) == 0)) {
D(bug("Software Swapping! SLOOOW!\n"));
CGX_SwapPixels(this->screen, numrects, rects);
for (i = 0; i < numrects; ++i) {
if (!rects[i].w) { /* Clipped? */
continue;
}
USE_WPA(this->screen->pixels, rects[i].x, rects[i].y,
this->screen->pitch, SDL_RastPort,
SDL_Window->BorderLeft + rects[i].x,
SDL_Window->BorderTop + rects[i].y, rects[i].w,
rects[i].h, format);
}
CGX_SwapPixels(this->screen, numrects, rects);
} else if (customroutine == 2) {
#ifdef USE_CGX_WRITELUTPIXEL
for (i = 0; i < numrects; ++i) {
if (!rects[i].w) { /* Clipped? */
continue;
}
WLUT(this->screen->pixels, rects[i].x, rects[i].y,
this->screen->pitch, SDL_RastPort, SDL_XPixels,
SDL_Window->BorderLeft + rects[i].x,
SDL_Window->BorderTop + rects[i].y, rects[i].w,
rects[i].h, CTABFMT_XRGB8);
}
#else
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if (handle =
LockBitMapTags(SDL_RastPort->BitMap, LBMI_BASEADDRESS,
&bm_address, LBMI_BYTESPERROW, &destpitch,
TAG_DONE)) {
int srcwidth;
unsigned char *destbase;
register int j, k, t;
register unsigned char *mask, *dst;
register unsigned char *src, *dest;
// Aggiungo il bordo della finestra se sono fullscreen.
if (currently_fullscreen)
destbase = bm_address;
else
destbase =
bm_address + (SDL_Window->TopEdge +
SDL_Window->BorderTop) * destpitch +
(SDL_Window->BorderLeft +
SDL_Window->LeftEdge) * this->hidden->BytesPerPixel;
for (i = 0; i < numrects; ++i) {
srcwidth = rects[i].w;
if (!srcwidth) { /* Clipped? */
continue;
}
dest = destbase + rects[i].x * this->hidden->BytesPerPixel;
dest += (rects[i].y * destpitch);
src = ((char *) (this->screen->pixels)) + rects[i].x;
src += (rects[i].y * this->screen->pitch);
for (j = rects[i].h; j; --j) {
dst = dest;
// SLOW routine, used for 8->24 bit mapping
for (k = 0; k < srcwidth; k++) {
mask = (unsigned char *) (&SDL_XPixels[src[k]]);
for (t = 0; t < bpp; t++) {
dst[t] = mask[t];
}
dst += bpp;
}
src += this->screen->pitch;
dest += destpitch;
}
}
UnLockBitMap(handle);
}
} else if (customroutine == 3) {
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if (handle =
LockBitMapTags(SDL_RastPort->BitMap, LBMI_BASEADDRESS,
&bm_address, LBMI_BYTESPERROW, &destpitch,
TAG_DONE)) {
int srcwidth;
unsigned char *destbase;
register int j, k;
register unsigned char *src, *dest;
register Uint16 *destl, *srcl;
if (currently_fullscreen)
destbase = bm_address;
else
destbase =
bm_address + (SDL_Window->TopEdge +
SDL_Window->BorderTop) * destpitch +
(SDL_Window->BorderLeft +
SDL_Window->LeftEdge) * this->hidden->BytesPerPixel;
for (i = 0; i < numrects; ++i) {
srcwidth = rects[i].w;
if (!srcwidth) { /* Clipped? */
continue;
}
dest = destbase + rects[i].x * this->hidden->BytesPerPixel;
dest += (rects[i].y * destpitch);
src = ((char *) (this->screen->pixels)) + rects[i].x;
src += (rects[i].y * this->screen->pitch);
// This is the fast, well not too slow, remapping code for 16bit displays
for (j = rects[i].h; j; --j) {
destl = (Uint16 *) dest;
for (k = 0; k < srcwidth; k++) {
srcl = (Uint16 *) & SDL_XPixels[src[k]];
*destl = *srcl;
destl++;
}
src += this->screen->pitch;
dest += destpitch;
}
}
UnLockBitMap(handle);
}
} else if (customroutine == 4) {
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if (handle =
LockBitMapTags(SDL_RastPort->BitMap, LBMI_BASEADDRESS,
&bm_address, LBMI_BYTESPERROW, &destpitch,
TAG_DONE)) {
int srcwidth;
unsigned char *destbase;
register int j, k;
register unsigned char *src, *dest;
register Uint32 *destl, *srcl;
if (currently_fullscreen)
destbase = bm_address;
else
destbase =
bm_address + (SDL_Window->TopEdge +
SDL_Window->BorderTop) * destpitch +
(SDL_Window->BorderLeft +
SDL_Window->LeftEdge) * this->hidden->BytesPerPixel;
for (i = 0; i < numrects; ++i) {
srcwidth = rects[i].w;
if (!srcwidth) { /* Clipped? */
continue;
}
dest = destbase + rects[i].x * this->hidden->BytesPerPixel;
dest += (rects[i].y * destpitch);
src = ((char *) (this->screen->pixels)) + rects[i].x;
src += (rects[i].y * this->screen->pitch);
// This is the fast, well not too slow, remapping code for 32bit displays
for (j = rects[i].h; j; --j) {
destl = (Uint32 *) dest;
for (k = 0; k < srcwidth; k++) {
srcl = (Uint32 *) & SDL_XPixels[src[k]];
*destl = *srcl;
destl++;
}
src += this->screen->pitch;
dest += destpitch;
}
}
UnLockBitMap(handle);
}
#endif
} else if (customroutine) {
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
// D(bug("Using customroutine!\n"));
if (handle =
LockBitMapTags(SDL_RastPort->BitMap, LBMI_BASEADDRESS,
(ULONG) & bm_address, LBMI_BYTESPERROW,
(ULONG) & destpitch, TAG_DONE)) {
unsigned char *destbase;
register int j, srcwidth;
register unsigned char *src, *dest;
// Aggiungo il bordo della finestra se sono fullscreen.
if (currently_fullscreen)
destbase = bm_address;
else
destbase =
bm_address + (SDL_Window->TopEdge +
SDL_Window->BorderTop) * destpitch +
(SDL_Window->BorderLeft +
SDL_Window->LeftEdge) *
this->screen->format->BytesPerPixel;
for (i = 0; i < numrects; ++i) {
srcwidth = rects[i].w;
if (!srcwidth) { /* Clipped? */
continue;
}
dest =
destbase +
rects[i].x * this->screen->format->BytesPerPixel;
dest += (rects[i].y * destpitch);
src =
((char *) (this->screen->pixels)) +
rects[i].x * this->screen->format->BytesPerPixel;
src += (rects[i].y * this->screen->pitch);
srcwidth *= this->screen->format->BytesPerPixel;
// D(bug("Rects: %ld,%ld %ld,%ld Src:%lx Dest:%lx\n",rects[i].x,rects[i].y,rects[i].w,rects[i].h,src,dest));
for (j = rects[i].h; j; --j) {
SDL_memcpy(dest, src, srcwidth);
src += this->screen->pitch;
dest += destpitch;
}
}
UnLockBitMap(handle);
// D(bug("Rectblit addr: %lx pitch: %ld rects:%ld srcptr: %lx srcpitch: %ld\n",bm_address,destpitch,numrects,this->screen->pixels,this->screen->pitch));
}
} else {
for (i = 0; i < numrects; ++i) {
if (!rects[i].w) { /* Clipped? */
continue;
}
USE_WPA(this->screen->pixels, rects[i].x, rects[i].y,
this->screen->pitch, SDL_RastPort,
SDL_Window->BorderLeft + rects[i].x,
SDL_Window->BorderTop + rects[i].y, rects[i].w,
rects[i].h, format);
}
}
}
void
CGX_RefreshDisplay(_THIS)
{
int format, customroutine = 0;
#ifndef USE_CGX_WRITELUTPIXEL
int bpp;
#endif
/* Don't refresh a display that doesn't have an image (like GL) */
if (!SDL_Ximage) {
return;
}
if (this->hidden->same_format && !use_picasso96) {
format = RECTFMT_RAW;
} else
switch (this->screen->format->BytesPerPixel) {
case 4:
format = RECTFMT_RGBA;
break;
case 3:
format = RECTFMT_RGB;
break;
case 2:
customroutine = 1;
break;
case 1:
// D(bug("soft depth: 8 hardbpp: %ld\n",this->hidden->depth));
if (this->hidden->depth > 8) {
#ifndef USE_CGX_WRITELUTPIXEL
if (this->hidden->depth > 32)
customroutine = 4;
else if (this->hidden->depth > 16) {
bpp = this->hidden->BytesPerPixel; // That one is the only one that needs bpp
customroutine = 2; // The slow one!
} else
customroutine = 3;
#else
customroutine = 2;
#endif
// format=RECTFMT_LUT8;
} else
customroutine = 1;
break;
}
/* Check for endian-swapped X server, swap if necessary */
if (swap_pixels && ((this->screen->format->BytesPerPixel % 2) == 0)) {
CGX_SwapAllPixels(this->screen);
USE_WPA(this->screen->pixels, 0, 0, this->screen->pitch,
SDL_RastPort, SDL_Window->BorderLeft,
SDL_Window->BorderTop, this->screen->w, this->screen->h,
format);
CGX_SwapAllPixels(this->screen);
} else if (customroutine == 2) {
#ifdef USE_CGX_WRITELUTPIXEL
WLUT(this->screen->pixels, 0, 0, this->screen->pitch,
SDL_RastPort, SDL_XPixels, SDL_Window->BorderLeft,
SDL_Window->BorderTop, this->screen->w, this->screen->h,
CTABFMT_XRGB8);
#else
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if (handle =
LockBitMapTags(SDL_RastPort->BitMap, LBMI_BASEADDRESS,
(ULONG) & bm_address, LBMI_BYTESPERROW,
(ULONG) & destpitch, TAG_DONE)) {
register int j, k, t;
register unsigned char *mask, *dst;
register unsigned char *src, *dest;
// Aggiungo il bordo della finestra se sono fullscreen.
if (!currently_fullscreen)
dest =
bm_address + (SDL_Window->TopEdge +
SDL_Window->BorderTop) * destpitch +
(SDL_Window->BorderLeft +
SDL_Window->LeftEdge) * this->hidden->BytesPerPixel;
else
dest = bm_address;
src = this->screen->pixels;
for (j = this->screen->h; j; --j) {
dst = dest;
// SLOW routine, used for 8->24 bit mapping
for (k = 0; k < this->screen->w; k++) {
mask = (unsigned char *) (&SDL_XPixels[src[k]]);
for (t = 0; t < bpp; t++) {
dst[t] = mask[t];
}
dst += bpp;
}
src += this->screen->pitch;
dest += destpitch;
}
UnLockBitMap(handle);
}
} else if (customroutine == 3) {
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if (handle =
LockBitMapTags(SDL_RastPort->BitMap, LBMI_BASEADDRESS,
(ULONG) & bm_address, LBMI_BYTESPERROW,
(ULONG) & destpitch, TAG_DONE)) {
register int j, k;
register unsigned char *src, *dest;
register Uint16 *destl, *srcl;
if (!currently_fullscreen)
dest =
bm_address + (SDL_Window->TopEdge +
SDL_Window->BorderTop) * destpitch +
(SDL_Window->BorderLeft +
SDL_Window->LeftEdge) * this->hidden->BytesPerPixel;
else
dest = bm_address;
src = this->screen->pixels;
// This is the fast, well not too slow, remapping code for 16bit displays
for (j = this->screen->h; j; --j) {
destl = (Uint16 *) dest;
for (k = 0; k < this->screen->w; k++) {
srcl = (Uint16 *) & SDL_XPixels[src[k]];
*destl = *srcl;
destl++;
}
src += this->screen->pitch;
dest += destpitch;
}
UnLockBitMap(handle);
}
} else if (customroutine == 4) {
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if (handle =
LockBitMapTags(SDL_RastPort->BitMap, LBMI_BASEADDRESS,
(ULONG) & bm_address, LBMI_BYTESPERROW,
(ULONG) & destpitch, TAG_DONE)) {
register int j, k;
register unsigned char *src, *dest;
register Uint32 *destl, *srcl;
if (!currently_fullscreen)
dest =
bm_address + (SDL_Window->TopEdge +
SDL_Window->BorderTop) * destpitch +
(SDL_Window->BorderLeft +
SDL_Window->LeftEdge) * this->hidden->BytesPerPixel;
else
dest = bm_address;
src = this->screen->pixels;
// This is the fast, well not too slow, remapping code for 32bit displays
for (j = this->screen->h; j; --j) {
destl = (Uint32 *) dest;
for (k = 0; k < this->screen->w; k++) {
srcl = (Uint32 *) & SDL_XPixels[src[k]];
*destl = *srcl;
destl++;
}
src += this->screen->pitch;
dest += destpitch;
}
UnLockBitMap(handle);
}
#endif
} else if (customroutine) {
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if (handle = LockBitMapTags(SDL_RastPort->BitMap,
LBMI_BASEADDRESS, (ULONG) & bm_address,
LBMI_BYTESPERROW, (ULONG) & destpitch,
TAG_DONE)) {
register int j;
register unsigned char *src, *dest;
if (!currently_fullscreen)
dest =
bm_address + (SDL_Window->TopEdge +
SDL_Window->BorderTop) * destpitch +
(SDL_Window->BorderLeft +
SDL_Window->LeftEdge) *
this->screen->format->BytesPerPixel;
else
dest = bm_address;
src = this->screen->pixels;
// D(bug("addr: %lx pitch: %ld src:%lx srcpitch: %ld\n",dest,destpitch,this->screen->pixels,this->screen->pitch));
if (this->screen->pitch == destpitch) {
SDL_memcpy(dest, src, this->screen->pitch * this->screen->h);
} else {
for (j = this->screen->h; j; --j) {
SDL_memcpy(dest, src, this->screen->pitch);
src += this->screen->pitch;
dest += destpitch;
}
}
UnLockBitMap(handle);
}
} else {
USE_WPA(this->screen->pixels, 0, 0, this->screen->pitch,
SDL_RastPort, SDL_Window->BorderLeft,
SDL_Window->BorderTop, this->screen->w, this->screen->h,
format);
}
}
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
#include "SDL_cgxvideo.h"
extern int CGX_SetupImage(_THIS, SDL_Surface * screen);
extern void CGX_DestroyImage(_THIS, SDL_Surface * screen);
extern int CGX_ResizeImage(_THIS, SDL_Surface * screen, Uint32 flags);
extern int CGX_AllocHWSurface(_THIS, SDL_Surface * surface);
extern void CGX_FreeHWSurface(_THIS, SDL_Surface * surface);
extern int CGX_LockHWSurface(_THIS, SDL_Surface * surface);
extern void CGX_UnlockHWSurface(_THIS, SDL_Surface * surface);
extern int CGX_FlipHWSurface(_THIS, SDL_Surface * surface);
extern void CGX_RefreshDisplay(_THIS);
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
/* Utilities for getting and setting the X display mode */
#include "SDL_timer.h"
#include "SDL_events.h"
#include "../../events/SDL_events_c.h"
#include "SDL_cgxvideo.h"
#include "SDL_cgxwm_c.h"
#include "SDL_cgxmodes_c.h"
#define CGX_DEBUG
static void
set_best_resolution(_THIS, int width, int height)
{
Uint32 idok;
int depth = 8;
if (SDL_Display)
depth =
GetCyberMapAttr(SDL_Display->RastPort.BitMap, CYBRMATTR_DEPTH);
idok = BestCModeIDTags(CYBRBIDTG_NominalWidth, width,
CYBRBIDTG_NominalHeight, height,
CYBRBIDTG_Depth, depth, TAG_DONE);
if (idok != INVALID_ID) {
if (SDL_Display) {
if (currently_fullscreen)
CloseScreen(SDL_Display);
else
UnlockPubScreen(NULL, SDL_Display);
}
SDL_Display = GFX_Display =
OpenScreenTags(NULL, SA_Width, width, SA_Height, height,
SA_Depth, depth, SA_DisplayID, idok,
SA_ShowTitle, FALSE, TAG_DONE);
}
}
static void
get_real_resolution(_THIS, int *w, int *h)
{
*w = /*SDL_Display->Width */ SDL_Window->Width - SDL_Window->BorderLeft -
SDL_Window->BorderRight;
*h = /*SDL_Display->Height */ SDL_Window->Height -
SDL_Window->BorderBottom - SDL_Window->BorderTop;
}
static void
move_cursor_to(_THIS, int x, int y)
{
/* XWarpPointer(SDL_Display, None, SDL_Root, 0, 0, 0, 0, x, y); */
/* DA FARE! */
}
static void
add_visual(_THIS, int depth, int class)
{
Uint32 tID;
tID = BestCModeIDTags(CYBRBIDTG_Depth, depth,
CYBRBIDTG_NominalWidth, 640,
CYBRBIDTG_NominalHeight, 480, TAG_DONE);
if (tID != INVALID_ID) {
int n = this->hidden->nvisuals;
this->hidden->visuals[n].depth = depth;
this->hidden->visuals[n].visual = tID;
this->hidden->visuals[n].bpp = GetCyberIDAttr(CYBRIDATTR_BPPIX, tID);
this->hidden->nvisuals++;
}
}
#define TrueColor 1
#define PseudoColor 2
int
CGX_GetVideoModes(_THIS)
{
int i;
ULONG nextid;
int nmodes = 0;
SDL_modelist = NULL;
nextid = NextDisplayInfo(INVALID_ID);
while (nextid != INVALID_ID) {
if (IsCyberModeID(nextid)) {
DisplayInfoHandle h;
if (h = FindDisplayInfo(nextid)) {
struct DimensionInfo info;
if (GetDisplayInfoData
(h, (char *) &info, sizeof(struct DimensionInfo),
DTAG_DIMS, NULL)) {
int ok = 0;
for (i = 0; i < nmodes; i++) {
if (SDL_modelist[i]->w == (info.Nominal.MaxX + 1)
&& SDL_modelist[i]->h == (info.Nominal.MaxY + 1))
ok = 1;
}
if (!ok) {
nmodes++;
SDL_modelist =
(SDL_Rect **) SDL_realloc(SDL_modelist,
(nmodes +
1) *
sizeof(SDL_Rect *));
SDL_modelist[nmodes] = NULL;
if (SDL_modelist) {
SDL_modelist[nmodes - 1] = (SDL_Rect *)
SDL_malloc(sizeof(SDL_Rect));
if (SDL_modelist[nmodes - 1] == NULL)
break;
SDL_modelist[nmodes - 1]->x = 0;
SDL_modelist[nmodes - 1]->y = 0;
SDL_modelist[nmodes - 1]->w =
info.Nominal.MaxX + 1;
SDL_modelist[nmodes - 1]->h =
info.Nominal.MaxY + 1;
}
}
}
}
}
nextid = NextDisplayInfo(nextid);
}
this->hidden->nvisuals = 0;
/* Search for the visuals in deepest-first order, so that the first
will be the richest one */
add_visual(this, 32, TrueColor);
add_visual(this, 24, TrueColor);
add_visual(this, 16, TrueColor);
add_visual(this, 15, TrueColor);
add_visual(this, 8, PseudoColor);
if (this->hidden->nvisuals == 0) {
SDL_SetError("Found no sufficiently capable CGX visuals");
return -1;
}
if (SDL_modelist == NULL) {
SDL_modelist = (SDL_Rect **) SDL_malloc((1 + 1) * sizeof(SDL_Rect *));
i = 0;
if (SDL_modelist) {
SDL_modelist[i] = (SDL_Rect *) SDL_malloc(sizeof(SDL_Rect));
if (SDL_modelist[i]) {
SDL_modelist[i]->x = 0;
SDL_modelist[i]->y = 0;
SDL_modelist[i]->w = SDL_Display->Width;
SDL_modelist[i]->h = SDL_Display->Height;
++i;
}
SDL_modelist[i] = NULL;
}
}
D(if (SDL_modelist) {
bug("CGX video mode list: (%ld)\n", nmodes);
for (i = 0; SDL_modelist[i]; ++i) {
bug("\t%ld x %ld\n", SDL_modelist[i]->w, SDL_modelist[i]->h);}
}
);
D( {
bug("CGX visuals list: (%ld)\n", this->hidden->nvisuals);
for (i = 0; i < this->hidden->nvisuals; i++)
bug("\t%lx - depth: %ld bpp: %ld\n",
this->hidden->visuals[i].visual,
this->hidden->visuals[i].depth, this->hidden->visuals[i].bpp);}
);
return 0;
}
int
CGX_SupportedVisual(_THIS, SDL_PixelFormat * format)
{
int i;
for (i = 0; i < this->hidden->nvisuals; i++) {
if (this->hidden->visuals[i].depth == format->BitsPerPixel) // Era bpp
return 1;
}
return 0;
}
SDL_Rect **
CGX_ListModes(_THIS, SDL_PixelFormat * format, Uint32 flags)
{
if (CGX_SupportedVisual(this, format)) {
if (flags & SDL_FULLSCREEN) {
return (SDL_modelist);
} else {
return ((SDL_Rect **) - 1);
}
} else {
return ((SDL_Rect **) 0);
}
}
void
CGX_FreeVideoModes(_THIS)
{
int i;
if (SDL_modelist) {
for (i = 0; SDL_modelist[i]; ++i) {
SDL_free(SDL_modelist[i]);
}
SDL_free(SDL_modelist);
SDL_modelist = NULL;
}
}
int
CGX_ResizeFullScreen(_THIS)
{
int x, y;
int real_w, real_h;
if (currently_fullscreen) {
/* Per ora non faccio nulla qui */
}
return (1);
}
void
_QueueEnterFullScreen(_THIS)
{
}
int
CGX_EnterFullScreen(_THIS)
{
int okay;
Uint32 saved_flags;
okay = 1;
saved_flags = this->screen->flags;
if (!currently_fullscreen) {
int real_w, real_h;
/* Map the fullscreen window to blank the screen */
get_real_resolution(this, &real_w, &real_h);
CGX_DestroyWindow(this, this->screen);
set_best_resolution(this, real_w, real_h);
currently_fullscreen = 1;
this->screen->flags = saved_flags;
CGX_CreateWindow(this, this->screen, real_w, real_h,
GetCyberMapAttr(SDL_Display->RastPort.BitMap,
CYBRMATTR_DEPTH),
this->screen->flags);
/* Set the new resolution */
okay = CGX_ResizeFullScreen(this);
if (!okay) {
CGX_LeaveFullScreen(this);
}
/* Set the colormap */
/*
if ( SDL_XColorMap ) {
XInstallColormap(SDL_Display, SDL_XColorMap);
}
*/
}
// CGX_GrabInputNoLock(this, this->input_grab | SDL_GRAB_FULLSCREEN);
return (okay);
}
int
CGX_LeaveFullScreen(_THIS)
{
if (currently_fullscreen) {
int width, height;
if (SDL_Window) {
CloseWindow(SDL_Window);
SDL_Window = NULL;
}
CloseScreen(SDL_Display);
GFX_Display = SDL_Display = LockPubScreen(NULL);
currently_fullscreen = 0;
CGX_CreateWindow(this, this->screen, this->screen->w,
this->screen->h,
GetCyberMapAttr(SDL_Display->RastPort.BitMap,
CYBRMATTR_DEPTH),
this->screen->flags);
CGX_ResizeImage(this, this->screen, 0L);
}
return (0);
}
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
/* Utilities for getting and setting the X display mode */
#include "SDL_cgxvideo.h"
/* Define this if you want to grab the keyboard in fullscreen mode.
If you do not define this, SDL will return from SDL_SetVideoMode()
immediately, but will not actually go fullscreen until the window
manager is idle.
*/
#define GRAB_FULLSCREEN
extern int CGX_GetVideoModes(_THIS);
extern SDL_Rect **CGX_ListModes(_THIS, SDL_PixelFormat * format,
Uint32 flags);
extern void CGX_FreeVideoModes(_THIS);
extern int CGX_ResizeFullScreen(_THIS);
/*
extern void CGX_WaitMapped(_THIS, Window win);
extern void CGX_WaitUnmapped(_THIS, Window win);
extern void CGX_QueueEnterFullScreen(_THIS);
*/
extern int CGX_EnterFullScreen(_THIS);
extern int CGX_LeaveFullScreen(_THIS);
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
/*
* CGX based SDL video driver implementation by Gabriele Greco
* gabriele.greco@aruba.it
*/
#include "SDL_endian.h"
#include "SDL_timer.h"
#include "SDL_thread.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_cgxgl_c.h"
#include "SDL_cgxvideo.h"
#include "SDL_cgxwm_c.h"
#include "SDL_amigamouse_c.h"
#include "SDL_amigaevents_c.h"
#include "SDL_cgxmodes_c.h"
#include "SDL_cgximage_c.h"
/* Initialization/Query functions */
static int CGX_VideoInit(_THIS, SDL_PixelFormat * vformat);
static SDL_Surface *CGX_SetVideoMode(_THIS, SDL_Surface * current, int width,
int height, int bpp, Uint32 flags);
static int CGX_ToggleFullScreen(_THIS, int on);
static void CGX_UpdateMouse(_THIS);
static int CGX_SetColors(_THIS, int firstcolor, int ncolors,
SDL_Color * colors);
static void CGX_VideoQuit(_THIS);
/* CGX driver bootstrap functions */
struct Library *CyberGfxBase = NULL;
struct IntuitionBase *IntuitionBase = NULL;
struct GfxBase *GfxBase = NULL;
int
CGX_SetGamma(_THIS, float red, float green, float blue)
{
SDL_SetError("Gamma correction not supported");
return -1;
}
int
CGX_GetGamma(_THIS, float red, float green, float blue)
{
SDL_SetError("Gamma correction not supported");
return -1;
}
int
CGX_SetGammaRamp(_THIS, Uint16 * ramp)
{
#if 0
Int i, ncolors;
XColor xcmap[256];
/* See if actually setting the gamma is supported */
if (SDL_Visual->class != DirectColor) {
SDL_SetError("Gamma correction not supported on this visual");
return (-1);
}
/* Calculate the appropriate palette for the given gamma ramp */
ncolors = SDL_Visual->map_entries;
for (i = 0; i < ncolors; ++i) {
Uint8 c = (256 * i / ncolors);
xcmap[i].pixel = SDL_MapRGB(this->screen->format, c, c, c);
xcmap[i].red = ramp[0 * 256 + c];
xcmap[i].green = ramp[1 * 256 + c];
xcmap[i].blue = ramp[2 * 256 + c];
xcmap[i].flags = (DoRed | DoGreen | DoBlue);
}
XStoreColors(GFX_Display, SDL_XColorMap, xcmap, ncolors);
XSync(GFX_Display, False);
return (0);
#else
SDL_SetError("Gamma correction not supported on this visual");
return (-1);
#endif
}
static void
DestroyScreen(_THIS)
{
if (currently_fullscreen) {
if (this->hidden->dbuffer) {
extern struct MsgPort *safeport, *dispport;
this->hidden->dbuffer = 0;
if (safeport) {
while (GetMsg(safeport) != NULL);
DeleteMsgPort(safeport);
}
if (dispport) {
while (GetMsg(dispport) != NULL);
DeleteMsgPort(dispport);
}
this->hidden->SB[0]->sb_DBufInfo->dbi_SafeMessage.
mn_ReplyPort =
this->hidden->SB[0]->sb_DBufInfo->dbi_DispMessage.
mn_ReplyPort = NULL;
this->hidden->SB[1]->sb_DBufInfo->dbi_SafeMessage.
mn_ReplyPort =
this->hidden->SB[1]->sb_DBufInfo->dbi_DispMessage.
mn_ReplyPort = NULL;
if (this->hidden->SB[1])
FreeScreenBuffer(SDL_Display, this->hidden->SB[1]);
if (this->hidden->SB[0])
FreeScreenBuffer(SDL_Display, this->hidden->SB[0]);
this->hidden->SB[0] = this->hidden->SB[1] = NULL;
if (SDL_RastPort && SDL_RastPort != &SDL_Display->RastPort)
SDL_free(SDL_RastPort);
SDL_RastPort = NULL;
}
CloseScreen(GFX_Display);
currently_fullscreen = 0;
} else if (GFX_Display)
UnlockPubScreen(NULL, GFX_Display);
GFX_Display = NULL;
}
static int
CGX_Available(void)
{
struct Library *l;
l = OpenLibrary("cybergraphics.library", 0L);
if (l != NULL) {
D(bug("CGX video device AVAILABLE\n"));
CloseLibrary(l);
}
D(
else
bug("**CGX video device UNAVAILABLE\n"));
return (l != NULL);
}
static void
CGX_DeleteDevice(SDL_VideoDevice * device)
{
if (device) {
if (device->hidden) {
SDL_free(device->hidden);
}
if (device->gl_data) {
SDL_free(device->gl_data);
}
SDL_free(device);
}
}
static SDL_VideoDevice *
CGX_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));
device->gl_data = (struct SDL_PrivateGLData *)
SDL_malloc((sizeof *device->gl_data));
}
if ((device == NULL) || (device->hidden == NULL) ||
(device->gl_data == NULL)) {
D(bug("Unable to create video device!\n"));
SDL_OutOfMemory();
CGX_DeleteDevice(device);
return (0);
}
SDL_memset(device->hidden, 0, sizeof(*device->hidden));
SDL_memset(device->gl_data, 0, sizeof(*device->gl_data));
/* Set the driver flags */
device->handles_any_size = 1;
/* Set the function pointers */
device->VideoInit = CGX_VideoInit;
device->ListModes = CGX_ListModes;
device->SetVideoMode = CGX_SetVideoMode;
device->ToggleFullScreen = CGX_ToggleFullScreen;
device->UpdateMouse = CGX_UpdateMouse;
device->SetColors = CGX_SetColors;
device->UpdateRects = NULL;
device->VideoQuit = CGX_VideoQuit;
device->AllocHWSurface = CGX_AllocHWSurface;
device->CheckHWBlit = CGX_CheckHWBlit;
device->FillHWRect = CGX_FillHWRect;
device->SetHWColorKey = CGX_SetHWColorKey;
device->SetHWAlpha = NULL;
device->LockHWSurface = CGX_LockHWSurface;
device->UnlockHWSurface = CGX_UnlockHWSurface;
device->FlipHWSurface = CGX_FlipHWSurface;
device->FreeHWSurface = CGX_FreeHWSurface;
device->SetGamma = CGX_SetGamma;
device->GetGamma = CGX_GetGamma;
device->SetGammaRamp = CGX_SetGammaRamp;
device->GetGammaRamp = NULL;
#if SDL_VIDEO_OPENGL
device->GL_LoadLibrary = CGX_GL_LoadLibrary;
device->GL_GetProcAddress = CGX_GL_GetProcAddress;
device->GL_GetAttribute = CGX_GL_GetAttribute;
device->GL_MakeCurrent = CGX_GL_MakeCurrent;
device->GL_SwapBuffers = CGX_GL_SwapBuffers;
#endif
device->SetIcon = CGX_SetIcon;
device->SetCaption = CGX_SetCaption;
device->IconifyWindow = NULL; /* CGX_IconifyWindow; */
device->GrabInput = NULL /* CGX_GrabInput */ ;
device->GetWMInfo = CGX_GetWMInfo;
device->FreeWMCursor = amiga_FreeWMCursor;
device->CreateWMCursor = amiga_CreateWMCursor;
device->ShowWMCursor = amiga_ShowWMCursor;
device->WarpWMCursor = amiga_WarpWMCursor;
device->CheckMouseMode = amiga_CheckMouseMode;
device->InitOSKeymap = amiga_InitOSKeymap;
device->PumpEvents = amiga_PumpEvents;
device->free = CGX_DeleteDevice;
return device;
}
VideoBootStrap CGX_bootstrap = {
"CGX", "AmigaOS CyberGraphics", CGX_Available, CGX_CreateDevice
};
Uint32
MakeBitMask(_THIS, int type, int format, int *bpp)
{
D(if (type == 0) bug("REAL pixel format: "));
if (this->hidden->depth == *bpp) {
switch (format) {
case PIXFMT_LUT8:
D(if (type == 0) bug("LUT8\n"));
return 0;
case PIXFMT_BGR15:
case PIXFMT_RGB15PC:
switch (type) {
case 0:
D(bug("RGB15PC/BGR15\n"));
return 31;
case 1:
return 992;
case 2:
return 31744;
}
case PIXFMT_RGB15:
case PIXFMT_BGR15PC:
switch (type) {
case 0:
D(bug("RGB15/BGR15PC\n"));
return 31744;
case 1:
return 992;
case 2:
return 31;
}
case PIXFMT_BGR16PC:
case PIXFMT_RGB16:
switch (type) {
case 0:
D(bug("RGB16PC\n"));
return 63488;
case 1:
return 2016;
case 2:
return 31;
}
case PIXFMT_BGR16:
case PIXFMT_RGB16PC:
switch (type) {
case 0:
D(bug("RGB16PC/BGR16\n"));
return 31;
case 1:
return 2016;
case 2:
return 63488;
}
case PIXFMT_RGB24:
switch (type) {
case 0:
D(bug("RGB24/BGR24\n"));
return 0xff0000;
case 1:
return 0xff00;
case 2:
return 0xff;
}
case PIXFMT_BGR24:
switch (type) {
case 0:
D(bug("BGR24\n"));
return 0xff;
case 1:
return 0xff00;
case 2:
return 0xff0000;
}
case PIXFMT_ARGB32:
switch (type) {
case 0:
D(bug("ARGB32\n"));
return 0xff0000;
case 1:
return 0xff00;
case 2:
return 0xff;
}
case PIXFMT_BGRA32:
switch (type) {
case 0:
D(bug("BGRA32\n"));
return 0xff00;
case 1:
return 0xff0000;
case 2:
return 0xff000000;
}
case PIXFMT_RGBA32:
switch (type) {
case 0:
D(bug("RGBA32\n"));
return 0xff000000;
case 1:
return 0xff0000;
case 2:
return 0xff00;
}
default:
D(bug("Unknown pixel format! Default to 24bit\n"));
return (Uint32) (255 << (type * 8));
}
} else {
D(if (type == 0)
bug("DIFFERENT from screen.\nAllocated screen format: "));
switch (*bpp) {
case 32:
D(if (type == 0) bug("RGBA32\n"));
switch (type) {
case 0:
return 0xff000000;
case 1:
return 0xff0000;
case 2:
return 0xff00;
}
break;
case 24:
use_truecolor:
switch (type) {
case 0:
D(bug("RGB24\n"));
return 0xff0000;
case 1:
return 0xff00;
case 2:
return 0xff;
}
case 16:
case 15:
D(if (type == 0)
bug("Not supported, switching to 24bit!\n"));
*bpp = 24;
goto use_truecolor;
break;
default:
D(if (type == 0) bug("This is a chunky display\n"));
// For chunky display mask is always 0;
return 0;
}
}
return 0;
}
static int
CGX_VideoInit(_THIS, SDL_PixelFormat * vformat)
{
int i;
struct Library *RTGBase;
D(bug("VideoInit... Opening libraries\n"));
if (!IntuitionBase) {
if (!
(IntuitionBase =
(struct IntuitionBase *) OpenLibrary("intuition.library",
39L))) {
SDL_SetError("Couldn't open intuition V39+");
return -1;
}
}
if (!GfxBase) {
if (!
(GfxBase =
(struct GfxBase *) OpenLibrary("graphics.library", 39L))) {
SDL_SetError("Couldn't open graphics V39+");
return -1;
}
}
if (!CyberGfxBase) {
if (!(CyberGfxBase = OpenLibrary("cybergraphics.library", 40L))) {
SDL_SetError("Couldn't open cybergraphics.");
return (-1);
}
}
if (RTGBase = OpenLibrary("libs:picasso96/rtg.library", 0L)) {
extern int use_picasso96;
CloseLibrary(RTGBase);
use_picasso96 = 1;
}
D(bug("Library intialized, locking screen...\n"));
SDL_Display = LockPubScreen(NULL);
if (SDL_Display == NULL) {
D(bug("Cannot lock display...\n"));
SDL_SetError("Couldn't lock the display");
return (-1);
}
this->info.current_w = SDL_Display->Width;
this->info.current_h = SDL_Display->Height;
D(bug("Checking if we are using a CGX native display...\n"));
if (!IsCyberModeID(GetVPModeID(&SDL_Display->ViewPort))) {
Uint32 okid =
BestCModeIDTags(CYBRBIDTG_NominalWidth, SDL_Display->Width,
CYBRBIDTG_NominalHeight, SDL_Display->Height,
CYBRBIDTG_Depth, 8,
TAG_DONE);
D(bug("Default visual is not CGX native!\n"));
UnlockPubScreen(NULL, SDL_Display);
GFX_Display = NULL;
if (okid != INVALID_ID) {
GFX_Display = OpenScreenTags(NULL,
SA_Width, SDL_Display->Width,
SA_Height, SDL_Display->Height,
SA_Depth, 8, SA_Quiet, TRUE,
SA_ShowTitle, FALSE,
SA_DisplayID, okid, TAG_DONE);
}
if (!GFX_Display) {
SDL_SetError("Unable to open a suited CGX display");
return -1;
} else
SDL_Display = GFX_Display;
} else
GFX_Display = SDL_Display;
/* See whether or not we need to swap pixels */
swap_pixels = 0;
// Non e' detto che sia cosi' pero', alcune schede potrebbero gestire i modi in modo differente
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) {
swap_pixels = 1;
}
D(bug("Before GetVideoModes....\n"));
/* Get the available video modes */
if (CGX_GetVideoModes(this) < 0)
return -1;
/* Determine the default screen depth:
Use the default visual (or at least one with the same depth) */
for (i = 0; i < this->hidden->nvisuals; i++)
if (this->hidden->visuals[i].depth ==
GetCyberMapAttr(SDL_Display->RastPort.BitMap, CYBRMATTR_DEPTH))
break;
if (i == this->hidden->nvisuals) {
/* default visual was useless, take the deepest one instead */
i = 0;
}
SDL_Visual = this->hidden->visuals[i].visual;
// SDL_XColorMap = SDL_DisplayColormap;
this->hidden->depth = this->hidden->visuals[i].depth;
D(bug("Init: Setting screen depth to: %ld\n", this->hidden->depth));
vformat->BitsPerPixel = this->hidden->visuals[i].depth; /* this->hidden->visuals[i].bpp; */
{
int form;
APTR handle;
struct DisplayInfo info;
if (!(handle = FindDisplayInfo(this->hidden->visuals[i].visual))) {
D(bug("Unable to get visual info...\n"));
return -1;
}
if (!GetDisplayInfoData
(handle, (char *) &info, sizeof(struct DisplayInfo), DTAG_DISP,
NULL)) {
D(bug("Unable to get visual info data...\n"));
return -1;
}
form = GetCyberIDAttr(CYBRIDATTR_PIXFMT, SDL_Visual);
// In this case I use makebitmask in a way that I'm sure I'll get PIXFMT pixel mask
if (vformat->BitsPerPixel > 8) {
vformat->Rmask = MakeBitMask(this, 0, form, &this->hidden->depth);
vformat->Gmask = MakeBitMask(this, 1, form, &this->hidden->depth);
vformat->Bmask = MakeBitMask(this, 2, form, &this->hidden->depth);
}
}
/* See if we have been passed a window to use */
/* SDL_windowid = SDL_getenv("SDL_WINDOWID"); */
SDL_windowid = NULL;
/* Create the blank cursor */
SDL_BlankCursor = AllocMem(16, MEMF_CHIP | MEMF_CLEAR);
/* Fill in some window manager capabilities */
this->info.wm_available = 1;
this->info.blit_hw = 1;
this->info.blit_hw_CC = 1;
this->info.blit_sw = 1;
this->info.blit_fill = 1;
this->info.video_mem = 2000000; // Not always true but almost any Amiga card has this memory!
this->hidden->same_format = 0;
SDL_RastPort = &SDL_Display->RastPort;
/* We're done! */
D(bug("End of CGX_VideoInit\n"));
return (0);
}
void
CGX_DestroyWindow(_THIS, SDL_Surface * screen)
{
D(bug("Destroy Window...\n"));
if (!SDL_windowid) {
/* Hide the managed window */
int was_fullscreen = 0;
/* Clean up OpenGL */
if (screen) {
screen->flags &= ~SDL_INTERNALOPENGL;
}
if (screen && (screen->flags & SDL_FULLSCREEN)) {
was_fullscreen = 1;
screen->flags &= ~SDL_FULLSCREEN;
// CGX_LeaveFullScreen(this); tolto x crash
}
/* Destroy the output window */
if (SDL_Window) {
CloseWindow(SDL_Window);
SDL_Window = NULL;
}
/* Free the colormap entries */
if (SDL_XPixels) {
int numcolors;
unsigned long pixel;
if (this->screen->format && this->hidden->depth == 8
&& !was_fullscreen) {
numcolors = 1 << this->screen->format->BitsPerPixel;
if (numcolors > 256)
numcolors = 256;
if (!was_fullscreen && this->hidden->depth == 8) {
for (pixel = 0; pixel < numcolors; pixel++) {
if (SDL_XPixels[pixel] >= 0)
ReleasePen(GFX_Display->ViewPort.
ColorMap, SDL_XPixels[pixel]);
}
}
}
SDL_free(SDL_XPixels);
SDL_XPixels = NULL;
}
}
}
static void
CGX_SetSizeHints(_THIS, int w, int h, Uint32 flags)
{
if (flags & SDL_RESIZABLE) {
WindowLimits(SDL_Window, 32, 32, 4096, 4096);
} else {
WindowLimits(SDL_Window, w, h, w, h);
}
if (flags & SDL_FULLSCREEN) {
flags &= ~SDL_RESIZABLE;
} else if (SDL_getenv("SDL_VIDEO_CENTERED")) {
int display_w, display_h;
display_w = SDL_Display->Width;
display_h = SDL_Display->Height;
ChangeWindowBox(SDL_Window,
(display_w - w - SDL_Window->BorderLeft -
SDL_Window->BorderRight) / 2,
(display_h - h - SDL_Window->BorderTop -
SDL_Window->BorderBottom) / 2,
w + SDL_Window->BorderLeft +
SDL_Window->BorderRight,
h + SDL_Window->BorderTop + SDL_Window->BorderBottom);
}
}
int
CGX_CreateWindow(_THIS, SDL_Surface * screen,
int w, int h, int bpp, Uint32 flags)
{
#if 0
int i, depth;
Uint32 vis;
#endif
D(bug("CGX_CreateWindow\n"));
/* If a window is already present, destroy it and start fresh */
if (SDL_Window) {
CGX_DestroyWindow(this, screen);
}
/* See if we have been given a window id */
if (SDL_windowid) {
SDL_Window = (struct Window *) atol(SDL_windowid);
} else {
SDL_Window = 0;
}
/* find out which visual we are going to use */
#if 0
/* questo l'ho spostato nell'apertura dello schermo, in quanto su Amiga le finestre
hanno il pixel mode degli schermi.
*/
/*if ( flags & SDL_INTERNALOPENGL ) {
SDL_SetError("OpenGL not supported by the Amiga SDL!");
return -1;
}
else { */
for (i = 0; i < this->hidden->nvisuals; i++) {
if (this->hidden->visuals[i].depth == bpp) /* era .depth */
break;
}
if (i == this->hidden->nvisuals) {
SDL_SetError("No matching visual for requested depth");
return -1; /* should never happen */
}
vis = this->hidden->visuals[i].visual;
depth = this->hidden->visuals[i].depth;
// }
SDL_Visual = vis;
this->hidden->depth = depth;
D(bug("Setting screen depth to: %ld\n", this->hidden->depth));
#endif
/* Allocate the new pixel format for this video mode */
{
Uint32 form;
APTR handle;
struct DisplayInfo info;
if (!(handle = FindDisplayInfo(SDL_Visual)))
return -1;
if (!GetDisplayInfoData
(handle, (char *) &info, sizeof(struct DisplayInfo), DTAG_DISP,
NULL))
return -1;
form = GetCyberIDAttr(CYBRIDATTR_PIXFMT, SDL_Visual);
if (flags & SDL_HWSURFACE) {
if (bpp != this->hidden->depth) {
bpp = this->hidden->depth;
D(bug("Accel forces bpp to be equal (%ld)\n", bpp));
}
}
D(bug
("BEFORE screen allocation: bpp:%ld (real:%ld)\n", bpp,
this->hidden->depth));
/* With this call if needed I'll revert the wanted bpp to a bpp best suited for the display, actually occurs
only with requested format 15/16bit and display format != 15/16bit
*/
if (!SDL_ReallocFormat(screen, bpp,
MakeBitMask(this, 0, form, &bpp),
MakeBitMask(this, 1, form, &bpp),
MakeBitMask(this, 2, form, &bpp), 0))
return -1;
D(bug
("AFTER screen allocation: bpp:%ld (real:%ld)\n", bpp,
this->hidden->depth));
}
/* Create the appropriate colormap */
/*
if ( SDL_XColorMap != SDL_DisplayColormap ) {
XFreeColormap(SDL_Display, SDL_XColorMap);
}
*/
if (GetCyberMapAttr(SDL_Display->RastPort.BitMap, CYBRMATTR_PIXFMT) ==
PIXFMT_LUT8 || bpp == 8) {
int ncolors, i;
D(bug("XPixels palette allocation...\n"));
/* Allocate the pixel flags */
if (bpp == 8)
ncolors = 256;
else
ncolors = 1 << screen->format->BitsPerPixel;
SDL_XPixels = (Sint32 *) SDL_malloc(ncolors * sizeof(Sint32));
if (SDL_XPixels == NULL) {
SDL_OutOfMemory();
return -1;
}
for (i = 0; i < ncolors; i++)
SDL_XPixels[i] = -1;
/* always allocate a private colormap on non-default visuals */
if (bpp == 8)
flags |= SDL_HWPALETTE;
if (flags & SDL_HWPALETTE)
screen->flags |= SDL_HWPALETTE;
}
/* resize the (possibly new) window manager window */
/* Create (or use) the X11 display window */
if (!SDL_windowid) {
if (flags & SDL_FULLSCREEN) {
SDL_Window = OpenWindowTags(NULL, WA_Width, w, WA_Height, h,
WA_Flags,
WFLG_ACTIVATE | WFLG_RMBTRAP |
WFLG_BORDERLESS | WFLG_BACKDROP |
WFLG_REPORTMOUSE, WA_IDCMP,
IDCMP_RAWKEY | IDCMP_MOUSEBUTTONS
| IDCMP_MOUSEMOVE,
WA_CustomScreen,
(ULONG) SDL_Display, TAG_DONE);
D(bug
("Opening backdrop window %ldx%ld on display %lx!\n", w, h,
SDL_Display));
} else {
/* Create GimmeZeroZero window when OpenGL is used */
unsigned long gzz = FALSE;
if (flags & SDL_INTERNALOPENGL) {
gzz = TRUE;
}
SDL_Window =
OpenWindowTags(NULL, WA_InnerWidth, w, WA_InnerHeight, h,
WA_Flags,
WFLG_REPORTMOUSE | WFLG_ACTIVATE |
WFLG_RMBTRAP | ((flags & SDL_NOFRAME) ? 0
: (WFLG_DEPTHGADGET |
WFLG_CLOSEGADGET |
WFLG_DRAGBAR |
((flags &
SDL_RESIZABLE) ?
WFLG_SIZEGADGET |
WFLG_SIZEBBOTTOM :
0))), WA_IDCMP,
IDCMP_RAWKEY | IDCMP_CLOSEWINDOW |
IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
IDCMP_MOUSEMOVE, WA_PubScreen,
(ULONG) SDL_Display, WA_GimmeZeroZero,
gzz, TAG_DONE);
D(bug("Opening WB window of size: %ldx%ld!\n", w, h));
}
if (!SDL_Window)
return -1;
}
this->hidden->BytesPerPixel =
GetCyberMapAttr(SDL_Window->RPort->BitMap, CYBRMATTR_BPPIX);
if (screen->flags & SDL_DOUBLEBUF) {
if (SDL_RastPort = SDL_malloc(sizeof(struct RastPort))) {
InitRastPort(SDL_RastPort);
SDL_RastPort->BitMap = this->hidden->SB[1]->sb_BitMap;
} else
return -1;
} else
SDL_RastPort = SDL_Window->RPort;
if (flags & SDL_HWSURFACE)
screen->flags |= SDL_HWSURFACE;
if (!SDL_windowid) {
CGX_SetSizeHints(this, w, h, flags);
}
/* Set our colormaps when not setting a GL mode */
/*
if ( ! (flags & SDL_INTERNALOPENGL) ) {
XSetWindowColormap(SDL_Display, SDL_Window, SDL_XColorMap);
}
*/
/* Map them both and go fullscreen, if requested */
if (!SDL_windowid) {
if (flags & SDL_FULLSCREEN) {
screen->flags |= SDL_FULLSCREEN;
currently_fullscreen = 1;
// CGX_EnterFullScreen(this); Ci siamo gia'!
} else {
screen->flags &= ~SDL_FULLSCREEN;
}
}
screen->w = w;
screen->h = h;
screen->pitch = SDL_CalculatePitch(screen);
CGX_ResizeImage(this, screen, flags);
/* Make OpenGL Context if needed */
if (flags & SDL_INTERNALOPENGL) {
if (this->gl_data->gl_active == 0) {
if (CGX_GL_Init(this) < 0)
return -1;
else
screen->flags |= SDL_INTERNALOPENGL;
} else {
if (CGX_GL_Update(this) < 0)
return -1;
else
screen->flags |= SDL_INTERNALOPENGL;
}
}
}
int
CGX_ResizeWindow(_THIS, SDL_Surface * screen, int w, int h, Uint32 flags)
{
D(bug("CGX_ResizeWindow\n"));
if (!SDL_windowid) {
/* Resize the window manager window */
CGX_SetSizeHints(this, w, h, flags);
ChangeWindowBox(SDL_Window, SDL_Window->LeftEdge,
SDL_Window->TopEdge,
w + SDL_Window->BorderLeft +
SDL_Window->BorderRight,
h + SDL_Window->BorderTop + SDL_Window->BorderBottom);
screen->w = w;
screen->h = h;
screen->pitch = SDL_CalculatePitch(screen);
CGX_ResizeImage(this, screen, flags);
}
return (0);
}
static SDL_Surface *
CGX_SetVideoMode(_THIS, SDL_Surface * current,
int width, int height, int bpp, Uint32 flags)
{
Uint32 saved_flags;
int needcreate = 0;
D(bug("CGX_SetVideoMode current:%lx\n", current));
/* Lock the event thread, in multi-threading environments */
SDL_Lock_EventThread();
// Check if the window needs to be closed or can be resized
if ((flags & SDL_FULLSCREEN)
|| (current && current->flags & SDL_FULLSCREEN
&& !(flags & SDL_FULLSCREEN)))
needcreate = 1;
// Check if we need to close an already existing videomode...
if (current && current->flags & SDL_FULLSCREEN
&& !(flags & SDL_FULLSCREEN)) {
unsigned long i;
D(bug("Destroying image, window & screen!\n"));
CGX_DestroyImage(this, current);
CGX_DestroyWindow(this, current);
DestroyScreen(this);
GFX_Display = SDL_Display = LockPubScreen(NULL);
bpp = this->hidden->depth =
GetCyberMapAttr(SDL_Display->RastPort.BitMap, CYBRMATTR_DEPTH);
for (i = 0; i < this->hidden->nvisuals; i++) {
if (this->hidden->visuals[i].depth == bpp) /* era .depth */
break;
}
if (i == this->hidden->nvisuals) {
SDL_SetError("No matching visual for requested depth");
return NULL; /* should never happen */
}
SDL_Visual = this->hidden->visuals[i].visual;
D(bug("Setting screen depth to: %ld\n", this->hidden->depth));
}
/* Check the combination of flags we were passed */
if (flags & SDL_FULLSCREEN) {
int i;
/* Clear fullscreen flag if not supported */
if (SDL_windowid) {
flags &= ~SDL_FULLSCREEN;
} else if (current && current->flags & SDL_FULLSCREEN) {
if (current->w != width ||
current->h != height ||
(this->hidden && this->hidden->depth != bpp)) {
D(bug("Deleting previous window...\n"));
CGX_DestroyImage(this, current);
CGX_DestroyWindow(this, current);
DestroyScreen(this);
goto buildnewscreen;
}
} else
buildnewscreen:
{
Uint32 okid = BestCModeIDTags(CYBRBIDTG_NominalWidth, width,
CYBRBIDTG_NominalHeight,
height,
CYBRBIDTG_Depth, bpp,
TAG_DONE);
GFX_Display = NULL;
D(bug("Opening screen...\n"));
if (okid != INVALID_ID)
GFX_Display = OpenScreenTags(NULL,
SA_Width, width,
SA_Height, height,
SA_Quiet, TRUE,
SA_ShowTitle, FALSE,
SA_Depth, bpp, SA_DisplayID,
okid, TAG_DONE);
if (!GFX_Display) {
GFX_Display = SDL_Display;
flags &= ~SDL_FULLSCREEN;
flags &= ~SDL_DOUBLEBUF;
} else {
UnlockPubScreen(NULL, SDL_Display);
SDL_Display = GFX_Display;
D(bug("Screen opened.\n"));
if (flags & SDL_DOUBLEBUF) {
int ok = 0;
D(bug("Start of DBuffering allocations...\n"));
if (this->hidden->SB[0] =
AllocScreenBuffer(SDL_Display, NULL,
SB_SCREEN_BITMAP)) {
if (this->hidden->SB[1] =
AllocScreenBuffer(SDL_Display, NULL, 0L)) {
extern struct MsgPort *safeport, *dispport;
safeport = CreateMsgPort();
dispport = CreateMsgPort();
if (!safeport || !dispport) {
if (safeport) {
DeleteMsgPort(safeport);
safeport = NULL;
}
if (dispport) {
DeleteMsgPort(dispport);
dispport = NULL;
}
FreeScreenBuffer(SDL_Display,
this->hidden->SB[0]);
FreeScreenBuffer(SDL_Display,
this->hidden->SB[1]);
} else {
extern ULONG safe_sigbit, disp_sigbit;
int i;
safe_sigbit = 1L << safeport->mp_SigBit;
disp_sigbit = 1L << dispport->mp_SigBit;
for (i = 0; i < 2; i++) {
this->hidden->SB[i]->
sb_DBufInfo->
dbi_SafeMessage.
mn_ReplyPort = safeport;
this->hidden->SB[i]->
sb_DBufInfo->
dbi_DispMessage.
mn_ReplyPort = dispport;
}
ok = 1;
D(bug("Dbuffering enabled!\n"));
this->hidden->dbuffer = 1;
current->flags |= SDL_DOUBLEBUF;
}
} else {
FreeScreenBuffer(SDL_Display,
this->hidden->SB[1]);
this->hidden->SB[0] = NULL;
}
}
if (!ok)
flags &= ~SDL_DOUBLEBUF;
}
}
if (GetCyberMapAttr
(SDL_Display->RastPort.BitMap, CYBRMATTR_DEPTH) == bpp)
this->hidden->same_format = 1;
}
bpp = this->hidden->depth =
GetCyberMapAttr(SDL_Display->RastPort.BitMap, CYBRMATTR_DEPTH);
D(bug("Setting screen depth to: %ld\n", this->hidden->depth));
for (i = 0; i < this->hidden->nvisuals; i++)
if (this->hidden->visuals[i].depth == bpp) /* era .depth */
break;
if (i == this->hidden->nvisuals) {
SDL_SetError("No matching visual for requested depth");
return NULL; /* should never happen */
}
SDL_Visual = this->hidden->visuals[i].visual;
}
/* Set up the X11 window */
saved_flags = current->flags;
if (SDL_Window
&& (saved_flags & SDL_INTERNALOPENGL) == (flags & SDL_INTERNALOPENGL)
&& bpp == current->format->BitsPerPixel && !needcreate) {
if (CGX_ResizeWindow(this, current, width, height, flags) < 0) {
current = NULL;
goto done;
}
} else {
if (CGX_CreateWindow(this, current, width, height, bpp, flags) < 0) {
current = NULL;
goto done;
}
}
#if 0
/* Set up the new mode framebuffer */
if (((current->w != width) || (current->h != height)) ||
((saved_flags & SDL_INTERNALOPENGL) != (flags & SDL_INTERNALOPENGL)))
{
current->w = width;
current->h = height;
current->pitch = SDL_CalculatePitch(current);
CGX_ResizeImage(this, current, flags);
}
#endif
current->flags |= (flags & SDL_RESIZABLE); // Resizable only if the user asked it
done:
/* Release the event thread */
SDL_Unlock_EventThread();
/* We're done! */
return (current);
}
static int
CGX_ToggleFullScreen(_THIS, int on)
{
Uint32 event_thread;
/* Don't switch if we don't own the window */
if (SDL_windowid) {
return (0);
}
/* Don't lock if we are the event thread */
event_thread = SDL_EventThreadID();
if (event_thread && (SDL_ThreadID() == event_thread)) {
event_thread = 0;
}
if (event_thread) {
SDL_Lock_EventThread();
}
if (on) {
this->screen->flags |= SDL_FULLSCREEN;
CGX_EnterFullScreen(this);
} else {
this->screen->flags &= ~SDL_FULLSCREEN;
CGX_LeaveFullScreen(this);
}
CGX_RefreshDisplay(this);
if (event_thread) {
SDL_Unlock_EventThread();
}
SDL_ResetKeyboard();
return (1);
}
static void
SetSingleColor(Uint32 fmt, unsigned char r, unsigned char g, unsigned char b,
unsigned char *c)
{
switch (fmt) {
case PIXFMT_BGR15:
case PIXFMT_RGB15PC:
{
Uint16 *t = (Uint16 *) c;
*t = (r >> 3) | ((g >> 3) << 5) | ((b >> 3) << 10);
}
break;
case PIXFMT_RGB15:
case PIXFMT_BGR15PC:
{
Uint16 *t = (Uint16 *) c;
*t = (b >> 3) | ((g >> 3) << 5) | ((r >> 3) << 10);
}
break;
case PIXFMT_BGR16PC:
case PIXFMT_RGB16:
{
Uint16 *t = (Uint16 *) c;
*t = (b >> 3) | ((g >> 2) << 5) | ((r >> 3) << 11);
}
break;
case PIXFMT_BGR16:
case PIXFMT_RGB16PC:
{
Uint16 *t = (Uint16 *) c;
*t = (r >> 3) | ((g >> 2) << 5) | ((b >> 3) << 11);
}
break;
case PIXFMT_RGB24:
c[0] = r;
c[1] = g;
c[2] = b;
c[3] = 0;
break;
case PIXFMT_BGR24:
c[0] = b;
c[1] = g;
c[2] = r;
c[3] = 0;
break;
case PIXFMT_ARGB32:
c[0] = 0;
c[1] = r;
c[2] = g;
c[3] = b;
break;
case PIXFMT_BGRA32:
c[0] = b;
c[1] = g;
c[2] = r;
c[3] = 0;
break;
case PIXFMT_RGBA32:
c[0] = r;
c[1] = g;
c[2] = b;
c[3] = 0;
break;
default:
D(bug("Error, SetSingleColor with PIXFMT %ld!\n", fmt));
}
}
/* Update the current mouse state and position */
static void
CGX_UpdateMouse(_THIS)
{
/* Lock the event thread, in multi-threading environments */
SDL_Lock_EventThread();
if (currently_fullscreen) {
SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
SDL_PrivateMouseMotion(0, 0, SDL_Display->MouseX,
SDL_Display->MouseY);
} else {
if (SDL_Display->MouseX >=
(SDL_Window->LeftEdge + SDL_Window->BorderLeft)
&& SDL_Display->MouseX <
(SDL_Window->LeftEdge + SDL_Window->Width -
SDL_Window->BorderRight)
&& SDL_Display->MouseY >=
(SDL_Window->TopEdge + SDL_Window->BorderLeft)
&& SDL_Display->MouseY <
(SDL_Window->TopEdge + SDL_Window->Height -
SDL_Window->BorderBottom)) {
SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
SDL_PrivateMouseMotion(0, 0,
SDL_Display->MouseX -
SDL_Window->LeftEdge -
SDL_Window->BorderLeft,
SDL_Display->MouseY -
SDL_Window->TopEdge -
SDL_Window->BorderTop);
} else {
SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
}
}
SDL_Unlock_EventThread();
}
static int
CGX_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color * colors)
{
int i;
/* Check to make sure we have a colormap allocated */
/* It's easy if we have a hidden colormap */
if ((this->screen->flags & SDL_HWPALETTE) && currently_fullscreen) {
ULONG xcmap[256 * 3 + 2];
xcmap[0] = (ncolors << 16);
xcmap[0] += firstcolor;
// D(bug("Setting %ld colors on an HWPALETTE screen\n",ncolors));
for (i = 0; i < ncolors; i++) {
xcmap[i * 3 + 1] = colors[i + firstcolor].r << 24;
xcmap[i * 3 + 2] = colors[i + firstcolor].g << 24;
xcmap[i * 3 + 3] = colors[i + firstcolor].b << 24;
}
xcmap[ncolors * 3 + 1] = 0;
LoadRGB32(&GFX_Display->ViewPort, xcmap);
} else {
// XPixels are not needed on 8bit screen with hwpalette
unsigned long pixel;
if (SDL_XPixels == NULL) {
D(bug("SetColors without colormap!"));
return (0);
}
if (this->hidden->depth == 8) {
// In this case I have to unalloc and realloc the full palette
D(bug("Obtaining %ld colors on the screen\n", ncolors));
/* Free existing allocated colors */
for (pixel = 0;
pixel < this->screen->format->palette->ncolors; ++pixel) {
if (SDL_XPixels[pixel] >= 0)
ReleasePen(GFX_Display->ViewPort.ColorMap,
SDL_XPixels[pixel]);
}
/* Try to allocate all the colors */
for (i = 0; i < this->screen->format->palette->ncolors; ++i) {
SDL_XPixels[i] =
ObtainBestPenA(GFX_Display->ViewPort.ColorMap,
colors[i].r << 24,
colors[i].g << 24,
colors[i].b << 24, NULL);
}
} else {
#ifndef USE_CGX_WRITELUTPIXEL
Uint32 fmt;
D(bug("Preparing a conversion pixel table...\n"));
fmt =
GetCyberMapAttr(SDL_Display->RastPort.BitMap,
CYBRMATTR_PIXFMT);
for (i = 0; i < ncolors; i++) {
SetSingleColor(fmt, colors[firstcolor + i].r,
colors[firstcolor + i].g,
colors[firstcolor + i].b, (unsigned char *)
&SDL_XPixels[firstcolor + i]);
}
#else
// D(bug("Executing XPixel(%lx) remapping: (from %ld, %ld colors) first: r%ld g%ld b%ld\n",SDL_XPixels,firstcolor,ncolors,colors[firstcolor].r,colors[firstcolor].g,colors[firstcolor].b));
for (i = 0; i < ncolors; i++)
SDL_XPixels[i + firstcolor] =
(colors[firstcolor + i].r << 16) +
(colors[firstcolor + i].g << 8) + colors[firstcolor +
i].b;
#endif
}
}
// Actually it cannot fail!
return 1;
}
/* Note: If we are terminated, this could be called in the middle of
another SDL video routine -- notably UpdateRects.
*/
static void
CGX_VideoQuit(_THIS)
{
/* Shutdown everything that's still up */
/* The event thread should be done, so we can touch SDL_Display */
D(bug("CGX_VideoQuit\n"));
if (SDL_Display != NULL) {
/* Clean up OpenGL */
if (this->gl_data->gl_active == 1) {
CGX_GL_Quit(this);
}
/* Start shutting down the windows */
D(bug("Destroying image...\n"));
CGX_DestroyImage(this, this->screen);
D(bug("Destroying window...\n"));
CGX_DestroyWindow(this, this->screen);
// Otherwise SDL_VideoQuit will try to free it!
SDL_VideoSurface = NULL;
CGX_FreeVideoModes(this);
/* Free that blank cursor */
if (SDL_BlankCursor != NULL) {
FreeMem(SDL_BlankCursor, 16);
SDL_BlankCursor = NULL;
}
/* Close the X11 graphics connection */
this->hidden->same_format = 0;
D(bug("Destroying screen...\n"));
if (GFX_Display != NULL)
DestroyScreen(this);
/* Close the X11 display connection */
SDL_Display = NULL;
/* Unload GL library after X11 shuts down */
}
D(bug("Closing libraries...\n"));
if (CyberGfxBase) {
CloseLibrary(CyberGfxBase);
CyberGfxBase = NULL;
}
if (IntuitionBase) {
CloseLibrary((struct Library *) IntuitionBase);
IntuitionBase = NULL;
}
if (GfxBase) {
CloseLibrary((struct Library *) GfxBase);
GfxBase = NULL;
}
if (this->screen && (this->screen->flags & SDL_HWSURFACE)) {
/* Direct screen access, no memory buffer */
this->screen->pixels = NULL;
}
D(bug("End of CGX_VideoQuit.\n"));
}
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
#ifndef _SDL_cgxvideo_h
#define _SDL_cgxvideo_h
#include <exec/exec.h>
#include <cybergraphx/cybergraphics.h>
#include <graphics/scale.h>
#include <graphics/gfx.h>
#include <intuition/intuition.h>
#if defined(__SASC) || defined(STORMC4_WOS)
#include <proto/exec.h>
#include <proto/cybergraphics.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/console.h>
#else
#include <inline/exec.h>
#include <inline/cybergraphics.h>
#include <inline/graphics.h>
#include <inline/intuition.h>
#include <inline/console.h>
#endif
#include "SDL_mouse.h"
#include "../SDL_sysvideo.h"
#include "mydebug.h"
#define USE_CGX_WRITELUTPIXEL
/* Hidden "this" pointer for the video functions */
#define _THIS SDL_VideoDevice *this
/* Private display data */
struct SDL_PrivateVideoData
{
struct Screen *Public_Display; /* Used for events and window management */
struct Screen *GFX_Display; /* Used for graphics and colormap stuff */
Uint32 SDL_VisualUnused; /* The visual used by our window */
struct Window *SDL_Window; /* Shared by both displays (no X security?) */
unsigned char *BlankCursor; /* The invisible cursor */
char *SDL_windowid; /* Flag: true if we have been passed a window */
/* The variables used for displaying graphics */
Uint8 *Ximage; /* The X image for our window */
int swap_pixels; /* Flag: true if display is swapped endian */
/* Support for internal mouse warping */
struct
{
int x;
int y;
} mouse_last;
struct
{
int numerator;
int denominator;
int threshold;
} mouse_accel;
int mouse_relative;
/* The current list of available video modes */
SDL_Rect **modelist;
/* available visuals of interest to us, sorted deepest first */
struct
{
Uint32 visual;
int depth; /* number of significant bits/pixel */
int bpp; /* pixel quantum in bits */
} visuals[5]; /* at most entries for 8, 15, 16, 24 */
int nvisuals;
Uint32 vis; /* current visual in use */
int depth; /* current visual depth (not bpp) */
int BytesPerPixel;
int currently_fullscreen, same_format, dbuffer;
/* Automatic mode switching support (entering/leaving fullscreen) */
Uint32 switch_waiting;
Uint32 switch_time;
/* Prevent too many XSync() calls */
int blit_queued;
/* Colormap handling */
LONG Pens;
Sint32 *XPixels; /* A list of pixels that have been allocated, the size depends on the screen format */
struct ScreenBuffer *SB[2];
struct RastPort *RP;
short *iconcolors; /* List of colors used by the icon */
};
/* Old variable names */
#define local_X11 (this->hidden->local_X11)
#define SDL_Display (this->hidden->Public_Display)
#define GFX_Display (this->hidden->GFX_Display)
#define SDL_Screen DefaultScreen(this->hidden->Public_Display)
#define SDL_Visual (this->hidden->vis)
#define SDL_Root RootWindow(SDL_Display, SDL_Screen)
#define WMwindow (this->hidden->WMwindow)
#define FSwindow (this->hidden->FSwindow)
#define SDL_Window (this->hidden->SDL_Window)
#define WM_DELETE_WINDOW (this->hidden->WM_DELETE_WINDOW)
#define SDL_BlankCursor (this->hidden->BlankCursor)
#define SDL_windowid (this->hidden->SDL_windowid)
#define SDL_Ximage (this->hidden->Ximage)
#define SDL_GC (this->hidden->gc)
#define swap_pixels (this->hidden->swap_pixels)
#define mouse_last (this->hidden->mouse_last)
#define mouse_accel (this->hidden->mouse_accel)
#define mouse_relative (this->hidden->mouse_relative)
#define SDL_modelist (this->hidden->modelist)
#define SDL_RastPort (this->hidden->RP)
#define saved_mode (this->hidden->saved_mode)
#define saved_view (this->hidden->saved_view)
#define currently_fullscreen (this->hidden->currently_fullscreen)
#define blit_queued (this->hidden->blit_queued)
#define SDL_DisplayColormap (this->hidden->GFX_Display->ViewPort.ColorMap)
#define SDL_XPixels (this->hidden->XPixels)
#define SDL_iconcolors (this->hidden->iconcolors)
/* Used to get the X cursor from a window-manager specific cursor */
// extern Cursor SDL_GetWMXCursor(WMcursor *cursor);
extern int CGX_CreateWindow(_THIS, SDL_Surface * screen,
int w, int h, int bpp, Uint32 flags);
extern int CGX_ResizeWindow(_THIS,
SDL_Surface * screen, int w, int h, Uint32 flags);
extern void CGX_DestroyWindow(_THIS, SDL_Surface * screen);
extern struct Library *CyberGfxBase;
extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase *GfxBase;
extern struct ExecBase *SysBase;
extern struct DosLibrary *DOSBase;
struct private_hwdata
{
struct BitMap *bmap;
APTR lock;
struct SDL_VideoDevice *videodata;
APTR mask;
int allocated;
};
int CGX_CheckHWBlit(_THIS, SDL_Surface * src, SDL_Surface * dst);
int CGX_FillHWRect(_THIS, SDL_Surface * dst, SDL_Rect * dstrect,
Uint32 color);
int CGX_SetHWColorKey(_THIS, SDL_Surface * surface, Uint32 key);
#endif /* _SDL_x11video_h */
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
#include "SDL_version.h"
#include "SDL_timer.h"
#include "SDL_video.h"
#include "SDL_syswm.h"
#include "../../events/SDL_events_c.h"
#include "../SDL_pixels_c.h"
#include "SDL_cgxmodes_c.h"
#include "SDL_cgxwm_c.h"
/* This is necessary for working properly with Enlightenment, etc. */
#define USE_ICON_WINDOW
void
CGX_SetIcon(_THIS, SDL_Surface * icon, Uint8 * mask)
{
/* Not yet implemented */
}
void
CGX_SetCaption(_THIS, const char *title, const char *icon)
{
if (SDL_Window)
SetWindowTitles(SDL_Window, (char *) title, NULL);
}
/* Iconify the window */
int
CGX_IconifyWindow(_THIS)
{
/* Not yet implemented */
return 0;
}
int
CGX_GetWMInfo(_THIS, SDL_SysWMinfo * info)
{
if (info->version.major <= SDL_MAJOR_VERSION) {
return (1);
} else {
SDL_SetError("Application not compiled with SDL %d.%d\n",
SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
return (-1);
}
}
/* vi: set ts=4 sw=4 expandtab: */
/*
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"
#include "SDL_cgxvideo.h"
/* Functions to be exported */
extern void CGX_SetCaption(_THIS, const char *title, const char *icon);
extern void CGX_SetIcon(_THIS, SDL_Surface * icon, Uint8 * mask);
extern int CGX_IconifyWindow(_THIS);
extern SDL_GrabMode CGX_GrabInputNoLock(_THIS, SDL_GrabMode mode);
extern SDL_GrabMode CGX_GrabInput(_THIS, SDL_GrabMode mode);
extern int CGX_GetWMInfo(_THIS, SDL_SysWMinfo * info);
/* vi: set ts=4 sw=4 expandtab: */
...@@ -160,8 +160,6 @@ main(int argc, char *argv[]) ...@@ -160,8 +160,6 @@ main(int argc, char *argv[])
printf("This system is running %s\n", printf("This system is running %s\n",
#if __AIX__ #if __AIX__
"AIX" "AIX"
#elif __AMIGA__
"AmigaOS"
#elif __BEOS__ #elif __BEOS__
"BeOS" "BeOS"
#elif __BSDI__ #elif __BSDI__
......
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