module GEGL.Color
  ( FFI.GeglColor
  , Color(..)
  , gegl_color_new
  , gegl_color_set_rgba
  ) where

import Foreign.C.Types (CInt, CDouble(..))
import Foreign.C.String (withCString)
import Foreign.Ptr (Ptr)

import qualified GEGL.FFI.Color as FFI

-- ANOTHER HACKY POINTER!!
-- type GeglColorDummy = CInt
-- newtype GeglColor = GeglColor (Ptr GeglColorDummy)

data Color = RGB Double Double Double
  | RGBA Double Double Double Double

instance Show Color where
  show (RGB r g b)    = "rgb(" ++ show r ++ "," ++ show g ++ "," ++ show b ++ ")"
  show (RGBA r g b a) = "rgba(" ++ show r ++ "," ++ show g ++ "," ++ show b ++ "," ++ show a ++ ")"

-- | Create a new 'GeglColor'
gegl_color_new :: Color -> IO FFI.GeglColor
gegl_color_new (RGB r g b) = FFI.GeglColor <$> withCString
  (show $ RGB r g b) FFI.c_gegl_color_new
gegl_color_new (RGBA r g b a) = FFI.GeglColor <$> withCString
  (show $ RGBA r g b a) FFI.c_gegl_color_new
-- gegl_color_new _ = error "Colors other than RGB are not yet implemented"

-- | Set the color of a 'GeglColor'
gegl_color_set_rgba :: FFI.GeglColor -> Color -> IO ()
gegl_color_set_rgba (FFI.GeglColor col) (RGBA r g b a) =
  FFI.c_gegl_color_set_rgba col (CDouble r) (CDouble g) (CDouble b) (CDouble a)