hcg-minus-0.16: Data/CG/Minus/Colour/Grey.hs
-- | RGB to greyscale conversion functions.
module Data.CG.Minus.Colour.Grey where
-- | (R,G,B) triple.
type RGB a = (a,a,a)
-- | Grey luminance.
type GREY a = a
-- | Apply binary function at triple, leftmost first.
f2_t3_left :: (t -> t -> t) -> (t,t,t) -> t
f2_t3_left f (p,q,r) = f (f p q) r
-- | Triple variant of 'min'.
min3 :: Ord t => (t,t,t) -> t
min3 = f2_t3_left min
-- | Triple variant of 'max'.
max3 :: Ord t => (t,t,t) -> t
max3 = f2_t3_left max
-- | Desaturation.
rgb_to_gs_lightness :: (Fractional a, Ord a) => RGB a -> GREY a
rgb_to_gs_lightness c = (min3 c + max3 c) / 2
-- | Simple average.
rgb_to_gs_average :: Fractional a => RGB a -> GREY a
rgb_to_gs_average (r,g,b) = (r + g + b) / 3
-- | Luminosity coefficents, ie. (R,G,B) multipliers.
type COEF a = (a,a,a)
rgb_to_gs_luminosity :: Num a => COEF a -> RGB a -> GREY a
rgb_to_gs_luminosity (rm,gm,bm) (r,g,b) = r * rm + g * gm + b * bm
luminosity_coef_rec_709 :: Fractional a => COEF a
luminosity_coef_rec_709 = (0.2126,0.7152,0.0722)
luminosity_coef_rec_601 :: Fractional a => COEF a
luminosity_coef_rec_601 = (0.299,0.587,0.114)
luminosity_coef_smpte_240m :: Fractional a => COEF a
luminosity_coef_smpte_240m = (0.212,0.701,0.087)
rgb_to_gs_decompose_min :: Ord a => RGB a -> GREY a
rgb_to_gs_decompose_min = f2_t3_left min
rgb_to_gs_decompose_max :: Ord a => RGB a -> GREY a
rgb_to_gs_decompose_max = f2_t3_left max
rgb_to_gs_r :: RGB t -> GREY t
rgb_to_gs_r (r,_,_) = r
rgb_to_gs_g :: RGB t -> GREY t
rgb_to_gs_g (_,g,_) = g
rgb_to_gs_b :: RGB t -> GREY t
rgb_to_gs_b (_,_,b) = b
-- | Requires R and G and B components to be equal.
rgb_to_gs_eq :: Eq a => RGB a -> Maybe (GREY a)
rgb_to_gs_eq (r,g,b) = if r == g && r == b then Just r else Nothing
-- | 'error'ing variant.
rgb_to_gs_eq' :: Eq a => RGB a -> GREY a
rgb_to_gs_eq' = maybe (error "rgb_to_gs_eq: not equal") id . rgb_to_gs_eq