Parse GASP table

This commit is contained in:
Eugen Wissner 2023-12-05 18:36:14 +01:00
parent 0cda68e19b
commit b87abcbf2f
2 changed files with 52 additions and 3 deletions

View File

@ -18,6 +18,7 @@ module Graphics.Fountainhead.Parser
, fixedP
, fontDirectoryP
, fpgmTableP
, gaspTableP
, glyfTableP
, hdmxTableP
, headTableP
@ -97,6 +98,8 @@ import Graphics.Fountainhead.TrueType
, FontDirectionHint(..)
, FontDirectory(..)
, FontStyle(..)
, GASPRange(..)
, GASPTable(..)
, GlyfTable(..)
, GlyphArgument(..)
, GlyphCoordinate(..)
@ -842,8 +845,7 @@ cmapFormat4TableP = do
entrySelector' <- Megaparsec.Binary.word16be
rangeShift' <- Megaparsec.Binary.word16be
endCode' <- vectorNP segCount Megaparsec.Binary.word16be
rangeShift' <- Megaparsec.Binary.word16be
-- reservedPad 0.
void $ Megaparsec.chunk $ ByteString.pack [0, 0] -- reservedPad 0.
startCode' <- vectorNP segCount Megaparsec.Binary.word16be
idDelta' <- vectorNP segCount Megaparsec.Binary.word16be
idRangeOffset' <- vectorNP segCount Megaparsec.Binary.word16be
@ -1211,3 +1213,20 @@ bMidlineP
<|> (Megaparsec.single 12 $> LowPointedMidline)
<|> (Megaparsec.single 13 $> LowSerifedMidline)
<?> "bMidline"
-- * Grid-fitting And Scan-conversion Procedure.
gaspTableP :: Parser GASPTable
gaspTableP = do
version' <- Megaparsec.Binary.word16be
numberRanges <- fromIntegral <$> Megaparsec.Binary.word16be
parsedRanges <- Megaparsec.count numberRanges gaspRangeP
Megaparsec.eof
pure $ GASPTable
{ version = version'
, gaspRange = parsedRanges
}
where
gaspRangeP = GASPRange
<$> Megaparsec.Binary.word16be
<*> Megaparsec.Binary.word16be

View File

@ -40,6 +40,8 @@ module Graphics.Fountainhead.TrueType
, FontDirectionHint(..)
, FontDirectory(..)
, FontStyle(..)
, GASPRange(..)
, GASPTable(..)
, GlyfTable(..)
, GlyphArgument(..)
, GlyphCoordinate(..)
@ -71,6 +73,7 @@ module Graphics.Fountainhead.TrueType
, PostSubtable(..)
, PostTable(..)
, PrepTable(..)
, RangeGaspBehavior(..)
, SimpleGlyphDefinition(..)
, TableDirectory(..)
, TrueMaxpTable(..)
@ -387,8 +390,9 @@ data OutlineFlag = OutlineFlag
newtype GlyfTable = GlyfTable (Vector GlyphDescription)
deriving (Eq, Show)
-- * Character to glyph mapping table
-- 'cmap' table
-- | Character to glyph mapping table.
data CmapTable = CmapTable
{ version :: Word16 -- ^ Version number is zero.
-- | Encodings with an offset into subtables map.
@ -1273,3 +1277,29 @@ data KernFormat2Table = KernFormat2Table
, classTableHeader :: ClassTableHeader
, values :: [Int16]
} deriving (Eq, Show)
-- * 'gasp' table
-- | Grid-fitting And Scan-conversion Procedure.
data GASPTable = GASPTable
{ version :: Word16 -- ^ Version number (set to 0).
, gaspRange :: [GASPRange] -- ^ Sorted by ppem.
} deriving (Eq, Show)
data GASPRange = GASPRange
{ rangeMaxPPEM :: Word16 -- ^ Upper limit of range, in PPEM.
, rangeGaspBehavior :: Word16 -- ^ Flags describing desired rasterizer behavior.
} deriving (Eq, Show)
data RangeGaspBehavior
= KGASPGridFit -- ^ Use gridfitting.
| KGASPDoGray -- ^ Use grayscale rendering.
deriving (Eq, Show)
instance Enum RangeGaspBehavior
where
toEnum 1 = KGASPGridFit
toEnum 2 = KGASPDoGray
toEnum _ = error "Unknown range GASP behavior"
fromEnum KGASPGridFit = 1
fromEnum KGASPDoGray = 2