packages feed

sdl2-gfx-0.2: src/SDL/Raw/Framerate.hsc

{-|

Module      : SDL.Raw.Framerate
Copyright   : (c) 2015 Siniša Biđin
License     : MIT
Maintainer  : sinisa@bidin.eu
Stability   : experimental

Raw bindings to the @SDL2_gfx@ library, specifically the framerate management
functionality from @SDL2_framerate.h@.

-}

{-# OPTIONS_GHC -fno-warn-missing-signatures #-}

{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}

module SDL.Raw.Framerate
  ( Manager(..)
  , init
  , framerateDelay
  , setFramerate
  , pattern FPS_DEFAULT
  , pattern FPS_LOWER_LIMIT
  , pattern FPS_UPPER_LIMIT
  , getFramerate
  , getFramecount
  ) where

#include "SDL2_framerate.h"

import Foreign.C.Types  (CFloat(..), CInt(..))
import Foreign.Ptr      (Ptr)
import Foreign.Storable (Storable(..))
import Data.Word        (Word32)
import Prelude   hiding (init)
import SDL.Raw.Helper   (liftF)

pattern FPS_DEFAULT     = (#const FPS_DEFAULT)
pattern FPS_LOWER_LIMIT = (#const FPS_LOWER_LIMIT)
pattern FPS_UPPER_LIMIT = (#const FPS_UPPER_LIMIT)

data Manager = Manager
  { frameCount :: Word32
  , rateTicks  :: CFloat
  , baseTicks  :: Word32
  , lastTicks  :: Word32
  , rate       :: Word32
  } deriving (Eq, Show, Read)

instance Storable Manager where
  alignment = sizeOf
  sizeOf _ = (#size FPSmanager)

  peek ptr =
    Manager
      <$> (#peek FPSmanager, framecount) ptr
      <*> (#peek FPSmanager, rateticks)  ptr
      <*> (#peek FPSmanager, baseticks)  ptr
      <*> (#peek FPSmanager, lastticks)  ptr
      <*> (#peek FPSmanager, rate)       ptr

  poke ptr (Manager {..}) = do
    (#poke FPSmanager, framecount) ptr frameCount
    (#poke FPSmanager, rateticks)  ptr rateTicks
    (#poke FPSmanager, baseticks)  ptr baseTicks
    (#poke FPSmanager, lastticks)  ptr lastTicks
    (#poke FPSmanager, rate)       ptr rate

liftF "init" "SDL_initFramerate"
  [t|Ptr Manager -> IO ()|]

liftF "getFramecount" "SDL_getFramecount"
  [t|Ptr Manager -> IO CInt|]

liftF "framerateDelay" "SDL_framerateDelay"
  [t|Ptr Manager -> IO Word32|]

liftF "getFramerate" "SDL_getFramerate"
  [t|Ptr Manager -> IO CInt|]

liftF "setFramerate" "SDL_setFramerate"
  [t|Ptr Manager -> Word32 -> IO CInt|]