summaryrefslogtreecommitdiff
path: root/src/Graphics/Fountainhead/Dumper.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2023-11-17 09:54:26 +0100
committerEugen Wissner <belka@caraus.de>2023-11-17 09:54:26 +0100
commit344467b8508b86838ba652f719a017f3415c9a96 (patch)
treee2a0e3b33ceec8560715b702e60b28a386be85e3 /src/Graphics/Fountainhead/Dumper.hs
parentac03d3236deececd13660295d8528e2d0de639ed (diff)
downloadfountainhead-344467b8508b86838ba652f719a017f3415c9a96.tar.gz
Dump the hhea table
Diffstat (limited to 'src/Graphics/Fountainhead/Dumper.hs')
-rw-r--r--src/Graphics/Fountainhead/Dumper.hs57
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