massiv-io 0.1.5.0 → 0.1.6.0
raw patch · 17 files changed
+339/−312 lines, 17 filesdep ~massivPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: massiv
API changes (from Hackage documentation)
- Data.Massiv.Array.IO: fromDynamicImage :: forall cs e. (ColorSpace cs e, Source S Ix2 (Pixel cs e)) => DynamicImage -> Maybe (Image S cs e)
+ Data.Massiv.Array.IO: fromDynamicImage :: forall cs e. ColorSpace cs e => DynamicImage -> Maybe (Image S cs e)
- Data.Massiv.Array.IO: toAnyCS :: forall r' cs' e' r cs e. (Source r' Ix2 (Pixel cs' e'), Mutable r Ix2 (Pixel cs e), Storable (Pixel cs e), ColorSpace cs e, ToYA cs' e', ToRGBA cs' e', ToHSIA cs' e', ToCMYKA cs' e', ToYCbCrA cs' e') => Image r' cs' e' -> Maybe (Image r cs e)
+ Data.Massiv.Array.IO: toAnyCS :: forall r' cs' e' r cs e. (Source r' Ix2 (Pixel cs' e'), Mutable r Ix2 (Pixel cs e), ColorSpace cs e, ToYA cs' e', ToRGBA cs' e', ToHSIA cs' e', ToCMYKA cs' e', ToYCbCrA cs' e') => Image r' cs' e' -> Maybe (Image r cs e)
Files
- massiv-io.cabal +1/−1
- src/Data/Massiv/Array/IO.hs +25/−27
- src/Data/Massiv/Array/IO/Base.hs +13/−13
- src/Data/Massiv/Array/IO/Image.hs +15/−15
- src/Data/Massiv/Array/IO/Image/JuicyPixels.hs +51/−38
- src/Data/Massiv/Array/IO/Image/Netpbm.hs +44/−27
- src/Graphics/ColorSpace.hs +18/−18
- src/Graphics/ColorSpace/Binary.hs +25/−25
- src/Graphics/ColorSpace/CMYK.hs +16/−16
- src/Graphics/ColorSpace/Complex.hs +12/−12
- src/Graphics/ColorSpace/Elevator.hs +9/−9
- src/Graphics/ColorSpace/HSI.hs +18/−18
- src/Graphics/ColorSpace/Internal.hs +29/−30
- src/Graphics/ColorSpace/RGB.hs +15/−15
- src/Graphics/ColorSpace/X.hs +15/−15
- src/Graphics/ColorSpace/Y.hs +15/−15
- src/Graphics/ColorSpace/YCbCr.hs +18/−18
massiv-io.cabal view
@@ -1,5 +1,5 @@ name: massiv-io-version: 0.1.5.0+version: 0.1.6.0 synopsis: Import/export of Image files into massiv Arrays description: This package contains functionality for import/export of arrays into the real world. For now it only has the ability to read/write
src/Data/Massiv/Array/IO.hs view
@@ -1,11 +1,11 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE TypeSynonymInstances #-} -- | -- Module : Data.Massiv.Array.IO -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -15,7 +15,8 @@ -- Portability : non-portable -- module Data.Massiv.Array.IO- ( -- * Reading+ ( -- $supported+ -- * Reading readArray , readImage , readImageAuto@@ -37,26 +38,23 @@ -- * Supported Image Formats , module Data.Massiv.Array.IO.Base , module Data.Massiv.Array.IO.Image- -- $supported ) where -import Control.Concurrent (forkIO)-import Control.Exception (bracket)-import Control.Monad (void)-import qualified Data.ByteString as B-import qualified Data.ByteString.Lazy as BL-import Data.Massiv.Array as A-import Data.Massiv.Array.IO.Base hiding (convertEither,- fromEitherDecode, fromMaybeEncode,- toProxy)-import Data.Massiv.Array.IO.Image-import Graphics.ColorSpace-import Prelude as P hiding (readFile, writeFile)-import System.Directory (createDirectoryIfMissing,- getTemporaryDirectory)-import System.FilePath-import System.IO (hClose, openBinaryTempFile)-import System.Process (readProcess)+import Control.Concurrent (forkIO)+import Control.Exception (bracket)+import Control.Monad (void)+import qualified Data.ByteString as B+import qualified Data.ByteString.Lazy as BL+import Data.Massiv.Array as A+import Data.Massiv.Array.IO.Base hiding (convertEither, fromEitherDecode,+ fromMaybeEncode, toProxy)+import Data.Massiv.Array.IO.Image+import Graphics.ColorSpace+import Prelude as P hiding (readFile, writeFile)+import System.Directory (createDirectoryIfMissing, getTemporaryDirectory)+import System.FilePath+import System.IO (hClose, openBinaryTempFile)+import System.Process (readProcess) @@ -262,7 +260,7 @@ * __read__: ('RGB' 'Word8'), ('RGBA' 'Word8') * __write__: ('RGB' 'Word8')- * Also supports reading and writing animated images, when used as @'GIFA'@+ * Also supports reading and writing animated images * 'HDR':
src/Data/Massiv/Array/IO/Base.hs view
@@ -1,10 +1,10 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-} -- | -- Module : Data.Massiv.Array.IO.Base -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -31,14 +31,14 @@ , convertEither ) where -import Control.Exception (Exception, throw)-import qualified Data.ByteString as B (ByteString)+import Control.Exception (Exception, throw)+import qualified Data.ByteString as B (ByteString) import qualified Data.ByteString.Lazy as BL (ByteString)-import Data.Default (Default (..))-import Data.Massiv.Array-import Data.Maybe (fromMaybe)-import Data.Typeable-import Graphics.ColorSpace (ColorSpace, Pixel)+import Data.Default (Default(..))+import Data.Massiv.Array+import Data.Maybe (fromMaybe)+import Data.Typeable+import Graphics.ColorSpace (ColorSpace, Pixel) type Image r cs e = Array r Ix2 (Pixel cs e)
src/Data/Massiv/Array/IO/Image.hs view
@@ -1,8 +1,8 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE TypeSynonymInstances #-} -- | -- Module : Data.Massiv.Array.IO.Image -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -24,17 +24,17 @@ , module Data.Massiv.Array.IO.Image.Netpbm ) where -import Control.Exception (throw)-import Data.Massiv.Array-import Data.Massiv.Array.IO.Base-import Data.Massiv.Array.IO.Image.JuicyPixels-import Data.Massiv.Array.IO.Image.Netpbm-import qualified Data.ByteString as B (ByteString)-import qualified Data.ByteString.Lazy as BL (ByteString)-import Data.Char (toLower)-import Graphics.ColorSpace-import Prelude as P-import System.FilePath (takeExtension)+import Control.Exception (throw)+import qualified Data.ByteString as B (ByteString)+import qualified Data.ByteString.Lazy as BL (ByteString)+import Data.Char (toLower)+import Data.Massiv.Array+import Data.Massiv.Array.IO.Base+import Data.Massiv.Array.IO.Image.JuicyPixels+import Data.Massiv.Array.IO.Image.Netpbm+import Graphics.ColorSpace+import Prelude as P+import System.FilePath (takeExtension)
src/Data/Massiv/Array/IO/Image/JuicyPixels.hs view
@@ -1,12 +1,14 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-} -- | -- Module : Data.Massiv.Array.IO.Image.JuicyPixels -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -69,25 +71,41 @@ , fromAnyDynamicImage ) where -import Prelude as P+import Prelude as P -import qualified Codec.Picture as JP-import qualified Codec.Picture.ColorQuant as JP-import qualified Codec.Picture.Gif as JP-import qualified Codec.Picture.Jpg as JP-import Control.Exception-import Control.Monad (guard, msum)-import Data.Bifunctor-import qualified Data.ByteString as B-import qualified Data.ByteString.Lazy as BL (ByteString)-import Data.Default (Default (..))-import Data.Massiv.Array as M-import Data.Massiv.Array.IO.Base-import Data.Massiv.Array.Manifest.Vector-import Data.Typeable-import qualified Data.Vector.Storable as V-import Foreign.Storable (Storable (sizeOf))-import Graphics.ColorSpace+import qualified Codec.Picture as JP+import qualified Codec.Picture.ColorQuant as JP+import qualified Codec.Picture.Gif as JP+import qualified Codec.Picture.Jpg as JP+import Control.Exception+import Control.Monad (guard, msum)+import Data.Bifunctor+import qualified Data.ByteString as B+import qualified Data.ByteString.Lazy as BL (ByteString)+import Data.Default (Default(..))+import Data.Massiv.Array as M+import Data.Massiv.Array.IO.Base+import Data.Massiv.Array.Manifest.Vector+import Data.Typeable+import qualified Data.Vector.Storable as V+import Foreign.Storable (Storable(sizeOf))+import Graphics.ColorSpace++#if !MIN_VERSION_massiv(0, 2, 7)+pattern Sz :: ix -> ix+pattern Sz ix = ix+type Sz ix = ix+#endif+#if !MIN_VERSION_massiv(0, 3, 0)+fromVectorM ::+ (Construct S ix a, Mutable S ix a, Storable a)+ => Comp+ -> Sz ix+ -> V.Vector a+ -> Maybe (Array S ix a)+fromVectorM comp sz = pure . fromVector comp sz+#endif+ -------------------------------------------------------------------------------- -- BMP Format ------------------------------------------------------------------ --------------------------------------------------------------------------------@@ -399,7 +417,7 @@ => JP.PaletteOptions -> Image r RGB e -> Maybe (JP.Image JP.Pixel8, JP.Palette)-palettizeRGB pal img = do+palettizeRGB pal img = msum [ do Refl <- eqT :: Maybe (e :~: Word8) return $ palettize' img@@ -748,8 +766,7 @@ elevate :: forall cs e' e.- ( Functor (Pixel cs)- , ColorSpace cs e'+ ( ColorSpace cs e' , ColorSpace cs e , Source D Ix2 (Pixel cs e') )@@ -769,7 +786,7 @@ return $ M.map toDouble img ] -fromDynamicImage :: forall cs e . (ColorSpace cs e, Source S Ix2 (Pixel cs e))+fromDynamicImage :: forall cs e . ColorSpace cs e => JP.DynamicImage -> Maybe (Image S cs e) fromDynamicImage jpDynImg = case jpDynImg of@@ -817,7 +834,7 @@ fromAnyDynamicImage :: (Mutable r Ix2 (Pixel cs e), ColorSpace cs e) => JP.DynamicImage -> Maybe (Image r cs e)-fromAnyDynamicImage jpDynImg = do+fromAnyDynamicImage jpDynImg = case jpDynImg of JP.ImageY8 jimg -> (fromJPImageUnsafe jimg :: Maybe (Image S Y Word8)) >>= toAnyCS JP.ImageY16 jimg -> (fromJPImageUnsafe jimg :: Maybe (Image S Y Word16)) >>= toAnyCS@@ -838,7 +855,6 @@ :: forall r' cs' e' r cs e. ( Source r' Ix2 (Pixel cs' e') , Mutable r Ix2 (Pixel cs e)- , Storable (Pixel cs e) , ColorSpace cs e , ToYA cs' e' , ToRGBA cs' e'@@ -895,16 +911,14 @@ -- Encoding --- | TODO: Validate size toJPImageUnsafe :: forall r cs a . (JP.Pixel a, Source r Ix2 (Pixel cs (JP.PixelBaseComponent a)),- ColorSpace cs (JP.PixelBaseComponent a),- Storable (Pixel cs (JP.PixelBaseComponent a)))+ ColorSpace cs (JP.PixelBaseComponent a)) => Image r cs (JP.PixelBaseComponent a) -> JP.Image a toJPImageUnsafe img = JP.Image n m $ V.unsafeCast $ toVector arrS where !arrS = computeSource img :: Image S cs (JP.PixelBaseComponent a)- (m :. n) = size img+ Sz (m :. n) = size img {-# INLINE toJPImageUnsafe #-} toJPImageY8 :: Source r Ix2 (Pixel Y Word8) => Image r Y Word8 -> JP.Image JP.Pixel8@@ -969,6 +983,5 @@ JP.Image jpx -> Maybe (Image S cs e) fromJPImageUnsafe (JP.Image n m !v) = do guard (n * m * sizeOf (undefined :: Pixel cs e) == V.length v)- return $ fromVector Par (m :. n) $ V.unsafeCast v+ fromVectorM Par (Sz (m :. n)) $ V.unsafeCast v {-# INLINE fromJPImageUnsafe #-}-
src/Data/Massiv/Array/IO/Image/Netpbm.hs view
@@ -1,12 +1,14 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE NamedFieldPuns #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE TypeSynonymInstances #-} -- | -- Module : Data.Massiv.Array.IO.Image.Netpbm -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -25,21 +27,36 @@ , PPM(..) ) where -import Control.Exception-import Control.Monad (guard)-import qualified Data.ByteString as B (ByteString)-import Data.Massiv.Array as M-import Data.Massiv.Array.IO.Base-import Data.Massiv.Array.IO.Image.JuicyPixels (toAnyCS)-import Data.Massiv.Array.Manifest.Vector-import Data.Typeable-import qualified Data.Vector.Storable as V-import Foreign.Storable (Storable)-import Graphics.ColorSpace-import Graphics.Netpbm as Netpbm hiding (PPM)-import qualified Graphics.Netpbm as Netpbm (PPM (..))-import Prelude as P+import Control.Exception+import Control.Monad (guard)+import qualified Data.ByteString as B (ByteString)+import Data.Massiv.Array as M+import Data.Massiv.Array.IO.Base+import Data.Massiv.Array.IO.Image.JuicyPixels (toAnyCS)+import Data.Massiv.Array.Manifest.Vector+import Data.Typeable+import qualified Data.Vector.Storable as V+import Foreign.Storable (Storable)+import Graphics.ColorSpace+import Graphics.Netpbm as Netpbm hiding (PPM)+import qualified Graphics.Netpbm as Netpbm (PPM(..))+import Prelude as P +#if !MIN_VERSION_massiv(0, 2, 7)+pattern Sz :: ix -> ix+pattern Sz ix = ix+type Sz ix = ix+#endif+#if !MIN_VERSION_massiv(0, 3, 0)+fromVectorM ::+ (Construct S ix a, Mutable S ix a, Storable a)+ => Comp+ -> Sz ix+ -> V.Vector a+ -> Maybe (Array S ix a)+fromVectorM comp sz = pure . fromVector comp sz+#endif+ -- | Netpbm: portable bitmap image with @.pbm@ extension. data PBM = PBM deriving Show @@ -143,7 +160,7 @@ -> Array B Ix1 (Image r cs e) decodePPMs f converter bs = either (throw . DecodeError) (fromList Seq) $- (P.map (fromEitherDecode f showNetpbmCS converter . Right) . fst) <$>+ P.map (fromEitherDecode f showNetpbmCS converter . Right) . fst <$> parsePPM bs {-# INLINE decodePPMs #-} @@ -166,12 +183,12 @@ => Int -> Int -> V.Vector a -> Maybe (Image S cs e) fromNetpbmImageUnsafe m n v = do guard (n * m == V.length v)- return $ fromVector Par (m :. n) $ V.unsafeCast v+ fromVectorM Par (Sz (m :. n)) $ V.unsafeCast v showNetpbmCS :: Netpbm.PPM -> String-showNetpbmCS Netpbm.PPM {ppmData} = do+showNetpbmCS Netpbm.PPM {ppmData} = case ppmData of PbmPixelData _ -> "Image S X Bit" PgmPixelData8 _ -> "Image S Y Word8"@@ -181,7 +198,7 @@ fromNetpbmImage- :: forall cs e . (ColorSpace cs e, V.Storable (Pixel cs e)) =>+ :: forall cs e . ColorSpace cs e => Netpbm.PPM -> Maybe (Image S cs e) fromNetpbmImage Netpbm.PPM {..} = do let m = ppmHeight ppmHeader@@ -200,7 +217,7 @@ fromNetpbmImageAuto- :: forall cs e r . (Mutable r Ix2 (Pixel cs e), ColorSpace cs e, V.Storable (Pixel cs e)) =>+ :: forall cs e r . (Mutable r Ix2 (Pixel cs e), ColorSpace cs e) => Netpbm.PPM -> Maybe (Image r cs e) fromNetpbmImageAuto Netpbm.PPM {..} = do let m = ppmHeight ppmHeader
src/Graphics/ColorSpace.hs view
@@ -1,15 +1,15 @@ {-# OPTIONS_GHC -fno-warn-orphans #-}-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE CPP #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE ViewPatterns #-} #if __GLASGOW_HASKELL__ >= 800 {-# OPTIONS_GHC -Wno-redundant-constraints #-}- {-# LANGUAGE MonoLocalBinds #-}+{-# LANGUAGE MonoLocalBinds #-} #endif -- | -- Module : Graphics.ColorSpace@@ -123,16 +123,16 @@ Word8, Word16, Word32, Word64 ) where -import Data.Word-import Graphics.ColorSpace.Binary-import Graphics.ColorSpace.CMYK-import Graphics.ColorSpace.Complex-import Graphics.ColorSpace.HSI-import Graphics.ColorSpace.Internal-import Graphics.ColorSpace.RGB-import Graphics.ColorSpace.X-import Graphics.ColorSpace.Y-import Graphics.ColorSpace.YCbCr+import Data.Word+import Graphics.ColorSpace.Binary+import Graphics.ColorSpace.CMYK+import Graphics.ColorSpace.Complex+import Graphics.ColorSpace.HSI+import Graphics.ColorSpace.Internal+import Graphics.ColorSpace.RGB+import Graphics.ColorSpace.X+import Graphics.ColorSpace.Y+import Graphics.ColorSpace.YCbCr -- -- Binary:
src/Graphics/ColorSpace/Binary.hs view
@@ -1,11 +1,11 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE CPP #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-} -- | -- Module : Graphics.ColorSpace.Binary -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -18,19 +18,19 @@ Bit, on, off, isOn, isOff, fromBool, zero, one, bit2bool, bool2bit, toNum, fromNum ) where -import Control.Applicative-import Control.Monad-import Data.Bits-import Data.Typeable (Typeable)-import qualified Data.Vector.Generic as V-import qualified Data.Vector.Generic.Mutable as M-import qualified Data.Vector.Unboxed as U-import Data.Word (Word8)-import Foreign.Ptr-import Foreign.Storable-import Graphics.ColorSpace.Internal-import Graphics.ColorSpace.X-import Prelude hiding (map)+import Control.Applicative+import Control.Monad+import Data.Bits+import Data.Typeable (Typeable)+import qualified Data.Vector.Generic as V+import qualified Data.Vector.Generic.Mutable as M+import qualified Data.Vector.Unboxed as U+import Data.Word (Word8)+import Foreign.Ptr+import Foreign.Storable+import Graphics.ColorSpace.Internal+import Graphics.ColorSpace.X+import Prelude hiding (map) -- | Under the hood, binary pixels are represented as `Word8`, but can only take@@ -92,11 +92,11 @@ {-# INLINE (.|.) #-} xor = liftA2 xor {-# INLINE xor #-}- complement = liftA complement+ complement = fmap complement {-# INLINE complement #-}- shift !b !n = liftA (`shift` n) b+ shift !b !n = fmap (`shift` n) b {-# INLINE shift #-}- rotate !b !n = liftA (`rotate` n) b+ rotate !b !n = fmap (`rotate` n) b {-# INLINE rotate #-} zeroBits = pure zeroBits {-# INLINE zeroBits #-}@@ -236,12 +236,12 @@ alignment _ = alignment (undefined :: Word8) {-# INLINE alignment #-} peek !p = do- q <- return $ castPtr p+ let !q = castPtr p b <- peek q return (Bit b) {-# INLINE peek #-} poke !p (Bit b) = do- q <- return $ castPtr p+ let !q = castPtr p poke q b {-# INLINE poke #-}
src/Graphics/ColorSpace/CMYK.hs view
@@ -1,10 +1,10 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-} -- | -- Module : Graphics.ColorSpace.CMYK -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -17,12 +17,12 @@ CMYK(..), CMYKA(..), Pixel(..) ) where -import Data.Foldable-import Data.Typeable (Typeable)-import Foreign.Ptr-import Foreign.Storable-import Graphics.ColorSpace.Internal-import Prelude hiding (map)+import Data.Foldable+import Data.Typeable (Typeable)+import Foreign.Ptr+import Foreign.Storable+import Graphics.ColorSpace.Internal+import Prelude hiding (map) ------------ --- CMYK ---@@ -45,7 +45,7 @@ instance Elevator e => ColorSpace CMYK e where type Components CMYK e = (e, e, e, e) - fromComponents !(c, m, y, k) = PixelCMYK c m y k+ fromComponents (c, m, y, k) = PixelCMYK c m y k {-# INLINE fromComponents #-} toComponents (PixelCMYK c m y k) = (c, m, y, k) {-# INLINE toComponents #-}@@ -133,7 +133,7 @@ instance Elevator e => ColorSpace CMYKA e where type Components CMYKA e = (e, e, e, e, e) - fromComponents !(c, m, y, k, a) = PixelCMYKA c m y k a+ fromComponents (c, m, y, k, a) = PixelCMYKA c m y k a {-# INLINE fromComponents #-} toComponents (PixelCMYKA c m y k a) = (c, m, y, k, a) {-# INLINE toComponents #-}@@ -195,7 +195,7 @@ alignment _ = alignment (undefined :: e) {-# INLINE alignment #-} peek !p = do- q <- return $ castPtr p+ let !q = castPtr p c <- peek q m <- peekElemOff q 1 y <- peekElemOff q 2@@ -204,7 +204,7 @@ return (PixelCMYKA c m y k a) {-# INLINE peek #-} poke !p (PixelCMYKA c m y k a) = do- q <- return $ castPtr p+ let !q = castPtr p poke q c pokeElemOff q 1 m pokeElemOff q 2 y
src/Graphics/ColorSpace/Complex.hs view
@@ -1,5 +1,5 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE CPP #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleContexts #-} #if __GLASGOW_HASKELL__ >= 800 {-# OPTIONS_GHC -Wno-redundant-constraints #-}@@ -21,10 +21,10 @@ conjugate ) where -import Control.Applicative-import Data.Complex (Complex (..))-import qualified Data.Complex as C hiding (Complex (..))-import Graphics.ColorSpace.Internal+import Control.Applicative+import Data.Complex (Complex(..))+import qualified Data.Complex as C hiding (Complex(..))+import Graphics.ColorSpace.Internal @@ -40,12 +40,12 @@ -- | Extracts the real part of a complex pixel. realPart :: (ColorSpace cs e, RealFloat e) => Pixel cs (Complex e) -> Pixel cs e-realPart = liftA C.realPart+realPart = fmap C.realPart {-# INLINE realPart #-} -- | Extracts the imaginary part of a complex pixel. imagPart :: (ColorSpace cs e, RealFloat e) => Pixel cs (Complex e) -> Pixel cs e-imagPart = liftA C.imagPart+imagPart = fmap C.imagPart {-# INLINE imagPart #-} -- | Form a complex pixel from polar components of magnitude and phase.@@ -56,7 +56,7 @@ -- | @'cis' t@ is a complex pixel with magnitude 1 and phase t (modulo @2*'pi'@). cis :: (ColorSpace cs e, RealFloat e) => Pixel cs e -> Pixel cs (Complex e)-cis = liftA C.cis+cis = fmap C.cis {-# INLINE cis #-} -- | The function @'polar'@ takes a complex pixel and returns a (magnitude, phase)@@ -68,18 +68,18 @@ -- | The nonnegative magnitude of a complex pixel. magnitude :: (ColorSpace cs e, RealFloat e) => Pixel cs (Complex e) -> Pixel cs e-magnitude = liftA C.magnitude+magnitude = fmap C.magnitude {-# INLINE magnitude #-} -- | The phase of a complex pixel, in the range @(-'pi', 'pi']@. If the -- magnitude is zero, then so is the phase. phase :: (ColorSpace cs e, RealFloat e) => Pixel cs (Complex e) -> Pixel cs e-phase = liftA C.phase+phase = fmap C.phase {-# INLINE phase #-} -- | The conjugate of a complex pixel. conjugate :: (ColorSpace cs e, RealFloat e) => Pixel cs (Complex e) -> Pixel cs (Complex e)-conjugate = liftA C.conjugate+conjugate = fmap C.conjugate {-# INLINE conjugate #-}
src/Graphics/ColorSpace/Elevator.hs view
@@ -1,5 +1,5 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE CPP #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE ScopedTypeVariables #-} #if __GLASGOW_HASKELL__ >= 800 {-# OPTIONS_GHC -Wno-redundant-constraints #-}@@ -17,13 +17,13 @@ , clamp01 ) where -import qualified Data.Complex as C-import Data.Int-import Data.Typeable-import Data.Vector.Storable (Storable)-import Data.Vector.Unboxed (Unbox)-import Data.Word-import GHC.Float+import qualified Data.Complex as C+import Data.Int+import Data.Typeable+import Data.Vector.Storable (Storable)+import Data.Vector.Unboxed (Unbox)+import Data.Word+import GHC.Float -- | A class with a set of convenient functions that allow for changing precision of
src/Graphics/ColorSpace/HSI.hs view
@@ -1,10 +1,10 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-} -- | -- Module : Graphics.ColorSpace.HSI -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -17,12 +17,12 @@ HSI(..), HSIA(..), Pixel(..) ) where -import Data.Foldable-import Data.Typeable (Typeable)-import Foreign.Ptr-import Foreign.Storable-import Graphics.ColorSpace.Internal-import Prelude hiding (map)+import Data.Foldable+import Data.Typeable (Typeable)+import Foreign.Ptr+import Foreign.Storable+import Graphics.ColorSpace.Internal+import Prelude hiding (map) ----------- --- HSI ---@@ -46,7 +46,7 @@ toComponents (PixelHSI h s i) = (h, s, i) {-# INLINE toComponents #-}- fromComponents !(h, s, i) = PixelHSI h s i+ fromComponents (h, s, i) = PixelHSI h s i {-# INLINE fromComponents #-} getPxC (PixelHSI h _ _) HueHSI = h getPxC (PixelHSI _ s _) SatHSI = s@@ -89,14 +89,14 @@ alignment _ = alignment (undefined :: e) {-# INLINE alignment #-} peek !p = do- q <- return $ castPtr p+ let !q = castPtr p r <- peek q g <- peekElemOff q 1 b <- peekElemOff q 2 return (PixelHSI r g b) {-# INLINE peek #-} poke !p (PixelHSI r g b) = do- q <- return $ castPtr p+ let !q = castPtr p poke q r pokeElemOff q 1 g pokeElemOff q 2 b@@ -126,7 +126,7 @@ toComponents (PixelHSIA h s i a) = (h, s, i, a) {-# INLINE toComponents #-}- fromComponents !(h, s, i, a) = PixelHSIA h s i a+ fromComponents (h, s, i, a) = PixelHSIA h s i a {-# INLINE fromComponents #-} getPxC (PixelHSIA h _ _ _) HueHSIA = h getPxC (PixelHSIA _ s _ _) SatHSIA = s@@ -180,7 +180,7 @@ alignment _ = alignment (undefined :: e) {-# INLINE alignment #-} peek !p = do- q <- return $ castPtr p+ let !q = castPtr p h <- peek q s <- peekElemOff q 1 i <- peekElemOff q 2@@ -188,7 +188,7 @@ return (PixelHSIA h s i a) {-# INLINE peek #-} poke !p (PixelHSIA h s i a) = do- q <- return $ castPtr p+ let !q = castPtr p poke q h pokeElemOff q 1 s pokeElemOff q 2 i
src/Graphics/ColorSpace/Internal.hs view
@@ -1,8 +1,7 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE CPP #-}-{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeFamilies #-} -- | -- Module : Graphics.ColorSpace.Internal -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -18,17 +17,17 @@ , module Graphics.ColorSpace.Elevator ) where -import Control.Applicative-import Control.DeepSeq (NFData (rnf), deepseq)-import Control.Monad (liftM)-import Data.Default-import Data.Foldable-import Data.Typeable-import qualified Data.Vector.Generic as V-import qualified Data.Vector.Generic.Mutable as VM-import qualified Data.Vector.Storable as VS-import qualified Data.Vector.Unboxed as VU-import Graphics.ColorSpace.Elevator+import Control.Applicative+import Control.DeepSeq (NFData(rnf), deepseq)+import Control.Monad (liftM)+import Data.Default+import Data.Foldable+import Data.Typeable+import qualified Data.Vector.Generic as V+import qualified Data.Vector.Generic.Mutable as VM+import qualified Data.Vector.Storable as VS+import qualified Data.Vector.Unboxed as VU+import Graphics.ColorSpace.Elevator -- | A Pixel family with a color space and a precision of elements.@@ -130,9 +129,9 @@ {-# INLINE (-) #-} (*) = liftA2 (*) {-# INLINE (*) #-}- abs = liftA abs+ abs = fmap abs {-# INLINE abs #-}- signum = liftA signum+ signum = fmap signum {-# INLINE signum #-} fromInteger = promote . fromInteger {-# INLINE fromInteger #-}@@ -141,7 +140,7 @@ instance (ColorSpace cs e, Fractional e) => Fractional (Pixel cs e) where (/) = liftA2 (/) {-# INLINE (/) #-}- recip = liftA recip+ recip = fmap recip {-# INLINE recip #-} fromRational = promote . fromRational {-# INLINE fromRational #-}@@ -150,29 +149,29 @@ instance (ColorSpace cs e, Floating e) => Floating (Pixel cs e) where pi = promote pi {-# INLINE pi #-}- exp = liftA exp+ exp = fmap exp {-# INLINE exp #-}- log = liftA log+ log = fmap log {-# INLINE log #-}- sin = liftA sin+ sin = fmap sin {-# INLINE sin #-}- cos = liftA cos+ cos = fmap cos {-# INLINE cos #-}- asin = liftA asin+ asin = fmap asin {-# INLINE asin #-}- atan = liftA atan+ atan = fmap atan {-# INLINE atan #-}- acos = liftA acos+ acos = fmap acos {-# INLINE acos #-}- sinh = liftA sinh+ sinh = fmap sinh {-# INLINE sinh #-}- cosh = liftA cosh+ cosh = fmap cosh {-# INLINE cosh #-}- asinh = liftA asinh+ asinh = fmap asinh {-# INLINE asinh #-}- atanh = liftA atanh+ atanh = fmap atanh {-# INLINE atanh #-}- acosh = liftA acosh+ acosh = fmap acosh {-# INLINE acosh #-} instance (ColorSpace cs e, Bounded e) => Bounded (Pixel cs e) where
src/Graphics/ColorSpace/RGB.hs view
@@ -1,10 +1,10 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-} -- | -- Module : Graphics.ColorSpace.RGB -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -17,11 +17,11 @@ RGB(..), RGBA(..), Pixel(..) ) where -import Data.Typeable (Typeable)-import Foreign.Ptr-import Foreign.Storable-import Graphics.ColorSpace.Internal-import Prelude hiding (map)+import Data.Typeable (Typeable)+import Foreign.Ptr+import Foreign.Storable+import Graphics.ColorSpace.Internal+import Prelude hiding (map) ----------- --- RGB ---@@ -44,7 +44,7 @@ toComponents (PixelRGB r g b) = (r, g, b) {-# INLINE toComponents #-}- fromComponents !(r, g, b) = PixelRGB r g b+ fromComponents (r, g, b) = PixelRGB r g b {-# INLINE fromComponents #-} getPxC (PixelRGB r _ _) RedRGB = r getPxC (PixelRGB _ g _) GreenRGB = g@@ -117,7 +117,7 @@ toComponents (PixelRGBA r g b a) = (r, g, b, a) {-# INLINE toComponents #-}- fromComponents !(r, g, b, a) = PixelRGBA r g b a+ fromComponents (r, g, b, a) = PixelRGBA r g b a {-# INLINE fromComponents #-} getPxC (PixelRGBA r _ _ _) RedRGBA = r getPxC (PixelRGBA _ g _ _) GreenRGBA = g@@ -167,14 +167,14 @@ sizeOf _ = 4 * sizeOf (undefined :: e) alignment _ = alignment (undefined :: e) peek p = do- q <- return $ castPtr p+ let q = castPtr p r <- peek q g <- peekElemOff q 1 b <- peekElemOff q 2 a <- peekElemOff q 3 return (PixelRGBA r g b a) poke p (PixelRGBA r g b a) = do- q <- return $ castPtr p+ let q = castPtr p poke q r pokeElemOff q 1 g pokeElemOff q 2 b
src/Graphics/ColorSpace/X.hs view
@@ -1,10 +1,10 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-} -- | -- Module : Graphics.ColorSpace.X -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -20,12 +20,12 @@ , fromPixelsX ) where -import Data.Foldable-import Data.Typeable (Typeable)-import Foreign.Ptr-import Foreign.Storable-import Graphics.ColorSpace.Internal-import Prelude as P+import Data.Foldable+import Data.Typeable (Typeable)+import Foreign.Ptr+import Foreign.Storable+import Graphics.ColorSpace.Internal+import Prelude as P -- ^ This is a single channel colorspace, that is designed to separate Gray -- level values from other types of colorspace, hence it is not convertible to@@ -51,7 +51,7 @@ {-# INLINE toComponents #-} getPxC (PixelX g) X = g {-# INLINE getPxC #-}- setPxC (PixelX _) X g = PixelX g+ setPxC (PixelX _) X = PixelX {-# INLINE setPxC #-} mapPxC f (PixelX g) = PixelX (f X g) {-# INLINE mapPxC #-}@@ -92,12 +92,12 @@ alignment _ = alignment (undefined :: e) {-# INLINE alignment #-} peek !p = do- q <- return $ castPtr p+ let q = castPtr p g <- peek q return (PixelX g) {-# INLINE peek #-} poke !p (PixelX g) = do- q <- return $ castPtr p+ let q = castPtr p poke q g {-# INLINE poke #-}
src/Graphics/ColorSpace/Y.hs view
@@ -1,10 +1,10 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-} -- | -- Module : Graphics.ColorSpace.Y -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -17,12 +17,12 @@ Y(..), YA(..), Pixel(..) ) where -import Data.Foldable-import Data.Typeable (Typeable)-import Foreign.Ptr-import Foreign.Storable-import Graphics.ColorSpace.Internal-import Prelude hiding (map)+import Data.Foldable+import Data.Typeable (Typeable)+import Foreign.Ptr+import Foreign.Storable+import Graphics.ColorSpace.Internal+import Prelude hiding (map) --------- --- Y ---@@ -45,7 +45,7 @@ {-# INLINE toComponents #-} getPxC (PixelY y) LumaY = y {-# INLINE getPxC #-}- setPxC _ LumaY y = PixelY y+ setPxC _ LumaY = PixelY {-# INLINE setPxC #-} mapPxC f (PixelY y) = PixelY (f LumaY y) {-# INLINE mapPxC #-}@@ -166,13 +166,13 @@ alignment _ = alignment (undefined :: e) {-# INLINE alignment #-} peek !p = do- q <- return $ castPtr p+ let q = castPtr p y <- peekElemOff q 0 a <- peekElemOff q 1 return (PixelYA y a) {-# INLINE peek #-} poke !p (PixelYA y a) = do- q <- return $ castPtr p+ let q = castPtr p pokeElemOff q 0 y pokeElemOff q 1 a {-# INLINE poke #-}
src/Graphics/ColorSpace/YCbCr.hs view
@@ -1,10 +1,10 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-} -- | -- Module : Graphics.ColorSpace.YCbCr -- Copyright : (c) Alexey Kuleshevich 2018-2019@@ -17,12 +17,12 @@ YCbCr(..), YCbCrA(..), Pixel(..) ) where -import Data.Foldable-import Data.Typeable (Typeable)-import Foreign.Ptr-import Foreign.Storable-import Graphics.ColorSpace.Internal-import Prelude hiding (map)+import Data.Foldable+import Data.Typeable (Typeable)+import Foreign.Ptr+import Foreign.Storable+import Graphics.ColorSpace.Internal+import Prelude hiding (map) ------------- --- YCbCr ---@@ -45,7 +45,7 @@ instance Elevator e => ColorSpace YCbCr e where type Components YCbCr e = (e, e, e) - fromComponents !(y, b, r) = PixelYCbCr y b r+ fromComponents (y, b, r) = PixelYCbCr y b r {-# INLINE fromComponents #-} toComponents (PixelYCbCr y b r) = (y, b, r) {-# INLINE toComponents #-}@@ -88,14 +88,14 @@ alignment _ = alignment (undefined :: e) {-# INLINE alignment #-} peek !p = do- q <- return $ castPtr p+ let q = castPtr p y <- peek q b <- peekElemOff q 1 r <- peekElemOff q 2 return (PixelYCbCr y b r) {-# INLINE poke #-} poke !p (PixelYCbCr y b r) = do- q <- return $ castPtr p+ let q = castPtr p pokeElemOff q 0 y pokeElemOff q 1 b pokeElemOff q 2 r@@ -124,7 +124,7 @@ instance Elevator e => ColorSpace YCbCrA e where type Components YCbCrA e = (e, e, e, e) - fromComponents !(y, b, r, a) = PixelYCbCrA y b r a+ fromComponents (y, b, r, a) = PixelYCbCrA y b r a {-# INLINE fromComponents #-} toComponents (PixelYCbCrA y b r a) = (y, b, r, a) {-# INLINE toComponents #-}@@ -181,7 +181,7 @@ alignment _ = alignment (undefined :: e) {-# INLINE alignment #-} peek !p = do- q <- return $ castPtr p+ let q = castPtr p y <- peekElemOff q 0 b <- peekElemOff q 1 r <- peekElemOff q 2@@ -189,7 +189,7 @@ return (PixelYCbCrA y b r a) {-# INLINE peek #-} poke !p (PixelYCbCrA y b r a) = do- q <- return $ castPtr p+ let q = castPtr p poke q y pokeElemOff q 1 b pokeElemOff q 2 r