module SFML.Graphics.RenderWindow
(
createRenderWindow
, renderWindowFromHandle
, destroy
, close
, isWindowOpen
, getWindowSettings
, pollEvent
, waitEvent
, getWindowPosition
, setWindowPosition
, getWindowSize
, setWindowSize
, setWindowTitle
, setWindowIcon
, setWindowVisible
, setMouseVisible
, setVSync
, setKeyRepeat
, setWindowActive
, requestFocus
, hasFocus
, display
, setFramerateLimit
, setJoystickThreshold
, getSystemHandle
, clearRenderWindow
, setView
, getView
, getDefaultView
, getViewport
, mapPixelToCoords
, drawSprite
, drawText
, drawShape
, drawCircle
, drawConvexShape
, drawRectangle
, drawVertexArray
, drawPrimitives
, drawPrimitives'
, pushGLStates
, popGLStates
, resetGLStates
, captureRenderWindow
, getMousePosition
, setMousePosition
)
where
import SFML.Graphics.Color
import SFML.Graphics.Rect
import SFML.Graphics.Types
import SFML.Graphics.PrimitiveType
import SFML.Graphics.RenderStates
import SFML.Graphics.SFCoordSpace
import SFML.Graphics.SFRenderTarget
import SFML.Graphics.SFViewable
import SFML.Graphics.Vertex
import SFML.Window.ContextSettings
import SFML.Window.Event
import SFML.Window.SFWindow
import SFML.Window.VideoMode
import SFML.Window.WindowHandle
import SFML.Window.Window
import SFML.SFDisplayable
import SFML.SFResource
import SFML.System.Vector2
import Control.Applicative ((<$>), (<*>))
import Data.Bits ((.|.))
import Data.List (foldl')
import Foreign.C.String
import Foreign.C.Types
import Foreign.Marshal.Alloc (alloca)
import Foreign.Marshal.Array (withArray)
import Foreign.Marshal.Utils (with)
import Foreign.Ptr
import Foreign.Storable
createRenderWindow
:: VideoMode
-> String
-> [WindowStyle]
-> Maybe ContextSettings
-> IO RenderWindow
createRenderWindow vm title styles ctx =
withCAString title $ \ctitle ->
with vm $ \ptrVM ->
let style = foldl' (.|.) 0 $ fmap fromEnum styles
in case ctx of
Nothing -> sfRenderWindow_create_helper ptrVM ctitle (fromIntegral . fromEnum $ style) nullPtr
Just c -> with c $ sfRenderWindow_create_helper ptrVM ctitle (fromIntegral . fromEnum $ style)
foreign import ccall unsafe "sfRenderWindow_create_helper"
sfRenderWindow_create_helper :: Ptr VideoMode -> CString -> CUInt -> Ptr ContextSettings -> IO RenderWindow
renderWindowFromHandle
:: WindowHandle
-> Maybe ContextSettings
-> IO RenderWindow
renderWindowFromHandle wm Nothing = sfRenderWindow_createFromHandle wm nullPtr
renderWindowHandleFrom wm (Just c) = with c $ sfRenderWindow_createFromHandle wm
foreign import ccall unsafe "sfRenderWindow_createFromHandle"
sfRenderWindow_createFromHandle :: WindowHandle -> Ptr ContextSettings -> IO RenderWindow
instance SFResource RenderWindow where
destroy = sfRenderWindow_destroy
foreign import ccall unsafe "sfRenderWindow_destroy"
sfRenderWindow_destroy :: RenderWindow -> IO ()
instance SFDisplayable RenderWindow where
display = sfRenderWindow_display
instance SFWindow RenderWindow where
close = sfRenderWindow_close
isWindowOpen = fmap (/=0) . sfRenderWindow_isOpen
getWindowSettings wnd = alloca $ \ptr -> sfRenderWindow_getSettings_helper wnd ptr >> peek ptr
pollEvent wnd =
alloca $ \ptr -> do
result <- sfRenderWindow_pollEvent wnd ptr
case result of
0 -> return Nothing
_ -> peek ptr >>= return . Just
waitEvent wnd =
alloca $ \ptr -> do
result <- sfRenderWindow_waitEvent wnd ptr
case result of
0 -> return Nothing
_ -> peek ptr >>= return . Just
getWindowPosition wnd = alloca $ \ptr -> sfRenderWindow_getPosition_helper wnd ptr >> peek ptr
setWindowPosition wnd pos = with pos $ sfRenderWindow_setPosition_helper wnd
getWindowSize wnd = alloca $ \ptr -> sfRenderWindow_getSize_helper wnd ptr >> peek ptr
setWindowSize wnd size = with size $ sfRenderWindow_setSize_helper wnd
setWindowTitle wnd title = withCAString title $ sfRenderWindow_setTitle wnd
setWindowIcon wnd w h pixels =
sfRenderWindow_setIcon wnd (fromIntegral w) (fromIntegral h) pixels
setWindowVisible wnd val = sfRenderWindow_setVisible wnd (fromIntegral . fromEnum $ val)
setMouseVisible wnd val = sfRenderWindow_setMouseCursorVisible wnd (fromIntegral . fromEnum $ val)
setVSync wnd val = sfRenderWindow_setVerticalSyncEnabled wnd (fromIntegral . fromEnum $ val)
setKeyRepeat wnd val = sfRenderWindow_setKeyRepeatEnabled wnd (fromIntegral . fromEnum $ val)
setWindowActive wnd val =
fmap (toEnum . fromIntegral) $ sfRenderWindow_setActive wnd (fromIntegral . fromEnum $ val)
requestFocus wnd = sfRenderWindow_requestFocus wnd
hasFocus wnd = ((/=0) . fromIntegral) <$> sfRenderWindow_hasFocus wnd
setFramerateLimit wnd fps = sfRenderWindow_setFramerateLimit wnd (fromIntegral fps)
setJoystickThreshold w t = sfRenderWindow_setJoystickThreshold w (realToFrac t)
getSystemHandle = sfRenderWindow_getSystemHandle
getMousePosition Nothing =
alloca $ \ptr -> sfMouse_getPositionRenderWindow_helper (RenderWindow nullPtr) ptr >> peek ptr
getMousePosition (Just wnd) =
alloca $ \ptr -> sfMouse_getPositionRenderWindow_helper wnd ptr >> peek ptr
setMousePosition pos Nothing =
with pos $ \ptr -> sfMouse_setPositionRenderWindow_helper ptr (RenderWindow nullPtr)
setMousePosition pos (Just wnd) =
with pos $ \ptr -> sfMouse_setPositionRenderWindow_helper ptr wnd
foreign import ccall unsafe "sfRenderWindow_close"
sfRenderWindow_close :: RenderWindow -> IO ()
foreign import ccall unsafe "sfRenderWindow_isOpen"
sfRenderWindow_isOpen :: RenderWindow -> IO CInt
foreign import ccall unsafe "sfRenderWindow_getSettings_helper"
sfRenderWindow_getSettings_helper :: RenderWindow -> Ptr ContextSettings -> IO ()
foreign import ccall unsafe "sfRenderWindow_pollEvent"
sfRenderWindow_pollEvent :: RenderWindow -> Ptr SFEvent -> IO CInt
foreign import ccall unsafe "sfRenderWindow_waitEvent"
sfRenderWindow_waitEvent :: RenderWindow -> Ptr SFEvent -> IO CInt
foreign import ccall unsafe "sfRenderWindow_getPosition_helper"
sfRenderWindow_getPosition_helper :: RenderWindow -> Ptr Vec2i -> IO ()
foreign import ccall unsafe "sfRenderWindow_setPosition_helper"
sfRenderWindow_setPosition_helper :: RenderWindow -> Ptr Vec2i -> IO ()
foreign import ccall unsafe "sfRenderWindow_getSize_helper"
sfRenderWindow_getSize_helper :: RenderWindow -> Ptr Vec2u -> IO ()
foreign import ccall unsafe "sfRenderWindow_setSize_helper"
sfRenderWindow_setSize_helper :: RenderWindow -> Ptr Vec2u -> IO ()
foreign import ccall unsafe "sfRenderWindow_setTitle"
sfRenderWindow_setTitle :: RenderWindow -> CString -> IO ()
foreign import ccall unsafe "sfRenderWindow_setIcon"
sfRenderWindow_setIcon :: RenderWindow -> CUInt -> CUInt -> Ptr a -> IO ()
foreign import ccall unsafe "sfRenderWindow_setVisible"
sfRenderWindow_setVisible :: RenderWindow -> CInt -> IO ()
foreign import ccall unsafe "sfRenderWindow_setMouseCursorVisible"
sfRenderWindow_setMouseCursorVisible :: RenderWindow -> CInt -> IO ()
foreign import ccall unsafe "sfRenderWindow_setVerticalSyncEnabled"
sfRenderWindow_setVerticalSyncEnabled :: RenderWindow -> CInt -> IO ()
foreign import ccall unsafe "sfRenderWindow_setKeyRepeatEnabled"
sfRenderWindow_setKeyRepeatEnabled :: RenderWindow -> CInt -> IO ()
foreign import ccall unsafe "sfRenderWindow_setActive"
sfRenderWindow_setActive :: RenderWindow -> CInt -> IO CInt
foreign import ccall unsafe "sfRenderWindow_requestFocus"
sfRenderWindow_requestFocus :: RenderWindow -> IO ()
foreign import ccall unsafe "sfRenderWindow_hasFocus"
sfRenderWindow_hasFocus :: RenderWindow -> IO CInt
foreign import ccall unsafe "sfRenderWindow_display"
sfRenderWindow_display :: RenderWindow -> IO ()
foreign import ccall unsafe "sfRenderWindow_setFramerateLimit"
sfRenderWindow_setFramerateLimit :: RenderWindow -> CInt -> IO ()
foreign import ccall unsafe "sfRenderWindow_setJoystickThreshold"
sfRenderWindow_setJoystickThreshold :: RenderWindow -> CFloat -> IO ()
foreign import ccall unsafe "sfRenderWindow_getSystemHandle"
sfRenderWindow_getSystemHandle :: RenderWindow -> IO WindowHandle
foreign import ccall unsafe "sfMouse_getPositionRenderWindow_helper"
sfMouse_getPositionRenderWindow_helper :: RenderWindow -> Ptr Vec2i -> IO ()
foreign import ccall unsafe "sfMouse_setPositionRenderWindow_helper"
sfMouse_setPositionRenderWindow_helper :: Ptr Vec2i -> RenderWindow -> IO ()
clearRenderWindow
:: RenderWindow
-> Color
-> IO ()
clearRenderWindow wnd color = with color $ sfRenderWindow_clear_helper wnd
foreign import ccall unsafe "sfRenderWindow_clear_helper"
sfRenderWindow_clear_helper :: RenderWindow -> Ptr Color -> IO ()
instance SFViewable RenderWindow where
setView = sfRenderWindow_setView
getView = sfRenderWindow_getView
getDefaultView = sfRenderWindow_getDefaultView
getViewport wnd view = alloca $ \ptr -> sfRenderWindow_getViewport_helper wnd view ptr >> peek ptr
foreign import ccall unsafe "sfRenderWindow_setView"
sfRenderWindow_setView :: RenderWindow -> View -> IO ()
foreign import ccall unsafe "sfRenderWindow_getView"
sfRenderWindow_getView :: RenderWindow -> IO View
foreign import ccall unsafe "sfRenderWindow_getDefaultView"
sfRenderWindow_getDefaultView :: RenderWindow -> IO View
foreign import ccall unsafe "sfRenderWindow_getViewport_helper"
sfRenderWindow_getViewport_helper :: RenderWindow -> View -> Ptr IntRect -> IO ()
instance SFCoordSpace RenderWindow where
mapPixelToCoords wnd p view =
alloca $ \ptr ->
with p $ \posPtr -> case view of
Nothing -> sfRenderWindow_mapPixelToCoords_helper wnd posPtr (View nullPtr) ptr >> peek ptr
Just v -> sfRenderWindow_mapPixelToCoords_helper wnd posPtr v ptr >> peek ptr
foreign import ccall unsafe "sfRenderWindow_mapPixelToCoords_helper"
sfRenderWindow_mapPixelToCoords_helper :: RenderWindow -> Ptr Vec2i -> View -> Ptr Vec2f -> IO ()
instance SFRenderTarget RenderWindow where
drawSprite wnd sprite Nothing = sfRenderWindow_drawSprite wnd sprite nullPtr
drawSprite wnd sprite (Just rs) = with rs $ sfRenderWindow_drawSprite wnd sprite
drawText wnd text Nothing = sfRenderWindow_drawText wnd text nullPtr
drawText wnd text (Just rs) = with rs $ sfRenderWindow_drawText wnd text
drawShape wnd shape Nothing = sfRenderWindow_drawShape wnd shape nullPtr
drawShape wnd shape (Just rs) = with rs $ sfRenderWindow_drawShape wnd shape
drawCircle wnd circle Nothing = sfRenderWindow_drawCircleShape wnd circle nullPtr
drawCircle wnd circle (Just rs) = with rs $ sfRenderWindow_drawCircleShape wnd circle
drawConvexShape wnd shape Nothing = sfRenderWindow_drawConvexShape wnd shape nullPtr
drawConvexShape wnd shape (Just rs) = with rs $ sfRenderWindow_drawConvexShape wnd shape
drawRectangle wnd rect Nothing = sfRenderWindow_drawRectangleShape wnd rect nullPtr
drawRectangle wnd rect (Just rs) = with rs $ sfRenderWindow_drawRectangleShape wnd rect
drawVertexArray wnd va Nothing = sfRenderWindow_drawVertexArray wnd va nullPtr
drawVertexArray wnd va (Just rs) = with rs $ sfRenderWindow_drawVertexArray wnd va
drawPrimitives wnd verts prim Nothing =
let n = length verts
in withArray verts $ \ptr ->
sfRenderWindow_drawPrimitives wnd ptr (fromIntegral n) (fromIntegral . fromEnum $ prim) nullPtr
drawPrimitives wnd verts prim (Just r) =
let n = length verts
in withArray verts $ \ptr ->
with r $ sfRenderWindow_drawPrimitives wnd ptr (fromIntegral n) (fromIntegral . fromEnum $ prim)
drawPrimitives' wnd verts n prim Nothing =
sfRenderWindow_drawPrimitives wnd verts (fromIntegral n) (fromIntegral . fromEnum $ prim) nullPtr
drawPrimitives' wnd verts n prim (Just r) =
with r $ sfRenderWindow_drawPrimitives wnd verts (fromIntegral n) (fromIntegral . fromEnum $ prim)
pushGLStates = sfRenderWindow_pushGLStates
popGLStates = sfRenderWindow_popGLStates
resetGLStates = sfRenderWindow_resetGLStates
foreign import ccall unsafe "sfRenderWindow_drawSprite"
sfRenderWindow_drawSprite :: RenderWindow -> Sprite -> Ptr RenderStates -> IO ()
foreign import ccall unsafe "sfRenderWindow_drawText"
sfRenderWindow_drawText :: RenderWindow -> Text -> Ptr RenderStates -> IO ()
foreign import ccall unsafe "sfRenderWindow_drawShape"
sfRenderWindow_drawShape :: RenderWindow -> Shape -> Ptr RenderStates -> IO ()
foreign import ccall unsafe "sfRenderWindow_drawCircleShape"
sfRenderWindow_drawCircleShape :: RenderWindow -> CircleShape -> Ptr RenderStates -> IO ()
foreign import ccall unsafe "sfRenderWindow_drawConvexShape"
sfRenderWindow_drawConvexShape :: RenderWindow -> ConvexShape -> Ptr RenderStates -> IO ()
foreign import ccall unsafe "sfRenderWindow_drawRectangleShape"
sfRenderWindow_drawRectangleShape :: RenderWindow -> RectangleShape -> Ptr RenderStates -> IO ()
foreign import ccall unsafe "sfRenderWindow_drawVertexArray"
sfRenderWindow_drawVertexArray :: RenderWindow -> VertexArray -> Ptr RenderStates -> IO ()
foreign import ccall unsafe "sfRenderWindow_drawPrimitives"
sfRenderWindow_drawPrimitives :: RenderWindow -> Ptr Vertex -> CUInt -> CInt -> Ptr RenderStates -> IO ()
foreign import ccall unsafe "sfRenderWindow_pushGLStates"
sfRenderWindow_pushGLStates :: RenderWindow -> IO ()
foreign import ccall unsafe "sfRenderWindow_popGLStates"
sfRenderWindow_popGLStates :: RenderWindow -> IO ()
foreign import ccall unsafe "sfRenderWindow_resetGLStates"
sfRenderWindow_resetGLStates :: RenderWindow -> IO ()
captureRenderWindow :: RenderWindow -> IO Image
captureRenderWindow = sfRenderWindow_capture
foreign import ccall unsafe "sfRenderWindow_capture"
sfRenderWindow_capture :: RenderWindow -> IO Image