{-# OPTIONS_HADDOCK hide #-}
--------------------------------------------------------------------------------
-- |
-- Module      :  Graphics.Rendering.OpenGL.GL.DataType
-- Copyright   :  (c) Sven Panne 2002-2016
-- License     :  BSD3
--
-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
-- Stability   :  stable
-- Portability :  portable
--
-- This is a purely internal module for (un-)marshaling DataType.
--
--------------------------------------------------------------------------------

module Graphics.Rendering.OpenGL.GL.DataType (
   DataType(..), marshalDataType, unmarshalDataType,
   DataTypeType(..), marshalDataTypeType, unmarshalDataTypeType
) where

import Graphics.GL

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

-- basically table 8.7 (pixel data type parameter) plus a few additions
data DataType =
     UnsignedByte
   | Byte
   | UnsignedShort
   | Short
   | UnsignedInt
   | Int
   | HalfFloat
   | Float
   | UnsignedByte332
   | UnsignedByte233Rev
   | UnsignedShort565
   | UnsignedShort565Rev
   | UnsignedShort4444
   | UnsignedShort4444Rev
   | UnsignedShort5551
   | UnsignedShort1555Rev
   | UnsignedInt8888
   | UnsignedInt8888Rev
   | UnsignedInt1010102
   | UnsignedInt2101010Rev
   | UnsignedInt248
   | UnsignedInt10f11f11fRev
   | UnsignedInt5999Rev
   | Float32UnsignedInt248Rev
   | Bitmap                    -- pixel data, deprecated in 3.1
   | UnsignedShort88           -- MESA_ycbcr_texture/APPLE_ycbcr_422
   | UnsignedShort88Rev        -- MESA_ycbcr_texture/APPLE_ycbcr_422
   | Double                    -- vertex arrays (EXT_vertex_array, now core)
   | TwoBytes                  -- CallLists
   | ThreeBytes                -- CallLists
   | FourBytes                 -- CallLists
   deriving ( Eq, Ord, Show )

marshalDataType :: DataType -> GLenum
marshalDataType x = case x of
   UnsignedByte -> GL_UNSIGNED_BYTE
   Byte -> GL_BYTE
   UnsignedShort -> GL_UNSIGNED_SHORT
   Short -> GL_SHORT
   UnsignedInt -> GL_UNSIGNED_INT
   Int -> GL_INT
   HalfFloat -> GL_HALF_FLOAT
   Float -> GL_FLOAT
   UnsignedByte332 -> GL_UNSIGNED_BYTE_3_3_2
   UnsignedByte233Rev -> GL_UNSIGNED_BYTE_2_3_3_REV
   UnsignedShort565 -> GL_UNSIGNED_SHORT_5_6_5
   UnsignedShort565Rev -> GL_UNSIGNED_SHORT_5_6_5_REV
   UnsignedShort4444 -> GL_UNSIGNED_SHORT_4_4_4_4
   UnsignedShort4444Rev -> GL_UNSIGNED_SHORT_4_4_4_4_REV
   UnsignedShort5551 -> GL_UNSIGNED_SHORT_5_5_5_1
   UnsignedShort1555Rev -> GL_UNSIGNED_SHORT_1_5_5_5_REV
   UnsignedInt8888 -> GL_UNSIGNED_INT_8_8_8_8
   UnsignedInt8888Rev -> GL_UNSIGNED_INT_8_8_8_8_REV
   UnsignedInt1010102 -> GL_UNSIGNED_INT_10_10_10_2
   UnsignedInt2101010Rev -> GL_UNSIGNED_INT_2_10_10_10_REV
   UnsignedInt248 -> GL_UNSIGNED_INT_24_8
   UnsignedInt10f11f11fRev -> GL_UNSIGNED_INT_10F_11F_11F_REV
   UnsignedInt5999Rev -> GL_UNSIGNED_INT_5_9_9_9_REV
   Float32UnsignedInt248Rev -> GL_FLOAT_32_UNSIGNED_INT_24_8_REV
   Bitmap -> GL_BITMAP
   UnsignedShort88 -> GL_UNSIGNED_SHORT_8_8_APPLE
   UnsignedShort88Rev -> GL_UNSIGNED_SHORT_8_8_REV_APPLE
   Double -> GL_DOUBLE
   TwoBytes -> GL_2_BYTES
   ThreeBytes -> GL_3_BYTES
   FourBytes -> GL_4_BYTES

unmarshalDataType :: GLenum -> DataType
unmarshalDataType x
   | x == GL_UNSIGNED_BYTE = UnsignedByte
   | x == GL_BYTE = Byte
   | x == GL_UNSIGNED_SHORT = UnsignedShort
   | x == GL_SHORT = Short
   | x == GL_UNSIGNED_INT = UnsignedInt
   | x == GL_INT = Int
   | x == GL_HALF_FLOAT = HalfFloat
   | x == GL_FLOAT = Float
   | x == GL_UNSIGNED_BYTE_3_3_2 = UnsignedByte332
   | x == GL_UNSIGNED_BYTE_2_3_3_REV = UnsignedByte233Rev
   | x == GL_UNSIGNED_SHORT_5_6_5 = UnsignedShort565
   | x == GL_UNSIGNED_SHORT_5_6_5_REV = UnsignedShort565Rev
   | x == GL_UNSIGNED_SHORT_4_4_4_4 = UnsignedShort4444
   | x == GL_UNSIGNED_SHORT_4_4_4_4_REV = UnsignedShort4444Rev
   | x == GL_UNSIGNED_SHORT_5_5_5_1 = UnsignedShort5551
   | x == GL_UNSIGNED_SHORT_1_5_5_5_REV = UnsignedShort1555Rev
   | x == GL_UNSIGNED_INT_8_8_8_8 = UnsignedInt8888
   | x == GL_UNSIGNED_INT_8_8_8_8_REV = UnsignedInt8888Rev
   | x == GL_UNSIGNED_INT_10_10_10_2 = UnsignedInt1010102
   | x == GL_UNSIGNED_INT_2_10_10_10_REV = UnsignedInt2101010Rev
   | x == GL_UNSIGNED_INT_24_8 = UnsignedInt248
   | x == GL_UNSIGNED_INT_10F_11F_11F_REV = UnsignedInt10f11f11fRev
   | x == GL_UNSIGNED_INT_5_9_9_9_REV = UnsignedInt5999Rev
   | x == GL_FLOAT_32_UNSIGNED_INT_24_8_REV = Float32UnsignedInt248Rev
   | x == GL_BITMAP = Bitmap
   | x == GL_UNSIGNED_SHORT_8_8_APPLE = UnsignedShort88
   | x == GL_UNSIGNED_SHORT_8_8_REV_APPLE = UnsignedShort88Rev
   | x == GL_DOUBLE = Double
   | x == GL_2_BYTES = TwoBytes
   | x == GL_3_BYTES = ThreeBytes
   | x == GL_4_BYTES = FourBytes
   | otherwise = error ("unmarshalDataType: illegal value " ++ show x)

data DataTypeType
   = TNone
   | TSignedNormalized
   | TUnsignedNormalized
   | TFloat
   | TInt
   | TUnsignedInt

marshalDataTypeType :: DataTypeType -> GLenum
marshalDataTypeType x = case x of
   TNone -> GL_NONE
   TSignedNormalized -> GL_SIGNED_NORMALIZED
   TUnsignedNormalized -> GL_UNSIGNED_NORMALIZED
   TFloat -> GL_FLOAT
   TInt -> GL_INT
   TUnsignedInt -> GL_UNSIGNED_INT

unmarshalDataTypeType :: GLenum -> DataTypeType
unmarshalDataTypeType x
   | x == GL_NONE = TNone
   | x == GL_SIGNED_NORMALIZED = TSignedNormalized
   | x == GL_UNSIGNED_NORMALIZED = TUnsignedNormalized
   | x == GL_FLOAT = TFloat
   | x == GL_INT = TInt
   | x == GL_UNSIGNED_INT = TUnsignedInt
   | otherwise = error $ "unmarshalDataTypeType: illegal value " ++ show x