diff options
| author | Eugen Wissner <belka@caraus.de> | 2023-11-17 09:54:26 +0100 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2023-11-17 09:54:26 +0100 |
| commit | 344467b8508b86838ba652f719a017f3415c9a96 (patch) | |
| tree | e2a0e3b33ceec8560715b702e60b28a386be85e3 /src/Graphics/Fountainhead/Dumper.hs | |
| parent | ac03d3236deececd13660295d8528e2d0de639ed (diff) | |
| download | fountainhead-344467b8508b86838ba652f719a017f3415c9a96.tar.gz | |
Dump the hhea table
Diffstat (limited to 'src/Graphics/Fountainhead/Dumper.hs')
| -rw-r--r-- | src/Graphics/Fountainhead/Dumper.hs | 57 |
1 files changed, 48 insertions, 9 deletions
diff --git a/src/Graphics/Fountainhead/Dumper.hs b/src/Graphics/Fountainhead/Dumper.hs index f09469d..e5bf6e7 100644 --- a/src/Graphics/Fountainhead/Dumper.hs +++ b/src/Graphics/Fountainhead/Dumper.hs @@ -32,7 +32,9 @@ import GHC.Records (HasField(..)) import Graphics.Fountainhead.TrueType ( CmapTable(..) , FontDirectory(..) + , FontDirectionHint(..) , HeadTable(..) + , HheaTable(..) , OffsetSubtable(..) , TableDirectory(..) , CmapEncoding(..) @@ -46,12 +48,13 @@ import Graphics.Fountainhead.Parser , parseTable , cmapTableP , headTableP + , hheaTableP ) -import Graphics.Fountainhead.Type (ttfEpoch) +import Graphics.Fountainhead.Type (Fixed32(..), ttfEpoch) import Data.Foldable (Foldable(..)) import Data.Maybe (fromMaybe) import Data.Time (LocalTime(..), NominalDiffTime, diffLocalTime, midnight) -import Data.Bits (Bits(setBit)) +import Data.Bits (Bits(..)) type ParseErrorOrDump = Either (Megaparsec.ParseErrorBundle ByteString Void) Text.Builder.Builder @@ -106,15 +109,38 @@ dumpOffsetTable directory <> justifyNumber 9 (getField @"length" table) <> newlineBuilder +dumpFixed32 :: Fixed32 -> Text.Builder.Builder +dumpFixed32 (Fixed32 word) + = Text.Builder.decimal (shiftR word 16) + <> Text.Builder.singleton '.' + <> Text.Builder.decimal (word .&. 0xff00) + +dumpHhea :: HheaTable -> Text.Builder.Builder +dumpHhea HheaTable{..} + = dumpCaption "'hhea' Table - Font Header" + <> " 'hhea' version: " <> dumpFixed32 version <> newlineBuilder + <> " yAscender: " <> Text.Builder.decimal ascent <> newlineBuilder + <> " yDescender: " <> Text.Builder.decimal descent <> newlineBuilder + <> " yLineGap: " <> Text.Builder.decimal lineGap <> newlineBuilder + <> " advanceWidthMax: " <> Text.Builder.decimal advanceWidthMax <> newlineBuilder + <> " minLeftSideBearing: " <> Text.Builder.decimal minLeftSideBearing <> newlineBuilder + <> " minRightSideBearing: " <> Text.Builder.decimal minRightSideBearing <> newlineBuilder + <> " xMaxExtent: " <> Text.Builder.decimal xMaxExtent <> newlineBuilder + <> " caretSlopeRise: " <> Text.Builder.decimal caretSlopeRise <> newlineBuilder + <> " caretSlopeRun: " <> Text.Builder.decimal caretSlopeRun <> newlineBuilder + <> " reserved0: 0" <> newlineBuilder + <> " reserved1: 0" <> newlineBuilder + <> " reserved2: 0" <> newlineBuilder + <> " reserved3: 0" <> newlineBuilder + <> " reserved4: 0" <> newlineBuilder + <> " metricDataFormat: " <> Text.Builder.decimal metricDataFormat <> newlineBuilder + <> " numberOfHMetrics: " <> Text.Builder.decimal numOfLongHorMetrics <> newlineBuilder + dumpHead :: HeadTable -> Text.Builder.Builder dumpHead HeadTable{..} = dumpCaption "'head' Table - Font Header" - {- version - <> lowestRecPPEM - <> indexToLocFormat - <> glyphDataFormat - <> fontRevision - <> fontDirectionHint -} + <> " head version: " <> dumpFixed32 version <> newlineBuilder + <> " fontRevision: " <> dumpFixed32 fontRevision <> newlineBuilder <> " checkSumAdjustment: " <> paddedHexadecimal checkSumAdjustment <> newlineBuilder <> " magicNumber: " <> paddedHexadecimal magicNumber <> newlineBuilder <> " flags: 0x" <> halfPaddedHexadecimal flags <> newlineBuilder @@ -126,10 +152,22 @@ dumpHead HeadTable{..} <> " xMax: " <> Text.Builder.decimal xMax <> newlineBuilder <> " yMax: " <> Text.Builder.decimal yMax <> newlineBuilder <> " macStyle bits: " <> "0x" <> dumpFontStyle macStyle <> newlineBuilder + <> " lowestRecPPEM " <> Text.Builder.decimal lowestRecPPEM <> newlineBuilder + <> " fontDirectionHint " <> dumpFontDirectionHint fontDirectionHint <> newlineBuilder + <> " indexToLocFormat " <> Text.Builder.decimal indexToLocFormat <> newlineBuilder + <> " glyphDataFormat " <> Text.Builder.decimal glyphDataFormat <> newlineBuilder + +dumpFontDirectionHint :: FontDirectionHint -> Text.Builder.Builder +dumpFontDirectionHint = \case + MixedDirectionalGlyphs -> "0" + StronglyLeftToRightGlyphs -> "1" + LeftToRightGlyphsWithNeutrals -> "2" + StronglyRightToLeftGlyphs -> "-1" + RightToLeftGlyphsWithNeutrals -> "-2" dumpFontStyle :: FontStyle -> Text.Builder.Builder dumpFontStyle FontStyle{..} = halfPaddedHexadecimal - $ foldr (go . fst) (0 :: Int) + $ foldr (go . fst) (zeroBits :: Int) $ filter snd $ zip [0..] [bold, italic, underline, outline, shadow, condensed, extended] where @@ -257,6 +295,7 @@ dumpTables processedState directory@FontDirectory{..} case getField @"tag" tableEntry of "cmap" -> Just $ dumpCmap <$> parseTable tableEntry cmapTableP processedState "head" -> Just $ dumpHead <$> parseTable tableEntry headTableP processedState + "hhea" -> Just $ dumpHhea <$> parseTable tableEntry hheaTableP processedState _ -> Nothing dumpTrueType :: ByteString -> FilePath -> ParseErrorOrDump |
