FontyFruity-0.1: src/Graphics/Text/TrueType/Header.hs
module Graphics.Text.TrueType.Header
( FontHeader( .. )
, HeaderFlags( .. )
) where
import Control.Applicative( (<$>), (<*>) )
import Data.Bits( setBit, testBit )
import Data.Binary( Binary( .. ) )
import Data.Binary.Get( getWord16be
, getWord32be
, getWord64be
)
import Data.Binary.Put( putWord16be)
import Data.Int( Int16 )
import Data.List( foldl' )
import Data.Word( Word16, Word32, Word64 )
import Graphics.Text.TrueType.Types
data FontHeader = FontHeader
{ -- | Table version number 0x00010000 for version 1.0.
_fHdrVersionNumber :: !Fixed
-- | fontRevision Set by font manufacturer.
, _fHdrFontRevision :: !Fixed
-- | To compute: set it to 0, sum the entire font as
-- ULONG, then store 0xB1B0AFBA - sum.
, _fHdrChecksumAdjust :: !Word32
-- | Should be equal to 0x5F0F3CF5.
, _fHdrMagicNumber :: !Word32
, _fHdrFlags :: !HeaderFlags
-- | Valid range is from 16 to 16384
, _fUnitsPerEm :: !Word16
-- | International date (8-byte field).
, _fHdrCreateTime :: !Word64
-- | International date (8-byte field).
, _fHdrModificationTime :: !Word64
-- | For all glyph bounding boxes.
, _fHdrxMin :: !FWord
-- | For all glyph bounding boxes.
, _fHdrYMin :: !FWord
-- | For all glyph bounding boxes.
, _fHdrXMax :: !FWord
-- | For all glyph bounding boxes.
, _fHdrYMax :: !FWord
-- | Bit 0 bold (if set to 1); Bit 1 italic (if set to 1)
, _fHdrMacStyle :: !Word16
-- | Smallest readable size in pixels.
, _fHdrLowestRecPPEM :: !Word16
-- | 0 Fully mixed directional glyphs;
-- 1 Only strongly left to right;
-- 2 Like 1 but also contains neutrals ;
-- -1 Only strongly right to left;
-- -2 Like -1 but also contains neutrals.
, _fHdrFontDirectionHint :: !Int16
-- | 0 for short offsets, 1 for long.
, _fHdrIndexToLocFormat :: !Int16
-- | 0 for current format.
, _fHdrGlyphDataFormat :: !Int16
}
deriving (Eq, Show)
instance Binary FontHeader where
put _ = fail "Unimplemented"
get =
FontHeader <$> get <*> get <*> g32 <*> g32 <*> get
<*> g16 <*> g64 <*> g64 <*> get <*> get
<*> get <*> get <*> g16 <*> g16 <*> gi16
<*> gi16 <*> gi16
where g16 = getWord16be
g32 = getWord32be
gi16 = fromIntegral <$> getWord16be
g64 = getWord64be
data HeaderFlags = HeaderFlags
{ -- | Bit 0 - baseline for font at y=0;
_hfBaselineY0 :: !Bool
-- | Bit 1 - left sidebearing at x=0;
, _hfLeftSideBearing :: !Bool
-- | Bit 2 - instructions may depend on point size;
, _hfInstrDependPointSize :: !Bool
-- | Bit 3 - force ppem to integer values for all internal
-- scaler math; may use fractional ppem sizes if this bit
-- is clear;
, _hfForcePPEM :: !Bool
-- | Bit 4 - instructions may alter advance width (the
-- advance widths might not scale linearly);
, _hfAlterAdvance :: !Bool
}
deriving (Eq, Show)
instance Binary HeaderFlags where
get = do
flags <- getWord16be
let at ix = flags `testBit` ix
return $ HeaderFlags (at 0) (at 1) (at 2) (at 3) (at 4)
put (HeaderFlags a0 a1 a2 a3 a4) =
putWord16be . foldl' setter 0 $ zip [0..] [a0, a1, a2, a3, a4]
where setter acc (_, False) = acc
setter acc (ix, True) = setBit acc ix