-- #hide
--------------------------------------------------------------------------------
-- |
-- Module      :  Graphics.Rendering.OpenGL.GL.BlendingFactor
-- Copyright   :  (c) Sven Panne 2002-2006
-- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
-- 
-- Maintainer  :  sven.panne@aedion.de
-- Stability   :  stable
-- Portability :  portable
--
-- This is a purely internal module for (un-)marshaling BlendingFactor.
--
--------------------------------------------------------------------------------

module Graphics.Rendering.OpenGL.GL.BlendingFactor (
   BlendingFactor(..), marshalBlendingFactor, unmarshalBlendingFactor
) where

import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum )

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

data BlendingFactor =
     Zero
   | One
   | SrcColor
   | OneMinusSrcColor
   | DstColor
   | OneMinusDstColor
   | SrcAlpha
   | OneMinusSrcAlpha
   | DstAlpha
   | OneMinusDstAlpha
   | ConstantColor
   | OneMinusConstantColor
   | ConstantAlpha
   | OneMinusConstantAlpha
   | SrcAlphaSaturate
   deriving ( Eq, Ord, Show )

marshalBlendingFactor :: BlendingFactor -> GLenum
marshalBlendingFactor x = case x of
   Zero -> 0x0
   One -> 0x1
   SrcColor -> 0x300
   OneMinusSrcColor -> 0x301
   DstColor -> 0x306
   OneMinusDstColor -> 0x307
   SrcAlpha -> 0x302
   OneMinusSrcAlpha -> 0x303
   DstAlpha -> 0x304
   OneMinusDstAlpha -> 0x305
   ConstantColor -> 0x8001
   OneMinusConstantColor -> 0x8002
   ConstantAlpha -> 0x8003
   OneMinusConstantAlpha -> 0x8004
   SrcAlphaSaturate -> 0x308

unmarshalBlendingFactor :: GLenum -> BlendingFactor
unmarshalBlendingFactor x
   | x == 0x0 = Zero
   | x == 0x1 = One
   | x == 0x300 = SrcColor
   | x == 0x301 = OneMinusSrcColor
   | x == 0x306 = DstColor
   | x == 0x307 = OneMinusDstColor
   | x == 0x302 = SrcAlpha
   | x == 0x303 = OneMinusSrcAlpha
   | x == 0x304 = DstAlpha
   | x == 0x305 = OneMinusDstAlpha
   | x == 0x8001 = ConstantColor
   | x == 0x8002 = OneMinusConstantColor
   | x == 0x8003 = ConstantAlpha
   | x == 0x8004 = OneMinusConstantAlpha
   | x == 0x308 = SrcAlphaSaturate
   | otherwise = error ("unmarshalBlendingFactor: illegal value " ++ show x)