module Graphics.Dynamic.Plot.Colour ( module Graphics.Dynamic.Plot.Colour
, Colour, AColour, FColour, ColourScheme
) where
import qualified Data.Colour as DCol
import Data.Colour (opaque)
import qualified Data.Colour.Names as N
import Data.Colour.CIE hiding (Colour)
import qualified Data.Colour.CIE.Illuminant as Illum
import Graphics.Dynamic.Plot.Internal.Types
neutral, contrast, grey
, magenta, red, orange, yellow, green, cyan, blue, violet :: Colour
neutral = BaseColour Neutral
contrast= Contrast Neutral
grey = paler contrast
magenta = Contrast Green
red = BaseColour Red
orange = Contrast Blue
yellow = BaseColour Yellow
green = BaseColour Green
cyan = Contrast Red
blue = BaseColour Blue
violet = Contrast Yellow
paler, opposite :: Colour -> Colour
paler = Paler
opposite (BaseColour c) = Contrast c
opposite (Contrast c) = BaseColour c
opposite (Paler c) = Paler $ opposite c
opposite (CustomColour c) = CustomColour $ hueInvert c
defaultColourScheme :: ColourScheme
defaultColourScheme (BaseColour Neutral) = opaque N.black
defaultColourScheme (BaseColour Red ) = opaque N.red
defaultColourScheme (BaseColour Yellow ) = opaque N.yellow
defaultColourScheme (BaseColour Green ) = opaque N.green
defaultColourScheme (BaseColour Blue ) = opaque N.blue
defaultColourScheme (Contrast Neutral) = opaque N.white
defaultColourScheme (Contrast Red ) = opaque N.cyan
defaultColourScheme (Contrast Yellow ) = opaque N.violet
defaultColourScheme (Contrast Green ) = opaque N.magenta
defaultColourScheme (Contrast Blue ) = opaque N.orange
defaultColourScheme (Paler c) = DCol.dissolve 0.5 $ defaultColourScheme c
defaultColourScheme (CustomColour c) = opaque c
defaultColourSeq :: [Colour]
defaultColourSeq = cycle [blue, red, green, orange, cyan, magenta, yellow, violet]
hueInvert :: FColour -> FColour
hueInvert c = let (l,a,b) = cieLABView i c
in cieLAB i l (1a) (1b)
where i = Illum.a