packages feed

Color 0.3.1 → 0.3.2

raw patch · 12 files changed

+527/−5 lines, 12 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Graphics.Color.Model: data LCH
+ Graphics.Color.Model: lch2lxy :: Color LCH Double -> Components LCH Double
+ Graphics.Color.Model: lxy2lch :: Components LCH Double -> Color LCH Double
+ Graphics.Color.Model: pattern ColorLCH :: e -> e -> e -> Color LCH e
+ Graphics.Color.Model: pattern ColorLCHA :: e -> e -> e -> e -> Color (Alpha LCH) e
+ Graphics.Color.Space.CIE1976.LAB.LCH: data LCHab (i :: k)
+ Graphics.Color.Space.CIE1976.LAB.LCH: data family Color cs e :: Type
+ Graphics.Color.Space.CIE1976.LAB.LCH: instance forall k (i :: k) e. (Graphics.Color.Space.Internal.Illuminant i, Graphics.Color.Algebra.Elevator.Elevator e) => GHC.Show.Show (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LAB.LCH.LCHab i) e)
+ Graphics.Color.Space.CIE1976.LAB.LCH: instance forall k (i :: k) e. (Graphics.Color.Space.Internal.Illuminant i, Graphics.Color.Algebra.Elevator.Elevator e, Graphics.Color.Model.Internal.ColorModel (Graphics.Color.Space.CIE1976.LAB.LAB i) e) => Graphics.Color.Model.Internal.ColorModel (Graphics.Color.Space.CIE1976.LAB.LCH.LCHab i) e
+ Graphics.Color.Space.CIE1976.LAB.LCH: instance forall k (i :: k) e. (Graphics.Color.Space.Internal.Illuminant i, Graphics.Color.Algebra.Elevator.Elevator e, Graphics.Color.Space.Internal.ColorSpace (Graphics.Color.Space.CIE1976.LAB.LAB i) i e) => Graphics.Color.Space.Internal.ColorSpace (Graphics.Color.Space.CIE1976.LAB.LCH.LCHab i) i e
+ Graphics.Color.Space.CIE1976.LAB.LCH: instance forall k (i :: k). Data.Foldable.Foldable (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LAB.LCH.LCHab i))
+ Graphics.Color.Space.CIE1976.LAB.LCH: instance forall k (i :: k). Data.Traversable.Traversable (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LAB.LCH.LCHab i))
+ Graphics.Color.Space.CIE1976.LAB.LCH: instance forall k (i :: k). GHC.Base.Applicative (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LAB.LCH.LCHab i))
+ Graphics.Color.Space.CIE1976.LAB.LCH: instance forall k (i :: k). GHC.Base.Functor (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LAB.LCH.LCHab i))
+ Graphics.Color.Space.CIE1976.LAB.LCH: instance forall k e (i :: k). Foreign.Storable.Storable e => Foreign.Storable.Storable (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LAB.LCH.LCHab i) e)
+ Graphics.Color.Space.CIE1976.LAB.LCH: instance forall k e (i :: k). GHC.Classes.Eq e => GHC.Classes.Eq (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LAB.LCH.LCHab i) e)
+ Graphics.Color.Space.CIE1976.LAB.LCH: instance forall k e (i :: k). GHC.Classes.Ord e => GHC.Classes.Ord (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LAB.LCH.LCHab i) e)
+ Graphics.Color.Space.CIE1976.LAB.LCH: pattern ColorLCHab :: e -> e -> e -> Color (LCHab i) e
+ Graphics.Color.Space.CIE1976.LAB.LCH: pattern ColorLCHabA :: e -> e -> e -> e -> Color (Alpha (LCHab i)) e
+ Graphics.Color.Space.CIE1976.LUV: data LUV (i :: k)
+ Graphics.Color.Space.CIE1976.LUV: instance forall k (i :: k) e. (Graphics.Color.Space.Internal.Illuminant i, Graphics.Color.Algebra.Elevator.Elevator e) => GHC.Show.Show (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LUV i) e)
+ Graphics.Color.Space.CIE1976.LUV: instance forall k (i :: k) e. (Graphics.Color.Space.Internal.Illuminant i, Graphics.Color.Algebra.Elevator.Elevator e) => Graphics.Color.Model.Internal.ColorModel (Graphics.Color.Space.CIE1976.LUV.LUV i) e
+ Graphics.Color.Space.CIE1976.LUV: instance forall k (i :: k) e. (Graphics.Color.Space.Internal.Illuminant i, Graphics.Color.Algebra.Elevator.Elevator e, GHC.Float.RealFloat e) => Graphics.Color.Space.Internal.ColorSpace (Graphics.Color.Space.CIE1976.LUV.LUV i) i e
+ Graphics.Color.Space.CIE1976.LUV: instance forall k (i :: k). Data.Foldable.Foldable (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LUV i))
+ Graphics.Color.Space.CIE1976.LUV: instance forall k (i :: k). Data.Traversable.Traversable (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LUV i))
+ Graphics.Color.Space.CIE1976.LUV: instance forall k (i :: k). GHC.Base.Applicative (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LUV i))
+ Graphics.Color.Space.CIE1976.LUV: instance forall k (i :: k). GHC.Base.Functor (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LUV i))
+ Graphics.Color.Space.CIE1976.LUV: instance forall k e (i :: k). Foreign.Storable.Storable e => Foreign.Storable.Storable (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LUV i) e)
+ Graphics.Color.Space.CIE1976.LUV: instance forall k e (i :: k). GHC.Classes.Eq e => GHC.Classes.Eq (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LUV i) e)
+ Graphics.Color.Space.CIE1976.LUV: instance forall k e (i :: k). GHC.Classes.Ord e => GHC.Classes.Ord (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LUV i) e)
+ Graphics.Color.Space.CIE1976.LUV: pattern ColorLUV :: e -> e -> e -> Color (LUV i) e
+ Graphics.Color.Space.CIE1976.LUV: pattern ColorLUVA :: e -> e -> e -> e -> Color (Alpha (LUV i)) e
+ Graphics.Color.Space.CIE1976.LUV: pattern LUV :: () => V3 e -> Color (LUV i) e
+ Graphics.Color.Space.CIE1976.LUV.LCH: data LCHuv (i :: k)
+ Graphics.Color.Space.CIE1976.LUV.LCH: data family Color cs e :: Type
+ Graphics.Color.Space.CIE1976.LUV.LCH: instance forall k (i :: k) e. (Graphics.Color.Space.Internal.Illuminant i, Graphics.Color.Algebra.Elevator.Elevator e) => GHC.Show.Show (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LCH.LCHuv i) e)
+ Graphics.Color.Space.CIE1976.LUV.LCH: instance forall k (i :: k) e. (Graphics.Color.Space.Internal.Illuminant i, Graphics.Color.Algebra.Elevator.Elevator e, Graphics.Color.Model.Internal.ColorModel (Graphics.Color.Space.CIE1976.LUV.LUV i) e) => Graphics.Color.Model.Internal.ColorModel (Graphics.Color.Space.CIE1976.LUV.LCH.LCHuv i) e
+ Graphics.Color.Space.CIE1976.LUV.LCH: instance forall k (i :: k) e. (Graphics.Color.Space.Internal.Illuminant i, Graphics.Color.Algebra.Elevator.Elevator e, Graphics.Color.Space.Internal.ColorSpace (Graphics.Color.Space.CIE1976.LUV.LUV i) i e) => Graphics.Color.Space.Internal.ColorSpace (Graphics.Color.Space.CIE1976.LUV.LCH.LCHuv i) i e
+ Graphics.Color.Space.CIE1976.LUV.LCH: instance forall k (i :: k). Data.Foldable.Foldable (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LCH.LCHuv i))
+ Graphics.Color.Space.CIE1976.LUV.LCH: instance forall k (i :: k). Data.Traversable.Traversable (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LCH.LCHuv i))
+ Graphics.Color.Space.CIE1976.LUV.LCH: instance forall k (i :: k). GHC.Base.Applicative (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LCH.LCHuv i))
+ Graphics.Color.Space.CIE1976.LUV.LCH: instance forall k (i :: k). GHC.Base.Functor (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LCH.LCHuv i))
+ Graphics.Color.Space.CIE1976.LUV.LCH: instance forall k e (i :: k). Foreign.Storable.Storable e => Foreign.Storable.Storable (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LCH.LCHuv i) e)
+ Graphics.Color.Space.CIE1976.LUV.LCH: instance forall k e (i :: k). GHC.Classes.Eq e => GHC.Classes.Eq (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LCH.LCHuv i) e)
+ Graphics.Color.Space.CIE1976.LUV.LCH: instance forall k e (i :: k). GHC.Classes.Ord e => GHC.Classes.Ord (Graphics.Color.Model.Internal.Color (Graphics.Color.Space.CIE1976.LUV.LCH.LCHuv i) e)
+ Graphics.Color.Space.CIE1976.LUV.LCH: pattern ColorLCHuv :: e -> e -> e -> Color (LCHuv i) e
+ Graphics.Color.Space.CIE1976.LUV.LCH: pattern ColorLCHuvA :: e -> e -> e -> e -> Color (Alpha (LCHuv i)) e

Files

CHANGELOG.md view
@@ -1,5 +1,9 @@ # Changelog for Color +## 0.3.2++* Addition of `CIEL*u*v*` colorspace and `LCh` views of both `CIEL*a*b*` and `L*u*v*`.+ ## 0.3.1  * Remove `RealFloat` constraint from `ColorSpace` for `Y'`
Color.cabal view
@@ -1,5 +1,5 @@ name:                Color-version:             0.3.1+version:             0.3.2 synopsis:            Color spaces and conversions between them description:         Please see the README on GitHub at <https://github.com/lehins/Color#readme> homepage:            https://github.com/lehins/Color@@ -42,9 +42,9 @@                      , Graphics.Color.Space.CIE1931.RGB                      , Graphics.Color.Space.CIE1931.XYZ                      , Graphics.Color.Space.CIE1976.LAB-                     -- , Graphics.Color.Space.CIE1976.LAB.LCH-                     -- , Graphics.Color.Space.CIE1976.LAB.HLC-                     -- , Graphics.Color.Space.CIE1976.LUV+                     , Graphics.Color.Space.CIE1976.LAB.LCH+                     , Graphics.Color.Space.CIE1976.LUV+                     , Graphics.Color.Space.CIE1976.LUV.LCH                      , Graphics.Color.Space.RGB                      , Graphics.Color.Space.RGB.CIERGB                      , Graphics.Color.Space.RGB.AdobeRGB@@ -80,6 +80,7 @@                      , Graphics.Color.Model.HSI                      , Graphics.Color.Model.HSL                      , Graphics.Color.Model.HSV+                     , Graphics.Color.Model.LCH                      , Graphics.Color.Model.X                      , Graphics.Color.Model.YCbCr                      , Graphics.Color.Space.Internal@@ -109,11 +110,15 @@                     , Graphics.Color.Model.HSISpec                     , Graphics.Color.Model.HSLSpec                     , Graphics.Color.Model.HSVSpec+                    , Graphics.Color.Model.LCHSpec                     , Graphics.Color.Model.RGBSpec                     , Graphics.Color.Model.YCbCrSpec                     , Graphics.Color.Space.Common                     , Graphics.Color.Space.CIE1931.RGBSpec                     , Graphics.Color.Space.CIE1976.LABSpec+                    , Graphics.Color.Space.CIE1976.LAB.LCHSpec+                    , Graphics.Color.Space.CIE1976.LUVSpec+                    , Graphics.Color.Space.CIE1976.LUV.LCHSpec                     , Graphics.Color.Space.RGB.AdobeRGBSpec                     , Graphics.Color.Space.RGB.SRGBSpec                     , Graphics.Color.Space.RGB.Derived.AdobeRGBSpec
src/Graphics/Color/Model.hs view
@@ -31,6 +31,8 @@   , module Graphics.Color.Model.YCbCr   -- * CMYK   , module Graphics.Color.Model.CMYK+  -- * LCH+  , module Graphics.Color.Model.LCH   -- * Color   , Color(..)   , module Graphics.Color.Algebra.Binary@@ -43,6 +45,7 @@ import Graphics.Color.Model.HSI import Graphics.Color.Model.HSL import Graphics.Color.Model.HSV+import Graphics.Color.Model.LCH import Graphics.Color.Model.Internal import Graphics.Color.Model.RGB import Graphics.Color.Model.X
+ src/Graphics/Color/Model/LCH.hs view
@@ -0,0 +1,88 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeFamilies #-}+-- |+-- Module : Graphics.Color.Model.LCH+module Graphics.Color.Model.LCH+  ( LCH+  -- * Constructors for an LCH color model.+  , pattern ColorLCH+  , pattern ColorLCHA+  , Color+  , ColorModel(..)+  , lch2lxy+  , lxy2lch+  ) where++import Data.Complex ( Complex(..), polar, mkPolar )+import Data.Fixed ( mod' )+import Foreign.Storable+import Graphics.Color.Model.Internal++-----------+--- LCH ---+-----------++-- | CIEL*C*H color model, representing a cylindrical reparameterization+--   of CIEL*a*b* or CIEL*u*v*.+data LCH++-- | `LCH` color model+newtype instance Color LCH e = LCH (V3 e)++-- | Constructor for @LCH@.+pattern ColorLCH :: e -> e -> e -> Color LCH e+pattern ColorLCH l c h = LCH (V3 l c h)+{-# COMPLETE ColorLCH #-}+++-- | Constructor for @LCH@ with alpha channel.+pattern ColorLCHA :: e -> e -> e -> e -> Color (Alpha LCH) e+pattern ColorLCHA l c h a = Alpha (ColorLCH l c h) a+{-# COMPLETE ColorLCHA #-}++-- | `LCH` color model+deriving instance Eq e => Eq (Color LCH e)+-- | `LCH` color model+deriving instance Ord e => Ord (Color LCH e)+-- | `LCH` color model+deriving instance Functor (Color LCH)+-- | `LCH` color model+deriving instance Applicative (Color LCH)+-- | `LCH` color model+deriving instance Foldable (Color LCH)+-- | `LCH` color model+deriving instance Traversable (Color LCH)+-- | `LCH` color model+deriving instance Storable e => Storable (Color LCH e)++-- | `LCH` color model+instance Elevator e => Show (Color LCH e) where+  showsPrec _ = showsColorModel++-- | `LCH` color model+instance Elevator e => ColorModel LCH e where+  type Components LCH e = (e, e, e)+  toComponents (ColorLCH l c h) = (l, c, h)+  {-# INLINE toComponents #-}+  fromComponents (l, c, h) = ColorLCH l c h+  {-# INLINE fromComponents #-}++lch2lxy :: Color LCH Double -> Components LCH Double+lch2lxy (ColorLCH l c h) = (l, x, y)+ where+  !h' = h * pi / 180+  (x :+ y) = mkPolar c h'+{-# INLINE lch2lxy #-}++lxy2lch :: Components LCH Double -> Color LCH Double+lxy2lch (l, x, y) = ColorLCH l c h+ where+  (c,h') = polar (x :+ y)+  !h = (h' * 180 / pi) `mod'` 360+{-# INLINE lxy2lch #-}
+ src/Graphics/Color/Space/CIE1976/LAB/LCH.hs view
@@ -0,0 +1,91 @@+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}++-- |+-- Module: Graphics.Color.Space.CIE1976.LAB.LCH++module Graphics.Color.Space.CIE1976.LAB.LCH+  ( pattern ColorLCHab+  , pattern ColorLCHabA+  , LCHab+  , Color(LCHab)+  ) where++import Data.Coerce+import Data.Proxy+import Foreign.Storable+import qualified Graphics.Color.Model.LCH as CM+import Graphics.Color.Space.CIE1976.LAB+import Graphics.Color.Model.Internal+import Graphics.Color.Space.Internal++-- | [CIE L*C*Hab](https://en.wikipedia.org/wiki/CIELAB_color_space),+--   an LCH representation for the L*a*b* color space+data LCHab (i :: k)++-- | Color in CIE L*C*Hab color space+newtype instance Color (LCHab i) e = LCHab (Color CM.LCH e)++-- | CIE1976 `LCHab` color space+deriving instance Eq e => Eq (Color (LCHab i) e)++-- | CIE1976 `LCHab` color space+deriving instance Ord e => Ord (Color (LCHab i) e)++-- | CIE1976 `LCHab` color space+deriving instance Functor (Color (LCHab i))++-- | CIE1976 `LCHab` color space+deriving instance Applicative (Color (LCHab i))++-- | CIE1976 `LCHab` color space+deriving instance Foldable (Color (LCHab i))++-- | CIE1976 `LCHab` color space+deriving instance Traversable (Color (LCHab i))++-- | CIE1976 `LCHab` color space+deriving instance Storable e => Storable (Color (LCHab i) e)++-- | CIE1976 `LCHab` color space+instance (Illuminant i, Elevator e) => Show (Color (LCHab i) e) where+  showsPrec _ = showsColorModel++-- | Constructor for a CIEL*a*b* color space in a cylindrical L*C*h parameterization+pattern ColorLCHab :: e -> e -> e -> Color (LCHab i) e+pattern ColorLCHab l c h = LCHab (CM.ColorLCH l c h)+{-# COMPLETE ColorLCHab #-}++-- | Constructor for a @LCHab@ with alpha+pattern ColorLCHabA :: e -> e -> e -> e -> Color (Alpha (LCHab i)) e+pattern ColorLCHabA l c h a = Alpha (LCHab (CM.ColorLCH l c h)) a+{-# COMPLETE ColorLCHabA #-}++-- | CIE1976 `LCHab` color space+instance (Illuminant i, Elevator e, ColorModel (LAB i) e) => ColorModel (LCHab i) e where+  type Components (LCHab i) e = (e, e, e)+  toComponents = toComponents . coerce+  {-# INLINE toComponents #-}+  fromComponents = coerce . fromComponents+  {-# INLINE fromComponents #-}+  showsColorModelName _ =+    ("LCH-"++) . showsColorModelName (Proxy :: Proxy (Color (LAB i) e))++instance (Illuminant i, Elevator e, ColorSpace (LAB i) i e) => ColorSpace (LCHab i) i e where+  type BaseModel (LCHab i) = CM.LCH+  type BaseSpace (LCHab i) = LAB i+  toBaseSpace = fmap fromDouble . fromComponents . CM.lch2lxy . fmap toDouble . coerce+  {-# INLINE toBaseSpace #-}+  fromBaseSpace = coerce . fmap fromDouble . CM.lxy2lch . toComponents . fmap toDouble+  {-# INLINE fromBaseSpace #-}+  luminance = luminance . toBaseSpace+  {-# INLINE luminance #-}
+ src/Graphics/Color/Space/CIE1976/LUV.hs view
@@ -0,0 +1,150 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeFamilies #-}+-- |+-- Module      : Graphics.Color.Space.CIE1976.LUV+--+module Graphics.Color.Space.CIE1976.LUV+  ( -- * Constructors for an CIE L*u*v* color space.+    pattern LUV+  , pattern ColorLUV+  , pattern ColorLUVA+  , LUV+  ) where++import Foreign.Storable+import Graphics.Color.Model.Internal+import Graphics.Color.Space.Internal++--------------+--- CIELUV ---+--------------++-- | [CIE L*u*v*](https://en.wikipedia.org/wiki/CIELUV_color_space) color space+data LUV (i :: k)++-- | Color in CIE L*u*v* color space+newtype instance Color (LUV i) e = LUV (V3 e)+++pattern ColorLUV :: e -> e -> e -> Color (LUV i) e+pattern ColorLUV l' u' v' = LUV (V3 l' u' v')+{-# COMPLETE ColorLUV #-}++-- | Constructor for @LUV@ with alpha channel.+pattern ColorLUVA :: e -> e -> e -> e -> Color (Alpha (LUV i)) e+pattern ColorLUVA l' u' v' a = Alpha (LUV (V3 l' u' v')) a+{-# COMPLETE ColorLUVA #-}++-- | CIE1976 `LUV` color space+deriving instance Eq e => Eq (Color (LUV i) e)++-- | CIE1976 `LUV` color space+deriving instance Ord e => Ord (Color (LUV i) e)++-- | CIE1976 `LUV` color space+deriving instance Functor (Color (LUV i))++-- | CIE1976 `LUV` color space+deriving instance Applicative (Color (LUV i))++-- | CIE1976 `LUV` color space+deriving instance Foldable (Color (LUV i))++-- | CIE1976 `LUV` color space+deriving instance Traversable (Color (LUV i))++-- | CIE1976 `LUV` color space+deriving instance Storable e => Storable (Color (LUV i) e)++-- | CIE1976 `LUV` color space+instance (Illuminant i, Elevator e) => Show (Color (LUV i) e) where+  showsPrec _ = showsColorModel++-- | CIE1976 `LUV` color space+instance (Illuminant i, Elevator e) => ColorModel (LUV i) e where+  type Components (LUV i) e = (e, e, e)+  toComponents (ColorLUV l' u' v') = (l', u', v')+  {-# INLINE toComponents #-}+  fromComponents (l', u', v') = ColorLUV l' u' v'+  {-# INLINE fromComponents #-}++instance (Illuminant i, Elevator e, RealFloat e) => ColorSpace (LUV (i :: k)) i e where+  type BaseModel (LUV i) = LUV i+  type BaseSpace (LUV i) = LUV i+  toBaseSpace = id+  {-# INLINE toBaseSpace #-}+  fromBaseSpace = id+  {-# INLINE fromBaseSpace #-}+  luminance (ColorLUV l' _ _) = Y (ift (scaleLightness l'))+  {-# INLINE luminance #-}+  toColorXYZ = luv2xyz+  {-# INLINE toColorXYZ #-}+  fromColorXYZ = xyz2luv+  {-# INLINE fromColorXYZ #-}++luv2xyz ::+     forall i a e. (Illuminant i, Elevator e, Elevator a, RealFloat a)+  => Color (LUV i) e+  -> Color (XYZ i) a+luv2xyz (ColorLUV l' u' v') = ColorXYZ x y z+  where+    !(ColorXYZ wx _ wz) = whitePointTristimulus :: Color (XYZ i) a+    !y = ift . scaleLightness $ l'+    !wxyz = wx + 15 + 3 * wz+    !l1 = 13 * toRealFloat l'+    !a = (1/3) * ((4 * l1 / (toRealFloat u' + l1 * 4 * (wx / wxyz))) - 1) :: a+    !b = -5 * y+    !c = -1 / 3+    !d = y * (3 * l1 / (toRealFloat v' + l1 * 9 * (1 / wxyz)) - 5) :: a+    !x = (d - b) / (a - c)+    !z = x * a + b+{-# INLINE luv2xyz #-}++scaleLightness :: (Elevator e, Elevator a, RealFloat a) => e -> a+scaleLightness l' = (toRealFloat l' + 16) / 116+{-# INLINE scaleLightness #-}++ift :: (Fractional a, Ord a) => a -> a+ift t+  | t > 6 / 29 = t ^ (3 :: Int)+  | otherwise = (108 / 841) * (t - 4 / 29)+++xyz2luv ::+     forall i a e. (Illuminant i, Elevator a, Elevator e, RealFloat e)+  => Color (XYZ i) a+  -> Color (LUV i) e+xyz2luv (ColorXYZ x y z) = ColorLUV l' u' v'+  where+    !l' = 116 * ft (toRealFloat y) - 16+    !(ColorXYZ wx _ wz) = whitePointTristimulus :: Color (XYZ i) e+    !xyz = toRealFloat $ x + 15 * y + 3 * z+    !wxyz = wx + 15 + 3 * wz+    !u' = 13 * l' * 4 * (toRealFloat x / xyz - wx / wxyz)+    !v' = 13 * l' * 9 * (toRealFloat y / xyz - 1 / wxyz)+{-# INLINE xyz2luv #-}++ft :: RealFloat a => a -> a+ft t+  | t > t0 = t ** (1 / 3)+  | otherwise = t * m + 4 / 29+{-# INLINE ft #-}++m :: RealFloat a => a+m = 841 / 108++t0 :: RealFloat a => a+t0 = 216 / 24389+  -- where+  --   m = 1/3 * δ^-2 = 841/108 =~ 7.787[037]+  --   t0 = δ^3 =~ 0.008856+  --   δ = 6/29 =~ 0.2069
+ src/Graphics/Color/Space/CIE1976/LUV/LCH.hs view
@@ -0,0 +1,91 @@+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module: Graphics.Color.Space.CIE1976.LUV.LCH++module Graphics.Color.Space.CIE1976.LUV.LCH+  ( pattern ColorLCHuv+  , pattern ColorLCHuvA+  , LCHuv+  , Color(LCHuv)+  ) where++import Data.Coerce+import Data.Proxy+import Foreign.Storable+import qualified Graphics.Color.Model.LCH as CM+import Graphics.Color.Space.CIE1976.LUV+import Graphics.Color.Model.Internal+import Graphics.Color.Space.Internal++-- | [CIE L*C*Huv](https://en.wikipedia.org/wiki/CIELUV_color_space),+--   an LCH representation for the L*u*v* color space+data LCHuv (i :: k)++-- | Color in CIE L*C*Huv color space+newtype instance Color (LCHuv i) e = LCHuv (Color CM.LCH e)++-- | CIE1976 `LCHuv` color space+deriving instance Eq e => Eq (Color (LCHuv i) e)++-- | CIE1976 `LCHuv` color space+deriving instance Ord e => Ord (Color (LCHuv i) e)++-- | CIE1976 `LCHuv` color space+deriving instance Functor (Color (LCHuv i))++-- | CIE1976 `LCHuv` color space+deriving instance Applicative (Color (LCHuv i))++-- | CIE1976 `LCHuv` color space+deriving instance Foldable (Color (LCHuv i))++-- | CIE1976 `LCHuv` color space+deriving instance Traversable (Color (LCHuv i))++-- | CIE1976 `LCHuv` color space+deriving instance Storable e => Storable (Color (LCHuv i) e)++-- | CIE1976 `LCHuv` color space+instance (Illuminant i, Elevator e) => Show (Color (LCHuv i) e) where+  showsPrec _ = showsColorModel++-- | Constructor for a CIEL*u*v* color space in a cylindrical L*C*h parameterization+pattern ColorLCHuv :: e -> e -> e -> Color (LCHuv i) e+pattern ColorLCHuv l c h = LCHuv (CM.ColorLCH l c h)+{-# COMPLETE ColorLCHuv #-}++-- | Constructor for a @LCHuv@ with alpha+pattern ColorLCHuvA :: e -> e -> e -> e -> Color (Alpha (LCHuv i)) e+pattern ColorLCHuvA l c h a = Alpha (LCHuv (CM.ColorLCH l c h)) a+{-# COMPLETE ColorLCHuvA #-}++-- | CIE1976 `LCHuv` color space+instance (Illuminant i, Elevator e, ColorModel (LUV i) e) => ColorModel (LCHuv i) e where+  type Components (LCHuv i) e = (e, e, e)+  toComponents = toComponents . coerce+  {-# INLINE toComponents #-}+  fromComponents = coerce . fromComponents+  {-# INLINE fromComponents #-}+  showsColorModelName _ =+    ("LCH-"++) . showsColorModelName (Proxy :: Proxy (Color (LUV i) e))++instance (Illuminant i, Elevator e, ColorSpace (LUV i) i e) => ColorSpace (LCHuv i) i e where+  type BaseModel (LCHuv i) = CM.LCH+  type BaseSpace (LCHuv i) = LUV i+  toBaseSpace = fmap fromDouble . fromComponents . CM.lch2lxy . fmap toDouble . coerce+  {-# INLINE toBaseSpace #-}+  fromBaseSpace = coerce . fmap fromDouble . CM.lxy2lch . toComponents . fmap toDouble+  {-# INLINE fromBaseSpace #-}+  luminance = luminance . toBaseSpace+  {-# INLINE luminance #-}
src/Graphics/Color/Space/RGB/ITU/Rec601.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE BangPatterns #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE FlexibleContexts #-}
+ tests/Graphics/Color/Model/LCHSpec.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeApplications #-}+module Graphics.Color.Model.LCHSpec (spec) where++import Graphics.Color.Model+import Graphics.Color.Model.Common++instance (Elevator e, Random e) => Arbitrary (Color LCH e) where+  arbitrary = ColorLCH <$> arbitraryElevator <*> arbitraryElevator <*> arbitraryElevator++spec :: Spec+spec =+  describe "LCH" $ do+    colorModelSpec @LCH @Word "LCH"
+ tests/Graphics/Color/Space/CIE1976/LAB/LCHSpec.hs view
@@ -0,0 +1,29 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+module Graphics.Color.Space.CIE1976.LAB.LCHSpec (spec) where++import Data.Coerce ( coerce )+import Graphics.Color.Model ( lxy2lch, lch2lxy )+import Graphics.Color.Space.Common+import Graphics.Color.Space.CIE1976.LABSpec ()+import Graphics.Color.Space.CIE1976.LAB.LCH++instance (Elevator e, Random e) => Arbitrary (Color (LCHab i) e) where+  arbitrary = ColorLCHab <$> arbitraryElevator <*> arbitraryElevator <*> arbitraryElevator++spec :: Spec+spec =+  describe "LCHab" $ do+    colorModelSpec @(LCHab D65) @Word "LCH"+    colorSpaceSpec @(LCHab D65) @Double+    prop "lab2lch . lch2lab" $ \(lab :: Color (LAB D65) Double) ->+      lab `epsilonEqColor` lch2lab (lab2lch lab)+    prop "lch2lab . lab2lch" $ \(lch :: Color (LCHab D65) Double) ->+      lch `epsilonEqColor` lab2lch (lch2lab lch)++lab2lch :: Illuminant i => Color (LAB i) Double -> Color (LCHab i) Double+lab2lch = coerce . lxy2lch . toComponents++lch2lab :: Illuminant i => Color (LCHab i) Double -> Color (LAB i) Double+lch2lab = fromComponents . lch2lxy . coerce
+ tests/Graphics/Color/Space/CIE1976/LUV/LCHSpec.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+module Graphics.Color.Space.CIE1976.LUV.LCHSpec (spec) where++import Data.Coerce ( coerce )+import Graphics.Color.Model ( lxy2lch, lch2lxy )+import Graphics.Color.Space.Common+import Graphics.Color.Space.CIE1976.LUV+import Graphics.Color.Space.CIE1976.LUVSpec ()+import Graphics.Color.Space.CIE1976.LUV.LCH++instance (Elevator e, Random e) => Arbitrary (Color (LCHuv i) e) where+  arbitrary = ColorLCHuv <$> arbitraryElevator <*> arbitraryElevator <*> arbitraryElevator++spec :: Spec+spec =+  describe "LCHuv" $ do+    colorModelSpec @(LCHuv D65) @Word "LCH"+    colorSpaceSpec @(LCHuv D65) @Double+    prop "luv2lch . lch2luv" $ \(luv :: Color (LUV D65) Double) ->+      luv `epsilonEqColor` lch2luv (luv2lch luv)+    prop "lch2luv . luv2lch" $ \(lch :: Color (LCHuv D65) Double) ->+      lch `epsilonEqColor` luv2lch (lch2luv lch)++luv2lch :: Illuminant i => Color (LUV i) Double -> Color (LCHuv i) Double+luv2lch = coerce . lxy2lch . toComponents++lch2luv :: Illuminant i => Color (LCHuv i) Double -> Color (LUV i) Double+lch2luv = fromComponents . lch2lxy . coerce
+ tests/Graphics/Color/Space/CIE1976/LUVSpec.hs view
@@ -0,0 +1,18 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE TypeApplications #-}+module Graphics.Color.Space.CIE1976.LUVSpec (spec) where++import Graphics.Color.Illuminant.CIE1931 as I2+import Graphics.Color.Space.Common+import Graphics.Color.Space.CIE1976.LUV++instance (Elevator e, Random e, Illuminant i) => Arbitrary (Color (LUV (i :: k)) e) where+  arbitrary = ColorLUV <$> arbitraryElevator <*> arbitraryElevator <*> arbitraryElevator+++spec :: Spec+spec = describe "LUV" $ do+  colorModelSpec @(LUV 'D65) @Word "LUV"+  colorSpaceLenientSpec @(LUV 'D65) @Double 1e-10