    -- #hide
    --------------------------------------------------------------------------------
    -- |
    -- Module      :  Graphics.Rendering.OpenGL.GL.DataType
    -- Copyright   :  (c) Sven Panne 2002-2009
    -- 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 DataType.
    --
    --------------------------------------------------------------------------------

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

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

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

    -- basically table 3.2 (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 -> 0x1401
       Byte -> 0x1400
       UnsignedShort -> 0x1403
       Short -> 0x1402
       UnsignedInt -> 0x1405
       Int -> 0x1404
       HalfFloat -> 0x140B
       Float -> 0x1406
       UnsignedByte332 -> 0x8032
       UnsignedByte233Rev -> 0x8362
       UnsignedShort565 -> 0x8363
       UnsignedShort565Rev -> 0x8364
       UnsignedShort4444 -> 0x8033
       UnsignedShort4444Rev -> 0x8365
       UnsignedShort5551 -> 0x8034
       UnsignedShort1555Rev -> 0x8366
       UnsignedInt8888 -> 0x8035
       UnsignedInt8888Rev -> 0x8367
       UnsignedInt1010102 -> 0x8036
       UnsignedInt2101010Rev -> 0x8368
       UnsignedInt248 -> 0x84fa
       UnsignedInt10f11f11fRev -> 0x8C3B
       UnsignedInt5999Rev -> 0x8C3E
       Float32UnsignedInt248Rev -> 0x8DAD
       Bitmap -> 0x1a00
       UnsignedShort88 -> 0x85ba
       UnsignedShort88Rev -> 0x85bb
       Double -> 0x140a
       TwoBytes -> 0x1407
       ThreeBytes -> 0x1408
       FourBytes -> 0x1409

    unmarshalDataType :: GLenum -> DataType
    unmarshalDataType x
       | x == 0x1401 = UnsignedByte
       | x == 0x1400 = Byte
       | x == 0x1403 = UnsignedShort
       | x == 0x1402 = Short
       | x == 0x1405 = UnsignedInt
       | x == 0x1404 = Int
       | x == 0x140B = HalfFloat
       | x == 0x1406 = Float
       | x == 0x8032 = UnsignedByte332
       | x == 0x8362 = UnsignedByte233Rev
       | x == 0x8363 = UnsignedShort565
       | x == 0x8364 = UnsignedShort565Rev
       | x == 0x8033 = UnsignedShort4444
       | x == 0x8365 = UnsignedShort4444Rev
       | x == 0x8034 = UnsignedShort5551
       | x == 0x8366 = UnsignedShort1555Rev
       | x == 0x8035 = UnsignedInt8888
       | x == 0x8367 = UnsignedInt8888Rev
       | x == 0x8036 = UnsignedInt1010102
       | x == 0x8368 = UnsignedInt2101010Rev
       | x == 0x84fa = UnsignedInt248
       | x == 0x8C3B = UnsignedInt10f11f11fRev
       | x == 0x8C3E = UnsignedInt5999Rev
       | x == 0x8DAD = Float32UnsignedInt248Rev
       | x == 0x1a00 = Bitmap
       | x == 0x85ba = UnsignedShort88
       | x == 0x85bb = UnsignedShort88Rev
       | x == 0x140a = Double
       | x == 0x1407 = TwoBytes
       | x == 0x1408 = ThreeBytes
       | x == 0x1409 = FourBytes
       | otherwise = error ("unmarshalDataType: illegal value " ++ show x)