summaryrefslogtreecommitdiff
path: root/lib/Graphics/Fountainhead.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-02-03 11:58:47 +0100
committerEugen Wissner <belka@caraus.de>2024-02-03 11:58:47 +0100
commita34b46e1b553623d5dc385fc8e235df808fbadb2 (patch)
tree7035a9625532bf6f7f41962c4352ac2367d065f3 /lib/Graphics/Fountainhead.hs
parent34d3ece99e438e5e81f4df6ca7a36de307e41b3e (diff)
downloadfountainhead-a34b46e1b553623d5dc385fc8e235df808fbadb2.tar.gz
Add font compression
Diffstat (limited to 'lib/Graphics/Fountainhead.hs')
-rw-r--r--lib/Graphics/Fountainhead.hs49
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/Graphics/Fountainhead.hs b/lib/Graphics/Fountainhead.hs
new file mode 100644
index 0000000..3852d51
--- /dev/null
+++ b/lib/Graphics/Fountainhead.hs
@@ -0,0 +1,49 @@
+{- This Source Code Form is subject to the terms of the Mozilla Public License,
+ v. 2.0. If a copy of the MPL was not distributed with this file, You can
+ obtain one at https://mozilla.org/MPL/2.0/. -}
+
+-- | Convenience wrappers for working with font files.
+module Graphics.Fountainhead
+ ( dumpFontFile
+ , parseFontDirectoryFromFile
+ ) where
+
+import Data.ByteString (ByteString)
+import Data.Void (Void)
+import Graphics.Fountainhead.Dumper (dumpTables, DumpError(..))
+import Graphics.Fountainhead.Parser (ParseErrorBundle, fontDirectoryP)
+import Graphics.Fountainhead.TrueType (FontDirectory(..))
+import qualified Text.Megaparsec as Megaparsec
+import Text.Megaparsec (PosState(..), State(..))
+import System.IO (IOMode(..), withBinaryFile)
+import Data.Bifunctor (Bifunctor(..))
+import qualified Data.Text.Lazy.Builder as Text.Builder
+import Graphics.Fountainhead.Compression (hDecompress)
+
+parseFontDirectoryFromFile :: FilePath
+ -> IO (State ByteString Void, Either ParseErrorBundle FontDirectory)
+parseFontDirectoryFromFile fontFile =
+ withBinaryFile fontFile ReadMode withFontHandle
+ where
+ withFontHandle fontHandle = doParsing
+ <$> hDecompress fontHandle
+ doParsing ttfContents =
+ let initialState = Megaparsec.State
+ { stateInput = ttfContents
+ , stateOffset = 0
+ , statePosState = Megaparsec.PosState
+ { pstateInput = ttfContents
+ , pstateOffset = 0
+ , pstateSourcePos = Megaparsec.initialPos fontFile
+ , pstateTabWidth = Megaparsec.defaultTabWidth
+ , pstateLinePrefix = ""
+ }
+ , stateParseErrors = []
+ }
+ in Megaparsec.runParser' fontDirectoryP initialState
+
+dumpFontFile :: FilePath -> IO (Either DumpError Text.Builder.Builder)
+dumpFontFile fontFile = do
+ (processedState, initialResult) <- parseFontDirectoryFromFile fontFile
+
+ pure $ first DumpParseError initialResult >>= dumpTables processedState