module Gamgine.Font.GLF where
import Foreign
import Foreign.C.Types
import Foreign.C.String
import Foreign.Marshal.Alloc
import Control.Applicative ((<$>))
init :: IO ()
init = c_glfInit
newtype FontId = FontId Int deriving (Eq, Show)
loadFont :: FilePath -> IO FontId
loadFont s = do
withCString s $ \cs -> do
ci <- c_glfLoadFont cs
return . FontId . fromIntegral $ ci
setCurrentFont :: FontId -> IO Bool
setCurrentFont (FontId id) = do
ci <- c_glfSetCurrentFont $ fromIntegral id
return $ glfOk == (fromIntegral ci)
type X = Double
type Y = Double
data Bounds = Bounds {
min :: (X, Y),
max :: (X, Y)
} deriving Show
getStringBounds :: String -> IO Bounds
getStringBounds s = do
withCString s $ \cs ->
alloca $ \cminX ->
alloca $ \cminY ->
alloca $ \cmaxX ->
alloca $ \cmaxY -> do
c_glfGetStringBounds cs cminX cminY cmaxX cmaxY
minX <- peekToFrac cminX
minY <- peekToFrac cminY
maxX <- peekToFrac cmaxX
maxY <- peekToFrac cmaxY
return $ Bounds (minX, minY) (maxX, maxY)
where
peekToFrac = (realToFrac <$>) . peek
drawWiredString :: String -> IO ()
drawWiredString s = withCString s c_glfDrawWiredString
drawSolidString :: String -> IO ()
drawSolidString s = withCString s c_glfDrawSolidString
glfError :: Int
glfError = 1
glfOk :: Int
glfOk = 0
glfYes :: Int
glfYes = 1
glfNo :: Int
glfNo = 2
foreign import ccall unsafe "glf.h glfInit"
c_glfInit :: IO ()
foreign import ccall unsafe "glf.h glfLoadFont"
c_glfLoadFont :: CString -> IO CInt
foreign import ccall unsafe "glf.h glfSetCurrentFont"
c_glfSetCurrentFont :: CInt -> IO CInt
foreign import ccall unsafe "glf.h glfGetStringBounds"
c_glfGetStringBounds :: CString -> Ptr CFloat -> Ptr CFloat -> Ptr CFloat -> Ptr CFloat -> IO ()
foreign import ccall unsafe "glf.h glfDrawWiredString"
c_glfDrawWiredString :: CString -> IO ()
foreign import ccall unsafe "glf.h glfDrawSolidString"
c_glfDrawSolidString :: CString -> IO ()