{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module Graphics.Color.Space.RGB.Derived.CIERGB
( CIERGB
, castLinearity
) where
import Data.Coerce
import Data.Typeable
import Foreign.Storable
import Graphics.Color.Model.Internal
import qualified Graphics.Color.Model.RGB as CM
import Graphics.Color.Space.Internal
import Graphics.Color.Space.RGB.Internal
import qualified Graphics.Color.Space.CIE1931.RGB as CIERGB
data CIERGB (i :: k) (l :: Linearity)
newtype instance Color (CIERGB i l) e = CIERGB (Color CM.RGB e)
deriving instance Eq e => Eq (Color (CIERGB i l) e)
deriving instance Ord e => Ord (Color (CIERGB i l) e)
deriving instance Functor (Color (CIERGB i l))
deriving instance Applicative (Color (CIERGB i l))
deriving instance Foldable (Color (CIERGB i l))
deriving instance Traversable (Color (CIERGB i l))
deriving instance Storable e => Storable (Color (CIERGB i l) e)
instance (Typeable l, Illuminant i, Elevator e) => Show (Color (CIERGB (i :: k) l) e) where
showsPrec :: Int -> Color (CIERGB i l) e -> ShowS
showsPrec Int
_ = Color (CIERGB i l) e -> ShowS
forall cs e. ColorModel cs e => Color cs e -> ShowS
showsColorModel
instance (Typeable l, Illuminant i, Elevator e) => ColorModel (CIERGB (i :: k) l) e where
type Components (CIERGB i l) e = (e, e, e)
type ChannelCount (CIERGB i l) = 3
channelCount :: Proxy (Color (CIERGB i l) e) -> Word8
channelCount Proxy (Color (CIERGB i l) e)
_ = Word8
3
{-# INLINE channelCount #-}
channelNames :: Proxy (Color (CIERGB i l) e) -> NonEmpty String
channelNames Proxy (Color (CIERGB i l) e)
_ = Proxy (Color RGB e) -> NonEmpty String
forall cs e.
ColorModel cs e =>
Proxy (Color cs e) -> NonEmpty String
channelNames (Proxy (Color RGB e)
forall {k} (t :: k). Proxy t
Proxy :: Proxy (Color CM.RGB e))
channelColors :: Proxy (Color (CIERGB i l) e) -> NonEmpty (V3 Word8)
channelColors Proxy (Color (CIERGB i l) e)
_ = Proxy (Color RGB e) -> NonEmpty (V3 Word8)
forall cs e.
ColorModel cs e =>
Proxy (Color cs e) -> NonEmpty (V3 Word8)
channelColors (Proxy (Color RGB e)
forall {k} (t :: k). Proxy t
Proxy :: Proxy (Color CM.RGB e))
toComponents :: Color (CIERGB i l) e -> Components (CIERGB i l) e
toComponents = Color RGB e -> (e, e, e)
Color RGB e -> Components RGB e
forall cs e. ColorModel cs e => Color cs e -> Components cs e
toComponents (Color RGB e -> (e, e, e))
-> (Color (CIERGB i l) e -> Color RGB e)
-> Color (CIERGB i l) e
-> (e, e, e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Color (CIERGB i l) e -> Color RGB e
forall k (cs :: Linearity -> *) (i :: k) (l :: Linearity) e.
RedGreenBlue cs i =>
Color (cs l) e -> Color RGB e
forall (l :: Linearity) e. Color (CIERGB i l) e -> Color RGB e
unColorRGB
{-# INLINE toComponents #-}
fromComponents :: Components (CIERGB i l) e -> Color (CIERGB i l) e
fromComponents = Color RGB e -> Color (CIERGB i l) e
forall e (l :: Linearity). Color RGB e -> Color (CIERGB i l) e
forall k (cs :: Linearity -> *) (i :: k) e (l :: Linearity).
RedGreenBlue cs i =>
Color RGB e -> Color (cs l) e
mkColorRGB (Color RGB e -> Color (CIERGB i l) e)
-> ((e, e, e) -> Color RGB e) -> (e, e, e) -> Color (CIERGB i l) e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (e, e, e) -> Color RGB e
Components RGB e -> Color RGB e
forall cs e. ColorModel cs e => Components cs e -> Color cs e
fromComponents
{-# INLINE fromComponents #-}
instance (Illuminant i, Typeable l, Elevator e) => ColorSpace (CIERGB i l) i e where
type BaseModel (CIERGB i l) = CM.RGB
toBaseSpace :: ColorSpace (BaseSpace (CIERGB i l)) i e =>
Color (CIERGB i l) e -> Color (BaseSpace (CIERGB i l)) e
toBaseSpace = Color (CIERGB i l) e -> Color (BaseSpace (CIERGB i l)) e
Color (CIERGB i l) e -> Color (CIERGB i l) e
forall a. a -> a
id
{-# INLINE toBaseSpace #-}
fromBaseSpace :: ColorSpace (BaseSpace (CIERGB i l)) i e =>
Color (BaseSpace (CIERGB i l)) e -> Color (CIERGB i l) e
fromBaseSpace = Color (BaseSpace (CIERGB i l)) e -> Color (CIERGB i l) e
Color (CIERGB i l) e -> Color (CIERGB i l) e
forall a. a -> a
id
{-# INLINE fromBaseSpace #-}
luminance :: forall a.
(Elevator a, RealFloat a) =>
Color (CIERGB i l) e -> Color (Y i) a
luminance = Color (CIERGB i 'Linear) a -> Color (Y i) a
forall {k} (cs :: Linearity -> *) (i :: k) e.
(RedGreenBlue cs i, ColorSpace (cs 'Linear) i e, RealFloat e) =>
Color (cs 'Linear) e -> Color (Y i) e
rgbLinearLuminance (Color (CIERGB i 'Linear) a -> Color (Y i) a)
-> (Color (CIERGB i l) e -> Color (CIERGB i 'Linear) a)
-> Color (CIERGB i l) e
-> Color (Y i) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Color (CIERGB i l) a -> Color (CIERGB i 'Linear) a
forall {k} (i :: k) (l' :: Linearity) e (l :: Linearity).
Color (CIERGB i l') e -> Color (CIERGB i l) e
castLinearity (Color (CIERGB i l) a -> Color (CIERGB i 'Linear) a)
-> (Color (CIERGB i l) e -> Color (CIERGB i l) a)
-> Color (CIERGB i l) e
-> Color (CIERGB i 'Linear) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (e -> a) -> Color (CIERGB i l) e -> Color (CIERGB i l) a
forall a b.
(a -> b) -> Color (CIERGB i l) a -> Color (CIERGB i l) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap e -> a
forall a. (Elevator a, RealFloat a) => e -> a
forall e a. (Elevator e, Elevator a, RealFloat a) => e -> a
toRealFloat
{-# INLINE luminance #-}
grayscale :: Color (CIERGB i l) e -> Color X e
grayscale = Color (Y i) e -> Color X e
Color (Y i) e -> Color (BaseModel (Y i)) e
forall k cs (i :: k) e.
ColorSpace cs i e =>
Color cs e -> Color (BaseModel cs) e
toBaseModel (Color (Y i) e -> Color X e)
-> (Color (CIERGB i l) e -> Color (Y i) e)
-> Color (CIERGB i l) e
-> Color X e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Double -> e) -> Color (Y i) Double -> Color (Y i) e
forall a b. (a -> b) -> Color (Y i) a -> Color (Y i) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Double -> e
forall e. Elevator e => Double -> e
fromDouble (Color (Y i) Double -> Color (Y i) e)
-> (Color (CIERGB i l) e -> Color (Y i) Double)
-> Color (CIERGB i l) e
-> Color (Y i) e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Color (CIERGB i l) e -> Color (Y i) Double
forall a.
(Elevator a, RealFloat a) =>
Color (CIERGB i l) e -> Color (Y i) a
forall k cs (i :: k) e a.
(ColorSpace cs i e, Elevator a, RealFloat a) =>
Color cs e -> Color (Y i) a
luminance
{-# INLINE grayscale #-}
applyGrayscale :: Color (CIERGB i l) e
-> (Color X e -> Color X e) -> Color (CIERGB i l) e
applyGrayscale Color (CIERGB i l) e
c Color X e -> Color X e
f = Color (CIERGB i 'Linear) e -> Color (CIERGB i l) e
forall {k} (i :: k) (l' :: Linearity) e (l :: Linearity).
Color (CIERGB i l') e -> Color (CIERGB i l) e
castLinearity (Color (CIERGB i 'Linear) e
-> (Color X e -> Color X e) -> Color (CIERGB i 'Linear) e
forall {k} (cs :: Linearity -> *) (i :: k) e.
ColorSpace (cs 'Linear) i e =>
Color (cs 'Linear) e
-> (Color X e -> Color X e) -> Color (cs 'Linear) e
rgbLinearApplyGrayscale (Color (CIERGB i l) e -> Color (CIERGB i 'Linear) e
forall {k} (i :: k) (l' :: Linearity) e (l :: Linearity).
Color (CIERGB i l') e -> Color (CIERGB i l) e
castLinearity Color (CIERGB i l) e
c) Color X e -> Color X e
f)
{-# INLINE applyGrayscale #-}
toColorXYZ :: forall a.
(Elevator a, RealFloat a) =>
Color (CIERGB i l) e -> Color (XYZ i) a
toColorXYZ = Color (CIERGB i 'Linear) a -> Color (XYZ i) a
forall {k} (cs :: Linearity -> *) (i :: k) e.
(RedGreenBlue cs i, ColorSpace (cs 'NonLinear) i e,
ColorSpace (cs 'Linear) i e, RealFloat e) =>
Color (cs 'Linear) e -> Color (XYZ i) e
rgbLinear2xyz (Color (CIERGB i 'Linear) a -> Color (XYZ i) a)
-> (Color (CIERGB i l) e -> Color (CIERGB i 'Linear) a)
-> Color (CIERGB i l) e
-> Color (XYZ i) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (e -> a)
-> Color (CIERGB i 'Linear) e -> Color (CIERGB i 'Linear) a
forall a b.
(a -> b)
-> Color (CIERGB i 'Linear) a -> Color (CIERGB i 'Linear) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap e -> a
forall a. (Elevator a, RealFloat a) => e -> a
forall e a. (Elevator e, Elevator a, RealFloat a) => e -> a
toRealFloat (Color (CIERGB i 'Linear) e -> Color (CIERGB i 'Linear) a)
-> (Color (CIERGB i l) e -> Color (CIERGB i 'Linear) e)
-> Color (CIERGB i l) e
-> Color (CIERGB i 'Linear) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Color (CIERGB i l) e -> Color (CIERGB i 'Linear) e
forall {k} (i :: k) (l' :: Linearity) e (l :: Linearity).
Color (CIERGB i l') e -> Color (CIERGB i l) e
castLinearity
{-# INLINE toColorXYZ #-}
fromColorXYZ :: forall a.
(Elevator a, RealFloat a) =>
Color (XYZ i) a -> Color (CIERGB i l) e
fromColorXYZ Color (XYZ i) a
xyz = Color (CIERGB i 'Linear) e -> Color (CIERGB i l) e
forall {k} (i :: k) (l' :: Linearity) e (l :: Linearity).
Color (CIERGB i l') e -> Color (CIERGB i l) e
castLinearity (a -> e
forall a. (Elevator a, RealFloat a) => a -> e
forall e a. (Elevator e, Elevator a, RealFloat a) => a -> e
fromRealFloat (a -> e)
-> Color (CIERGB i 'Linear) a -> Color (CIERGB i 'Linear) e
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall {k} (cs :: Linearity -> *) (i :: k) e.
(RedGreenBlue cs i, ColorSpace (cs 'NonLinear) i e,
ColorSpace (cs 'Linear) i e, RealFloat e) =>
Color (XYZ i) e -> Color (cs 'Linear) e
forall (cs :: Linearity -> *) (i :: k) e.
(RedGreenBlue cs i, ColorSpace (cs 'NonLinear) i e,
ColorSpace (cs 'Linear) i e, RealFloat e) =>
Color (XYZ i) e -> Color (cs 'Linear) e
xyz2rgbLinear @(CIERGB i) Color (XYZ i) a
xyz)
{-# INLINE fromColorXYZ #-}
instance Illuminant i => RedGreenBlue (CIERGB i) i where
gamut :: forall e. RealFloat e => Gamut (CIERGB i) i e
gamut = Gamut CIERGB 'E e -> Gamut (CIERGB i) i e
forall {k1} {k2} (cs' :: Linearity -> *) (i' :: k1) e
(cs :: Linearity -> *) (i :: k2).
Gamut cs' i' e -> Gamut cs i e
coerceGamut (forall k (cs :: Linearity -> *) (i :: k) e.
(RedGreenBlue cs i, RealFloat e) =>
Gamut cs i e
gamut @_ @CIERGB.CIERGB)
transfer :: forall e. RealFloat e => e -> e
transfer = e -> e
forall a. a -> a
id
{-# INLINE transfer #-}
itransfer :: forall e. RealFloat e => e -> e
itransfer = e -> e
forall a. a -> a
id
{-# INLINE itransfer #-}
castLinearity :: Color (CIERGB i l') e -> Color (CIERGB i l) e
castLinearity :: forall {k} (i :: k) (l' :: Linearity) e (l :: Linearity).
Color (CIERGB i l') e -> Color (CIERGB i l) e
castLinearity = Color (CIERGB i l') e -> Color (CIERGB i l) e
forall a b. Coercible a b => a -> b
coerce