{-# LINE 2 "./Graphics/UI/Gtk/OpenGL/General.chs" #-}
-- -*-haskell-*-
-- GIMP Toolkit (GTK) OpenGL Extension: General
--
-- Author : Duncan Coutts
--
-- Created: 9 June 2005
--
-- Copyright (C) 2005 Duncan Coutts
--
-- This library is free software; you can redistribute it and/or
-- modify it under the terms of the GNU Lesser General Public
-- License as published by the Free Software Foundation; either
-- version 2.1 of the License, or (at your option) any later version.
--
-- This library is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- Lesser General Public License for more details.
--
-- |
-- Maintainer : gtk2hs-users@lists.sourceforge.net
-- Stability : provisional
-- Portability : portable (depends on GHC)
--
--
--
module Graphics.UI.Gtk.OpenGL.General (

-- * Methods
  initGL,
-- ** Query
  glQueryExtension,
  glQueryExtensionForDisplay,
  glQueryGLExtension,
  glQueryVersion,
  glQueryVersionForDisplay,
-- ** Fonts
  glFontUsePangoFont,
  glFontUsePangoFontForDisplay,
  ) where

import Control.Monad (liftM)
import System.Environment (getProgName, getArgs)

import System.Glib.FFI
import System.Glib.UTFString
import System.Glib.GObject (makeNewGObject)
import Graphics.Rendering.Pango.Types
{-# LINE 50 "./Graphics/UI/Gtk/OpenGL/General.chs" #-}
import Graphics.Rendering.Pango.BasicTypes
{-# LINE 51 "./Graphics/UI/Gtk/OpenGL/General.chs" #-}
import Graphics.UI.Gtk.OpenGL.Types
{-# LINE 52 "./Graphics/UI/Gtk/OpenGL/General.chs" #-}


{-# LINE 54 "./Graphics/UI/Gtk/OpenGL/General.chs" #-}

--------------------
-- Methods

initGL :: IO [String]
initGL = do
  prog <- getProgName
  args <- getArgs
  let allArgs = (prog:args)
  withMany withUTFString allArgs $ \addrs ->
    withArrayLen addrs $ \argc argv ->
    with argv $ \argvp ->
    with argc $ \argcp -> do
      res <- gtk_gl_init_check (castPtr argcp) (castPtr argvp)
      if (toBool res) then do
        argc'   <- peek argcp
        argv'   <- peek argvp
        _:addrs'  <- peekArray argc' argv'  -- drop the program name
        mapM peekUTFString addrs'
        else error "Cannot initialize OpenGL."

-- |
--
glQueryExtension :: IO Bool
glQueryExtension =
  liftM toBool $
  gdk_gl_query_extension
{-# LINE 81 "./Graphics/UI/Gtk/OpenGL/General.chs" #-}

-- |
--
glQueryExtensionForDisplay :: Display -> IO Bool
glQueryExtensionForDisplay display =
  liftM toBool $
  (\(Display arg1) -> withForeignPtr arg1 $ \argPtr1 ->gdk_gl_query_extension_for_display argPtr1)
{-# LINE 88 "./Graphics/UI/Gtk/OpenGL/General.chs" #-}
    display

-- |
--
glQueryGLExtension :: String -> IO Bool
glQueryGLExtension extension =
  liftM toBool $
  withUTFString extension $ \extensionPtr ->
  gdk_gl_query_gl_extension
{-# LINE 97 "./Graphics/UI/Gtk/OpenGL/General.chs" #-}
    extensionPtr

-- |
--
glQueryVersion :: IO (Maybe (Int, Int))
glQueryVersion =
  alloca $ \majorPtr ->
  alloca $ \minorPtr ->
  gdk_gl_query_version
{-# LINE 106 "./Graphics/UI/Gtk/OpenGL/General.chs" #-}
    majorPtr
    minorPtr
  >>= \ok ->
  if toBool ok
    then peek majorPtr >>= \major ->
         peek minorPtr >>= \minor ->
         return (Just (fromIntegral major, fromIntegral minor))
    else return Nothing

-- |
--
glQueryVersionForDisplay :: Display -> IO (Maybe (Int, Int))
glQueryVersionForDisplay display =
  alloca $ \majorPtr ->
  alloca $ \minorPtr ->
  (\(Display arg1) arg2 arg3 -> withForeignPtr arg1 $ \argPtr1 ->gdk_gl_query_version_for_display argPtr1 arg2 arg3)
{-# LINE 122 "./Graphics/UI/Gtk/OpenGL/General.chs" #-}
    display
    majorPtr
    minorPtr
  >>= \ok ->
  if toBool ok
    then peek majorPtr >>= \major ->
         peek minorPtr >>= \minor ->
         return (Just (fromIntegral major, fromIntegral minor))
    else return Nothing

-- |
--
glFontUsePangoFont :: FontDescription -> Int -> Int -> Int -> IO Font
glFontUsePangoFont fontDesc first count listBase =
  makeNewGObject mkFont $
  (\(FontDescription arg1) arg2 arg3 arg4 -> withForeignPtr arg1 $ \argPtr1 ->gdk_gl_font_use_pango_font argPtr1 arg2 arg3 arg4)
{-# LINE 138 "./Graphics/UI/Gtk/OpenGL/General.chs" #-}
    fontDesc
    (fromIntegral first)
    (fromIntegral count)
    (fromIntegral listBase)

-- |
--
glFontUsePangoFontForDisplay :: Display -> FontDescription -> Int -> Int -> Int -> IO Font
glFontUsePangoFontForDisplay display fontDesc first count listBase =
  makeNewGObject mkFont $
  (\(Display arg1) (FontDescription arg2) arg3 arg4 arg5 -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg2 $ \argPtr2 ->gdk_gl_font_use_pango_font_for_display argPtr1 argPtr2 arg3 arg4 arg5)
{-# LINE 149 "./Graphics/UI/Gtk/OpenGL/General.chs" #-}
    display
    fontDesc
    (fromIntegral first)
    (fromIntegral count)
    (fromIntegral listBase)

foreign import ccall safe "gtk_gl_init_check"
  gtk_gl_init_check :: ((Ptr CInt) -> ((Ptr (Ptr (Ptr CChar))) -> (IO CInt)))

foreign import ccall safe "gdk_gl_query_extension"
  gdk_gl_query_extension :: (IO CInt)

foreign import ccall safe "gdk_gl_query_extension_for_display"
  gdk_gl_query_extension_for_display :: ((Ptr Display) -> (IO CInt))

foreign import ccall safe "gdk_gl_query_gl_extension"
  gdk_gl_query_gl_extension :: ((Ptr CChar) -> (IO CInt))

foreign import ccall safe "gdk_gl_query_version"
  gdk_gl_query_version :: ((Ptr CInt) -> ((Ptr CInt) -> (IO CInt)))

foreign import ccall safe "gdk_gl_query_version_for_display"
  gdk_gl_query_version_for_display :: ((Ptr Display) -> ((Ptr CInt) -> ((Ptr CInt) -> (IO CInt))))

foreign import ccall safe "gdk_gl_font_use_pango_font"
  gdk_gl_font_use_pango_font :: ((Ptr FontDescription) -> (CInt -> (CInt -> (CInt -> (IO (Ptr Font))))))

foreign import ccall safe "gdk_gl_font_use_pango_font_for_display"
  gdk_gl_font_use_pango_font_for_display :: ((Ptr Display) -> ((Ptr FontDescription) -> (CInt -> (CInt -> (CInt -> (IO (Ptr Font)))))))