summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2023-11-14 11:49:11 +0100
committerEugen Wissner <belka@caraus.de>2023-11-14 11:49:11 +0100
commite5ed4f1b961795c3bfaeea2a7815e82a13459b84 (patch)
tree6fa4a9db374561206cedea84c62bf90637a07919 /src
parentdb61d2e5583a94691b6f2c690508192ed41ce58a (diff)
downloadfountainhead-e5ed4f1b961795c3bfaeea2a7815e82a13459b84.tar.gz
Dump cmap segment summary
Diffstat (limited to 'src')
-rw-r--r--src/Graphics/Fountainhead/Dumper.hs43
1 files changed, 32 insertions, 11 deletions
diff --git a/src/Graphics/Fountainhead/Dumper.hs b/src/Graphics/Fountainhead/Dumper.hs
index dfa760f..680c0f7 100644
--- a/src/Graphics/Fountainhead/Dumper.hs
+++ b/src/Graphics/Fountainhead/Dumper.hs
@@ -41,6 +41,7 @@ import Graphics.Fountainhead.Parser
, parseTable
, cmapTableP
)
+import Data.Foldable (Foldable(..))
type ParseErrorOrDump
= Either (Megaparsec.ParseErrorBundle ByteString Void) Text.Builder.Builder
@@ -52,6 +53,12 @@ paddedHexadecimal = ("0x" <>)
. Text.Builder.toLazyText
. Text.Builder.hexadecimal
+halfPaddedHexadecimal :: Integral a => a -> Text.Builder.Builder
+halfPaddedHexadecimal = Text.Builder.fromLazyText
+ . Text.Lazy.justifyRight 4 '0'
+ . Text.Builder.toLazyText
+ . Text.Builder.hexadecimal
+
justifyNumber :: Integral a => Int64 -> a -> Text.Builder.Builder
justifyNumber count = Text.Builder.fromLazyText
. Text.Lazy.justifyRight count ' '
@@ -120,23 +127,37 @@ dumpCmap CmapTable{..}
(CmapFormat0 _) -> "Format 0"
(CmapFormat2 _) -> "Format 2"
(CmapFormat4 CmapFormat4Table{..}) ->
- "Format 4 - Segment mapping to delta values\n\
- \ Length: 994\n\
- \ Version: 0\n\
- \ segCount: "
- <> Text.Builder.decimal (Vector.length startCode)
- <> newlineBuilder <> " searchRange: "
- <> Text.Builder.decimal searchRange
- <> newlineBuilder <> " entrySelector: "
- <> Text.Builder.decimal entrySelector
- <> newlineBuilder <> " rangeShift: "
- <> Text.Builder.decimal (Vector.length startCode * 2 - fromIntegral searchRange)
+ let segCount = Vector.length startCode
+ in "Format 4 - Segment mapping to delta values\n\
+ \ Length: 994\n\
+ \ Version: 0\n\
+ \ segCount: "
+ <> Text.Builder.decimal segCount
+ <> newlineBuilder <> " searchRange: "
+ <> Text.Builder.decimal searchRange
+ <> newlineBuilder <> " entrySelector: "
+ <> Text.Builder.decimal entrySelector
+ <> newlineBuilder <> " rangeShift: "
+ <> Text.Builder.decimal (segCount * 2 - fromIntegral searchRange)
+ <> newlineBuilder
+ <> fold (Vector.izipWith4 (dumpSegment segCount) startCode endCode idDelta idRangeOffset)
(CmapFormat6 _) -> "Format 6"
(CmapFormat8 _) -> "Format 8"
(CmapFormat10 _) -> "Format 10"
(CmapFormat12 _) -> "Format 12"
(CmapFormat13 _) -> "Format 13"
(CmapFormat14 _) -> "Format 14"
+ dumpSegment segCount index startCode' endCode' idDelta' idRangeOffset'
+ = " Seg " <> justifyNumber 5 index
+ <> " : St = " <> halfPaddedHexadecimal startCode'
+ <> ", En = " <> halfPaddedHexadecimal endCode'
+ <> ", D = " <> justifyNumber 6 idDelta'
+ <> ", RO = " <> justifyNumber 6 idRangeOffset'
+ <> ", gId# = " <> dumpGlyphId index segCount idRangeOffset'
+ <> newlineBuilder
+ dumpGlyphId index segCount idRangeOffset'
+ | idRangeOffset' == 0 = "N/A"
+ | otherwise = Text.Builder.decimal $ index - segCount + (fromIntegral idRangeOffset' `div` 2)
dumpTables
:: Megaparsec.State ByteString Void