From a34b46e1b553623d5dc385fc8e235df808fbadb2 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sat, 3 Feb 2024 11:58:47 +0100 Subject: Add font compression --- lib/Graphics/Fountainhead/Compression.hs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 lib/Graphics/Fountainhead/Compression.hs (limited to 'lib/Graphics/Fountainhead/Compression.hs') diff --git a/lib/Graphics/Fountainhead/Compression.hs b/lib/Graphics/Fountainhead/Compression.hs new file mode 100644 index 0000000..c1a05fc --- /dev/null +++ b/lib/Graphics/Fountainhead/Compression.hs @@ -0,0 +1,27 @@ +-- | Font compression and decompression. +module Graphics.Fountainhead.Compression + ( compress + , hDecompress + ) where + +import qualified Data.ByteString.Lazy as ByteString.Lazy +import Data.ByteString (ByteString) +import qualified Data.ByteString as ByteString +import qualified Codec.Compression.Zlib as Zlib +import System.IO (Handle, SeekMode(..), hFileSize, hSeek) + +-- | Reads the font from a file handle decompressing it if needed. +hDecompress :: Handle -> IO ByteString +hDecompress fontHandle = do + firstBytes <- ByteString.unpack <$> ByteString.hGet fontHandle 2 + hSeek fontHandle AbsoluteSeek 0 + fileSize <- fromIntegral <$> hFileSize fontHandle + case firstBytes of + 0x78 : [secondByte] + | secondByte `elem` [0x01, 0x9c, 0x5e, 0xda] -> + ByteString.Lazy.toStrict . Zlib.decompress + <$> ByteString.Lazy.hGet fontHandle fileSize + _ -> ByteString.hGetContents fontHandle + +compress :: ByteString -> ByteString +compress = ByteString.Lazy.toStrict . Zlib.compress . ByteString.Lazy.fromStrict -- cgit v1.2.3