{-# LANGUAGE DeriveGeneric, TypeSynonymInstances, FlexibleInstances #-}
module Graphics.Text.Font.Choose.Value (Value(..), Value_, withValue, thawValue,
    value'Size, ToValue(..)) where

import Linear.Matrix (M22)
import Linear.V2 (V2(..))
import Graphics.Text.Font.Choose.CharSet (CharSet, withCharSet, thawCharSet)
import FreeType.Core.Base (FT_Face(..))
import Graphics.Text.Font.Choose.LangSet (LangSet, withLangSet, thawLangSet)
import Graphics.Text.Font.Choose.Range (Range, withRange, thawRange)
import Control.Exception (throw)

import Foreign.Ptr (Ptr, castPtr)
import Foreign.Storable (Storable(..))
import Foreign.Marshal.Array (advancePtr)
import Foreign.Marshal.Alloc (allocaBytes)
import Foreign.C.String (withCString, peekCString)

import GHC.Generics (Generic)
import Data.Hashable (Hashable)
import Graphics.Text.Font.Choose.Result (Word8, throwNull, Error(ErrTypeMismatch))

-- | A dynamic type system for `Pattern`s.
data Value = ValueVoid
    | ValueInt Int
    | ValueDouble Double
    | ValueString String
    | ValueBool Bool
    | ValueMatrix (M22 Double)
    | ValueCharSet CharSet
    | ValueFTFace FT_Face
    | ValueLangSet LangSet
    | ValueRange Range deriving (Value -> Value -> Bool
(Value -> Value -> Bool) -> (Value -> Value -> Bool) -> Eq Value
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Value -> Value -> Bool
$c/= :: Value -> Value -> Bool
== :: Value -> Value -> Bool
$c== :: Value -> Value -> Bool
Eq, Int -> Value -> ShowS
[Value] -> ShowS
Value -> String
(Int -> Value -> ShowS)
-> (Value -> String) -> ([Value] -> ShowS) -> Show Value
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Value] -> ShowS
$cshowList :: [Value] -> ShowS
show :: Value -> String
$cshow :: Value -> String
showsPrec :: Int -> Value -> ShowS
$cshowsPrec :: Int -> Value -> ShowS
Show, Eq Value
Eq Value =>
(Value -> Value -> Ordering)
-> (Value -> Value -> Bool)
-> (Value -> Value -> Bool)
-> (Value -> Value -> Bool)
-> (Value -> Value -> Bool)
-> (Value -> Value -> Value)
-> (Value -> Value -> Value)
-> Ord Value
Value -> Value -> Bool
Value -> Value -> Ordering
Value -> Value -> Value
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Value -> Value -> Value
$cmin :: Value -> Value -> Value
max :: Value -> Value -> Value
$cmax :: Value -> Value -> Value
>= :: Value -> Value -> Bool
$c>= :: Value -> Value -> Bool
> :: Value -> Value -> Bool
$c> :: Value -> Value -> Bool
<= :: Value -> Value -> Bool
$c<= :: Value -> Value -> Bool
< :: Value -> Value -> Bool
$c< :: Value -> Value -> Bool
compare :: Value -> Value -> Ordering
$ccompare :: Value -> Value -> Ordering
$cp1Ord :: Eq Value
Ord, (forall x. Value -> Rep Value x)
-> (forall x. Rep Value x -> Value) -> Generic Value
forall x. Rep Value x -> Value
forall x. Value -> Rep Value x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Value x -> Value
$cfrom :: forall x. Value -> Rep Value x
Generic)

instance Hashable Value

-- | Coerces compiletime types to runtime types.
class ToValue x where
    toValue :: x -> Value
    fromValue :: Value -> Maybe x
    fromValue' :: Value -> x -- throws Result.Error
    fromValue' self :: Value
self | Just ret :: x
ret <- Value -> Maybe x
forall x. ToValue x => Value -> Maybe x
fromValue Value
self = x
ret
    fromValue' _ = Error -> x
forall a e. Exception e => e -> a
throw Error
ErrTypeMismatch

instance ToValue () where
    toValue :: () -> Value
toValue () = Value
ValueVoid
    fromValue :: Value -> Maybe ()
fromValue ValueVoid = () -> Maybe ()
forall a. a -> Maybe a
Just ()
    fromValue _ = Maybe ()
forall a. Maybe a
Nothing
instance ToValue Int where
    toValue :: Int -> Value
toValue = Int -> Value
ValueInt
    fromValue :: Value -> Maybe Int
fromValue (ValueInt x :: Int
x) = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
x
    fromValue _ = Maybe Int
forall a. Maybe a
Nothing
instance ToValue Double where
    toValue :: Double -> Value
toValue = Double -> Value
ValueDouble
    fromValue :: Value -> Maybe Double
fromValue (ValueDouble x :: Double
x) = Double -> Maybe Double
forall a. a -> Maybe a
Just Double
x
    fromValue _ = Maybe Double
forall a. Maybe a
Nothing
instance ToValue String where
    toValue :: String -> Value
toValue = String -> Value
ValueString
    fromValue :: Value -> Maybe String
fromValue (ValueString x :: String
x) = String -> Maybe String
forall a. a -> Maybe a
Just String
x
    fromValue _ = Maybe String
forall a. Maybe a
Nothing
instance ToValue Bool where
    toValue :: Bool -> Value
toValue = Bool -> Value
ValueBool
    fromValue :: Value -> Maybe Bool
fromValue (ValueBool x :: Bool
x) = Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
x
    fromValue _ = Maybe Bool
forall a. Maybe a
Nothing
instance ToValue (M22 Double) where
    toValue :: M22 Double -> Value
toValue = M22 Double -> Value
ValueMatrix
    fromValue :: Value -> Maybe (M22 Double)
fromValue (ValueMatrix x :: M22 Double
x) = M22 Double -> Maybe (M22 Double)
forall a. a -> Maybe a
Just M22 Double
x
    fromValue _ = Maybe (M22 Double)
forall a. Maybe a
Nothing
instance ToValue CharSet where
    toValue :: CharSet -> Value
toValue = CharSet -> Value
ValueCharSet
    fromValue :: Value -> Maybe CharSet
fromValue (ValueCharSet x :: CharSet
x) = CharSet -> Maybe CharSet
forall a. a -> Maybe a
Just CharSet
x
    fromValue _ = Maybe CharSet
forall a. Maybe a
Nothing
instance ToValue FT_Face where
    toValue :: FT_Face -> Value
toValue = FT_Face -> Value
ValueFTFace
    fromValue :: Value -> Maybe FT_Face
fromValue (ValueFTFace x :: FT_Face
x) = FT_Face -> Maybe FT_Face
forall a. a -> Maybe a
Just FT_Face
x
    fromValue _ = Maybe FT_Face
forall a. Maybe a
Nothing
instance ToValue LangSet where
    toValue :: LangSet -> Value
toValue = LangSet -> Value
ValueLangSet
    fromValue :: Value -> Maybe LangSet
fromValue (ValueLangSet x :: LangSet
x) = LangSet -> Maybe LangSet
forall a. a -> Maybe a
Just LangSet
x
    fromValue _ = Maybe LangSet
forall a. Maybe a
Nothing
instance ToValue Range where
    toValue :: Range -> Value
toValue = Range -> Value
ValueRange
    fromValue :: Value -> Maybe Range
fromValue (ValueRange x :: Range
x) = Range -> Maybe Range
forall a. a -> Maybe a
Just Range
x
    fromValue _ = Maybe Range
forall a. Maybe a
Nothing

------
--- Low-level
------

type Value_ = Ptr Int

foreign import ccall "size_value" value'Size :: Int
pokeUnion :: Ptr a -> a -> IO ()
pokeUnion ptr :: Ptr a
ptr x :: a
x = Ptr a -> Ptr a
forall a b. Ptr a -> Ptr b
castPtr (Ptr a
ptr Ptr a -> Int -> Ptr a
forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` 1) Ptr a -> a -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
`poke` a
x

withValue :: Value -> (Value_ -> IO a) -> IO a
withValue :: Value -> (Value_ -> IO a) -> IO a
withValue ValueVoid cb :: Value_ -> IO a
cb = Int -> (Value_ -> IO a) -> IO a
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
value'Size ((Value_ -> IO a) -> IO a) -> (Value_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \val' :: Value_
val' -> do
    Value_ -> Int -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Value_
val' 0
    Value_ -> IO a
cb Value_
val'
withValue (ValueInt x :: Int
x) cb :: Value_ -> IO a
cb = Int -> (Value_ -> IO a) -> IO a
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
value'Size ((Value_ -> IO a) -> IO a) -> (Value_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \val' :: Value_
val' -> do
    Value_ -> Int -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Value_
val' 1
    Value_ -> Int -> Int -> IO ()
forall a. Storable a => Ptr a -> Int -> a -> IO ()
pokeElemOff Value_
val' 1 Int
x
    Value_ -> IO a
cb Value_
val'
withValue (ValueDouble x :: Double
x) cb :: Value_ -> IO a
cb = Int -> (Value_ -> IO a) -> IO a
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
value'Size ((Value_ -> IO a) -> IO a) -> (Value_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \val' :: Value_
val' -> do
    Value_ -> Int -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Value_
val' 2
    Value_ -> Double -> IO ()
forall a a. (Storable a, Storable a) => Ptr a -> a -> IO ()
pokeUnion Value_
val' Double
x
    Value_ -> IO a
cb Value_
val'
withValue (ValueString str :: String
str) cb :: Value_ -> IO a
cb =
    String -> (CString -> IO a) -> IO a
forall a. String -> (CString -> IO a) -> IO a
withCString String
str ((CString -> IO a) -> IO a) -> (CString -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \str' :: CString
str' -> Int -> (Value_ -> IO a) -> IO a
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
value'Size ((Value_ -> IO a) -> IO a) -> (Value_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \val' :: Value_
val' -> do
        Value_ -> Int -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Value_
val' 3
        Value_ -> CString -> IO ()
forall a a. (Storable a, Storable a) => Ptr a -> a -> IO ()
pokeUnion Value_
val' CString
str'
        Value_ -> IO a
cb Value_
val'
withValue (ValueBool b :: Bool
b) cb :: Value_ -> IO a
cb = Int -> (Value_ -> IO a) -> IO a
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
value'Size ((Value_ -> IO a) -> IO a) -> (Value_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \val' :: Value_
val' -> do
    Value_ -> Int -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Value_
val' 4
    Value_ -> Bool -> IO ()
forall a a. (Storable a, Storable a) => Ptr a -> a -> IO ()
pokeUnion Value_
val' Bool
b
    Value_ -> IO a
cb Value_
val'
withValue (ValueMatrix mat :: M22 Double
mat) cb :: Value_ -> IO a
cb =
    M22 Double -> (Ptr Double -> IO a) -> IO a
forall a b. Storable a => V2 (V2 a) -> (Ptr a -> IO b) -> IO b
withMatrix M22 Double
mat ((Ptr Double -> IO a) -> IO a) -> (Ptr Double -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \mat' :: Ptr Double
mat' -> Int -> (Value_ -> IO a) -> IO a
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
value'Size ((Value_ -> IO a) -> IO a) -> (Value_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \val' :: Value_
val' -> do
        Value_ -> Int -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Value_
val' 5
        Value_ -> Ptr Double -> IO ()
forall a a. (Storable a, Storable a) => Ptr a -> a -> IO ()
pokeUnion Value_
val' Ptr Double
mat'
        Value_ -> IO a
cb Value_
val'
withValue (ValueCharSet charsets :: CharSet
charsets) cb :: Value_ -> IO a
cb =
    CharSet -> (CharSet_ -> IO a) -> IO a
forall a. CharSet -> (CharSet_ -> IO a) -> IO a
withCharSet CharSet
charsets ((CharSet_ -> IO a) -> IO a) -> (CharSet_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \charsets' :: CharSet_
charsets' -> Int -> (Value_ -> IO a) -> IO a
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
value'Size ((Value_ -> IO a) -> IO a) -> (Value_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \val' :: Value_
val' -> do
        Value_ -> Int -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Value_
val' 6
        Value_ -> CharSet_ -> IO ()
forall a a. (Storable a, Storable a) => Ptr a -> a -> IO ()
pokeUnion Value_
val' CharSet_
charsets'
        Value_ -> IO a
cb Value_
val'
withValue (ValueFTFace x :: FT_Face
x) cb :: Value_ -> IO a
cb = Int -> (Value_ -> IO a) -> IO a
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
value'Size ((Value_ -> IO a) -> IO a) -> (Value_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \val' :: Value_
val' -> do
    Value_ -> Int -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Value_
val' 7
    Value_ -> FT_Face -> IO ()
forall a a. (Storable a, Storable a) => Ptr a -> a -> IO ()
pokeUnion Value_
val' FT_Face
x
    Value_ -> IO a
cb Value_
val'
withValue (ValueLangSet langset :: LangSet
langset) cb :: Value_ -> IO a
cb =
    LangSet -> (LangSet_ -> IO a) -> IO a
forall a. LangSet -> (LangSet_ -> IO a) -> IO a
withLangSet LangSet
langset ((LangSet_ -> IO a) -> IO a) -> (LangSet_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \langset' :: LangSet_
langset' -> Int -> (Value_ -> IO a) -> IO a
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
value'Size ((Value_ -> IO a) -> IO a) -> (Value_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \val' :: Value_
val' -> do
        Value_ -> Int -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Value_
val' 8
        Value_ -> LangSet_ -> IO ()
forall a a. (Storable a, Storable a) => Ptr a -> a -> IO ()
pokeUnion Value_
val' LangSet_
langset'
        Value_ -> IO a
cb Value_
val'
withValue (ValueRange range :: Range
range) cb :: Value_ -> IO a
cb =
    Range -> (Range_ -> IO a) -> IO a
forall a. Range -> (Range_ -> IO a) -> IO a
withRange Range
range ((Range_ -> IO a) -> IO a) -> (Range_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \range' :: Range_
range' -> Int -> (Value_ -> IO a) -> IO a
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
value'Size ((Value_ -> IO a) -> IO a) -> (Value_ -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \val' :: Value_
val' -> do
        Value_ -> Int -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Value_
val' 9
        Value_ -> Range_ -> IO ()
forall a a. (Storable a, Storable a) => Ptr a -> a -> IO ()
pokeUnion Value_
val' Range_
range'
        Value_ -> IO a
cb Value_
val'

foreign import ccall "size_matrix" mat22Size :: Int
withMatrix :: V2 (V2 a) -> (Ptr a -> IO b) -> IO b
withMatrix (V2 (V2 xx :: a
xx yx :: a
yx) (V2 xy :: a
xy yy :: a
yy)) cb :: Ptr a -> IO b
cb = Int -> (Ptr a -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
mat22Size ((Ptr a -> IO b) -> IO b) -> (Ptr a -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \mat' :: Ptr a
mat' -> do
    Ptr a -> Int -> a -> IO ()
forall a. Storable a => Ptr a -> Int -> a -> IO ()
pokeElemOff Ptr a
mat' 0 a
xx
    Ptr a -> Int -> a -> IO ()
forall a. Storable a => Ptr a -> Int -> a -> IO ()
pokeElemOff Ptr a
mat' 1 a
xy
    Ptr a -> Int -> a -> IO ()
forall a. Storable a => Ptr a -> Int -> a -> IO ()
pokeElemOff Ptr a
mat' 2 a
yx
    Ptr a -> Int -> a -> IO ()
forall a. Storable a => Ptr a -> Int -> a -> IO ()
pokeElemOff Ptr a
mat' 3 a
yy
    Ptr a -> IO b
cb Ptr a
mat'

thawValue :: Value_ -> IO (Maybe Value)
thawValue :: Value_ -> IO (Maybe Value)
thawValue ptr :: Value_
ptr = do
    Word8
kind <- Ptr Word8 -> IO Word8
forall a. Storable a => Ptr a -> IO a
peek (Ptr Word8 -> IO Word8) -> Ptr Word8 -> IO Word8
forall a b. (a -> b) -> a -> b
$ Value_ -> Ptr Word8
forall a b. Ptr a -> Ptr b
castPtr Value_
ptr :: IO Word8
    let val' :: Ptr b
val' = Value_ -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr (Value_
ptr Value_ -> Int -> Value_
forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` 1)
    case Word8
kind of
        0 -> Maybe Value -> IO (Maybe Value)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Value -> IO (Maybe Value))
-> Maybe Value -> IO (Maybe Value)
forall a b. (a -> b) -> a -> b
$ Value -> Maybe Value
forall a. a -> Maybe a
Just Value
ValueVoid
        1 -> Value -> Maybe Value
forall a. a -> Maybe a
Just (Value -> Maybe Value) -> (Int -> Value) -> Int -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Value
ValueInt (Int -> Maybe Value) -> IO Int -> IO (Maybe Value)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value_ -> IO Int
forall a. Storable a => Ptr a -> IO a
peek Value_
forall b. Ptr b
val'
        2 -> Value -> Maybe Value
forall a. a -> Maybe a
Just (Value -> Maybe Value)
-> (Double -> Value) -> Double -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Double -> Value
ValueDouble (Double -> Maybe Value) -> IO Double -> IO (Maybe Value)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr Double -> IO Double
forall a. Storable a => Ptr a -> IO a
peek Ptr Double
forall b. Ptr b
val'
        3 -> do
            CString
val <- CString -> CString
forall a. Ptr a -> Ptr a
throwNull (CString -> CString) -> IO CString -> IO CString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CString -> IO CString
forall a. Storable a => Ptr a -> IO a
peek Ptr CString
forall b. Ptr b
val'
            Value -> Maybe Value
forall a. a -> Maybe a
Just (Value -> Maybe Value)
-> (String -> Value) -> String -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Value
ValueString (String -> Maybe Value) -> IO String -> IO (Maybe Value)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CString -> IO String
peekCString CString
val
        4 -> Value -> Maybe Value
forall a. a -> Maybe a
Just (Value -> Maybe Value) -> (Bool -> Value) -> Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Value
ValueBool (Bool -> Maybe Value) -> IO Bool -> IO (Maybe Value)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr Bool -> IO Bool
forall a. Storable a => Ptr a -> IO a
peek Ptr Bool
forall b. Ptr b
val'
        5 -> do
            Ptr Double
mat' <- Ptr Double -> Ptr Double
forall a. Ptr a -> Ptr a
throwNull (Ptr Double -> Ptr Double) -> IO (Ptr Double) -> IO (Ptr Double)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr (Ptr Double) -> IO (Ptr Double)
forall a. Storable a => Ptr a -> IO a
peek Ptr (Ptr Double)
forall b. Ptr b
val'
            Double
xx <- Ptr Double -> Int -> IO Double
forall a. Storable a => Ptr a -> Int -> IO a
peekElemOff Ptr Double
mat' 0
            Double
xy <- Ptr Double -> Int -> IO Double
forall a. Storable a => Ptr a -> Int -> IO a
peekElemOff Ptr Double
mat' 1
            Double
yx <- Ptr Double -> Int -> IO Double
forall a. Storable a => Ptr a -> Int -> IO a
peekElemOff Ptr Double
mat' 2
            Double
yy <- Ptr Double -> Int -> IO Double
forall a. Storable a => Ptr a -> Int -> IO a
peekElemOff Ptr Double
mat' 3
            Maybe Value -> IO (Maybe Value)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Value -> IO (Maybe Value))
-> Maybe Value -> IO (Maybe Value)
forall a b. (a -> b) -> a -> b
$ Value -> Maybe Value
forall a. a -> Maybe a
Just (Value -> Maybe Value) -> Value -> Maybe Value
forall a b. (a -> b) -> a -> b
$ M22 Double -> Value
ValueMatrix (M22 Double -> Value) -> M22 Double -> Value
forall a b. (a -> b) -> a -> b
$ V2 Double -> V2 Double -> M22 Double
forall a. a -> a -> V2 a
V2 (Double -> Double -> V2 Double
forall a. a -> a -> V2 a
V2 Double
xx Double
xy) (Double -> Double -> V2 Double
forall a. a -> a -> V2 a
V2 Double
yx Double
yy)
        6 -> do
            CharSet_
val <- CharSet_ -> CharSet_
forall a. Ptr a -> Ptr a
throwNull (CharSet_ -> CharSet_) -> IO CharSet_ -> IO CharSet_
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CharSet_ -> IO CharSet_
forall a. Storable a => Ptr a -> IO a
peek Ptr CharSet_
forall b. Ptr b
val'
            Value -> Maybe Value
forall a. a -> Maybe a
Just (Value -> Maybe Value)
-> (CharSet -> Value) -> CharSet -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CharSet -> Value
ValueCharSet (CharSet -> Maybe Value) -> IO CharSet -> IO (Maybe Value)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CharSet_ -> IO CharSet
thawCharSet CharSet_
val
        7 -> Value -> Maybe Value
forall a. a -> Maybe a
Just (Value -> Maybe Value)
-> (FT_Face -> Value) -> FT_Face -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FT_Face -> Value
ValueFTFace (FT_Face -> Maybe Value)
-> (FT_Face -> FT_Face) -> FT_Face -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FT_Face -> FT_Face
forall a. Ptr a -> Ptr a
throwNull (FT_Face -> Maybe Value) -> IO FT_Face -> IO (Maybe Value)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr FT_Face -> IO FT_Face
forall a. Storable a => Ptr a -> IO a
peek Ptr FT_Face
forall b. Ptr b
val'
        8 -> do
            LangSet_
val <- LangSet_ -> LangSet_
forall a. Ptr a -> Ptr a
throwNull (LangSet_ -> LangSet_) -> IO LangSet_ -> IO LangSet_
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr LangSet_ -> IO LangSet_
forall a. Storable a => Ptr a -> IO a
peek Ptr LangSet_
forall b. Ptr b
val'
            Value -> Maybe Value
forall a. a -> Maybe a
Just (Value -> Maybe Value)
-> (LangSet -> Value) -> LangSet -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> LangSet -> Value
ValueLangSet (LangSet -> Maybe Value) -> IO LangSet -> IO (Maybe Value)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> LangSet_ -> IO LangSet
thawLangSet LangSet_
val
        9 -> do
            Range_
val <- Range_ -> Range_
forall a. Ptr a -> Ptr a
throwNull (Range_ -> Range_) -> IO Range_ -> IO Range_
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr Range_ -> IO Range_
forall a. Storable a => Ptr a -> IO a
peek Ptr Range_
forall b. Ptr b
val'
            Value -> Maybe Value
forall a. a -> Maybe a
Just (Value -> Maybe Value) -> (Range -> Value) -> Range -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range -> Value
ValueRange (Range -> Maybe Value) -> IO Range -> IO (Maybe Value)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range_ -> IO Range
thawRange Range_
val
        _ -> Maybe Value -> IO (Maybe Value)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Value
forall a. Maybe a
Nothing