{-# LANGUAGE TemplateHaskell #-}

module Glest.Utils.InlineC (
  ctx
) where

import Data.Map.Strict as Map
import Glest.Egl.Types
import Graphics.GL.Types
import Foreign
import Language.C.Inline.Context
import Language.C.Types
import Language.Haskell.TH
import Quasar.Prelude
import System.Posix.Types (COff(..))

ctx :: Context
ctx = baseCtx <> extraTypesCtx

emptyCtx :: Context
emptyCtx = Context {
  ctxTypesTable = mempty,
  ctxAntiQuoters = mempty,
  ctxOutput = mempty,
  ctxForeignSrcLang = Nothing,
  ctxEnableCpp = False
}

extraTypesCtx :: Context
extraTypesCtx =
  emptyCtx {
    ctxTypesTable = Map.fromList types
  }

types :: [(TypeSpecifier, TypeQ)]
types = [
  (TypeName "off_t", [t|COff|]),

  (TypeName "GLuint", [t|GLuint|]),

  (TypeName "EGLenum", [t|EGLenum|]),
  (TypeName "EGLint", [t|EGLint|]),
  (TypeName "EGLBoolean", [t|EGLBoolean|]),
  (TypeName "EGLConfig", [t|EGLConfig|]),
  (TypeName "EGLContext", [t|EGLContext|]),
  (TypeName "EGLDisplay", [t|EGLDisplay|]),
  (TypeName "EGLDeviceEXT", [t|EGLDeviceEXT|]),
  (TypeName "EGLImage", [t|EGLImage|]),
  (TypeName "EGLLabel", [t|EGLLabel|]),
  (TypeName "EGLDEBUGPROCKHR", [t|FunPtr EglDebugCallback|])
  ]