module Graphics.Rendering.Ombra.Blend.Draw (
        MonadBlend(..),
        equation,
        function
) where

import Graphics.Rendering.Ombra.Blend.Types
import Graphics.Rendering.Ombra.Internal.GL

class (GLES, MonadGL m) => MonadBlend m where
        withBlendMode :: Maybe Mode -> m a -> m a

equation :: GLES => Mode -> (GLEnum, GLEnum)
equation m = (mode $ rgbOperator m, mode $ alphaOperator m)
        where mode Add = gl_FUNC_ADD
              mode Subtract = gl_FUNC_SUBTRACT
              mode ReverseSubtract = gl_FUNC_REVERSE_SUBTRACT
              -- mode Min = gl_MIN
              -- mode Max = gl_MAX

function :: GLES => Mode -> (GLEnum, GLEnum, GLEnum, GLEnum)
function m = (rgbs, rgbd, alphas, alphad)
        where (rgbs, rgbd) = case rgbParameters m of
                                  Just (p, p') -> (param p, param p')
                                  Nothing -> (gl_ZERO, gl_ZERO)
              (alphas, alphad) = case alphaParameters m of
                                      Just (p, p') -> (param p, param p')
                                      Nothing -> (gl_ZERO, gl_ZERO)
              param Zero = gl_ZERO
              param One = gl_ONE
              param SourceColor = gl_SRC_COLOR
              param DestinationColor = gl_DST_COLOR
              param ConstantColor = gl_CONSTANT_COLOR
              param SourceAlpha = gl_SRC_ALPHA
              param DestinationAlpha = gl_DST_ALPHA
              param ConstantAlpha = gl_CONSTANT_ALPHA
              param (OneMinus Zero) = gl_ONE
              param (OneMinus One) = gl_ZERO
              param (OneMinus SourceColor) = gl_ONE_MINUS_SRC_COLOR
              param (OneMinus DestinationColor) = gl_ONE_MINUS_DST_COLOR
              param (OneMinus ConstantColor) = gl_ONE_MINUS_CONSTANT_COLOR
              param (OneMinus SourceAlpha) = gl_ONE_MINUS_SRC_ALPHA
              param (OneMinus DestinationAlpha) = gl_ONE_MINUS_DST_ALPHA
              param (OneMinus ConstantAlpha) = gl_ONE_MINUS_CONSTANT_ALPHA
              param (OneMinus (OneMinus x)) = param x