From 22d37b09726f4d6113816145f2101c4c3298e4c0 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Mon, 29 Jan 2024 20:13:43 +0100 Subject: [PATCH] Dump glyph coordinates --- src/Graphics/Fountainhead/Dumper.hs | 36 +++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/Graphics/Fountainhead/Dumper.hs b/src/Graphics/Fountainhead/Dumper.hs index 8925694..84d8661 100644 --- a/src/Graphics/Fountainhead/Dumper.hs +++ b/src/Graphics/Fountainhead/Dumper.hs @@ -662,15 +662,41 @@ dumpGlyf (GlyfTable glyfDescriptions) = dumpCaption "'glyf' Table - Glyf data" <> foldMap dumpEndPoint (Vector.indexed endPtsOfContours) <> newlineBuilder <> " Length of Instructions: " <> Text.Builder.decimal (Vector.length instructions) <> newlineBuilder - <> " Flags" <> newlineBuilder + <> newlineBuilder <> " Flags" <> newlineBuilder <> " -----" <> newlineBuilder - <> foldMap dumpFlag (Vector.indexed coordinates) <> newlineBuilder <> newlineBuilder - dumpGlyphDefinition _ = "" - dumpFlag (coordinateIndex, GlyphCoordinate{..}) + <> foldMap dumpFlag (Vector.indexed coordinates) <> newlineBuilder + <> " Coordinates" <> newlineBuilder + <> " -----------" <> newlineBuilder + <> dumpCoordinates coordinates + dumpGlyphDefinition _ = "" -- TODO + dumpFlag (coordinateIndex, GlyphCoordinate{..}) -- TODO = " " <> justifyNumber 2 coordinateIndex <> ": " - <> Text.Builder.decimal coordinateX <> " " <> Text.Builder.decimal coordinateY <> " " <> (if onCurve then "On" else "Off") <> newlineBuilder + dumpCoordinates coordinates = + let initial = ("", GlyphCoordinate 0 0 True) + in fst $ Vector.ifoldl' foldCoordinate initial coordinates + foldCoordinate + :: (Text.Builder.Builder, GlyphCoordinate) + -> Int + -> GlyphCoordinate + -> (Text.Builder.Builder, GlyphCoordinate) + foldCoordinate (accumulator, absCoordinate) coordinateIndex relCoordinate = + let nextAbs = GlyphCoordinate + { coordinateX = sumCoordinate (getField @"coordinateX") relCoordinate absCoordinate + , coordinateY = sumCoordinate (getField @"coordinateY") relCoordinate absCoordinate + , onCurve = getField @"onCurve" relCoordinate -- Not used. + } + newLine = " " <> justifyNumber 2 coordinateIndex + <> " Rel " <> dumpCoordinate relCoordinate + <> " -> Abs " <> dumpCoordinate nextAbs + <> newlineBuilder + in (accumulator <> newLine, nextAbs) + sumCoordinate getAxis relCoordinate absCoordinate = + getAxis relCoordinate + getAxis absCoordinate + dumpCoordinate GlyphCoordinate{..} + = "(" <> justifyNumber 7 coordinateX <> ", " + <> justifyNumber 7 coordinateY <> ")" dumpTables :: Megaparsec.State ByteString Void