module Graphics.Text.TrueType.Types
( Fixed( .. )
, FWord( .. )
, F26Dot6( .. )
) where
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative( (<$>), (<*>) )
#endif
import Data.Int( Int32 )
import Data.Word( Word16 )
import Data.Binary( Binary( .. ) )
import Data.Binary.Get( getWord16be)
import Data.Binary.Put( putWord16be )
data Fixed = Fixed Word16 Word16
deriving (Eq, Show)
instance Binary Fixed where
get = Fixed <$> getWord16be <*> getWord16be
put (Fixed a b) = putWord16be a >> putWord16be b
newtype FWord = FWord Word16
deriving (Eq, Show)
instance Binary FWord where
put (FWord w) = putWord16be w
get = FWord <$> getWord16be
newtype F26Dot6 = F26Dot6 Int32
deriving (Eq, Show, Ord)
instance Num F26Dot6 where
(F26Dot6 a) + (F26Dot6 b) = F26Dot6 $ a + b
(F26Dot6 a) (F26Dot6 b) = F26Dot6 $ a b
(F26Dot6 a) * (F26Dot6 b) = F26Dot6 $ (a * b) `div` 64
negate (F26Dot6 a) = F26Dot6 $ negate a
abs (F26Dot6 a) = F26Dot6 $ abs a
signum (F26Dot6 a) = F26Dot6 $ signum a * 64
fromInteger a = F26Dot6 $ fromInteger a * 64
instance Fractional F26Dot6 where
fromRational a = F26Dot6 $ floor ad
where ad = fromRational a * 64 :: Double
(F26Dot6 a) / (F26Dot6 b) = F26Dot6 $ (a * 64) `div` b