module Clr where
type CFlt = Double
data Color = Color {r,g,b :: !CFlt} deriving Show
c_black = Color 0 0 0
c_white = Color 1 1 1
c_red = Color 1 0 0
c_green = Color 0 1 0
c_blue = Color 0 0 1
cadd :: Color -> Color -> Color
cadd (Color r1 g1 b1) (Color r2 g2 b2) =
Color (r1+r2) (g1+g2) (b1+b2)
cdiv :: Color -> CFlt -> Color
cdiv c1 div =
cscale c1 (1/div)
cscale :: Color -> CFlt -> Color
cscale (Color r g b) mul =
Color (r * mul)
(g * mul)
(b * mul)
cmul :: Color -> Color -> Color
cmul (Color r1 g1 b1) (Color r2 g2 b2) =
Color (r1*r2) (g1*g2) (b1*b2)
cavg :: Color -> Color -> Color
cavg c1 c2 = cscale (cadd c1 c2) 0.5
cscaleadd :: Color -> Color -> CFlt -> Color
cscaleadd (Color r1 g1 b1) (Color r2 g2 b2) mul =
Color (r1+(r2*mul)) (g1+(g2*mul)) (b1+(b2*mul))
cclamp :: Color -> Color
cclamp (Color r g b) =
Color (if r > 0.0 then r else 0.0)
(if g > 0.0 then g else 0.0)
(if b > 0.0 then b else 0.0)