1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{-# LANGUAGE DeriveGeneric #-}
module Graphics.Text.Font.Choose.Range where
import Foreign.Ptr (Ptr)
import Control.Exception (bracket)
import Foreign.Marshal.Alloc (alloca)
import Foreign.Storable (peek)
import GHC.Generics (Generic)
import Data.Hashable (Hashable)
data Range = Range Double Double deriving (Eq, Show, Ord, Generic)
iRange i j = toEnum i `Range` toEnum j
instance Hashable Range
------
--- Low-level
------
data Range'
type Range_ = Ptr Range'
withRange :: Range -> (Range_ -> IO a) -> IO a
withRange (Range i j) = bracket (fcRangeCreateDouble i j) fcRangeDestroy
foreign import ccall "FcRangeCreateDouble" fcRangeCreateDouble ::
Double -> Double -> IO Range_
foreign import ccall "FcRangeDestroy" fcRangeDestroy :: Range_ -> IO ()
thawRange :: Range_ -> IO Range
thawRange range' = alloca $ \i' -> alloca $ \j' -> do
fcRangeGetDouble range' i' j'
i <- peek i'
j <- peek j'
return $ Range i j
foreign import ccall "FcRangeGetDouble" fcRangeGetDouble ::
Range_ -> Ptr Double -> Ptr Double -> IO Bool