module Graphics.Caramia.Color
(
Color()
, v4
, rgba
, floatToWord8
, word8ToFloat
, rgbaL
, redL
, greenL
, blueL
, alphaL
, viewRgba
, viewRed
, viewGreen
, viewBlue
, viewAlpha )
where
import Control.Lens
import Data.Data
import GHC.Generics
import Graphics.Caramia.Prelude
import Foreign.Storable
import Linear.V4
newtype Color = Color { toV4 :: (V4 Float) }
deriving ( Eq, Ord, Show, Read, Typeable, Storable
, Data, Generic )
v4 :: Lens' Color (V4 Float)
v4 = lens toV4 (\_ new -> Color new)
viewRed :: Color -> Float
viewRed (Color (V4 r _ _ _)) = r
viewGreen :: Color -> Float
viewGreen (Color (V4 _ g _ _)) = g
viewBlue :: Color -> Float
viewBlue (Color (V4 _ _ b _)) = b
viewAlpha :: Color -> Float
viewAlpha (Color (V4 _ _ _ a)) = a
floatToWord8 :: Float -> Word8
floatToWord8 f = round $ max 0 $ min 255 $ f * 255.0
word8ToFloat :: Word8 -> Float
word8ToFloat w = fromIntegral w / 255.0
rgba :: Float -> Float -> Float -> Float -> Color
rgba r g b a = Color $ V4 r g b a
viewRgba :: Color -> (Float, Float, Float, Float)
viewRgba (Color (V4 r g b a)) = (r, g, b, a)
rgbaL :: Lens' Color (Float, Float, Float, Float)
rgbaL = lens viewRgba (\_ (r, g, b, a) -> Color $ V4 r g b a)
redL :: Lens' Color Float
redL = v4._x
greenL :: Lens' Color Float
greenL = v4._y
blueL :: Lens' Color Float
blueL = v4._z
alphaL :: Lens' Color Float
alphaL = v4._w