gremlin/libs/glfw/lib/amigaos/platform.h
2011-01-04 18:11:59 +01:00

338 lines
10 KiB
C

//========================================================================
// GLFW - An OpenGL framework
// File: platform.h
// Platforms: AmigaOS, MorphOS
// API version: 2.6
// WWW: http://glfw.sourceforge.net
//------------------------------------------------------------------------
// Copyright (c) 2002-2006 Camilla Berglund
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would
// be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not
// be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
//========================================================================
#ifndef _platform_h_
#define _platform_h_
// First of all: a file that hides compiler specific stuff
#include "SDI_compiler.h"
// This is the AmigaOS version of GLFW
#define _GLFW_AMIGAOS
// Are we compiling for MorphOS?
#if defined(__MORPHOS__) || defined(MORPHOS)
#define _GLFW_MORPHOS
#endif
// Mesa/OpenGL flavour (we only support StormMesa at the moment)
#if !defined(_GLFW_STORMMESA)
#define _GLFW_STORMMESA
#endif
// Include files
#include <exec/exec.h>
#include <dos/dos.h>
#include <dos/dostags.h>
#include <dos/dosextens.h>
#include <intuition/intuition.h>
#include <graphics/displayinfo.h>
#include <graphics/rastport.h>
#include <devices/timer.h>
#include <devices/keymap.h>
#include <devices/input.h>
#include <devices/inputevent.h>
#include <devices/gameport.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/timer.h>
#include <proto/keymap.h>
#include <proto/utility.h>
#include <clib/alib_protos.h>
// Amiga Mesa/OpenGL implementation dependent include
#ifdef _GLFW_STORMMESA
#include <GL/Amigamesa.h>
#endif
// MorphOS support
#ifdef _GLFW_MORPHOS
#include <emul/emulinterface.h>
#endif
// GLFW+GL+GLU defines
#ifdef __GNUC__
#include "../../include/GL/glfw.h"
#else
#include "//include/GL/glfw.h"
#endif
// Stack size for each thread (in bytes)
#define _GLFW_TASK_STACK_SIZE 50000
//========================================================================
// Global variables (GLFW internals)
//========================================================================
//------------------------------------------------------------------------
// Shared libraries
//------------------------------------------------------------------------
#if defined( _init_c_ )
struct GfxBase * GfxBase;
struct IntuitionBase * IntuitionBase;
struct Library * KeymapBase;
struct UtilityBase * UtilityBase;
struct Device * TimerBase;
#endif
//------------------------------------------------------------------------
// Window structure
//------------------------------------------------------------------------
typedef struct _GLFWwin_struct _GLFWwin;
struct _GLFWwin_struct {
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
// User callback functions
GLFWwindowsizefun WindowSizeCallback;
GLFWwindowclosefun WindowCloseCallback;
GLFWwindowrefreshfun WindowRefreshCallback;
GLFWmousebuttonfun MouseButtonCallback;
GLFWmouseposfun MousePosCallback;
GLFWmousewheelfun MouseWheelCallback;
GLFWkeyfun KeyCallback;
GLFWcharfun CharCallback;
// User selected window settings
int Fullscreen; // Fullscreen flag
int MouseLock; // Mouse-lock flag
int AutoPollEvents; // Auto polling flag
int SysKeysDisabled; // System keys disabled flag
int WindowNoResize; // Resize- and maximize gadgets disabled flag
// Window status & parameters
int Opened; // Flag telling if window is opened or not
int Active; // Application active flag
int Iconified; // Window iconified flag
int Width, Height; // Window width and heigth
int Accelerated; // GL_TRUE if window is HW accelerated
int RedBits;
int GreenBits;
int BlueBits;
int AlphaBits;
int DepthBits;
int StencilBits;
int AccumRedBits;
int AccumGreenBits;
int AccumBlueBits;
int AccumAlphaBits;
int AuxBuffers;
int Stereo;
int RefreshRate; // Vertical monitor refresh rate
// Extensions & OpenGL version
int Has_GL_SGIS_generate_mipmap;
int Has_GL_ARB_texture_non_power_of_two;
int GLVerMajor,GLVerMinor;
// ========= PLATFORM SPECIFIC PART ======================================
// Platform specific window resources
struct Screen *Screen; // Screen handle
struct Window *Window; // Window handle
ULONG ModeID; // ModeID
APTR PointerSprite; // Memory for blank pointer sprite
int PointerHidden; // Is pointer hidden?
struct MsgPort *InputMP; // Message port (pointer movement)
struct IOStdReq *InputIO; // I/O request (pointer movement)
// Mesa/OpenGL flavour specific
#ifdef _GLFW_STORMMESA
struct amigamesa_context *Context; // GL context handle
#endif
// Platform specific extensions
// Various platform specific internal variables
};
GLFWGLOBAL _GLFWwin _glfwWin;
//------------------------------------------------------------------------
// User input status (most of this should go in _GLFWwin)
//------------------------------------------------------------------------
GLFWGLOBAL struct {
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
// Mouse status
int MousePosX, MousePosY;
int WheelPos;
char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];
// Keyboard status
char Key[ GLFW_KEY_LAST+1 ];
int LastChar;
// User selected settings
int StickyKeys;
int StickyMouseButtons;
int KeyRepeat;
// ========= PLATFORM SPECIFIC PART ======================================
// Platform specific internal variables
int MouseMoved, OldMouseX, OldMouseY;
} _glfwInput;
//------------------------------------------------------------------------
// Timer status
//------------------------------------------------------------------------
GLFWGLOBAL struct {
struct MsgPort *TimerMP;
struct timerequest *TimerIO;
double Resolution;
long long t0;
} _glfwTimer;
//------------------------------------------------------------------------
// Thread record (one for each thread)
//------------------------------------------------------------------------
typedef struct _GLFWthread_struct _GLFWthread;
struct _GLFWthread_struct {
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
// Pointer to previous and next threads in linked list
_GLFWthread *Previous, *Next;
// GLFW user side thread information
GLFWthread ID;
// ========= PLATFORM SPECIFIC PART ======================================
// System side thread information
GLFWthreadfun Function;
void *Arg;
struct Process *AmiProc;
struct Task *AmiTask;
// "Wait for" object. Can be a thread, condition variable or NULL.
void *WaitFor;
int WaitSig;
// MorphOS support
#ifdef _GLFW_MORPHOS
struct EmulLibEntry mosEmulLibEntry;
#endif
};
//------------------------------------------------------------------------
// General thread information
//------------------------------------------------------------------------
GLFWGLOBAL struct {
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
// Next thread ID to use (increments for every created thread)
GLFWthread NextID;
// First thread in linked list (always the main thread)
_GLFWthread First;
// ========= PLATFORM SPECIFIC PART ======================================
// Critical section lock
struct SignalSemaphore CriticalSection;
// Next condition variable ID (decrements for every created cond)
unsigned int NextCondID;
} _glfwThrd;
//------------------------------------------------------------------------
// Joystick information & state
//------------------------------------------------------------------------
GLFWGLOBAL struct {
int Present;
int GameDeviceOpen;
struct IOStdReq *GameIO;
struct MsgPort *GameMP;
struct InputEvent GameEvent;
float Axis[ 2 ];
unsigned char Button[ 2 ];
} _glfwJoy;
//========================================================================
// Macros for encapsulating critical code sections (i.e. making parts
// of GLFW thread safe)
//========================================================================
// Thread list management
#define ENTER_THREAD_CRITICAL_SECTION ObtainSemaphore( &_glfwThrd.CriticalSection );
#define LEAVE_THREAD_CRITICAL_SECTION ReleaseSemaphore( &_glfwThrd.CriticalSection );
//========================================================================
// Prototypes for platform specific internal functions
//========================================================================
// Time
int _glfwInitTimer( void );
void _glfwTerminateTimer( void );
// Fullscreen
int _glfwOpenScreen( int *width, int *height, int *r, int *g, int *b,
int refresh );
int _glfwGetClosestVideoMode( int *w, int *h, int *r, int *g, int *b,
int refresh );
void _glfwGetModeIDInfo( ULONG ModeID, int *w, int *h, int *r, int *g,
int *b, int *refresh );
// Joystick
void _glfwInitJoysticks( void );
void _glfwTerminateJoysticks( void );
#endif // _platform_h_