GLFW 0.2 → 0.3
raw patch · 4 files changed
+251/−538 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Graphics.UI.GLFW: JoyStickNo :: Int -> JoyStick
- Graphics.UI.GLFW: instance Enum JoyStick
- Graphics.UI.GLFW: instance Eq JoyStick
- Graphics.UI.GLFW: instance Show JoyStick
- Graphics.UI.GLFW: newtype JoyStick
+ Graphics.UI.GLFW: Axes :: JoystickParam
+ Graphics.UI.GLFW: Buttons :: JoystickParam
+ Graphics.UI.GLFW: Joystick :: Int -> Joystick
+ Graphics.UI.GLFW: Present :: JoystickParam
+ Graphics.UI.GLFW: data JoystickParam
+ Graphics.UI.GLFW: instance Enum Joystick
+ Graphics.UI.GLFW: instance Enum JoystickParam
+ Graphics.UI.GLFW: instance Eq Joystick
+ Graphics.UI.GLFW: instance Eq JoystickParam
+ Graphics.UI.GLFW: instance Show Joystick
+ Graphics.UI.GLFW: instance Show JoystickParam
+ Graphics.UI.GLFW: joystickButtons :: Joystick -> GettableStateVar [KeyButtonState]
+ Graphics.UI.GLFW: joystickParam :: Joystick -> JoystickParam -> GettableStateVar Int
+ Graphics.UI.GLFW: joystickPos :: Joystick -> GettableStateVar [Int]
+ Graphics.UI.GLFW: newtype Joystick
+ Graphics.UI.GLFW: type CharCallback = Char -> KeyButtonState -> IO ()
+ Graphics.UI.GLFW: type KeyCallback = Key -> KeyButtonState -> IO ()
+ Graphics.UI.GLFW: type MouseButtonCallback = MouseButton -> KeyButtonState -> IO ()
+ Graphics.UI.GLFW: type MousePosCallback = Position -> IO ()
+ Graphics.UI.GLFW: type MouseWheelCallback = Int -> IO ()
+ Graphics.UI.GLFW: type WindowCloseCallback = IO ()
+ Graphics.UI.GLFW: type WindowRefreshCallback = IO ()
+ Graphics.UI.GLFW: type WindowSizeCallback = Size -> IO ()
Files
- GL/glfw.h +0/−488
- GLFW.cabal +1/−2
- Graphics/UI/GLFW.hs +229/−39
- README.txt +21/−9
− GL/glfw.h
@@ -1,488 +0,0 @@-//========================================================================-// GLFW - An OpenGL framework-// File: glfw.h-// 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.-//-//-------------------------------------------------------------------------// $Id: glfw.h,v 1.19 2007/05/02 20:47:13 elmindreda Exp $-//========================================================================--#ifndef __glfw_h_-#define __glfw_h_--#ifdef __cplusplus-extern "C" {-#endif---//========================================================================-// Global definitions-//========================================================================--// We need a NULL pointer from time to time-#ifndef NULL- #ifdef __cplusplus- #define NULL 0- #else- #define NULL ((void *)0)- #endif-#endif // NULL---// ------------------- BEGIN SYSTEM/COMPILER SPECIFIC ----------------------// Please report any probles that you find with your compiler, which may-// be solved in this section! There are several compilers that I have not-// been able to test this file with yet.--// First: If we are we on Windows, we want a single define for it (_WIN32)-// (Note: For Cygwin the compiler flag -mwin32 should be used, but to-// make sure that things run smoothly for Cygwin users, we add __CYGWIN__-// to the list of "valid Win32 identifiers", which removes the need for-// -mwin32)-#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__))- #define _WIN32-#endif // _WIN32--// In order for extension support to be portable, we need to define an-// OpenGL function call method. We use the keyword APIENTRY, which is-// defined for Win32. (Note: Windows also needs this for <GL/gl.h>)-#ifndef APIENTRY- #ifdef _WIN32- #define APIENTRY __stdcall- #else- #define APIENTRY- #endif- #define GL_APIENTRY_DEFINED-#endif // APIENTRY---// The following three defines are here solely to make some Windows-based-// <GL/gl.h> files happy. Theoretically we could include <windows.h>, but-// it has the major drawback of severely polluting our namespace.--// Under Windows, we need WINGDIAPI defined-#if !defined(WINGDIAPI) && defined(_WIN32)- #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__)- // Microsoft Visual C++, Borland C++ Builder and Pelles C- #define WINGDIAPI __declspec(dllimport)- #elif defined(__LCC__)- // LCC-Win32- #define WINGDIAPI __stdcall- #else- // Others (e.g. MinGW, Cygwin)- #define WINGDIAPI extern- #endif- #define GL_WINGDIAPI_DEFINED-#endif // WINGDIAPI--// Some <GL/glu.h> files also need CALLBACK defined-#if !defined(CALLBACK) && defined(_WIN32)- #if defined(_MSC_VER)- // Microsoft Visual C++- #if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)- #define CALLBACK __stdcall- #else- #define CALLBACK- #endif- #else- // Other Windows compilers- #define CALLBACK __stdcall- #endif- #define GLU_CALLBACK_DEFINED-#endif // CALLBACK--// Microsoft Visual C++, Borland C++ and Pelles C <GL/glu.h> needs wchar_t-#if defined(_WIN32) && (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__)) && !defined(_WCHAR_T_DEFINED)- typedef unsigned short wchar_t;- #define _WCHAR_T_DEFINED-#endif // _WCHAR_T_DEFINED---// ---------------- GLFW related system specific defines -------------------#if defined(_WIN32) && defined(GLFW_BUILD_DLL)-- // We are building a Win32 DLL- #define GLFWAPI __declspec(dllexport)- #define GLFWAPIENTRY __stdcall- #define GLFWCALL __stdcall--#elif defined(_WIN32) && defined(GLFW_DLL)-- // We are calling a Win32 DLL- #if defined(__LCC__)- #define GLFWAPI extern- #else- #define GLFWAPI __declspec(dllimport)- #endif- #define GLFWAPIENTRY __stdcall- #define GLFWCALL __stdcall--#else-- // We are either building/calling a static lib or we are non-win32- #define GLFWAPIENTRY- #define GLFWAPI- #define GLFWCALL--#endif--// -------------------- END SYSTEM/COMPILER SPECIFIC -----------------------// Include standard OpenGL headers: GLFW uses GL_FALSE/GL_TRUE, and it is-// convenient for the user to only have to include <GL/glfw.h>. This also-// solves the problem with Windows <GL/gl.h> and <GL/glu.h> needing some-// special defines which normally requires the user to include <windows.h>-// (which is not a nice solution for portable programs).-#if defined(__APPLE_CC__)- #include <OpenGL/gl.h>- #include <OpenGL/glu.h>-#else- #include <GL/gl.h>- #include <GL/glu.h>-#endif---//========================================================================-// GLFW version-//========================================================================--#define GLFW_VERSION_MAJOR 2-#define GLFW_VERSION_MINOR 6-#define GLFW_VERSION_REVISION 0---//========================================================================-// Input handling definitions-//========================================================================--// Key and button state/action definitions-#define GLFW_RELEASE 0-#define GLFW_PRESS 1--// Keyboard key definitions: 8-bit ISO-8859-1 (Latin 1) encoding is used-// for printable keys (such as A-Z, 0-9 etc), and values above 256-// represent special (non-printable) keys (e.g. F1, Page Up etc).-#define GLFW_KEY_UNKNOWN -1-#define GLFW_KEY_SPACE 32-#define GLFW_KEY_SPECIAL 256-#define GLFW_KEY_ESC (GLFW_KEY_SPECIAL+1)-#define GLFW_KEY_F1 (GLFW_KEY_SPECIAL+2)-#define GLFW_KEY_F2 (GLFW_KEY_SPECIAL+3)-#define GLFW_KEY_F3 (GLFW_KEY_SPECIAL+4)-#define GLFW_KEY_F4 (GLFW_KEY_SPECIAL+5)-#define GLFW_KEY_F5 (GLFW_KEY_SPECIAL+6)-#define GLFW_KEY_F6 (GLFW_KEY_SPECIAL+7)-#define GLFW_KEY_F7 (GLFW_KEY_SPECIAL+8)-#define GLFW_KEY_F8 (GLFW_KEY_SPECIAL+9)-#define GLFW_KEY_F9 (GLFW_KEY_SPECIAL+10)-#define GLFW_KEY_F10 (GLFW_KEY_SPECIAL+11)-#define GLFW_KEY_F11 (GLFW_KEY_SPECIAL+12)-#define GLFW_KEY_F12 (GLFW_KEY_SPECIAL+13)-#define GLFW_KEY_F13 (GLFW_KEY_SPECIAL+14)-#define GLFW_KEY_F14 (GLFW_KEY_SPECIAL+15)-#define GLFW_KEY_F15 (GLFW_KEY_SPECIAL+16)-#define GLFW_KEY_F16 (GLFW_KEY_SPECIAL+17)-#define GLFW_KEY_F17 (GLFW_KEY_SPECIAL+18)-#define GLFW_KEY_F18 (GLFW_KEY_SPECIAL+19)-#define GLFW_KEY_F19 (GLFW_KEY_SPECIAL+20)-#define GLFW_KEY_F20 (GLFW_KEY_SPECIAL+21)-#define GLFW_KEY_F21 (GLFW_KEY_SPECIAL+22)-#define GLFW_KEY_F22 (GLFW_KEY_SPECIAL+23)-#define GLFW_KEY_F23 (GLFW_KEY_SPECIAL+24)-#define GLFW_KEY_F24 (GLFW_KEY_SPECIAL+25)-#define GLFW_KEY_F25 (GLFW_KEY_SPECIAL+26)-#define GLFW_KEY_UP (GLFW_KEY_SPECIAL+27)-#define GLFW_KEY_DOWN (GLFW_KEY_SPECIAL+28)-#define GLFW_KEY_LEFT (GLFW_KEY_SPECIAL+29)-#define GLFW_KEY_RIGHT (GLFW_KEY_SPECIAL+30)-#define GLFW_KEY_LSHIFT (GLFW_KEY_SPECIAL+31)-#define GLFW_KEY_RSHIFT (GLFW_KEY_SPECIAL+32)-#define GLFW_KEY_LCTRL (GLFW_KEY_SPECIAL+33)-#define GLFW_KEY_RCTRL (GLFW_KEY_SPECIAL+34)-#define GLFW_KEY_LALT (GLFW_KEY_SPECIAL+35)-#define GLFW_KEY_RALT (GLFW_KEY_SPECIAL+36)-#define GLFW_KEY_TAB (GLFW_KEY_SPECIAL+37)-#define GLFW_KEY_ENTER (GLFW_KEY_SPECIAL+38)-#define GLFW_KEY_BACKSPACE (GLFW_KEY_SPECIAL+39)-#define GLFW_KEY_INSERT (GLFW_KEY_SPECIAL+40)-#define GLFW_KEY_DEL (GLFW_KEY_SPECIAL+41)-#define GLFW_KEY_PAGEUP (GLFW_KEY_SPECIAL+42)-#define GLFW_KEY_PAGEDOWN (GLFW_KEY_SPECIAL+43)-#define GLFW_KEY_HOME (GLFW_KEY_SPECIAL+44)-#define GLFW_KEY_END (GLFW_KEY_SPECIAL+45)-#define GLFW_KEY_KP_0 (GLFW_KEY_SPECIAL+46)-#define GLFW_KEY_KP_1 (GLFW_KEY_SPECIAL+47)-#define GLFW_KEY_KP_2 (GLFW_KEY_SPECIAL+48)-#define GLFW_KEY_KP_3 (GLFW_KEY_SPECIAL+49)-#define GLFW_KEY_KP_4 (GLFW_KEY_SPECIAL+50)-#define GLFW_KEY_KP_5 (GLFW_KEY_SPECIAL+51)-#define GLFW_KEY_KP_6 (GLFW_KEY_SPECIAL+52)-#define GLFW_KEY_KP_7 (GLFW_KEY_SPECIAL+53)-#define GLFW_KEY_KP_8 (GLFW_KEY_SPECIAL+54)-#define GLFW_KEY_KP_9 (GLFW_KEY_SPECIAL+55)-#define GLFW_KEY_KP_DIVIDE (GLFW_KEY_SPECIAL+56)-#define GLFW_KEY_KP_MULTIPLY (GLFW_KEY_SPECIAL+57)-#define GLFW_KEY_KP_SUBTRACT (GLFW_KEY_SPECIAL+58)-#define GLFW_KEY_KP_ADD (GLFW_KEY_SPECIAL+59)-#define GLFW_KEY_KP_DECIMAL (GLFW_KEY_SPECIAL+60)-#define GLFW_KEY_KP_EQUAL (GLFW_KEY_SPECIAL+61)-#define GLFW_KEY_KP_ENTER (GLFW_KEY_SPECIAL+62)-#define GLFW_KEY_LAST GLFW_KEY_KP_ENTER--// Mouse button definitions-#define GLFW_MOUSE_BUTTON_1 0-#define GLFW_MOUSE_BUTTON_2 1-#define GLFW_MOUSE_BUTTON_3 2-#define GLFW_MOUSE_BUTTON_4 3-#define GLFW_MOUSE_BUTTON_5 4-#define GLFW_MOUSE_BUTTON_6 5-#define GLFW_MOUSE_BUTTON_7 6-#define GLFW_MOUSE_BUTTON_8 7-#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8--// Mouse button aliases-#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1-#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2-#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3---// Joystick identifiers-#define GLFW_JOYSTICK_1 0-#define GLFW_JOYSTICK_2 1-#define GLFW_JOYSTICK_3 2-#define GLFW_JOYSTICK_4 3-#define GLFW_JOYSTICK_5 4-#define GLFW_JOYSTICK_6 5-#define GLFW_JOYSTICK_7 6-#define GLFW_JOYSTICK_8 7-#define GLFW_JOYSTICK_9 8-#define GLFW_JOYSTICK_10 9-#define GLFW_JOYSTICK_11 10-#define GLFW_JOYSTICK_12 11-#define GLFW_JOYSTICK_13 12-#define GLFW_JOYSTICK_14 13-#define GLFW_JOYSTICK_15 14-#define GLFW_JOYSTICK_16 15-#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16---//========================================================================-// Other definitions-//========================================================================--// glfwOpenWindow modes-#define GLFW_WINDOW 0x00010001-#define GLFW_FULLSCREEN 0x00010002--// glfwGetWindowParam tokens-#define GLFW_OPENED 0x00020001-#define GLFW_ACTIVE 0x00020002-#define GLFW_ICONIFIED 0x00020003-#define GLFW_ACCELERATED 0x00020004-#define GLFW_RED_BITS 0x00020005-#define GLFW_GREEN_BITS 0x00020006-#define GLFW_BLUE_BITS 0x00020007-#define GLFW_ALPHA_BITS 0x00020008-#define GLFW_DEPTH_BITS 0x00020009-#define GLFW_STENCIL_BITS 0x0002000A--// The following constants are used for both glfwGetWindowParam-// and glfwOpenWindowHint-#define GLFW_REFRESH_RATE 0x0002000B-#define GLFW_ACCUM_RED_BITS 0x0002000C-#define GLFW_ACCUM_GREEN_BITS 0x0002000D-#define GLFW_ACCUM_BLUE_BITS 0x0002000E-#define GLFW_ACCUM_ALPHA_BITS 0x0002000F-#define GLFW_AUX_BUFFERS 0x00020010-#define GLFW_STEREO 0x00020011-#define GLFW_WINDOW_NO_RESIZE 0x00020012-#define GLFW_FSAA_SAMPLES 0x00020013--// glfwEnable/glfwDisable tokens-#define GLFW_MOUSE_CURSOR 0x00030001-#define GLFW_STICKY_KEYS 0x00030002-#define GLFW_STICKY_MOUSE_BUTTONS 0x00030003-#define GLFW_SYSTEM_KEYS 0x00030004-#define GLFW_KEY_REPEAT 0x00030005-#define GLFW_AUTO_POLL_EVENTS 0x00030006--// glfwWaitThread wait modes-#define GLFW_WAIT 0x00040001-#define GLFW_NOWAIT 0x00040002--// glfwGetJoystickParam tokens-#define GLFW_PRESENT 0x00050001-#define GLFW_AXES 0x00050002-#define GLFW_BUTTONS 0x00050003--// glfwReadImage/glfwLoadTexture2D flags-#define GLFW_NO_RESCALE_BIT 0x00000001 // Only for glfwReadImage-#define GLFW_ORIGIN_UL_BIT 0x00000002-#define GLFW_BUILD_MIPMAPS_BIT 0x00000004 // Only for glfwLoadTexture2D-#define GLFW_ALPHA_MAP_BIT 0x00000008--// Time spans longer than this (seconds) are considered to be infinity-#define GLFW_INFINITY 100000.0---//========================================================================-// Typedefs-//========================================================================--// The video mode structure used by glfwGetVideoModes()-typedef struct {- int Width, Height;- int RedBits, BlueBits, GreenBits;-} GLFWvidmode;--// Image/texture information-typedef struct {- int Width, Height;- int Format;- int BytesPerPixel;- unsigned char *Data;-} GLFWimage;--// Thread ID-typedef int GLFWthread;--// Mutex object-typedef void * GLFWmutex;--// Condition variable object-typedef void * GLFWcond;--// Function pointer types-typedef void (GLFWCALL * GLFWwindowsizefun)(int,int);-typedef int (GLFWCALL * GLFWwindowclosefun)(void);-typedef void (GLFWCALL * GLFWwindowrefreshfun)(void);-typedef void (GLFWCALL * GLFWmousebuttonfun)(int,int);-typedef void (GLFWCALL * GLFWmouseposfun)(int,int);-typedef void (GLFWCALL * GLFWmousewheelfun)(int);-typedef void (GLFWCALL * GLFWkeyfun)(int,int);-typedef void (GLFWCALL * GLFWcharfun)(int,int);-typedef void (GLFWCALL * GLFWthreadfun)(void *);---//========================================================================-// Prototypes-//========================================================================--/*! @file glfw.h- */-// GLFW initialization, termination and version querying-/*! @fn glfwInit- */-GLFWAPI int GLFWAPIENTRY glfwInit( void );-GLFWAPI void GLFWAPIENTRY glfwTerminate( void );-GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor, int *rev );--// Window handling-GLFWAPI int GLFWAPIENTRY glfwOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode );-GLFWAPI void GLFWAPIENTRY glfwOpenWindowHint( int target, int hint );-GLFWAPI void GLFWAPIENTRY glfwCloseWindow( void );-GLFWAPI void GLFWAPIENTRY glfwSetWindowTitle( const char *title );-GLFWAPI void GLFWAPIENTRY glfwGetWindowSize( int *width, int *height );-GLFWAPI void GLFWAPIENTRY glfwSetWindowSize( int width, int height );-GLFWAPI void GLFWAPIENTRY glfwSetWindowPos( int x, int y );-GLFWAPI void GLFWAPIENTRY glfwIconifyWindow( void );-GLFWAPI void GLFWAPIENTRY glfwRestoreWindow( void );-GLFWAPI void GLFWAPIENTRY glfwSwapBuffers( void );-GLFWAPI void GLFWAPIENTRY glfwSwapInterval( int interval );-GLFWAPI int GLFWAPIENTRY glfwGetWindowParam( int param );-GLFWAPI void GLFWAPIENTRY glfwSetWindowSizeCallback( GLFWwindowsizefun cbfun );-GLFWAPI void GLFWAPIENTRY glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun );-GLFWAPI void GLFWAPIENTRY glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun );--// Video mode functions-GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list, int maxcount );-GLFWAPI void GLFWAPIENTRY glfwGetDesktopMode( GLFWvidmode *mode );--// Input handling-GLFWAPI void GLFWAPIENTRY glfwPollEvents( void );-GLFWAPI void GLFWAPIENTRY glfwWaitEvents( void );-GLFWAPI int GLFWAPIENTRY glfwGetKey( int key );-GLFWAPI int GLFWAPIENTRY glfwGetMouseButton( int button );-GLFWAPI void GLFWAPIENTRY glfwGetMousePos( int *xpos, int *ypos );-GLFWAPI void GLFWAPIENTRY glfwSetMousePos( int xpos, int ypos );-GLFWAPI int GLFWAPIENTRY glfwGetMouseWheel( void );-GLFWAPI void GLFWAPIENTRY glfwSetMouseWheel( int pos );-GLFWAPI void GLFWAPIENTRY glfwSetKeyCallback( GLFWkeyfun cbfun );-GLFWAPI void GLFWAPIENTRY glfwSetCharCallback( GLFWcharfun cbfun );-GLFWAPI void GLFWAPIENTRY glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun );-GLFWAPI void GLFWAPIENTRY glfwSetMousePosCallback( GLFWmouseposfun cbfun );-GLFWAPI void GLFWAPIENTRY glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun );--// Joystick input-GLFWAPI int GLFWAPIENTRY glfwGetJoystickParam( int joy, int param );-GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos( int joy, float *pos, int numaxes );-GLFWAPI int GLFWAPIENTRY glfwGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons );--// Time-GLFWAPI double GLFWAPIENTRY glfwGetTime( void );-GLFWAPI void GLFWAPIENTRY glfwSetTime( double time );-GLFWAPI void GLFWAPIENTRY glfwSleep( double time );--// Extension support-GLFWAPI int GLFWAPIENTRY glfwExtensionSupported( const char *extension );-GLFWAPI void* GLFWAPIENTRY glfwGetProcAddress( const char *procname );-GLFWAPI void GLFWAPIENTRY glfwGetGLVersion( int *major, int *minor, int *rev );--// Threading support-GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun, void *arg );-GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID );-GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode );-GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID( void );-GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex( void );-GLFWAPI void GLFWAPIENTRY glfwDestroyMutex( GLFWmutex mutex );-GLFWAPI void GLFWAPIENTRY glfwLockMutex( GLFWmutex mutex );-GLFWAPI void GLFWAPIENTRY glfwUnlockMutex( GLFWmutex mutex );-GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond( void );-GLFWAPI void GLFWAPIENTRY glfwDestroyCond( GLFWcond cond );-GLFWAPI void GLFWAPIENTRY glfwWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout );-GLFWAPI void GLFWAPIENTRY glfwSignalCond( GLFWcond cond );-GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond );-GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void );--// Enable/disable functions-GLFWAPI void GLFWAPIENTRY glfwEnable( int token );-GLFWAPI void GLFWAPIENTRY glfwDisable( int token );--// Image/texture I/O support-GLFWAPI int GLFWAPIENTRY glfwReadImage( const char *name, GLFWimage *img, int flags );-GLFWAPI int GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags );-GLFWAPI void GLFWAPIENTRY glfwFreeImage( GLFWimage *img );-GLFWAPI int GLFWAPIENTRY glfwLoadTexture2D( const char *name, int flags );-GLFWAPI int GLFWAPIENTRY glfwLoadMemoryTexture2D( const void *data, long size, int flags );-GLFWAPI int GLFWAPIENTRY glfwLoadTextureImage2D( GLFWimage *img, int flags );---#ifdef __cplusplus-}-#endif--#endif // __glfw_h_
GLFW.cabal view
@@ -1,5 +1,5 @@ name: GLFW-version: 0.2+version: 0.3 Cabal-Version: >= 1.2 license: BSD3 license-file: LICENSE@@ -14,7 +14,6 @@ please see: <http://glfw.sourceforge.net> data-files: README.txt- GL/glfw.h glfw/license.txt glfw/include/GL/glfw.h glfw/lib/internal.h
Graphics/UI/GLFW.hs view
@@ -1,14 +1,12 @@-{-- Interface to GLFW - An OpenGL framework- Author: Paul H. Liu (paul at thev.net)+{- |+ Interface to GLFW - An OpenGL Framework. - GLFW API version: 2.6 Beta- GLFW Author: Marcus Geelnard (marcus.geelnard at home.se)- GLFW WWW: http://glfw.sourceforge.net+ It provides an alternative to GLUT for OpenGL based Haskell programs,+ and currently supports GLFW API version 2.6 <http://glfw.sourceforge.net>. -} module Graphics.UI.GLFW (- -- Types+ -- * Data Types Version, DisplayBits(..), WindowMode(..),@@ -18,13 +16,21 @@ KeyButtonState(..), Key(..), SpecialKey(..),- MouseButton(..), -- from ButtonNo 0 to 7, different from GLFW C library.- JoyStick(..), -- from JoyStickNo 0 to 15, different from GLFW C library.+ MouseButton(..),+ Joystick (..),+ JoystickParam (..), SpecialFeature(..), TextureFlag(..), BitmapFont(..),-- -- Intialization and Window functions+ WindowCloseCallback,+ WindowSizeCallback,+ WindowRefreshCallback,+ KeyCallback,+ CharCallback,+ MouseButtonCallback,+ MousePosCallback,+ MouseWheelCallback,+ -- * Initialization and Window functions initialize, terminate, videoModes,@@ -40,40 +46,39 @@ swapBuffers, swapInterval, windowParam,- -- Window Callbacks- windowSizeCallback,- windowCloseCallback,- windowRefreshCallback,-- -- Event Handling functions+ joystickParam,+ -- * Event Handling functions pollEvents, waitEvents, getKey, getMouseButton, mousePos, mouseWheel,- -- Event Callbacks+ joystickPos,+ joystickButtons,+ -- * Callbacks+ -- ** Window Callbacks+ windowSizeCallback,+ windowCloseCallback,+ windowRefreshCallback,+ -- ** Event Callbacks keyCallback, charCallback, mouseButtonCallback, mousePosCallback, mouseWheelCallback,-- -- Other functions+ -- * Other functions time, sleep, extensionSupported, enableSpecial, disableSpecial,-- -- Texture Loading functions+ -- * Texture Loading functions loadTexture2D, loadMemoryTexture2D,-- -- Text Rendering function (not in GLFW C library)+ -- * Text Rendering function (not in GLFW C library) renderString-- -- GLFW Thread Support functions are ommited purposely+ -- * GLFW Thread Support functions are omitted purposely ) where {-# OPTIONS_GHC -fglasgow-exts #-}@@ -86,8 +91,11 @@ import Data.IORef import System.IO.Unsafe +-- | Version is represented by (major, minor, revision), used+-- in gettable variable 'version'. type Version = (Int, Int, Int) +-- | Bit depth of GL display buffers, used in 'openWindow'. data DisplayBits = DisplayRGBBits !Int !Int !Int | DisplayAlphaBits !Int@@ -95,7 +103,11 @@ | DisplayStencilBits !Int deriving (Eq, Show) -data WindowMode = Window | FullScreen deriving (Eq, Show)+-- | Window or Fullscreen mode, used in 'openWindow'.+data WindowMode+ = Window+ | FullScreen + deriving (Eq, Show) instance Enum WindowMode where fromEnum Window = 0x00010001@@ -104,6 +116,7 @@ toEnum 0x00010002 = FullScreen toEnum _ = error "toEnum out of bound" +-- | Window hints, used in settable variable 'openWindowHint'. data WindowHint = RefreshRate | AccumRedBits@@ -137,6 +150,7 @@ toEnum 0x00020013 = FSAASamples toEnum _ = error "toEnum out of bound" +-- | Window parameters used in gettable variable 'windowParam'. data WindowParam = Opened | Active@@ -173,7 +187,7 @@ toEnum 0x0002000A = StencilBits toEnum _ = error "toEnum out of bound" -+-- | Video modes used in gettable variables 'videoModes' and 'desktopMode'. data VideoMode = VideoMode { videoWidth :: !Int , videoHeight :: !Int@@ -182,9 +196,17 @@ , videoGreenBits :: !Int } deriving (Eq, Show) -data KeyButtonState = Release | Press deriving (Eq, Show, Enum)+-- | Key or button state.+data KeyButtonState+ = Release+ | Press+ deriving (Eq, Show, Enum) -data Key = CharKey Char | SpecialKey SpecialKey deriving (Eq, Show)+-- | Key is represented by either a character key or a special key.+data Key+ = CharKey Char+ | SpecialKey SpecialKey+ deriving (Eq, Show) instance Enum Key where fromEnum (CharKey c) = fromEnum c@@ -192,6 +214,7 @@ toEnum c | c < 256 = CharKey (toEnum c) toEnum c = SpecialKey (toEnum c) +-- | Special key is a key not represented in the 32 - 127 printable ASCII range. data SpecialKey = UNKNOWN | ESC@@ -386,6 +409,8 @@ toEnum 318 = KP_ENTER toEnum _ = UNKNOWN +-- | Mouse button is represented by left, right, middle or a number+-- from 0 to 7 (note the difference from the GLFW C library). data MouseButton = ButtonLeft | ButtonRight@@ -405,15 +430,35 @@ toEnum 2 = ButtonMiddle toEnum i = ButtonNo i -newtype JoyStick = JoyStickNo Int deriving (Eq, Show)+-- | Joystick is represent a number from 0 to 15 (note the difference from the+-- GLFW C library).+newtype Joystick + = Joystick Int+ deriving (Eq, Show) -instance Enum JoyStick where- fromEnum (JoyStickNo i) | i < 0 = 0- fromEnum (JoyStickNo i) | i < _GLFW_JOYSTICK_LAST = i+instance Enum Joystick where+ fromEnum (Joystick i) | i < 0 = 0+ fromEnum (Joystick i) | i < _GLFW_JOYSTICK_LAST = i fromEnum _ = _GLFW_JOYSTICK_LAST- toEnum i | i < _GLFW_JOYSTICK_LAST = JoyStickNo i- toEnum _ = JoyStickNo _GLFW_JOYSTICK_LAST+ toEnum i | i < _GLFW_JOYSTICK_LAST = Joystick i+ toEnum _ = Joystick _GLFW_JOYSTICK_LAST +-- | Joystick parameters+data JoystickParam + = Present + | Axes+ | Buttons+ deriving (Eq, Show)++instance Enum JoystickParam where+ fromEnum Present = 0x00050001+ fromEnum Axes = 0x00050002 + fromEnum Buttons = 0x00050003+ toEnum 0x00050001 = Present+ toEnum 0x00050002 = Axes+ toEnum 0x00050003 = Buttons++-- | Special features used in 'enableSpecial' and 'disableSpecial'. data SpecialFeature = MouseCursor | StickyKey@@ -438,6 +483,7 @@ toEnum 0x00030006 = AutoPollEvent toEnum _ = error "toEnum out of bound" +-- | Texture flag used in 'loadTexture2D' and 'loadMemoryTexture2D'. data TextureFlag = NoRescale | OriginUL@@ -456,7 +502,10 @@ toEnum 0x00000008 = AlphaMap toEnum _ = error "toEnum out of bound" -data BitmapFont = Fixed8x16 deriving (Eq, Enum, Show)+-- | Build-in bitmap font used in 'renderString'.+data BitmapFont+ = Fixed8x16 -- ^ 8x16 fixed width font.+ deriving (Eq, Enum, Show) -- Mouse button definitions _GLFW_MOUSE_BUTTON_LAST = 7 :: Int@@ -479,13 +528,23 @@ -- Initialization foreign import ccall "GL/glfw.h glfwInit" glfwInit :: IO Int+-- | Initialize GLFW library before use, returns True if successful+-- or False otherwise.+--+-- Before any GLFW functions can be used, GLFW must be initialized+-- to ensure proper functionality. initialize :: IO Bool initialize = glfwInit >>= return . toEnum foreign import ccall "GL/glfw.h glfwTerminate" glfwTerminate :: IO ()+-- | Terminate GLFW library after use.+--+-- Before a program terminates, GLFW has to be terminated in order+-- to free up resources etc. terminate = glfwTerminate >> glfwCleanup foreign import ccall "GL/glfw.h glfwGetVersion" glfwGetVersion :: Ptr Int -> Ptr Int -> Ptr Int -> IO ()+-- | Returns the supported GLFW C library version numbers. version :: GL.GettableStateVar Version version = GL.makeGettableStateVar getter where@@ -499,6 +558,11 @@ -- Windows handling foreign import ccall "GL/glfw.h glfwOpenWindow" glfwOpenWindow :: Int32 -> Int32 -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> IO Int+-- | Open the Window of the given size and other parameters, returns True if+-- successful or False otherwise. +--+-- GLFW applications can only open one Window, which is assumed to be the+-- default place where renderings take place. openWindow :: GL.Size -> [DisplayBits] -> WindowMode -> IO Bool openWindow (GL.Size w h) bits mode = do let (r, g, b) = maybe (0, 0, 0) id $ filterBits (\x -> @@ -526,19 +590,23 @@ filterBits f (x:xs) = maybe (filterBits f xs) Just (f x) foreign import ccall "GL/glfw.h glfwOpenWindowHint" glfwOpenWindowHint :: Int -> Int -> IO ()+-- | Set the Window hints, i.e., additional Window properties, before openWindow. openWindowHint :: GL.SettableStateVar (WindowHint, Int) openWindowHint = GL.makeSettableStateVar setter where setter (hint, val) = glfwOpenWindowHint (fromEnum hint) val +-- | Close the open Window and destroys the associated OpenGL context. foreign import ccall "GL/glfw.h glfwCloseWindow" closeWindow :: IO () foreign import ccall "GL/glfw.h glfwSetWindowTitle" glfwSetWindowTitle :: CString -> IO ()+-- | Set the title of the opened Window. windowTitle :: GL.SettableStateVar String windowTitle = GL.makeSettableStateVar setter where setter = flip withCString glfwSetWindowTitle foreign import ccall "GL/glfw.h glfwGetWindowSize" glfwGetWindowSize :: Ptr Int32 -> Ptr Int32 -> IO () foreign import ccall "GL/glfw.h glfwSetWindowSize" glfwSetWindowSize :: Int32 -> Int32 -> IO ()+-- | Get or set the size of the opened Window. windowSize :: GL.StateVar GL.Size windowSize = GL.makeStateVar getter setter where@@ -549,19 +617,30 @@ return $ GL.Size w' h')) setter (GL.Size w h) = glfwSetWindowSize w h +-- | Iconify the Window which can later by retored. foreign import ccall "GL/glfw.h glfwIconifyWindow" iconifyWindow :: IO ()+-- | Restore the Window after iconification. foreign import ccall "GL/glfw.h glfwRestoreWindow" restoreWindow :: IO ()+-- | Swap the back and front color buffers of the Window. If 'AutoPollEvent'+-- is enabled by 'enableSpecial' (which is the default), it also polls for+-- new events before the swapping. foreign import ccall "GL/glfw.h glfwSwapBuffers" swapBuffers :: IO () foreign import ccall "GL/glfw.h glfwSwapInterval" glfwSwapInterval :: Int -> IO ()+-- | Set the minimum number of monitor retraces between each each buffer swap+-- performed by 'swapBuffers'. If set to zero, buffer swaps will not be+-- synchronized to the vertical refresh of the monitor. swapInterval :: GL.SettableStateVar Int swapInterval = GL.makeSettableStateVar glfwSwapInterval foreign import ccall "GL/glfw.h glfwGetWindowParam" glfwGetWindowParam :: Int -> IO Int+-- | Get the value of Window parameters. windowParam :: WindowParam -> GL.GettableStateVar Int windowParam p = GL.makeGettableStateVar (glfwGetWindowParam (fromEnum p)) foreign import ccall "GL/glfw.h glfwSetWindowSizeCallback" glfwSetWindowSizeCallback :: FunPtr GLFWwindowsizefun -> IO ()+-- | Callback type for 'windowSizeCallback'. type WindowSizeCallback = GL.Size -> IO ()+-- | Set the callback function that will be called every time the Window size changes. windowSizeCallback :: GL.SettableStateVar WindowSizeCallback windowSizeCallback = GL.makeSettableStateVar (\f -> do let g w h = f (GL.Size w h)@@ -570,7 +649,9 @@ glfwSetWindowSizeCallback ptr) foreign import ccall "GL/glfw.h glfwSetWindowCloseCallback" glfwSetWindowCloseCallback :: FunPtr GLFWwindowclosefun -> IO ()+-- | Callback type for 'windowCloseCallback'. type WindowCloseCallback = IO ()+-- | Set the callback function that will be called when the Window is closed. windowCloseCallback :: GL.SettableStateVar WindowCloseCallback windowCloseCallback = GL.makeSettableStateVar (\f -> do ptr <- glfwWrapFun0 f@@ -578,7 +659,13 @@ glfwSetWindowCloseCallback ptr) foreign import ccall "GL/glfw.h glfwSetWindowRefreshCallback" glfwSetWindowRefreshCallback :: FunPtr GLFWwindowrefreshfun -> IO ()+-- | Callback type for 'windowRefreshCallback'. type WindowRefreshCallback = IO ()+-- | Set the callback function that will be called when the Window client area+-- needs to be refreshed, which occurs when any part of the window client+-- area is damaged and needs to be repainted (for instance, if a part +-- of the window that was previously occluded by another window has become+-- visible). windowRefreshCallback :: GL.SettableStateVar WindowRefreshCallback windowRefreshCallback = GL.makeSettableStateVar setter where @@ -589,6 +676,8 @@ -- Video mode functions foreign import ccall "GL/glfw.h glfwGetVideoModes" glfwGetVideoModes :: Ptr Int -> Int -> IO ()+-- | Get a list of deteced 'VideoMode's, the max number of which is limited+-- to 256 for now. videoModes :: GL.GettableStateVar [VideoMode] videoModes = GL.makeGettableStateVar getter where@@ -608,6 +697,7 @@ maxCount = 256 foreign import ccall "GL/glfw.h glfwGetDesktopMode" glfwGetDesktopMode :: Ptr Int -> IO ()+-- | Get the 'VideoMode' of current desktop. desktopMode :: GL.GettableStateVar VideoMode desktopMode = GL.makeGettableStateVar getter where@@ -617,18 +707,30 @@ return $ VideoMode w h r b g) -- Input Handling+-- | Poll events, such as user input and window events. Upon calling this+-- function, all window states, keyboard states and mouse states are updated.+-- If any related callback functions are registered, these are called during the+-- call of 'pollEvents'. foreign import ccall "GL/glfw.h glfwPollEvents" pollEvents :: IO ()+-- | Wait for events, such as user input and window events. The calling thread+-- will be put to sleep until any event appears in the event queue.+-- When events are ready, the events will be processed just as they are +-- processed by 'pollEvents'. foreign import ccall "GL/glfw.h glfwWaitEvents" waitEvents :: IO () foreign import ccall "GL/glfw.h glfwGetKey" glfwGetKey :: Int -> IO Int+-- | Return a 'KeyButtonState', either 'Release' or 'Press', of the indicated key. getKey :: Enum a => a -> IO KeyButtonState getKey key = glfwGetKey (fromEnum key) >>= return . toEnum foreign import ccall "GL/glfw.h glfwGetMouseButton" glfwGetMouseButton :: Int -> IO Int +-- | Return a 'KeyButtonState', either 'Release' or 'Press', of the indicated mouse+-- button. getMouseButton :: MouseButton -> IO KeyButtonState getMouseButton button = glfwGetMouseButton (fromEnum button) >>= return . toEnum foreign import ccall "GL/glfw.h glfwGetMousePos" glfwGetMousePos :: Ptr Int32 -> Ptr Int32 -> IO () foreign import ccall "GL/glfw.h glfwSetMousePos" glfwSetMousePos :: Int32 -> Int32 -> IO ()+-- | Set or get the mouse position. mousePos :: GL.StateVar GL.Position mousePos = GL.makeStateVar getter setter where@@ -641,11 +743,45 @@ foreign import ccall "GL/glfw.h glfwGetMouseWheel" glfwGetMouseWheel :: IO Int foreign import ccall "GL/glfw.h glfwSetMouseWheel" glfwSetMouseWheel :: Int -> IO ()+-- | Set or get the mouse wheel position. mouseWheel :: GL.StateVar Int mouseWheel = GL.makeStateVar glfwGetMouseWheel glfwSetMouseWheel +foreign import ccall "GL/glfw.h glfwGetJoystickParam" glfwGetJoystickParam :: Int -> Int -> IO Int+-- | Get joystick parameters.+joystickParam :: Joystick -> JoystickParam -> GL.GettableStateVar Int+joystickParam joy param = GL.makeGettableStateVar + (glfwGetJoystickParam (fromEnum joy) (fromEnum param))+foreign import ccall "GL/glfw.h glfwGetJoystickPos" glfwGetJoystickPos :: Int -> Ptr Int -> Int -> IO Int+-- | Get joystick positions. The returned list contains the positions+-- for all available axes for the given joystick.+joystickPos :: Joystick -> GL.GettableStateVar [Int] +joystickPos joy = GL.makeGettableStateVar getter+ where+ getter = do+ n <- glfwGetJoystickParam (fromEnum joy) (fromEnum Axes)+ withArray (take n (repeat 0)) (\arr -> do+ m <- glfwGetJoystickPos (fromEnum joy) arr n+ peekArray m arr)+foreign import ccall "GL/glfw.h glfwGetJoystickButtons" glfwGetJoystickButtons :: Int -> Ptr Int8 -> Int -> IO Int+-- | Get joystick button states. The returned list contains the states+-- for all available buttons for the given joystick.+joystickButtons :: Joystick -> GL.GettableStateVar [KeyButtonState]+joystickButtons joy = GL.makeGettableStateVar getter+ where+ getter = do+ n <- glfwGetJoystickParam (fromEnum joy) (fromEnum Buttons)+ withArray (take n (repeat 0)) (\arr -> do+ m <- glfwGetJoystickButtons (fromEnum joy) arr n+ a <- peekArray m arr+ return $ map (toEnum . fromEnum) a)+ foreign import ccall "GL/glfw.h glfwSetKeyCallback" glfwSetKeyCallback :: FunPtr GLFWkeyfun -> IO ()+-- | Callback type for 'keyCallback'. type KeyCallback = Key -> KeyButtonState -> IO ()+-- | Set the callback function that will be called when there is a key event,+-- i.e., everytime the state of a single key is changed. The reported keys+-- are unaffected by any modifiers (such as SHIFT or ALT). keyCallback :: GL.SettableStateVar KeyCallback keyCallback = GL.makeSettableStateVar setter where @@ -657,7 +793,12 @@ glfwSetKeyCallback ptr foreign import ccall "GL/glfw.h glfwSetCharCallback" glfwSetCharCallback :: FunPtr GLFWcharfun -> IO ()+-- | Callback type for 'charCallback'. type CharCallback = Char -> KeyButtonState -> IO ()+-- | Set the callback function that will be called when there is a character event,+-- i.e., everytime a key that results in a printable Unicode character is+-- pressed or released. Characters are affected by modifiers (such as SHIFT+-- or ALT). charCallback :: GL.SettableStateVar CharCallback charCallback = GL.makeSettableStateVar setter where@@ -668,7 +809,10 @@ glfwSetCharCallback ptr foreign import ccall "GL/glfw.h glfwSetMouseButtonCallback" glfwSetMouseButtonCallback :: FunPtr GLFWmousebuttonfun -> IO ()+-- | Callback type for 'mouseButtonCallback'. type MouseButtonCallback = MouseButton -> KeyButtonState -> IO ()+-- | Set the callback function that will be called when there is a mouse button event,+-- i.e., everytime a mouse button is pressed or released. mouseButtonCallback :: GL.SettableStateVar MouseButtonCallback mouseButtonCallback = GL.makeSettableStateVar setter where@@ -679,7 +823,10 @@ glfwSetMouseButtonCallback ptr foreign import ccall "GL/glfw.h glfwSetMousePosCallback" glfwSetMousePosCallback :: FunPtr GLFWmouseposfun -> IO ()+-- | Callback type for 'mousePosCallback'. type MousePosCallback = GL.Position -> IO ()+-- | Set the callback function that will be called when there is a mouse motion+-- event, i.e., everytime they mouse is moved. mousePosCallback :: GL.SettableStateVar MousePosCallback mousePosCallback = GL.makeSettableStateVar setter where @@ -690,7 +837,10 @@ glfwSetMousePosCallback ptr foreign import ccall "GL/glfw.h glfwSetMouseWheelCallback" glfwSetMouseWheelCallback :: FunPtr GLFWmousewheelfun -> IO ()+-- | Callback type for 'mouseWheelCallback'. type MouseWheelCallback = Int -> IO ()+-- | Set the callback function that will be called when there is a mouse wheel+-- event, i.e., everytime the mouse wheel is turned. mouseWheelCallback :: GL.SettableStateVar MouseWheelCallback mouseWheelCallback = GL.makeSettableStateVar setter where@@ -702,24 +852,35 @@ -- Time function foreign import ccall "GL/glfw.h glfwGetTime" glfwGetTime :: IO Double foreign import ccall "GL/glfw.h glfwSetTime" glfwSetTime :: Double -> IO ()+-- | Get or set the value of the high precision timer. The time is measured+-- in seconds as a double precision floasting point number. +--+-- Unless the timer has been set by the programmer, the time is measured+-- as the number of seconds that have passed since 'initialize' was called. time :: GL.StateVar Double time = GL.makeStateVar glfwGetTime glfwSetTime-+-- | Put the calling thread to sleep for the requested period of time in seconds.+--+-- The time is generally in the range 1ms to 20ms, depending on thread scheduling+-- time slot intervals etc. foreign import ccall "GL/glfw.h glfwSleep" sleep :: Double -> IO () -- Extension support foreign import ccall "GL/glfw.h glfwExtensionSupported" glfwExtensionSupported :: CString -> IO Int+-- | Return True if the extension is supported, otherwise False. extensionSupported :: String -> IO Bool extensionSupported e = flip withCString glfwExtensionSupported e >>= return . toEnum-+-- TODO: -- foreign import ccall "GL/glfw.h glfwGetProcAddress" glfwGetProcAddress :: Ptr CChar -> FunPtr ? -- foreign import ccall "GL/glfw.h glfwGetGLVersion" glfwGetGLVersion :: Ptr Int -> Ptr Int -> Ptr Int -> IO () -- Enable/disable function foreign import ccall "GL/glfw.h glfwEnable" glfwEnable :: Int -> IO () foreign import ccall "GL/glfw.h glfwDisable" glfwDisable :: Int -> IO ()+-- | Enable a 'SpecialFeature'. enableSpecial :: SpecialFeature -> IO () enableSpecial f = glfwEnable (fromEnum f)+-- | Disable a 'SpecialFeature'. disableSpecial :: SpecialFeature -> IO () disableSpecial f = glfwEnable (fromEnum f) @@ -727,6 +888,29 @@ --foreign import ccall "GL/glfw.h glfwReadImage" glfwReadImage :: Ptr CChar -> Ptr GLFWimage -> Int -> IO () --foreign import ccall "GL/glfw.h glfwFreeImage" glfwFreeImage :: Ptr GLFWimage -> IO () foreign import ccall "GL/glfw.h glfwLoadTexture2D" glfwLoadTexture2D :: CString -> Int -> IO Int+-- | Read an image from a file specified by the given string and+-- upload the image to OpenGL texture memory.+--+-- If BuildMipMaps flag is given, all mipmap levels for the loaded+-- texture are generated and uploaded to texture memory.+--+-- Unless the OriginUL flag is given, the origin of the texture is+-- the lower left corner of the loaded image. If OriginUL is given,+-- however, the first pixel is the upper left corner.+--+-- For single component images (i.e. gray scale), the texture is uploaded+-- as an alpha mask if the flag AlphaMap is set, otherwise it's uploaded+-- as a luminance texture.+--+-- It only supports the Truevision Targa verson 1 file (.tga). Supported +-- pixel formats are: 8-bit gray scale, 8-bit paletted (24/32-bit color), +-- 24-bit true color and 32-bit true color + alpha.+--+-- Paletted images are translated into true color or tru color + alpha+-- pixel formats.+--+-- The read texture is always rescaled to the nearest larger 2^m x 2^n+-- resolution using bilinear interpolation if necessary. loadTexture2D :: String -> [TextureFlag] -> IO Bool loadTexture2D fname flag = do r <- flip withCString (flip glfwLoadTexture2D (readFlag flag)) fname@@ -736,6 +920,9 @@ readFlag [] = 0 foreign import ccall "GL/glfw.h glfwLoadMemoryTexture2D" glfwLoadMemoryTexture2D :: Ptr CChar -> Int -> Int -> IO Int+-- | Read an image from the memory buffer (the given byte string) and+-- upload the image to OpenGL texture memory. The rest is similar+-- to 'loadTexture2D'. loadMemoryTexture2D :: String -> [TextureFlag] -> IO Bool loadMemoryTexture2D arr flag = withCAStringLen arr (\(ptr, len) -> do r <- glfwLoadMemoryTexture2D ptr len (readFlag flag)@@ -829,6 +1016,9 @@ GL.vertex (vertex3 0 0 0)) GL.translate (vector3 w 0 0) +-- | Render a text string using the given 'BitmapFont'.+-- +-- Text is rendered through texture, and is only possible with alpha enabled. renderString :: BitmapFont -> String -> IO () renderString name s = do font <- loadFont name
README.txt view
@@ -4,14 +4,21 @@ SOE (http://www.haskell.org/soe) now depends on this package. +The website for this Haskell module is at Haskell Wiki site: +http://haskell.org/haskellwiki/GLFW ========= ChangeLog ========= +- Tue Jan 15 EST 2008 + + Version 0.3 adds Haddock documentation and the missing Joystick + APIs. + - Thu Dec 20 EST 2007 - version 0.2 is repackaged to work with Cabal 1.2 or later. + Version 0.2 is repackaged to work with Cabal 1.2 or later. Now it builds and installs out-of-box on most platforms. @@ -48,7 +55,10 @@ use "runhaskell Setup.hs build --verbose" to see the actual compilation steps. +4. Optionally to build its Haddock documentation, type + runhaskell Setup.hs haddock + ==== NOTE ==== @@ -61,8 +71,8 @@ GHC 6.8.x is already equipped with Cabal 1.2, so everything should work as expected. But for GHC 6.6.x users, you'll have to first install the newest version of Cabal 1.2 before installing GLFW. -Cabal 1.2 also requires the module FilePath to be priorly installed, -which doesn't come with GHC 6.6.x. +Cabal 1.2 also requires the module FilePath, which doesn't come +with GHC 6.6.x. ============= @@ -77,14 +87,16 @@ module to import is "Graphics.UI.GLFW". You'll need to pass "-package GLFW" to GHC if you want to compile it. -GLFW itself is well documented (see glfw/docs directory), but -the Haskell module isn't. You may see the SOE.hs from the -SOE package for sample usage. +GLFW itself is well documented (see GLFW website), and the +Haskell module API is documented via Haddock. Not all functions are fully tested, and there are still a few GLFW C functions missing from the Haskell module, namely -the image loading and joystick ones. They'll be added in -future releases. +the image loading functions. They are excluded because image +handling is a separate issue, and low level buffer manipulation +would obscure their use further. Texture loading from TGA +format is supported both from file and from memory (via a +string buffer). The Haskell module also provides basic text rendering while GLFW doesn't. It comes from a free 8x16 font which is made @@ -105,4 +117,4 @@ maintainer: Paul H. Liu <paul@thev.net>. -- -Last Updated: Thu Dec 20 EST 2007 +Last Updated: Tue Jan 15 EST 2008