{-# LINE 1 "src/SDL/Raw/Framerate.hsc" #-}
{-|
{-# LINE 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


{-# LINE 33 "src/SDL/Raw/Framerate.hsc" #-}

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     = (30)
{-# LINE 42 "src/SDL/Raw/Framerate.hsc" #-}
pattern FPS_LOWER_LIMIT = (1)
{-# LINE 43 "src/SDL/Raw/Framerate.hsc" #-}
pattern FPS_UPPER_LIMIT = (200)
{-# LINE 44 "src/SDL/Raw/Framerate.hsc" #-}

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

instance Storable Manager where
  alignment = sizeOf
  sizeOf _ = ((20))
{-# LINE 56 "src/SDL/Raw/Framerate.hsc" #-}

  peek ptr =
    Manager
      <$> ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 60 "src/SDL/Raw/Framerate.hsc" #-}
      <*> ((\hsc_ptr -> peekByteOff hsc_ptr 4))  ptr
{-# LINE 61 "src/SDL/Raw/Framerate.hsc" #-}
      <*> ((\hsc_ptr -> peekByteOff hsc_ptr 8))  ptr
{-# LINE 62 "src/SDL/Raw/Framerate.hsc" #-}
      <*> ((\hsc_ptr -> peekByteOff hsc_ptr 12))  ptr
{-# LINE 63 "src/SDL/Raw/Framerate.hsc" #-}
      <*> ((\hsc_ptr -> peekByteOff hsc_ptr 16))       ptr
{-# LINE 64 "src/SDL/Raw/Framerate.hsc" #-}

  poke ptr (Manager {..}) = do
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr frameCount
{-# LINE 67 "src/SDL/Raw/Framerate.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 4))  ptr rateTicks
{-# LINE 68 "src/SDL/Raw/Framerate.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 8))  ptr baseTicks
{-# LINE 69 "src/SDL/Raw/Framerate.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 12))  ptr lastTicks
{-# LINE 70 "src/SDL/Raw/Framerate.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 16))       ptr rate
{-# LINE 71 "src/SDL/Raw/Framerate.hsc" #-}

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|]