packages feed

bludigon-0.1.0.0: src/Bludigon/RGB.hs

module Bludigon.RGB (
  Chromaticity
, Trichromaticity (..)
) where

import Control.DeepSeq
import Data.Default
import Data.Word
import GHC.Generics

-- | 8-bit value for color channel intensity
newtype Chromaticity = Chromaticity Word8
  deriving (Bounded, Enum, Eq, Generic, Integral, Num, Ord, Read, Real, Show)

instance NFData Chromaticity

instance Default Chromaticity where
  def = maxBound

-- | combination of 'Chromaticity's for the colors 'red', 'green' and 'blue'
data Trichromaticity = Trichromaticity { red :: Chromaticity
                                       , green :: Chromaticity
                                       , blue :: Chromaticity
                                       }
  deriving (Bounded, Eq, Generic, Ord, Read, Show)

instance NFData Trichromaticity

instance Enum Trichromaticity where
  fromEnum tc = sum [ fromEnum (red tc)
                    , fromEnum (green tc) * range
                    , fromEnum (blue tc) * range * range
                    ]
    where range = succ . fromEnum $ maxBound @Chromaticity
  toEnum i = let (b , i') = i `divMod` (range * range)
                 (g , r) = i' `divMod` range
              in Trichromaticity { red = toEnum r
                                 , green = toEnum g
                                 , blue = toEnum b
                                 }
    where range = succ . fromEnum $ maxBound @Chromaticity

instance Default Trichromaticity where
  def = Trichromaticity { red = def
                        , green = def
                        , blue = def
                        }