{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RecordWildCards #-}

-- |
-- Module      : WGPU.Internal.Color
-- Description : Color.
module WGPU.Internal.Color
  ( -- * Types
    Color (..),

    -- * Functions
    transparentBlack,
  )
where

import Foreign.C (CDouble (CDouble))
import WGPU.Internal.Memory (ToRaw, raw)
import WGPU.Raw.Generated.Struct.WGPUColor (WGPUColor)
import qualified WGPU.Raw.Generated.Struct.WGPUColor as WGPUColor

-------------------------------------------------------------------------------

-- | RGBA double-precision color.
data Color = Color
  { Color -> Double
red :: {-# UNPACK #-} !Double,
    Color -> Double
green :: {-# UNPACK #-} !Double,
    Color -> Double
blue :: {-# UNPACK #-} !Double,
    Color -> Double
alpha :: {-# UNPACK #-} !Double
  }
  deriving (Color -> Color -> Bool
(Color -> Color -> Bool) -> (Color -> Color -> Bool) -> Eq Color
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Color -> Color -> Bool
$c/= :: Color -> Color -> Bool
== :: Color -> Color -> Bool
$c== :: Color -> Color -> Bool
Eq, Int -> Color -> ShowS
[Color] -> ShowS
Color -> String
(Int -> Color -> ShowS)
-> (Color -> String) -> ([Color] -> ShowS) -> Show Color
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Color] -> ShowS
$cshowList :: [Color] -> ShowS
show :: Color -> String
$cshow :: Color -> String
showsPrec :: Int -> Color -> ShowS
$cshowsPrec :: Int -> Color -> ShowS
Show)

transparentBlack :: Color
transparentBlack :: Color
transparentBlack = Double -> Double -> Double -> Double -> Color
Color Double
0 Double
0 Double
0 Double
0

instance ToRaw Color WGPUColor where
  raw :: Color -> ContT r IO WGPUColor
raw Color {Double
alpha :: Double
blue :: Double
green :: Double
red :: Double
alpha :: Color -> Double
blue :: Color -> Double
green :: Color -> Double
red :: Color -> Double
..} =
    WGPUColor -> ContT r IO WGPUColor
forall (f :: * -> *) a. Applicative f => a -> f a
pure (WGPUColor -> ContT r IO WGPUColor)
-> WGPUColor -> ContT r IO WGPUColor
forall a b. (a -> b) -> a -> b
$
      CDouble -> CDouble -> CDouble -> CDouble -> WGPUColor
WGPUColor.WGPUColor
        (Double -> CDouble
CDouble Double
red)
        (Double -> CDouble
CDouble Double
green)
        (Double -> CDouble
CDouble Double
blue)
        (Double -> CDouble
CDouble Double
alpha)