diff options
Diffstat (limited to 'src/Graphics/Fountainhead/Dumper.hs')
| -rw-r--r-- | src/Graphics/Fountainhead/Dumper.hs | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/src/Graphics/Fountainhead/Dumper.hs b/src/Graphics/Fountainhead/Dumper.hs index 84d8661..06756cb 100644 --- a/src/Graphics/Fountainhead/Dumper.hs +++ b/src/Graphics/Fountainhead/Dumper.hs @@ -83,6 +83,7 @@ import Graphics.Fountainhead.TrueType , Panose(..) , SimpleGlyphDefinition(..) , CVTable(..) + , OutlineFlag (..) ) import qualified Text.Megaparsec as Megaparsec import Graphics.Fountainhead.Parser @@ -101,13 +102,14 @@ import Graphics.Fountainhead.Parser , cvTableP , glyfTableP ) -import Graphics.Fountainhead.Type (Fixed32(..), ttfEpoch) +import Graphics.Fountainhead.Type (Fixed32(..), succIntegral, ttfEpoch) import Data.Foldable (Foldable(..), find) import Data.Maybe (fromMaybe) import Data.Time (LocalTime(..), NominalDiffTime, diffLocalTime, midnight) import Data.Bits (Bits(..), (.>>.)) import Data.Bifunctor (Bifunctor(first)) import Data.List (intersperse) +import Prelude hiding (repeat) data DumpError = DumpParseError (Megaparsec.ParseErrorBundle ByteString Void) @@ -664,36 +666,41 @@ dumpGlyf (GlyfTable glyfDescriptions) = dumpCaption "'glyf' Table - Glyf data" <> Text.Builder.decimal (Vector.length instructions) <> newlineBuilder <> newlineBuilder <> " Flags" <> newlineBuilder <> " -----" <> newlineBuilder - <> foldMap dumpFlag (Vector.indexed coordinates) <> newlineBuilder + <> fst (Vector.foldl' foldFlag ("", 0) flags) <> newlineBuilder <> " Coordinates" <> newlineBuilder <> " -----------" <> newlineBuilder - <> dumpCoordinates coordinates + <> fst (Vector.ifoldl' foldCoordinate mempty coordinates) dumpGlyphDefinition _ = "" -- TODO - dumpFlag (coordinateIndex, GlyphCoordinate{..}) -- TODO - = " " <> justifyNumber 2 coordinateIndex <> ": " - <> (if onCurve then "On" else "Off") - <> newlineBuilder - dumpCoordinates coordinates = - let initial = ("", GlyphCoordinate 0 0 True) - in fst $ Vector.ifoldl' foldCoordinate initial coordinates + dumpFlag lineValue coordinateIndex + = " " <> justifyNumber 2 coordinateIndex <> lineValue + foldFlag :: (Text.Builder.Builder, Int) -> OutlineFlag -> (Text.Builder.Builder, Int) + foldFlag (accumulator, coordinateIndex) OutlineFlag{..} = + let lineValue = ": " + <> (if thisYIsSame then "YDual " else " ") + <> (if thisXIsSame then "XDual " else " ") + <> (if repeat > 0 then "Repeat " else " ") + <> (if yShortVector then "Y-Short " else " ") + <> (if xShortVector then "X-Short " else " ") + <> (if onCurve then "On" else "Off") + <> newlineBuilder + repeatN = succIntegral repeat + repeatedLines = fold + $ Vector.cons accumulator + $ dumpFlag lineValue + <$> Vector.enumFromN coordinateIndex repeatN + in (repeatedLines, coordinateIndex + repeatN) 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. - } + let nextAbs = relCoordinate <> absCoordinate 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 <> ")" |
