packages feed

wright-0.1.0.2: src/Data/Wright/Colour.hs

module Data.Wright.Colour where

import Data.Wright.Types
import qualified Numeric.Matrix as M (map)
import Data.Wright.RGB.Matrix (m')
import Data.Vector (fromVector)
import Data.Matrix (toMatrix, fromMatrix)
import Data.Wright.RGB.Compand (compand)

class Colour m where
  toXYZ :: Model -> m ℝ -> XYZ ℝ
  toLAB :: Model -> m ℝ -> LAB ℝ
  toLAB m = toLAB m . toXYZ m
  toRGB :: Model -> m ℝ -> RGB ℝ
  toRGB m = toRGB m . toXYZ m
  toYxy :: Model -> m ℝ -> Yxy ℝ
  toYxy m = toYxy m . toXYZ m

instance Colour XYZ where
  toXYZ _ = id
  toRGB model@(Model γ _ _ _ _) xyz = fromMatrix
                                    $ compand γ `M.map` (m' model * toMatrix xyz)
  toLAB (Model _ (XYZ xw yw zw) _ _ _) (XYZ x y z) = fromVector $
    ( 116 * yf - 16
    , 500 * (xf - yf)
    , 200 * (yf - zf)
    )
    where [xf, yf, zf] = map f [x/xw,y/yw,z/zw]
          f t | t > (6/29)**3 = t**(1/3)
              | otherwise     = (t/3)*((29/6)**2) + 4/29
  toYxy _ (XYZ x y z) = fromVector $
    ( y
    , x/d
    , y/d
    ) where d = x+y+z