-----------------------------------------------------------------------------
-- |
-- Module      :  Graphics.UI.SDL.Framerate
-- Copyright   :  (c) David Himmelstrup 2005
-- License     :  BSD-like
--
-- Maintainer  :  lemmih@gmail.com
-- Stability   :  provisional
-- Portability :  portable
--
-----------------------------------------------------------------------------
module Graphics.UI.SDL.Framerate
    ( new
    , init
    , set
    , get
    , delay
    , FPSManager
    ) where

import Foreign as Foreign hiding (new)
import Foreign.C

import Prelude hiding (init)

data FPSManagerStruct
type FPSManager = ForeignPtr FPSManagerStruct

sizeOfManager :: Int
sizeOfManager = 16

new :: IO FPSManager
new  = do manager <- Foreign.mallocBytes sizeOfManager >>= newForeignPtr finalizerFree
          init manager
          return manager

-- void SDL_initFramerate(FPSmanager * manager);
foreign import ccall unsafe "SDL_initFramerate" sdlInitFramerate :: Ptr FPSManagerStruct -> IO ()
init :: FPSManager -> IO ()
init manager
    = withForeignPtr manager sdlInitFramerate


-- int SDL_setFramerate(FPSmanager * manager, int rate);
foreign import ccall unsafe "SDL_setFramerate" sdlSetFramerate :: Ptr FPSManagerStruct -> Int -> IO Int
set :: FPSManager -> Int -> IO Bool
set manager hz
    = withForeignPtr manager $ \fpsPtr ->
      do ret <- sdlSetFramerate fpsPtr hz
         case ret of
           (-1) -> return False
           _    -> return True

-- int SDL_getFramerate(FPSmanager * manager);
foreign import ccall unsafe "SDL_getFramerate" sdlGetFramerate :: Ptr FPSManagerStruct -> IO Int
get :: FPSManager -> IO Int
get manager = withForeignPtr manager sdlGetFramerate

-- void SDL_framerateDelay(FPSmanager * manager);
foreign import ccall unsafe "SDL_framerateDelay" sdlFramerateDelay :: Ptr FPSManagerStruct -> IO ()
delay :: FPSManager -> IO ()
delay manager = withForeignPtr manager sdlFramerateDelay