summaryrefslogtreecommitdiff
path: root/src/Graphics/Fountainhead/Dumper.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Graphics/Fountainhead/Dumper.hs')
-rw-r--r--src/Graphics/Fountainhead/Dumper.hs41
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 <> ")"