aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Herklotz Grave <git@yannherklotzgrave.com>2019-02-21 14:40:04 +0000
committerYann Herklotz Grave <git@yannherklotzgrave.com>2019-02-21 14:40:27 +0000
commit711deffd693615530ec9a12f7c3e58682633e032 (patch)
tree3444d8a7fba3e3c6f894809db90b52b022c87f13
parentf9985ed4a104f8df2068336d4958dd4a2be0acb0 (diff)
downloadpfm-711deffd693615530ec9a12f7c3e58682633e032.tar.gz
pfm-711deffd693615530ec9a12f7c3e58682633e032.zip
Add Vector instead of List to store colour
-rw-r--r--pfm.cabal1
-rw-r--r--src/PFM.hs46
2 files changed, 27 insertions, 20 deletions
diff --git a/pfm.cabal b/pfm.cabal
index 065ff64..b0d3199 100644
--- a/pfm.cabal
+++ b/pfm.cabal
@@ -35,6 +35,7 @@ library
, text >=1.2 && <1.3
, binary >=0.8 && <0.9
, data-binary-ieee754 >=0.4 && <0.5
+ , vector >=0.12 && <0.13
default-extensions: OverloadedStrings
executable readpfm
diff --git a/src/PFM.hs b/src/PFM.hs
index b21e625..182c341 100644
--- a/src/PFM.hs
+++ b/src/PFM.hs
@@ -38,31 +38,37 @@ import Data.Monoid ((<>))
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
+import Data.Vector (Vector)
+import qualified Data.Vector as V
import Data.Word (Word8)
import PFM.Vec
-data PFMImage = PFMImage { pfmWidth :: Int
- , pfmHeight :: Int
- , pfmColour :: [[PFMColour]]
+type PFMColours = Vector (Vector PFMColour)
+
+type PPMColours = Vector (Vector PPMColour)
+
+data PFMImage = PFMImage { pfmWidth :: {-# UNPACK #-} !Int
+ , pfmHeight :: {-# UNPACK #-} !Int
+ , pfmColour :: {-# UNPACK #-} !PFMColours
} deriving (Show)
-data PPMImage = PPMImage { ppmWidth :: Int
- , ppmHeight :: Int
- , ppmColour :: [[PPMColour]]
+data PPMImage = PPMImage { ppmWidth :: {-# UNPACK #-} !Int
+ , ppmHeight :: {-# UNPACK #-} !Int
+ , ppmColour :: {-# UNPACK #-} !PPMColours
} deriving (Show)
-data PFMColour = PFMColour { getR :: Float
- , getG :: Float
- , getB :: Float
+data PFMColour = PFMColour { getR :: {-# UNPACK #-} !Float
+ , getG :: {-# UNPACK #-} !Float
+ , getB :: {-# UNPACK #-} !Float
}
- | PFMMono Float
+ | PFMMono {-# UNPACK #-} !Float
deriving (Show)
-data PPMColour = PPMColour { getRw :: Word8
- , getGw :: Word8
- , getBw :: Word8
+data PPMColour = PPMColour { getRw :: {-# UNPACK #-} !Word8
+ , getGw :: {-# UNPACK #-} !Word8
+ , getBw :: {-# UNPACK #-} !Word8
}
- | PPMMono Word8
+ | PPMMono {-# UNPACK #-} !Word8
deriving (Show)
data Endianness = Big | Little
@@ -137,17 +143,17 @@ parseMono e = PFMMono <$> float e
parser :: Parser PFMImage
parser = do
(w, h, e, i) <- header
- c <- P.many1 . P.count w $ fun i e
+ c <- V.fromList <$> (P.many1 . fmap V.fromList . P.count w) (fun i e)
return $ PFMImage w h c
where
fun i = case i of
ColourImage -> parseColour
MonoImage -> parseMono
-magicNumPFM :: [[PFMColour]] -> Text
-magicNumPFM ((PFMColour{}:_):_) = "PF"
-magicNumPFM ((PFMMono{}:_):_) = "Pf"
-magicNumPFM _ = "PF"
+magicNumPFM :: PFMColours -> Text
+magicNumPFM v = case V.head $ V.head v of
+ PFMColour{} -> "PF"
+ PFMMono{} -> "Pf"
tShow :: (Show a) => a -> Text
tShow = T.pack . show
@@ -194,7 +200,7 @@ parse s = case P.parseOnly parser s of
revColour :: PFMImage -> PFMImage
revColour (PFMImage w h i) =
- PFMImage w h $ reverse i
+ PFMImage w h $ V.reverse i
gamma :: (Floating a) => a -> a -> a
gamma g m = m ** (1 / g)