summaryrefslogtreecommitdiff
path: root/lib/Graphics/Fountainhead/Compression.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Graphics/Fountainhead/Compression.hs')
-rw-r--r--lib/Graphics/Fountainhead/Compression.hs27
1 files changed, 27 insertions, 0 deletions
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