-- #hide
--------------------------------------------------------------------------------
-- |
-- Module      :  Graphics.Rendering.OpenGL.GL.PixelFormat
-- Copyright   :  (c) Sven Panne 2002-2009
-- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--
-- Maintainer  :  [email protected]
-- Stability   :  stable
-- Portability :  portable
--
-- This is a purely internal module for (un-)marshaling PixelFormat.
--
--------------------------------------------------------------------------------

module Graphics.Rendering.OpenGL.GL.PixelFormat (
   PixelFormat(..), marshalPixelFormat, unmarshalPixelFormat
) where

import Graphics.Rendering.OpenGL.Raw.ARB.Compatibility (
   gl_COLOR_INDEX, gl_LUMINANCE, gl_LUMINANCE_ALPHA, gl_ALPHA_INTEGER )
import Graphics.Rendering.OpenGL.Raw.Core31
import Graphics.Rendering.OpenGL.Raw.EXT.Abgr ( gl_ABGR )
import Graphics.Rendering.OpenGL.Raw.EXT.Cmyka ( gl_CMYK, gl_CMYKA )
import Graphics.Rendering.OpenGL.Raw.EXT.FourTwoTwoPixels (
   gl_422, gl_422_AVERAGE, gl_422_REV, gl_422_REV_AVERAGE )

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

data PixelFormat =
     ColorIndex
   | StencilIndex
   | DepthComponent
   | DepthStencil
   | Red
   | Green
   | Blue
   | Alpha
   | RG
   | RGB
   | RGBA
   | Luminance
   | LuminanceAlpha
   | RedInteger
   | GreenInteger
   | BlueInteger
   | AlphaInteger
   | RGInteger
   | RGBInteger
   | RGBAInteger
   | BGRInteger
   | BGRAInteger
   | ABGR
   | BGR
   | BGRA
   | CMYK
   | CMYKA
   | FourTwoTwo
   | FourTwoTwoRev
   | FourTwoTwoAverage
   | FourTwoTwoRevAverage
   | YCBCR422
   deriving ( Eq, Ord, Show )

marshalPixelFormat :: PixelFormat -> GLenum
marshalPixelFormat x = case x of
   ColorIndex -> gl_COLOR_INDEX
   StencilIndex -> gl_STENCIL_INDEX
   DepthComponent -> gl_DEPTH_COMPONENT
   Red -> gl_RED
   Green -> gl_GREEN
   Blue -> gl_BLUE
   Alpha -> gl_ALPHA
   RG -> gl_RG
   RGB -> gl_RGB
   RGBA -> gl_RGBA
   Luminance -> gl_LUMINANCE
   LuminanceAlpha -> gl_LUMINANCE_ALPHA
   RedInteger -> gl_RED_INTEGER
   GreenInteger -> gl_GREEN_INTEGER
   BlueInteger -> gl_BLUE_INTEGER
   AlphaInteger -> gl_ALPHA_INTEGER
   RGInteger -> gl_RG_INTEGER
   RGBInteger -> gl_RGB_INTEGER
   RGBAInteger -> gl_RGBA_INTEGER
   BGRInteger -> gl_BGR_INTEGER
   BGRAInteger -> gl_BGRA_INTEGER
   ABGR -> gl_ABGR
   BGR -> gl_BGR
   BGRA -> gl_BGRA
   CMYK -> gl_CMYK
   CMYKA -> gl_CMYKA
   FourTwoTwo -> gl_422
   FourTwoTwoRev -> gl_422_REV
   FourTwoTwoAverage -> gl_422_AVERAGE
   FourTwoTwoRevAverage -> gl_422_REV_AVERAGE
   -- TODO: Use YCBCR_422_APPLE from APPLE_ycbcr_422 extension
   YCBCR422 -> 0x85B9
   DepthStencil -> gl_DEPTH_STENCIL

unmarshalPixelFormat :: GLenum -> PixelFormat
unmarshalPixelFormat x
   | x == gl_COLOR_INDEX = ColorIndex
   | x == gl_STENCIL_INDEX = StencilIndex
   | x == gl_DEPTH_COMPONENT = DepthComponent
   | x == gl_RED = Red
   | x == gl_GREEN = Green
   | x == gl_BLUE = Blue
   | x == gl_ALPHA = Alpha
   | x == gl_RG = RG
   | x == gl_RGB = RGB
   | x == gl_RGBA = RGBA
   | x == gl_LUMINANCE = Luminance
   | x == gl_LUMINANCE_ALPHA = LuminanceAlpha
   | x == gl_RED_INTEGER = RedInteger
   | x == gl_GREEN_INTEGER = GreenInteger
   | x == gl_BLUE_INTEGER = BlueInteger
   | x == gl_ALPHA_INTEGER = AlphaInteger
   | x == gl_RG_INTEGER = RGInteger
   | x == gl_RGB_INTEGER = RGBInteger
   | x == gl_RGBA_INTEGER = RGBAInteger
   | x == gl_BGR_INTEGER = BGRInteger
   | x == gl_BGRA_INTEGER = BGRAInteger
   | x == gl_ABGR = ABGR
   | x == gl_BGR = BGR
   | x == gl_BGRA = BGRA
   | x == gl_CMYK = CMYK
   | x == gl_CMYKA = CMYKA
   | x == gl_422 = FourTwoTwo
   | x == gl_422_REV = FourTwoTwoRev
   | x == gl_422_AVERAGE = FourTwoTwoAverage
   | x == gl_422_REV_AVERAGE = FourTwoTwoRevAverage
   -- TODO: Use YCBCR_422_APPLE from APPLE_ycbcr_422 extension
   | x == 0x85B9 = YCBCR422
   | x == gl_DEPTH_STENCIL = DepthStencil
   | otherwise = error ("unmarshalPixelFormat: illegal value " ++ show x)