[gtkglext] [GB#604435] Quartz backend for GdkGL.
- From: Braden McDaniel <bradenmcd src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtkglext] [GB#604435] Quartz backend for GdkGL.
- Date: Wed, 25 Aug 2010 19:57:08 +0000 (UTC)
commit 35f97cd57350e4f067ea54874495638cf2216b61
Author: Braden McDaniel <braden endoframe com>
Date: Mon Jul 26 02:27:51 2010 -0400
[GB#604435] Quartz backend for GdkGL.
Modified from original submission from <agruzdev users sourceforge net>.
configure.ac | 19 ++-
docs/reference/gtkglext/Makefile.am | 1 +
examples/Makefile.am | 5 +
examples/button.c | 4 +
examples/color.c | 4 +
examples/coolwave.c | 4 +
examples/coolwave2.c | 4 +
examples/drawshapes.c | 5 +
examples/font-pangoft2-tex.c | 4 +
examples/font-pangoft2.c | 4 +
examples/gears.c | 6 +-
examples/glade/share-lists.c | 4 +
examples/glade/simple.c | 4 +
examples/logo-model.c | 6 +
examples/logo.c | 4 +
examples/low-level.c | 4 +
examples/lw.h | 6 +
examples/multiarb.c | 5 +
examples/pixmap-mixed.c | 4 +
examples/pixmap.c | 4 +
examples/readtex.c | 6 +
examples/readtex.h | 5 +
examples/rotating-square.c | 5 +
examples/scribble-gl.c | 4 +
examples/shapes.c | 4 +
examples/share-lists.c | 4 +
examples/simple-mixed.c | 4 +
examples/simple.c | 4 +
examples/template.c | 4 +
examples/viewlw.c | 4 +
gdk/Makefile.am | 15 ++-
gdk/gdkglglext.h | 4 +
gdk/gdkglquery.c | 4 +
gdk/quartz/Makefile.am | 49 +++++
gdk/quartz/gdkglconfig-quartz.h | 42 +++++
gdk/quartz/gdkglconfig-quartz.m | 306 +++++++++++++++++++++++++++++++
gdk/quartz/gdkglcontext-quartz.h | 44 +++++
gdk/quartz/gdkglcontext-quartz.m | 342 +++++++++++++++++++++++++++++++++++
gdk/quartz/gdkgldrawable-quartz.m | 16 ++
gdk/quartz/gdkglpixmap-quartz.h | 49 +++++
gdk/quartz/gdkglpixmap-quartz.m | 305 +++++++++++++++++++++++++++++++
gdk/quartz/gdkglprivate-quartz.h | 26 +++
gdk/quartz/gdkglquartz.h | 9 +
gdk/quartz/gdkglquery-quartz.m | 214 ++++++++++++++++++++++
gdk/quartz/gdkglwindow-quartz.h | 41 ++++
gdk/quartz/gdkglwindow-quartz.m | 204 +++++++++++++++++++++
gtk/Makefile.am | 5 +
47 files changed, 1810 insertions(+), 10 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 62e880b..576694b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -101,6 +101,7 @@ AC_SUBST([GTKGLEXT_CURRENT_MINUS_AGE])
dnl Initialize libtool
AC_PROG_CC
AM_PROG_CC_C_O
+AC_PROG_OBJC
AM_DISABLE_STATIC
LT_PREREQ([2.2.6])
LT_INIT([win32-dll])
@@ -213,7 +214,7 @@ AC_ARG_WITH([gdktarget],
[select GDK target])],
[gdktarget=$with_gdktarget],
[gdktarget=`$PKG_CONFIG --variable=target gdk-2.0`])
-AS_IF([test x$gdktarget = xwin32],
+AS_IF([test x$gdktarget = xwin32 -o x$gdktarget = xquartz],
[with_x=no])
# Checks for headers and libraries.
@@ -315,8 +316,8 @@ fi
AC_SUBST([REBUILD])
case $gdktarget in
- x11|win32) ;;
- *) AC_MSG_ERROR([Invalid target for GDK: use x11 or win32.]);;
+ x11|quartz|win32) ;;
+ *) AC_MSG_ERROR([Invalid target for GDK: use x11, quartz or win32.]);;
esac
AC_SUBST([gdktarget])
@@ -352,14 +353,10 @@ if test "x$gdktarget" = "xx11"; then
GDKGLEXT_WIN_CFLAGS="$X_CFLAGS"
GDKGLEXT_WIN_LIBS="$X_LIBS $XMU_LIBS"
fi
-AM_CONDITIONAL([USE_X11], [test x$gdktarget = xx11])
if test "x$gdktarget" = "xwin32"; then
WINDOWING_LIBS="-lgdi32 -luser32 -lkernel32"
GDKGLEXT_WIN_LIBS="-lgdi32 -luser32 -lkernel32"
- AM_CONDITIONAL([USE_WIN32], [true])
-else
- AM_CONDITIONAL([USE_WIN32], [false])
fi
AC_SUBST([WINDOWING_CFLAGS])
@@ -368,6 +365,10 @@ AC_SUBST([WINDOWING_LIBS])
AC_SUBST([GDKGLEXT_WIN_CFLAGS])
AC_SUBST([GDKGLEXT_WIN_LIBS])
+AM_CONDITIONAL([USE_X11], [test x$gdktarget = xx11])
+AM_CONDITIONAL([USE_WIN32], [test x$gdktarget = xwin32])
+AM_CONDITIONAL([TARGET_QUARTZ], [test x$gdktarget = xquartz])
+
# Debug option
AC_ARG_ENABLE([debug],
AS_HELP_STRING([--enable-debug=@<:@no/minimum/yes@:>@],
@@ -457,6 +458,9 @@ if test "x$gdktarget" = "xx11" ; then
elif test "x$gdktarget" = "xwin32" ; then
gdkglext_windowing='
#define GDKGLEXT_WINDOWING_WIN32'
+elif test "x$gdktarget" = "xquartz" ; then
+ gdkglext_windowing='
+#define GDKGLEXT_WINDOWING_QUARTZ'
fi
if test "x$GDKGLEXT_NEED_GLXFBCONFIGSGIX_TYPEDEF" = "xyes"; then
@@ -507,6 +511,7 @@ gdk/Makefile
gdk/gdkglversion.h
gdk/x11/Makefile
gdk/win32/Makefile
+gdk/quartz/Makefile
gtk/Makefile
gtk/gtkglversion.h
docs/Makefile
diff --git a/docs/reference/gtkglext/Makefile.am b/docs/reference/gtkglext/Makefile.am
index b141c74..df0a2f6 100644
--- a/docs/reference/gtkglext/Makefile.am
+++ b/docs/reference/gtkglext/Makefile.am
@@ -36,6 +36,7 @@ IGNORE_HFILES = \
glext \
x11 \
win32 \
+ quartz \
gdkglext-config.h \
gdkglprivate.h \
gdkgldebug.h \
diff --git a/examples/Makefile.am b/examples/Makefile.am
index 463503d..d9f4a96 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -14,6 +14,7 @@ AM_CPPFLAGS = \
-I$(top_builddir)/gtk \
$(GTKGLEXT_DEBUG_FLAGS) \
$(GTK_CFLAGS) \
+ $(BASE_DEPENDENCIES_CFLAGS) \
$(GL_CFLAGS) \
$(GDKGLEXT_WIN_CFLAGS) \
$(EXAMPLES_DEP_CFLAGS)
@@ -140,12 +141,14 @@ font_pangoft2_tex_LDFLAGS = $(AM_LDFLAGS) $(PANGOFT2_LIBS) $(GTKGLEXT_DEP_LIBS_W
endif
if !PLATFORM_WIN32
+if !TARGET_QUARTZ
if GLU
noinst_PROGRAMS += simple-pbuffer-sgix
simple_pbuffer_sgix_SOURCES = simple-pbuffer-sgix.c
simple_pbuffer_sgix_LDFLAGS = $(GLU_LIBS)
endif
endif
+endif
if PLATFORM_WIN32
noinst_PROGRAMS += wglinfo
@@ -154,12 +157,14 @@ wglinfo_LDADD = $(GL_LIBS) $(WINDOWING_LIBS)
endif
if !PLATFORM_WIN32
+if !TARGET_QUARTZ
if GLU
noinst_PROGRAMS += glxinfo
glxinfo_SOURCES = glxinfo.c
glxinfo_LDADD = $(GL_LIBS) $(WINDOWING_LIBS) $(GLU_LIBS) $(MATH_LIB)
endif
endif
+endif
EXTRA_DIST += glade/README \
diff --git a/examples/button.c b/examples/button.c
index 1c35055..1cc2cd1 100644
--- a/examples/button.c
+++ b/examples/button.c
@@ -17,7 +17,11 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
#include "drawshapes.h"
diff --git a/examples/color.c b/examples/color.c
index 744c4a5..26bcc13 100644
--- a/examples/color.c
+++ b/examples/color.c
@@ -17,7 +17,11 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
/*
* Colors.
diff --git a/examples/coolwave.c b/examples/coolwave.c
index 34fbf1a..dc38380 100644
--- a/examples/coolwave.c
+++ b/examples/coolwave.c
@@ -37,8 +37,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
/**************************************************************************
diff --git a/examples/coolwave2.c b/examples/coolwave2.c
index 4c7135a..353a65d 100644
--- a/examples/coolwave2.c
+++ b/examples/coolwave2.c
@@ -50,8 +50,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
/**************************************************************************
diff --git a/examples/drawshapes.c b/examples/drawshapes.c
index 475efd5..18cf23e 100644
--- a/examples/drawshapes.c
+++ b/examples/drawshapes.c
@@ -19,14 +19,19 @@
#include <math.h>
#include "drawshapes.h"
+#include <gdk/gdkglext-config.h>
#ifdef G_OS_WIN32
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
#endif
+#ifdef GDKGLEXT_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
/*
* The following code is imported from GLUT.
diff --git a/examples/font-pangoft2-tex.c b/examples/font-pangoft2-tex.c
index 2e663a3..7a3a03f 100644
--- a/examples/font-pangoft2-tex.c
+++ b/examples/font-pangoft2-tex.c
@@ -20,8 +20,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
#define TIMEOUT_INTERVAL 10
diff --git a/examples/font-pangoft2.c b/examples/font-pangoft2.c
index 1ccac4f..103e60f 100644
--- a/examples/font-pangoft2.c
+++ b/examples/font-pangoft2.c
@@ -20,8 +20,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
#define FOVY_2 20.0
#define Z_NEAR 3.0
diff --git a/examples/gears.c b/examples/gears.c
index ae76402..a8df06d 100644
--- a/examples/gears.c
+++ b/examples/gears.c
@@ -22,7 +22,11 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
/*
* Draw a gear wheel. You'll probably want to call this function when
@@ -574,7 +578,7 @@ main (int argc,
/*
* Main loop.
*/
-
+//idle_add (drawing_area);
gtk_main ();
return 0;
diff --git a/examples/glade/share-lists.c b/examples/glade/share-lists.c
index d434b15..7b41ef7 100644
--- a/examples/glade/share-lists.c
+++ b/examples/glade/share-lists.c
@@ -16,8 +16,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
gboolean
on_window1_delete_event (GtkWidget *widget,
diff --git a/examples/glade/simple.c b/examples/glade/simple.c
index 1528b09..5cfc635 100644
--- a/examples/glade/simple.c
+++ b/examples/glade/simple.c
@@ -16,8 +16,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
gboolean
on_window1_delete_event (GtkWidget *widget,
diff --git a/examples/logo-model.c b/examples/logo-model.c
index f2d4253..0058175 100644
--- a/examples/logo-model.c
+++ b/examples/logo-model.c
@@ -12,7 +12,13 @@
#include <windows.h>
#endif
+#include <gdkconfig.h>
+
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
#include "logo-model.h"
diff --git a/examples/logo.c b/examples/logo.c
index 72ca5f7..274ddad 100644
--- a/examples/logo.c
+++ b/examples/logo.c
@@ -19,7 +19,11 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
#include "logo-model.h"
#include "trackball.h"
diff --git a/examples/low-level.c b/examples/low-level.c
index 64126b8..d6231e1 100644
--- a/examples/low-level.c
+++ b/examples/low-level.c
@@ -16,8 +16,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
static GdkGLConfig *glconfig = NULL;
static GdkGLWindow *glwindow = NULL;
diff --git a/examples/lw.h b/examples/lw.h
index 407aa19..6ef0621 100644
--- a/examples/lw.h
+++ b/examples/lw.h
@@ -27,7 +27,13 @@
#include <windows.h>
#endif
+#include <gdk/gdkglext-config.h>
+
+#ifdef GDKGLEXT_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
#define LW_MAX_POINTS 200
#define LW_MAX_NAME_LEN 500
diff --git a/examples/multiarb.c b/examples/multiarb.c
index 8764677..c5192ed 100644
--- a/examples/multiarb.c
+++ b/examples/multiarb.c
@@ -21,7 +21,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
+#include <GL/glu.h>
+#endif
#include "readtex.h"
diff --git a/examples/pixmap-mixed.c b/examples/pixmap-mixed.c
index 14b39b8..7045053 100644
--- a/examples/pixmap-mixed.c
+++ b/examples/pixmap-mixed.c
@@ -16,8 +16,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
static GdkGLConfig *glconfig = NULL;
static GdkGLContext *glcontext = NULL;
diff --git a/examples/pixmap.c b/examples/pixmap.c
index df7f21b..3644211 100644
--- a/examples/pixmap.c
+++ b/examples/pixmap.c
@@ -16,8 +16,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
static GdkGLConfig *glconfig = NULL;
static GdkGLContext *glcontext = NULL;
diff --git a/examples/readtex.c b/examples/readtex.c
index ecb91b5..51cffa9 100644
--- a/examples/readtex.c
+++ b/examples/readtex.c
@@ -12,8 +12,14 @@
#include <windows.h>
#endif
+#include <gdkconfig.h>
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
diff --git a/examples/readtex.h b/examples/readtex.h
index 8e544f1..461e83b 100644
--- a/examples/readtex.h
+++ b/examples/readtex.h
@@ -4,7 +4,12 @@
#define READTEX_H
+#include <gdkconfig.h>
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
extern GLboolean
diff --git a/examples/rotating-square.c b/examples/rotating-square.c
index a47db8a..3b038ef 100644
--- a/examples/rotating-square.c
+++ b/examples/rotating-square.c
@@ -34,7 +34,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
+
/**************************************************************************
* The following section contains all the macro definitions.
diff --git a/examples/scribble-gl.c b/examples/scribble-gl.c
index 95458ca..9d650aa 100644
--- a/examples/scribble-gl.c
+++ b/examples/scribble-gl.c
@@ -32,7 +32,11 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
/**************************************************************************
* The following section contains all the macro definitions.
diff --git a/examples/shapes.c b/examples/shapes.c
index f9b2d6b..d2b9084 100644
--- a/examples/shapes.c
+++ b/examples/shapes.c
@@ -18,7 +18,11 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
#include "trackball.h"
#include "drawshapes.h"
diff --git a/examples/share-lists.c b/examples/share-lists.c
index dc0bac9..b994d08 100644
--- a/examples/share-lists.c
+++ b/examples/share-lists.c
@@ -16,8 +16,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
static GLfloat red[] = {1.0, 0.0, 0.0, 1.0};
static GLfloat yellow[] = {1.0, 1.0, 0.0, 1.0};
diff --git a/examples/simple-mixed.c b/examples/simple-mixed.c
index 6fb3887..b88d407 100644
--- a/examples/simple-mixed.c
+++ b/examples/simple-mixed.c
@@ -16,8 +16,12 @@
#include <windows.h>
#endif
+#ifdef GDKGLEXT_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
static void
realize (GtkWidget *widget,
diff --git a/examples/simple.c b/examples/simple.c
index 53a09d9..3c0ea98 100644
--- a/examples/simple.c
+++ b/examples/simple.c
@@ -16,8 +16,12 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
static void
realize (GtkWidget *widget,
diff --git a/examples/template.c b/examples/template.c
index 7c2ee53..b469748 100644
--- a/examples/template.c
+++ b/examples/template.c
@@ -42,7 +42,11 @@
#include <windows.h>
#endif
+#ifdef GDKGLEXT_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
/**************************************************************************
* The following section contains all the macro definitions.
diff --git a/examples/viewlw.c b/examples/viewlw.c
index 5fc4f48..3528075 100644
--- a/examples/viewlw.c
+++ b/examples/viewlw.c
@@ -43,8 +43,12 @@
#include <windows.h>
#endif
+#ifdef GDKGLEXT_WINDOWING_QUARTZ
+#include <OpenGL/glu.h>
+#else
#include <GL/gl.h>
#include <GL/glu.h>
+#endif
#include "trackball.h"
#include "lw.h"
diff --git a/gdk/Makefile.am b/gdk/Makefile.am
index f37db42..8288748 100644
--- a/gdk/Makefile.am
+++ b/gdk/Makefile.am
@@ -2,7 +2,7 @@
## Makefile.am for gtkglext/gdk
SUBDIRS = $(gdktarget)
-DIST_SUBDIRS = x11 win32
+DIST_SUBDIRS = x11 win32 quartz
EXTRA_DIST = \
gdkglversion.h.in \
@@ -116,12 +116,17 @@ lib_LTLIBRARIES = $(gdkglext_targetlib)
EXTRA_LTLIBRARIES = \
libgdkglext-x11- API_MJ@ API_MI@.la \
+ libgdkglext-quartz- API_MJ@ API_MI@.la \
libgdkglext-win32- API_MJ@ API_MI@.la
libgdkglext_x11_ API_MJ@_ API_MI@_la_SOURCES = $(gdkglext_sources)
libgdkglext_x11_ API_MJ@_ API_MI@_la_LDFLAGS = $(common_ldflags)
libgdkglext_x11_ API_MJ@_ API_MI@_la_LIBADD = x11/libgdkglext-x11.la $(common_libadd)
+libgdkglext_quartz_ API_MJ@_ API_MI@_la_SOURCES = $(gdkglext_sources)
+libgdkglext_quartz_ API_MJ@_ API_MI@_la_LDFLAGS = $(common_ldflags)
+libgdkglext_quartz_ API_MJ@_ API_MI@_la_LIBADD = quartz/libgdkglext-quartz.la $(common_libadd)
+
libgdkglext_win32_ API_MJ@_ API_MI@_la_SOURCES = $(gdkglext_sources)
libgdkglext_win32_ API_MJ@_ API_MI@_la_LDFLAGS = $(common_ldflags)
libgdkglext_win32_ API_MJ@_ API_MI@_la_LIBADD = win32/libgdkglext-win32.la $(common_libadd)
@@ -137,7 +142,7 @@ MAINTAINERCLEANFILES = \
$(gdkglext_built_sources)
# Generate built header without using automake BUILT_SOURCES
-$(libgdkglext_x11_ API_MJ@_ API_MI@_la_OBJECTS) $(libgdkglext_win32_ API_MJ@_ API_MI@_la_OBJECTS): $(gdkglext_built_public_h_sources)
+$(libgdkglext_x11_ API_MJ@_ API_MI@_la_OBJECTS) $(libgdkglext_quartz_ API_MJ@_ API_MI@_la_OBJECTS) $(libgdkglext_win32_ API_MJ@_ API_MI@_la_OBJECTS): $(gdkglext_built_public_h_sources)
$(srcdir)/gdkglenumtypes.h: stamp-gdkglenumtypes-h
@true
@@ -159,6 +164,12 @@ $(srcdir)/gdkglenumtypes.c: @REBUILD@ $(gdkglext_public_h_sources) Makefile
configexecincludedir = $(libdir)/gtkglext- GTKGLEXT_API_VERSION@/include
configexecinclude_DATA = gdkglext-config.h
+install-exec-local: gdkglext-config.h
+ $(mkinstalldirs) $(DESTDIR)$(configexecincludedir)
+ file=$(DESTDIR)$(configexecincludedir)/gdkglext-config.h; \
+ if test -r $$file && cmp -s gdkglext-config.h $$file; then :; \
+ else $(INSTALL_DATA) gdkglext-config.h $$file; fi
+
gdkglext-config.h: stamp-gdkglext-config-h
@if test -f gdkglext-config.h; then :; \
else rm -f stamp-gdkglext-config-h; $(MAKE) stamp-gdkglext-config-h; fi
diff --git a/gdk/gdkglglext.h b/gdk/gdkglglext.h
index de4e151..63806c4 100644
--- a/gdk/gdkglglext.h
+++ b/gdk/gdkglglext.h
@@ -30,7 +30,11 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
#include <gdk/gdkgldefs.h>
#include <gdk/gdkglquery.h>
diff --git a/gdk/gdkglquery.c b/gdk/gdkglquery.c
index 9ea4fec..0df6f7c 100644
--- a/gdk/gdkglquery.c
+++ b/gdk/gdkglquery.c
@@ -31,7 +31,11 @@
#include <windows.h>
#endif
+#ifdef GDK_WINDOWING_QUARTZ
+#include <OpenGL/gl.h>
+#else
#include <GL/gl.h>
+#endif
/*
* This code is based on glutExtensionSupported().
diff --git a/gdk/quartz/Makefile.am b/gdk/quartz/Makefile.am
new file mode 100644
index 0000000..627f0f8
--- /dev/null
+++ b/gdk/quartz/Makefile.am
@@ -0,0 +1,49 @@
+## -*- Makefile -*-
+## Makefile.am for gtkglext/gdk/quartz
+
+AM_CPPFLAGS = \
+ -DG_LOG_DOMAIN=\"GdkGLExt\" \
+ -DGDK_GL_COMPILATION \
+ -DINSIDE_GDK_GL_QUARTZ \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/gdk \
+ -I$(top_builddir)/gdk \
+ $(GTKGLEXT_DEBUG_FLAGS) \
+ $(GDK_CFLAGS) \
+ $(GL_CFLAGS) \
+ $(GDKGLEXT_WIN_CFLAGS) \
+ -DG_DISABLE_DEPRECATED \
+ -DGDK_DISABLE_DEPRECATED \
+ -DGDK_PIXBUF_DISABLE_DEPRECATED
+
+AM_LDFLAGS = $(GDK_LIBS) $(GL_LIBS) $(GDKGLEXT_WIN_LIBS)
+
+gdkglext_quartz_public_h_sources =
+gdkglext_quartz_private_h_sources = \
+ gdkglconfig-quartz.h \
+ gdkglcontext-quartz.h \
+ gdkglpixmap-quartz.h \
+ gdkglwindow-quartz.h \
+ gdkglprivate-quartz.h
+
+gdkglext_quartz_c_sources = \
+ gdkglquery-quartz.m \
+ gdkglconfig-quartz.m \
+ gdkglcontext-quartz.m \
+ gdkgldrawable-quartz.m \
+ gdkglpixmap-quartz.m \
+ gdkglwindow-quartz.m
+
+gdkglext_quartz_headers = \
+ $(gdkglext_quartz_public_h_sources)
+
+gdkglext_quartz_sources = \
+ $(gdkglext_quartz_private_h_sources) \
+ $(gdkglext_quartz_c_sources)
+
+gdkglextquartzincludedir = $(includedir)/gtkglext- GTKGLEXT_API_VERSION@/gdk/quartz
+gdkglextquartzinclude_HEADERS = $(gdkglext_quartz_headers)
+
+noinst_LTLIBRARIES = libgdkglext-quartz.la
+
+libgdkglext_quartz_la_SOURCES = $(gdkglext_quartz_sources)
diff --git a/gdk/quartz/gdkglconfig-quartz.h b/gdk/quartz/gdkglconfig-quartz.h
new file mode 100644
index 0000000..de2741c
--- /dev/null
+++ b/gdk/quartz/gdkglconfig-quartz.h
@@ -0,0 +1,42 @@
+#ifndef __GDK_GL_CONFIG_QUARTZ_H__
+#define __GDK_GL_CONFIG_QUARTZ_H__
+
+#include <gdk/gdkglconfig.h>
+#include <gdk/quartz/gdkglquartz.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GdkGLConfigImplQuartz GdkGLConfigImplQuartz;
+typedef struct _GdkGLConfigImplQuartzClass GdkGLConfigImplQuartzClass;
+
+#define GDK_TYPE_GL_CONFIG_IMPL_QUARTZ (gdk_gl_config_impl_quartz_get_type ())
+#define GDK_GL_CONFIG_IMPL_QUARTZ(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_GL_CONFIG_IMPL_QUARTZ, GdkGLConfigImplQuartz))
+#define GDK_GL_CONFIG_IMPL_QUARTZ_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_GL_CONFIG_IMPL_QUARTZ, GdkGLConfigImplQuartzClass))
+#define GDK_IS_GL_CONFIG_IMPL_QUARTZ(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_GL_CONFIG_IMPL_QUARTZ))
+#define GDK_IS_GL_CONFIG_IMPL_QUARTZ_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_GL_CONFIG_IMPL_QUARTZ))
+#define GDK_GL_CONFIG_IMPL_QUARTZ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_GL_CONFIG_IMPL_QUARTZ, GdkGLConfigImplQuartzClass))
+
+ struct _GdkGLConfigImplQuartz
+ {
+ GdkGLConfig parent_instance;
+
+ int screen_num;
+
+ GdkScreen *screen;
+
+ GdkColormap *colormap;
+
+ NSOpenGLPixelFormat *quartzPixelFormat;
+ };
+
+struct _GdkGLConfigImplQuartzClass
+{
+ GdkGLConfigClass parent_class;
+};
+
+GType gdk_gl_config_impl_quartz_get_type (void);
+
+G_END_DECLS
+
+
+#endif
diff --git a/gdk/quartz/gdkglconfig-quartz.m b/gdk/quartz/gdkglconfig-quartz.m
new file mode 100644
index 0000000..3cfbd69
--- /dev/null
+++ b/gdk/quartz/gdkglconfig-quartz.m
@@ -0,0 +1,306 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+
+#include "gdkglprivate-quartz.h"
+#include "gdkglconfig-quartz.h"
+
+
+static void gdk_gl_config_impl_quartz_class_init (GdkGLConfigImplQuartzClass *klass);
+static void gdk_gl_config_impl_quartz_finalize (GObject *object);
+
+static gpointer parent_class = NULL;
+
+GType
+gdk_gl_config_impl_quartz_get_type (void)
+{
+ static GType type = 0;
+
+ if (!type)
+ {
+ static const GTypeInfo type_info = {
+ sizeof (GdkGLConfigImplQuartzClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gdk_gl_config_impl_quartz_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (GdkGLConfigImplQuartz),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) NULL
+ };
+
+ type = g_type_register_static (GDK_TYPE_GL_CONFIG,
+ "GdkGLConfigImplQuartz",
+ &type_info, 0);
+ }
+
+ return type;
+}
+
+static void
+gdk_gl_config_impl_quartz_class_init (GdkGLConfigImplQuartzClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ parent_class = g_type_class_peek_parent (klass);
+ object_class->finalize = gdk_gl_config_impl_quartz_finalize;
+}
+
+static void
+gdk_gl_config_impl_quartz_finalize (GObject *object)
+{
+ GdkGLConfigImplQuartz *impl = GDK_GL_CONFIG_IMPL_QUARTZ (object);
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+ [impl->quartzPixelFormat release];
+ g_object_unref (G_OBJECT (impl->colormap));
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+
+/**
+ * gdk_gl_config_get_colormap:
+ * @glconfig: a #GdkGLConfig.
+ *
+ * Gets the #GdkColormap that is appropriate for the OpenGL frame buffer
+ * configuration.
+ *
+ * Return value: the appropriate #GdkColormap.
+ **/
+GdkColormap *
+gdk_gl_config_get_colormap (GdkGLConfig *glconfig)
+{
+ g_return_val_if_fail (GDK_IS_GL_CONFIG_IMPL_QUARTZ (glconfig), NULL);
+
+ return GDK_GL_CONFIG_IMPL_QUARTZ (glconfig)->colormap;
+}
+
+/**
+ * gdk_gl_config_get_visual:
+ * @glconfig: a #GdkGLConfig.
+ *
+ * Gets the #GdkVisual that is appropriate for the OpenGL frame buffer
+ * configuration.
+ *
+ * Return value: the appropriate #GdkVisual.
+ **/
+GdkVisual *
+gdk_gl_config_get_visual (GdkGLConfig *glconfig)
+{
+ g_return_val_if_fail (GDK_IS_GL_CONFIG_IMPL_QUARTZ (glconfig), NULL);
+
+ return gdk_colormap_get_visual (GDK_GL_CONFIG_IMPL_QUARTZ (glconfig)->colormap);
+}
+
+static GdkGLConfig *
+gdk_gl_config_new_common (GdkScreen *screen,
+ const int *attrib_list)
+{
+#define MAX_ATTRS 100
+ GdkGLConfig *glconfig;
+ GdkGLConfigImplQuartz *impl;
+ static NSOpenGLPixelFormatAttribute attrlist[MAX_ATTRS];
+ unsigned i=0;
+ int *p;
+
+ glconfig = g_object_new (GDK_TYPE_GL_CONFIG_IMPL_QUARTZ, NULL);
+ impl = GDK_GL_CONFIG_IMPL_QUARTZ (glconfig);
+
+ impl->screen = screen;
+ impl->colormap =gdk_screen_get_system_colormap (screen); // gdk_colormap_get_system();
+
+ glconfig->is_rgba = TRUE;
+ glconfig->is_stereo = FALSE;
+ glconfig->is_double_buffered = FALSE;
+ glconfig->n_aux_buffers = 0;
+ glconfig->layer_plane = 0;
+ glconfig->has_alpha = TRUE;
+ glconfig->has_depth_buffer = FALSE;
+ glconfig->has_stencil_buffer = FALSE;
+ glconfig->has_accum_buffer = FALSE;
+ glconfig->n_sample_buffers = 0;
+
+
+ p = (int *) attrib_list;
+ while ((*p != GDK_GL_ATTRIB_LIST_NONE) && (i+2<MAX_ATTRS))
+ {
+ switch (*p)
+ {
+ case GDK_GL_BUFFER_SIZE:
+ /* Specifies the number of color bitplanes in each color buffer. */
+ attrlist[i++] = NSOpenGLPFAColorSize;
+ attrlist[i++] = *(++p);
+ break;
+ case GDK_GL_DOUBLEBUFFER:
+ /* The buffer is double-buffered. */
+ attrlist[i++] =NSOpenGLPFADoubleBuffer;
+ glconfig->is_double_buffered = TRUE;
+ break;
+ case GDK_GL_STEREO:
+ /* The buffer is stereoscopic.
+ This flag is not supported in the current generic implementation. */
+ attrlist[i++] = NSOpenGLPFAStereo;
+ glconfig->is_stereo = TRUE;
+ break;
+ case GDK_GL_AUX_BUFFERS:
+ /* Specifies the number of auxiliary buffers.
+ Auxiliary buffers are not supported. */
+ attrlist[i++] = NSOpenGLPFAAuxBuffers;
+ glconfig->n_aux_buffers = attrlist[i++] = *(++p);
+ break;
+ case GDK_GL_DEPTH_SIZE:
+ /* Specifies the depth of the depth (z-axis) buffer. */
+ attrlist[i++] = NSOpenGLPFADepthSize ;
+ attrlist[i++] = *(++p);
+ glconfig->has_depth_buffer = TRUE;
+ break;
+ case GDK_GL_STENCIL_SIZE:
+ /* Specifies the depth of the stencil buffer. */
+ attrlist[i++] = NSOpenGLPFAStencilSize ;
+ attrlist[i++] = *(++p);
+ glconfig->has_stencil_buffer = TRUE;
+ break;
+ case GDK_GL_ALPHA_SIZE:
+ attrlist[i++] = NSOpenGLPFAAlphaSize ;
+ attrlist[i++] = *(++p);
+ glconfig->has_stencil_buffer = TRUE;
+ break;
+ case GDK_GL_USE_GL:
+ case GDK_GL_RGBA:
+ case GDK_GL_LEVEL:
+ case GDK_GL_RED_SIZE:
+ case GDK_GL_GREEN_SIZE:
+ case GDK_GL_BLUE_SIZE:
+ case GDK_GL_ACCUM_RED_SIZE:
+ case GDK_GL_ACCUM_GREEN_SIZE:
+ case GDK_GL_ACCUM_BLUE_SIZE:
+ case GDK_GL_ACCUM_ALPHA_SIZE:
+ break;
+ }
+ ++p;
+ }
+ attrlist[i] = 0;
+ impl->quartzPixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrlist];
+
+ return glconfig;
+#undef MAX_ATTRS
+}
+
+GdkGLConfig *
+gdk_gl_config_new (const int *attrib_list)
+{
+ GdkScreen *screen;
+
+ GDK_GL_NOTE_FUNC ();
+
+ g_return_val_if_fail (attrib_list != NULL, NULL);
+
+ screen = gdk_screen_get_default ();
+
+ return gdk_gl_config_new_common (screen, attrib_list);
+}
+
+/**
+ * gdk_gl_config_new_for_screen:
+ * @screen: target screen.
+ * @attrib_list: a list of attribute/value pairs. The last attribute must
+ * be GDK_GL_ATTRIB_LIST_NONE.
+ *
+ * Returns an OpenGL frame buffer configuration that match the specified
+ * attributes.
+ *
+ * Return value: the new #GdkGLConfig.
+ **/
+GdkGLConfig *
+gdk_gl_config_new_for_screen (GdkScreen *screen,
+ const int *attrib_list)
+{
+ GDK_GL_NOTE_FUNC ();
+
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+ g_return_val_if_fail (attrib_list != NULL, NULL);
+
+ return gdk_gl_config_new_common (screen, attrib_list);
+}
+
+/**
+ * gdk_gl_config_get_attrib:
+ * @glconfig: a #GdkGLConfig.
+ * @attribute: the attribute to be returned.
+ * @value: returns the requested value.
+ *
+ * Gets information about a OpenGL frame buffer configuration.
+ *
+ * Return value: TRUE if it succeeded, FALSE otherwise.
+ **/
+gboolean
+gdk_gl_config_get_attrib (GdkGLConfig *glconfig,
+ int attribute,
+ int *value)
+{
+#if 1
+ GdkGLConfigImplQuartz *impl;
+ NSOpenGLPixelFormat *lPixelFormat;
+ GLint lScreen=0;
+ NSOpenGLPixelFormatAttribute attrib;
+ g_return_val_if_fail (GDK_IS_GL_CONFIG_IMPL_QUARTZ(glconfig), FALSE);
+
+ impl = GDK_GL_CONFIG_IMPL_QUARTZ (glconfig);
+ lPixelFormat = impl->quartzPixelFormat;
+ switch (attribute)
+ {
+ case GDK_GL_USE_GL:
+ case GDK_GL_RGBA:
+ *value = 1;
+ return TRUE;
+ break;
+ case GDK_GL_BUFFER_SIZE:
+ attrib = NSOpenGLPFAColorSize;
+ break;
+ case GDK_GL_DOUBLEBUFFER:
+ attrib = NSOpenGLPFADoubleBuffer;
+ break;
+ case GDK_GL_STEREO:
+ attrib = NSOpenGLPFAStereo;
+ break;
+ case GDK_GL_AUX_BUFFERS:
+ attrib = NSOpenGLPFAAuxBuffers;
+ break;
+ case GDK_GL_DEPTH_SIZE:
+ attrib = NSOpenGLPFADepthSize;
+ break;
+ case GDK_GL_STENCIL_SIZE:
+ attrib = NSOpenGLPFAStencilSize;
+ break;
+ case GDK_GL_ALPHA_SIZE:
+ attrib = NSOpenGLPFAAlphaSize;
+ break;
+ case GDK_GL_RED_SIZE:
+ case GDK_GL_GREEN_SIZE:
+ case GDK_GL_BLUE_SIZE:
+ //attrib = NSOpenGLPFAColorSize;
+ *value=1;
+ return TRUE;
+ break;
+ case GDK_GL_ACCUM_RED_SIZE:
+ case GDK_GL_ACCUM_GREEN_SIZE:
+ case GDK_GL_ACCUM_BLUE_SIZE:
+ case GDK_GL_ACCUM_ALPHA_SIZE:
+ attrib = NSOpenGLPFAAccumSize;
+ break;
+ case GDK_GL_LEVEL:
+ default:
+ return FALSE;
+ }
+
+ [lPixelFormat getValues:value forAttribute:attrib forVirtualScreen:lScreen];
+ return TRUE;
+#else
+ return FALSE;
+#endif
+}
diff --git a/gdk/quartz/gdkglcontext-quartz.h b/gdk/quartz/gdkglcontext-quartz.h
new file mode 100644
index 0000000..6584b74
--- /dev/null
+++ b/gdk/quartz/gdkglcontext-quartz.h
@@ -0,0 +1,44 @@
+#ifndef __GDK_GL_CONTEXT_QUARTZ_H__
+#define __GDK_GL_CONTEXT_QUARTZ_H__
+
+#include <gdk/gdkglcontext.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GdkGLContextImplQuartz GdkGLContextImplQuartz;
+typedef struct _GdkGLContextImplQuartzClass GdkGLContextImplQuartzClass;
+
+#define GDK_TYPE_GL_CONTEXT_IMPL_QUARTZ (gdk_gl_context_impl_quartz_get_type ())
+#define GDK_GL_CONTEXT_IMPL_QUARTZ(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_GL_CONTEXT_IMPL_QUARTZ, GdkGLContextImplQuartz))
+#define GDK_GL_CONTEXT_IMPL_QUARTZ_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_GL_CONTEXT_IMPL_QUARTZ, GdkGLContextImplQuartzClass))
+#define GDK_IS_GL_CONTEXT_IMPL_QUARTZ(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_GL_CONTEXT_IMPL_QUARTZ))
+#define GDK_IS_GL_CONTEXT_IMPL_QUARTZ_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_GL_CONTEXT_IMPL_QUARTZ))
+#define GDK_GL_CONTEXT_IMPL_QUARTZ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_GL_CONTEXT_IMPL_QUARTZ, GdkGLContextImplQuartzClass))
+
+ struct _GdkGLContextImplQuartz
+ {
+ GdkGLContext parent_instance;
+
+ GdkGLContext *share_list;
+ gboolean is_direct;
+ int render_type;
+
+ GdkGLConfig *glconfig;
+
+ GdkGLDrawable *gldrawable;
+
+ NSOpenGLContext *quartzContext;
+
+ guint is_destroyed : 1;
+ };
+
+struct _GdkGLContextImplQuartzClass
+{
+ GdkGLContextClass parent_class;
+};
+
+GType gdk_gl_context_impl_quartz_get_type (void);
+
+G_END_DECLS
+
+#endif
diff --git a/gdk/quartz/gdkglcontext-quartz.m b/gdk/quartz/gdkglcontext-quartz.m
new file mode 100644
index 0000000..2e9279d
--- /dev/null
+++ b/gdk/quartz/gdkglcontext-quartz.m
@@ -0,0 +1,342 @@
+#include <gdk/gdk.h> /* for gdk_error_trap_(push|pop) () */
+
+#include "gdkglprivate-quartz.h"
+#include "gdkgldrawable.h"
+#include "gdkglconfig-quartz.h"
+#include "gdkglcontext-quartz.h"
+#include "gdkglwindow-quartz.h"
+#include "gdkglpixmap-quartz.h"
+
+static void gdk_gl_context_insert (GdkGLContext *glcontext);
+static void gdk_gl_context_remove (GdkGLContext *glcontext);
+
+static GdkGLContext *gdk_gl_context_lookup (NSOpenGLContext *quartzContext);
+
+
+static void gdk_gl_context_impl_quartz_class_init (GdkGLContextImplQuartzClass *klass);
+static void gdk_gl_context_impl_quartz_finalize (GObject *object);
+
+static gpointer parent_class = NULL;
+
+
+GType
+gdk_gl_context_impl_quartz_get_type (void)
+{
+ static GType type = 0;
+
+ if (!type)
+ {
+ static const GTypeInfo type_info = {
+ sizeof (GdkGLContextImplQuartzClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gdk_gl_context_impl_quartz_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (GdkGLContextImplQuartz),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) NULL
+ };
+
+ type = g_type_register_static (GDK_TYPE_GL_CONTEXT,
+ "GdkGLContextImplQuartz",
+ &type_info, 0);
+ }
+
+ return type;
+}
+
+static void
+gdk_gl_context_impl_quartz_class_init (GdkGLContextImplQuartzClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ object_class->finalize = gdk_gl_context_impl_quartz_finalize;
+}
+
+void
+_gdk_gl_context_destroy (GdkGLContext *glcontext)
+{
+ GdkGLContextImplQuartz *impl = GDK_GL_CONTEXT_IMPL_QUARTZ (glcontext);
+
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ if (impl->is_destroyed)
+ return;
+
+ gdk_gl_context_remove (glcontext);
+
+
+
+ if (impl->gldrawable != NULL)
+ {
+ g_object_remove_weak_pointer (G_OBJECT (impl->gldrawable),
+ (gpointer *) &(impl->gldrawable));
+ impl->gldrawable = NULL;
+ }
+
+
+ impl->is_destroyed = TRUE;
+}
+
+static void
+gdk_gl_context_impl_quartz_finalize (GObject *object)
+{
+ GdkGLContextImplQuartz *impl = GDK_GL_CONTEXT_IMPL_QUARTZ (object);
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+ [[NSNotificationCenter defaultCenter] removeObserver:impl->quartzContext];
+ [impl->quartzContext release];
+
+ _gdk_gl_context_destroy (GDK_GL_CONTEXT (object));
+
+// g_object_unref (G_OBJECT (impl->glconfig));
+
+ if (impl->share_list != NULL)
+ g_object_unref (G_OBJECT (impl->share_list));
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+
+/*
+ * GdkGLContext hash table.
+ */
+
+static GHashTable *gl_context_ht = NULL;
+
+static void
+gdk_gl_context_insert (GdkGLContext *glcontext)
+{
+ GdkGLContextImplQuartz *impl;
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+ if (gl_context_ht == NULL)
+ {
+ GDK_GL_NOTE (MISC, g_message (" -- Create GL context hash table."));
+ gl_context_ht = g_hash_table_new (g_direct_hash, g_direct_equal);
+ }
+ impl = GDK_GL_CONTEXT_IMPL_QUARTZ (glcontext);
+
+ g_hash_table_insert (gl_context_ht, impl->quartzContext, glcontext);
+}
+
+
+static void
+gdk_gl_context_remove (GdkGLContext *glcontext)
+{
+ GdkGLContextImplQuartz *impl;
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ if (gl_context_ht == NULL)
+ return;
+
+ impl = GDK_GL_CONTEXT_IMPL_QUARTZ (glcontext);
+
+ g_hash_table_remove (gl_context_ht, impl->quartzContext);
+
+ if (g_hash_table_size (gl_context_ht) == 0)
+ {
+ GDK_GL_NOTE (MISC, g_message (" -- Destroy GL context hash table."));
+ g_hash_table_destroy (gl_context_ht);
+ gl_context_ht = NULL;
+ }
+}
+
+
+GdkGLDrawable *gdk_gl_context_get_gl_drawable (GdkGLContext *glcontext)
+{
+ g_return_val_if_fail (GDK_IS_GL_CONTEXT_IMPL_QUARTZ (glcontext), NULL);
+
+ return GDK_GL_CONTEXT_IMPL_QUARTZ (glcontext)->gldrawable;
+}
+
+GdkGLContext *
+gdk_gl_context_get_current (void)
+{
+
+ static GdkGLContext *current = NULL;
+ NSOpenGLContext *quartzContext;
+
+ GDK_GL_NOTE_FUNC ();
+
+ quartzContext = [NSOpenGLContext currentContext];
+
+ if (quartzContext == NULL)
+ return NULL;
+
+ if (current && GDK_GL_CONTEXT_IMPL_QUARTZ(current)->quartzContext == quartzContext)
+ return current;
+
+ current = gdk_gl_context_lookup (quartzContext);
+
+ return current;
+}
+
+static GdkGLContext *
+gdk_gl_context_new_common (GdkGLConfig *glconfig,
+ GdkGLContext *share_list,
+ int render_type,
+ NSOpenGLContext *quartzContext
+ )
+{
+ GdkGLContext *glcontext;
+ GdkGLContextImplQuartz *impl;
+
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ /*
+ * Instantiate the GdkGLContextImplX11 object.
+ */
+
+ glcontext = g_object_new (GDK_TYPE_GL_CONTEXT_IMPL_QUARTZ, NULL);
+ impl = GDK_GL_CONTEXT_IMPL_QUARTZ (glcontext);
+ impl->quartzContext = quartzContext;
+
+ if (share_list != NULL && GDK_IS_GL_CONTEXT (share_list))
+ {
+ impl->share_list = share_list;
+ g_object_ref (G_OBJECT (impl->share_list));
+ }
+ else
+ {
+ impl->share_list = NULL;
+ }
+
+ return glcontext;
+}
+
+
+/*< private >*/
+GdkGLContext *_gdk_quartz_gl_context_pixmap_new (GdkGLDrawable *gldrawable,
+ GdkGLContext *share_list,
+ gboolean direct,
+ int render_type)
+{
+ GdkGLConfig *glconfig;
+ GdkGLContextImplQuartz *share_impl = NULL;
+ NSOpenGLContext *quartzContext;
+ static NSOpenGLPixelFormatAttribute attribs[] = {NSOpenGLPFAOffScreen,
+ NSOpenGLPFADepthSize , 1,
+ NSOpenGLPFAColorSize, 24,
+ NSOpenGLPFAAlphaSize, 8,
+ 0};
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+ NSOpenGLPixelFormat *quartzPixelFormat;
+ /*
+ * Create an OpenGL rendering context.
+ */
+
+ glconfig = gdk_gl_drawable_get_gl_config (gldrawable);
+
+
+ if (share_list != NULL && GDK_IS_GL_CONTEXT (share_list))
+ {
+ share_impl = GDK_GL_CONTEXT_IMPL_QUARTZ (share_list);
+ }
+
+ //if (glconfig != NULL && GDK_IS_GL_CONFIG_IMPL_QUARTZ(glconfig))
+// {
+// GdkGLConfigImplQuartz *glQuartzConfig = GDK_GL_CONFIG_IMPL_QUARTZ(glconfig) ;
+// quartzPixelFormat = glQuartzConfig -> quartzPixelFormat;
+// }
+// else
+
+ quartzPixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attribs] autorelease];
+
+ quartzContext = [[NSOpenGLContext alloc] initWithFormat:quartzPixelFormat shareContext:nil];
+
+ if(GDK_IS_GL_PIXMAP_IMPL_QUARTZ(gldrawable))
+ {
+ GdkGLPixmapImplQuartz *pixmapQuartz=GDK_GL_PIXMAP_IMPL_QUARTZ (gldrawable);
+ GdkPixbuf *pixbuf=pixmapQuartz->glPixbuf;
+
+ pixmapQuartz->quartzContext = quartzContext;
+
+ [quartzContext setOffScreen:gdk_pixbuf_get_pixels(pixbuf)
+ width:gdk_pixbuf_get_width(pixbuf)
+ height:gdk_pixbuf_get_height(pixbuf)
+ rowbytes:gdk_pixbuf_get_rowstride(pixbuf)];
+ }
+
+
+ return gdk_gl_context_new_common (glconfig,
+ share_list,
+ render_type,
+ quartzContext
+ );
+
+}
+
+GdkGLContext *
+_gdk_quartz_gl_context_window_new (GdkGLDrawable *gldrawable,
+ GdkGLContext *share_list,
+ gboolean direct,
+ int render_type)
+{
+ GdkGLConfig *glconfig;
+ GdkGLContextImplQuartz *share_impl = NULL;
+ NSOpenGLContext *quartzContext;
+ NSOpenGLPixelFormatAttribute attribs[] = {0};
+ NSView *quartzView;
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+ NSOpenGLPixelFormat *quartzPixelFormat;
+ /*
+ * Create an OpenGL rendering context.
+ */
+
+ glconfig = gdk_gl_drawable_get_gl_config (gldrawable);
+
+
+ if (share_list != NULL && GDK_IS_GL_CONTEXT (share_list))
+ {
+ share_impl = GDK_GL_CONTEXT_IMPL_QUARTZ (share_list);
+ }
+
+ if (glconfig != NULL && GDK_IS_GL_CONFIG_IMPL_QUARTZ(glconfig))
+ {
+ GdkGLConfigImplQuartz *glQuartzConfig = GDK_GL_CONFIG_IMPL_QUARTZ(glconfig) ;
+ quartzPixelFormat = glQuartzConfig -> quartzPixelFormat;
+ }
+ else quartzPixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attribs] autorelease];
+
+ quartzContext = [[NSOpenGLContext alloc] initWithFormat:quartzPixelFormat shareContext:nil];
+
+ if(GDK_IS_GL_WINDOW_IMPL_QUARTZ(gldrawable))
+ {
+ GDK_GL_WINDOW_IMPL_QUARTZ (gldrawable)->quartzContext = quartzContext;
+ quartzView = GDK_GL_WINDOW_IMPL_QUARTZ (gldrawable)->quartzView;
+ [[NSNotificationCenter defaultCenter]
+ addObserver:quartzContext
+ selector: @selector(update)
+ name: NSViewFrameDidChangeNotification
+ object:quartzView
+ ];
+
+ }
+
+
+ return gdk_gl_context_new_common (glconfig,
+ share_list,
+ render_type,
+ quartzContext
+ );
+}
+
+static GdkGLContext *
+gdk_gl_context_lookup (NSOpenGLContext *glxcontext)
+{
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ if (gl_context_ht == NULL)
+ return NULL;
+
+ return g_hash_table_lookup (gl_context_ht, &glxcontext);
+}
diff --git a/gdk/quartz/gdkgldrawable-quartz.m b/gdk/quartz/gdkgldrawable-quartz.m
new file mode 100644
index 0000000..f45ff67
--- /dev/null
+++ b/gdk/quartz/gdkgldrawable-quartz.m
@@ -0,0 +1,16 @@
+#include "gdkglprivate-quartz.h"
+#include <OpenGL/gl.h>
+
+/*< private >*/
+void
+_gdk_gl_drawable_impl_quartz_wait_gl (GdkGLDrawable *gldrawable)
+{
+ glFinish ();
+}
+
+/*< private >*/
+void
+_gdk_gl_drawable_impl_quartz_wait_gdk (GdkGLDrawable *gldrawable)
+{
+
+}
diff --git a/gdk/quartz/gdkglpixmap-quartz.h b/gdk/quartz/gdkglpixmap-quartz.h
new file mode 100644
index 0000000..05e7e8b
--- /dev/null
+++ b/gdk/quartz/gdkglpixmap-quartz.h
@@ -0,0 +1,49 @@
+#ifndef __GDK_GL_PIXMAP_QUARTZ_H__
+#define __GDK_GL_PIXMAP_QUARTZ_H__
+
+#include <gdk/gdkglpixmap.h>
+#include <gdk/quartz/gdkglquartz.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GdkGLPixmapImplQuartz GdkGLPixmapImplQuartz;
+typedef struct _GdkGLPixmapImplQuartzClass GdkGLPixmapImplQuartzClass;
+
+#define GDK_TYPE_GL_PIXMAP_IMPL_QUARTZ (gdk_gl_pixmap_impl_quartz_get_type ())
+#define GDK_GL_PIXMAP_IMPL_QUARTZ(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_GL_PIXMAP_IMPL_QUARTZ, GdkGLPixmapImplQuartz))
+#define GDK_GL_PIXMAP_IMPL_QUARTZ_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_GL_PIXMAP_IMPL_QUARTZ, GdkGLPixmapImplQuartzClass))
+#define GDK_IS_GL_PIXMAP_IMPL_QUARTZ(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_GL_PIXMAP_IMPL_QUARTZ))
+#define GDK_IS_GL_PIXMAP_IMPL_QUARTZ_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_GL_PIXMAP_IMPL_QUARTZ))
+#define GDK_GL_PIXMAP_IMPL_QUARTZ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_GL_PIXMAP_IMPL_QUARTZ, GdkGLPixmapImplQuartzClass))
+
+struct _GdkGLPixmapImplQuartz
+ {
+ GdkGLPixmap parent_instance;
+
+// GdkPixmap *bufPixmap;
+ NSOpenGLContext *quartzContext;
+
+// int width;
+// int height;
+// int depth;
+
+ GdkPixbuf *glPixbuf;
+
+ GdkGLConfig *glconfig;
+
+
+ guint is_destroyed : 1;
+ };
+
+struct _GdkGLPixmapImplQuartzClass
+{
+ GdkGLPixmapClass parent_class;
+};
+
+GType gdk_gl_pixmap_impl_quartz_get_type (void);
+
+
+G_END_DECLS
+
+
+#endif
diff --git a/gdk/quartz/gdkglpixmap-quartz.m b/gdk/quartz/gdkglpixmap-quartz.m
new file mode 100644
index 0000000..2284d10
--- /dev/null
+++ b/gdk/quartz/gdkglpixmap-quartz.m
@@ -0,0 +1,305 @@
+#include "gdkglprivate-quartz.h"
+#include "gdkglconfig-quartz.h"
+#include "gdkglcontext-quartz.h"
+#include "gdkglpixmap-quartz.h"
+
+static void gdk_gl_pixmap_sync_gl (GdkGLPixmap *glpixmap);
+static void gdk_gl_pixmap_sync_buffers (GdkGLPixmap *glpixmap);
+static void gdk_gl_pixmap_sync_gdk (GdkGLPixmap *glpixmap);
+
+
+static gboolean gdk_gl_pixmap_impl_quartz_make_context_current (GdkGLDrawable *draw,
+ GdkGLDrawable *read,
+ GdkGLContext *glcontext);
+static gboolean gdk_gl_pixmap_impl_quartz_is_double_buffered (GdkGLDrawable *gldrawable);
+static void gdk_gl_pixmap_impl_quartz_swap_buffers (GdkGLDrawable *gldrawable);
+
+static void gdk_gl_pixmap_impl_quartz_wait_gl (GdkGLDrawable *gldrawable);
+static void gdk_gl_pixmap_impl_quartz_wait_gdk (GdkGLDrawable *gldrawable);
+
+static gboolean gdk_gl_pixmap_impl_quartz_gl_begin (GdkGLDrawable *draw,
+ GdkGLDrawable *read,
+ GdkGLContext *glcontext);
+static void gdk_gl_pixmap_impl_quartz_gl_end (GdkGLDrawable *gldrawable);
+static GdkGLConfig *gdk_gl_pixmap_impl_quartz_get_gl_config (GdkGLDrawable *gldrawable);
+
+static void gdk_gl_pixmap_impl_quartz_class_init (GdkGLPixmapImplQuartzClass *klass);
+static void gdk_gl_pixmap_impl_quartz_finalize (GObject *object);
+static void gdk_gl_pixmap_impl_quartz_gl_drawable_interface_init (GdkGLDrawableClass *iface);
+
+static gpointer parent_class = NULL;
+
+GType
+gdk_gl_pixmap_impl_quartz_get_type (void)
+{
+ static GType type = 0;
+
+ if (!type)
+ {
+ static const GTypeInfo type_info = {
+ sizeof (GdkGLPixmapImplQuartzClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gdk_gl_pixmap_impl_quartz_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (GdkGLPixmapImplQuartz),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) NULL
+ };
+ static const GInterfaceInfo gl_drawable_interface_info = {
+ (GInterfaceInitFunc) gdk_gl_pixmap_impl_quartz_gl_drawable_interface_init,
+ (GInterfaceFinalizeFunc) NULL,
+ NULL /* interface_data */
+ };
+
+ type = g_type_register_static (GDK_TYPE_GL_PIXMAP,
+ "GdkGLPixmapImplQuartz",
+ &type_info, 0);
+ g_type_add_interface_static (type,
+ GDK_TYPE_GL_DRAWABLE,
+ &gl_drawable_interface_info);
+ }
+
+ return type;
+}
+
+static void
+gdk_gl_pixmap_impl_quartz_class_init (GdkGLPixmapImplQuartzClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ object_class->finalize = gdk_gl_pixmap_impl_quartz_finalize;
+}
+
+void
+_gdk_gl_pixmap_destroy (GdkGLPixmap *glpixmap)
+{
+ GdkGLPixmapImplQuartz *impl = GDK_GL_PIXMAP_IMPL_QUARTZ (glpixmap);
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ if (impl->is_destroyed)
+ return;
+
+ impl->is_destroyed = TRUE;
+}
+
+static void
+gdk_gl_pixmap_impl_quartz_finalize (GObject *object)
+{
+ GdkGLPixmapImplQuartz *impl = GDK_GL_PIXMAP_IMPL_QUARTZ (object);
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ _gdk_gl_pixmap_destroy (GDK_GL_PIXMAP (object));
+
+ g_object_unref (G_OBJECT (impl->glconfig));
+
+ g_object_unref (G_OBJECT (impl->glPixbuf));
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gdk_gl_pixmap_impl_quartz_gl_drawable_interface_init (GdkGLDrawableClass *iface)
+{
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ iface->create_new_context = _gdk_quartz_gl_context_pixmap_new;
+ iface->make_context_current = gdk_gl_pixmap_impl_quartz_make_context_current;
+ iface->is_double_buffered = gdk_gl_pixmap_impl_quartz_is_double_buffered;
+ iface->swap_buffers = gdk_gl_pixmap_impl_quartz_swap_buffers;
+ iface->wait_gl = gdk_gl_pixmap_impl_quartz_wait_gl;
+ iface->wait_gdk = gdk_gl_pixmap_impl_quartz_wait_gdk;
+ iface->gl_begin = gdk_gl_pixmap_impl_quartz_make_context_current;
+ iface->gl_end = gdk_gl_pixmap_impl_quartz_gl_end;
+ iface->get_gl_config = gdk_gl_pixmap_impl_quartz_get_gl_config;
+ iface->get_size = _gdk_gl_pixmap_get_size;
+}
+
+GdkGLPixmap *
+gdk_gl_pixmap_new (GdkGLConfig *glconfig,
+ GdkPixmap *pixmap,
+ const int *attrib_list)
+{
+ GdkGLPixmap *glpixmap;
+ GdkGLPixmapImplQuartz *impl;
+
+ gint width, height;
+// gint depth;
+
+
+ GDK_GL_NOTE_FUNC ();
+
+ g_return_val_if_fail (GDK_IS_GL_CONFIG_IMPL_QUARTZ (glconfig), NULL);
+ g_return_val_if_fail (GDK_IS_PIXMAP (pixmap), NULL);
+
+ /*
+ * Create offscreen rendering area.
+ */
+
+ gdk_drawable_get_size (GDK_DRAWABLE (pixmap), &width, &height);
+
+// depth = gdk_drawable_get_depth (GDK_DRAWABLE (pixmap));
+// if(depth != 32) goto FAIL;
+// depth = 32;
+
+ glpixmap = g_object_new (GDK_TYPE_GL_PIXMAP_IMPL_QUARTZ, NULL);
+ impl = GDK_GL_PIXMAP_IMPL_QUARTZ (glpixmap);
+
+ glpixmap->drawable = GDK_DRAWABLE (pixmap);
+ g_object_add_weak_pointer (G_OBJECT (glpixmap->drawable),
+ (gpointer *) &(glpixmap->drawable));
+
+
+ impl->glPixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width, height);
+
+// impl->width = width;
+// impl->height = height;
+// impl->depth = depth;
+// impl->bufPixmap = pixmap;
+
+ impl->glconfig = glconfig;
+ g_object_ref (G_OBJECT (impl->glconfig));
+
+ impl->is_destroyed = FALSE;
+
+ return glpixmap;
+
+FAIL:
+
+ return NULL;
+}
+
+static gboolean
+gdk_gl_pixmap_impl_quartz_make_context_current (GdkGLDrawable *draw,
+ GdkGLDrawable *read,
+ GdkGLContext *glcontext)
+{
+ NSOpenGLContext *quartzContext = GDK_GL_CONTEXT_IMPL_QUARTZ(glcontext)->quartzContext;
+ GdkGLPixmapImplQuartz *impl = GDK_GL_PIXMAP_IMPL_QUARTZ(draw);
+ GdkPixbuf *pixbuf = impl->glPixbuf;
+ impl->quartzContext = quartzContext;
+
+
+ [quartzContext setOffScreen:gdk_pixbuf_get_pixels(pixbuf)
+ width:gdk_pixbuf_get_width(pixbuf)
+ height:gdk_pixbuf_get_height(pixbuf)
+ rowbytes:gdk_pixbuf_get_rowstride(pixbuf)];
+
+ [quartzContext makeCurrentContext];
+ return TRUE;
+}
+
+static gboolean
+gdk_gl_pixmap_impl_quartz_is_double_buffered (GdkGLDrawable *gldrawable)
+{
+ g_return_val_if_fail (GDK_IS_GL_PIXMAP_IMPL_QUARTZ (gldrawable), FALSE);
+
+ return gdk_gl_config_is_double_buffered (GDK_GL_PIXMAP_IMPL_QUARTZ (gldrawable)->glconfig);
+}
+
+static void
+gdk_gl_pixmap_impl_quartz_swap_buffers (GdkGLDrawable *gldrawable)
+{
+
+ NSOpenGLContext *quartzContext=GDK_GL_PIXMAP_IMPL_QUARTZ (gldrawable)->quartzContext;
+ [quartzContext flushBuffer];
+
+}
+
+static void gdk_gl_pixmap_sync_buffers (GdkGLPixmap *glpixmap)
+{
+// GdkPixmap *pixmap = glpixmap->drawable;
+ GdkPixbuf *pixbuf = GDK_GL_PIXMAP_IMPL_QUARTZ (glpixmap)->glPixbuf;
+// gint width, height;
+ gint pwidth, pheight;
+ NSOpenGLContext *quartzContext=GDK_GL_PIXMAP_IMPL_QUARTZ (glpixmap)->quartzContext;
+
+// gdk_drawable_get_size (GDK_DRAWABLE (pixmap), &width, &height);
+
+ pwidth = gdk_pixbuf_get_width(pixbuf);
+ pheight = gdk_pixbuf_get_height(pixbuf);
+
+// if(pwidth==width && pheight==height) return;
+
+// g_object_unref (G_OBJECT (pixbuf));
+// pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width, height);
+// GDK_GL_PIXMAP_IMPL_QUARTZ (glpixmap)->glPixbuf = pixbuf;
+
+ [quartzContext setOffScreen:gdk_pixbuf_get_pixels(pixbuf)
+ width:pwidth
+ height:pheight
+ rowbytes:gdk_pixbuf_get_rowstride(pixbuf)];
+}
+
+static void gdk_gl_pixmap_sync_gl (GdkGLPixmap *glpixmap)
+{
+ GdkPixmap *pixmap = glpixmap->drawable;
+ GdkPixbuf *pixbuf = GDK_GL_PIXMAP_IMPL_QUARTZ (glpixmap)->glPixbuf;
+
+
+ gdk_draw_pixbuf(pixmap,
+ NULL,
+ pixbuf,
+ 0, 0,
+ 0 , 0,
+ gdk_pixbuf_get_width(pixbuf),
+ gdk_pixbuf_get_height(pixbuf),
+ GDK_RGB_DITHER_NORMAL,
+ 0, 0);
+}
+
+static void gdk_gl_pixmap_sync_gdk (GdkGLPixmap *glpixmap)
+{
+ gdk_gl_pixmap_sync_gl (glpixmap);
+}
+
+static void gdk_gl_pixmap_impl_quartz_wait_gl (GdkGLDrawable *gldrawable)
+{
+ glFinish ();
+
+ /* Sync. */
+ gdk_gl_pixmap_sync_gl (GDK_GL_PIXMAP (gldrawable));
+}
+static void gdk_gl_pixmap_impl_quartz_wait_gdk (GdkGLDrawable *gldrawable)
+{
+
+// gdk_gl_pixmap_sync_buffers( GDK_GL_PIXMAP(gldrawable));
+}
+
+static gboolean
+ gdk_gl_pixmap_impl_quartz_gl_begin (GdkGLDrawable *draw,
+ GdkGLDrawable *read,
+ GdkGLContext *glcontext)
+{
+ gboolean ret;
+
+ ret = gdk_gl_pixmap_impl_quartz_make_context_current (draw, read, glcontext);
+ if (!ret)
+ return FALSE;
+
+ gdk_gl_pixmap_impl_quartz_wait_gdk (draw);
+
+ return TRUE;
+}
+
+
+static void
+gdk_gl_pixmap_impl_quartz_gl_end (GdkGLDrawable *gldrawable)
+{
+ gdk_gl_pixmap_impl_quartz_wait_gl (gldrawable);
+}
+
+static GdkGLConfig *
+gdk_gl_pixmap_impl_quartz_get_gl_config (GdkGLDrawable *gldrawable)
+{
+ g_return_val_if_fail (GDK_IS_GL_PIXMAP_IMPL_QUARTZ (gldrawable), NULL);
+
+ return GDK_GL_PIXMAP_IMPL_QUARTZ (gldrawable)->glconfig;
+}
diff --git a/gdk/quartz/gdkglprivate-quartz.h b/gdk/quartz/gdkglprivate-quartz.h
new file mode 100644
index 0000000..6b11da7
--- /dev/null
+++ b/gdk/quartz/gdkglprivate-quartz.h
@@ -0,0 +1,26 @@
+#ifndef __GDK_GL_PRIVATE_QUARTZ_H__
+#define __GDK_GL_PRIVATE_QUARTZ_H__
+
+#include <gdk/gdkprivate.h>
+
+#include <gdk/gdkglprivate.h>
+
+
+G_BEGIN_DECLS
+
+GdkGLContext *_gdk_quartz_gl_context_window_new (GdkGLDrawable *gldrawable,
+ GdkGLContext *share_list,
+ gboolean direct,
+ int render_type);
+
+GdkGLContext *_gdk_quartz_gl_context_pixmap_new (GdkGLDrawable *gldrawable,
+ GdkGLContext *share_list,
+ gboolean direct,
+ int render_type);
+
+void _gdk_gl_drawable_impl_quartz_wait_gl (GdkGLDrawable *gldrawable);
+void _gdk_gl_drawable_impl_quartz_wait_gdk (GdkGLDrawable *gldrawable);
+
+G_BEGIN_DECLS
+
+#endif /* __GDK_GL_PRIVATE_QUARTZ_H__ */
diff --git a/gdk/quartz/gdkglquartz.h b/gdk/quartz/gdkglquartz.h
new file mode 100644
index 0000000..8330ed1
--- /dev/null
+++ b/gdk/quartz/gdkglquartz.h
@@ -0,0 +1,9 @@
+
+#ifndef __GDK_GL_X_H__
+#define __GDK_GL_X_H__
+
+#include <gdk/gdkquartz.h>
+
+#include <OpenGL/gl.h>
+
+#endif
\ No newline at end of file
diff --git a/gdk/quartz/gdkglquery-quartz.m b/gdk/quartz/gdkglquery-quartz.m
new file mode 100644
index 0000000..55b7045
--- /dev/null
+++ b/gdk/quartz/gdkglquery-quartz.m
@@ -0,0 +1,214 @@
+/* GdkGLExt - OpenGL Extension to GDK
+ * Copyright (C) 2002-2004 Naofumi Yasufuku
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <string.h>
+
+#include <mach-o/dyld.h>
+
+#include "gdkglquartz.h"
+#include "gdkglprivate-quartz.h"
+#include "gdkglconfig-quartz.h"
+#include "gdkglquery.h"
+
+#ifdef GDKGLEXT_MULTIHEAD_SUPPORT
+#include <gdk/gdkdisplay.h>
+#endif /* GDKGLEXT_MULTIHEAD_SUPPORT */
+
+/**
+ * gdk_gl_query_extension:
+ *
+ * Indicates whether the window system supports the OpenGL extension
+ * (GLX, WGL, etc.).
+ *
+ * Return value: TRUE if OpenGL is supported, FALSE otherwise.
+ **/
+gboolean
+gdk_gl_query_extension (void)
+{
+ return TRUE;
+}
+
+
+/**
+ * gdk_gl_query_extension_for_display:
+ * @display: the #GdkDisplay where the query is sent to.
+ *
+ * Indicates whether the window system supports the OpenGL extension
+ * (GLX, WGL, etc.).
+ *
+ * Return value: TRUE if OpenGL is supported, FALSE otherwise.
+ **/
+gboolean
+gdk_gl_query_extension_for_display (GdkDisplay *display)
+{
+ return TRUE;
+}
+
+
+/**
+ * gdk_gl_query_version:
+ * @major: returns the major version number of the OpenGL extension.
+ * @minor: returns the minor version number of the OpenGL extension.
+ *
+ * Returns the version numbers of the OpenGL extension to the window system.
+ *
+ * In the X Window System, it returns the GLX version.
+ *
+ * In the Microsoft Windows, it returns the Windows version.
+ *
+ * Return value: FALSE if it fails, TRUE otherwise.
+ **/
+gboolean
+gdk_gl_query_version (int *major,
+ int *minor)
+{
+ *major = 1;
+ *minor = 0;
+ return TRUE;
+}
+
+
+/**
+ * gdk_gl_query_version_for_display:
+ * @display: the #GdkDisplay where the query is sent to.
+ * @major: returns the major version number of the OpenGL extension.
+ * @minor: returns the minor version number of the OpenGL extension.
+ *
+ * Returns the version numbers of the OpenGL extension to the window system.
+ *
+ * In the X Window System, it returns the GLX version.
+ *
+ * In the Microsoft Windows, it returns the Windows version.
+ *
+ * Return value: FALSE if it fails, TRUE otherwise.
+ **/
+gboolean
+gdk_gl_query_version_for_display (GdkDisplay *display,
+ int *major,
+ int *minor)
+{
+ *major = 1;
+ *minor = 0;
+ return TRUE;
+}
+
+
+
+
+/**
+ * gdk_gl_get_proc_address:
+ * @proc_name: function name.
+ *
+ * Returns the address of the OpenGL, GLU, or GLX function.
+ *
+ * Return value: the address of the function named by @proc_name.
+ **/
+
+
+
+#define _GDK_GL_LIBGL_PATH "/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib"
+#define _GDK_GL_LIBGLU_PATH "/System/Library/Frameworks/OpenGL.framework/Libraries/libGLU.dylib"
+
+GdkGLProc
+gdk_gl_get_proc_address (const char *proc_name)
+{
+ const char *image_name;
+ static const struct mach_header *libgl_image = NULL;
+ static const struct mach_header *libglu_image = NULL;
+ NSSymbol symbol;
+ char *symbol_name;
+
+
+ GDK_GL_NOTE_FUNC ();
+
+ if (strncmp ("glu", proc_name, 3) != 0)
+ {
+ /* libGL */
+
+ if (libgl_image == NULL)
+ {
+ image_name = g_getenv ("GDK_GL_LIBGL_PATH");
+ if (image_name == NULL)
+ image_name = _GDK_GL_LIBGL_PATH;
+
+ GDK_GL_NOTE (MISC, g_message (" - Add Mach-O image %s", image_name));
+
+ libgl_image = NSAddImage (image_name, NSADDIMAGE_OPTION_RETURN_ON_ERROR);
+ if (libgl_image == NULL)
+ {
+ g_warning ("Cannot add Mach-O image %s", image_name);
+ return NULL;
+ }
+ }
+
+
+
+
+ /* Try Mach-O dyld */
+
+ symbol_name = g_strconcat ("_", proc_name, NULL);
+
+ symbol = NSLookupSymbolInImage (libgl_image,
+ symbol_name,
+ NSLOOKUPSYMBOLINIMAGE_OPTION_BIND |
+ NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
+ GDK_GL_NOTE (MISC, g_message (" - NSLookupSymbolInImage () - %s",
+ symbol ? "succeeded" : "failed"));
+
+ g_free (symbol_name);
+
+ if (symbol != NULL)
+ return NSAddressOfSymbol (symbol);
+ }
+ else
+ {
+ /* libGLU */
+
+ if (libglu_image == NULL)
+ {
+ image_name = g_getenv ("GDK_GL_LIBGLU_PATH");
+ if (image_name == NULL)
+ image_name = _GDK_GL_LIBGLU_PATH;
+
+ GDK_GL_NOTE (MISC, g_message (" - Add Mach-O image %s", image_name));
+
+ libglu_image = NSAddImage (image_name, NSADDIMAGE_OPTION_RETURN_ON_ERROR);
+ if (libglu_image == NULL)
+ {
+ g_warning ("Cannot add Mach-O image %s", image_name);
+ return NULL;
+ }
+ }
+
+ symbol_name = g_strconcat ("_", proc_name, NULL);
+
+ symbol = NSLookupSymbolInImage (libglu_image,
+ symbol_name,
+ NSLOOKUPSYMBOLINIMAGE_OPTION_BIND |
+ NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
+ GDK_GL_NOTE (MISC, g_message (" - NSLookupSymbolInImage () - %s",
+ symbol ? "succeeded" : "failed"));
+
+ g_free (symbol_name);
+
+ if (symbol != NULL)
+ return NSAddressOfSymbol (symbol);
+ }
+
+ return NULL;
+}
diff --git a/gdk/quartz/gdkglwindow-quartz.h b/gdk/quartz/gdkglwindow-quartz.h
new file mode 100644
index 0000000..d95d7c3
--- /dev/null
+++ b/gdk/quartz/gdkglwindow-quartz.h
@@ -0,0 +1,41 @@
+#ifndef __GDK_GL_WINDOW_QUARTZ_H__
+#define __GDK_GL_WINDOW_QUARTZ_H__
+
+#include <gdk/gdkglwindow.h>
+#include <gdk/quartz/gdkglquartz.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GdkGLWindowImplQuartz GdkGLWindowImplQuartz;
+typedef struct _GdkGLWindowImplQuartzClass GdkGLWindowImplQuartzClass;
+
+#define GDK_TYPE_GL_WINDOW_IMPL_QUARTZ (gdk_gl_window_impl_quartz_get_type ())
+#define GDK_GL_WINDOW_IMPL_QUARTZ(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_GL_WINDOW_IMPL_QUARTZ, GdkGLWindowImplQuartz))
+#define GDK_GL_WINDOW_IMPL_QUARTZ_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_GL_WINDOW_IMPL_QUARTZ, GdkGLWindowImplQuartzClass))
+#define GDK_IS_GL_WINDOW_IMPL_QUARTZ(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_GL_WINDOW_IMPL_QUARTZ))
+#define GDK_IS_GL_WINDOW_IMPL_QUARTZ_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_GL_WINDOW_IMPL_QUARTZ))
+#define GDK_GL_WINDOW_IMPL_QUARTZ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_GL_WINDOW_IMPL_QUARTZ, GdkGLWindowImplQuartzClass))
+
+struct _GdkGLWindowImplQuartz
+{
+ GdkGLWindow parent_instance;
+
+ NSView *quartzView;
+ NSOpenGLContext *quartzContext;
+
+ GdkGLConfig *glconfig;
+
+ guint is_destroyed : 1;
+};
+
+struct _GdkGLWindowImplQuartzClass
+{
+ GdkGLWindowClass parent_class;
+};
+
+GType gdk_gl_window_impl_quartz_get_type (void);
+
+G_END_DECLS
+
+
+#endif
diff --git a/gdk/quartz/gdkglwindow-quartz.m b/gdk/quartz/gdkglwindow-quartz.m
new file mode 100644
index 0000000..c47baab
--- /dev/null
+++ b/gdk/quartz/gdkglwindow-quartz.m
@@ -0,0 +1,204 @@
+#include "gdkglprivate-quartz.h"
+#include "gdkglconfig-quartz.h"
+#include "gdkglcontext-quartz.h"
+#include "gdkglwindow-quartz.h"
+
+#include <gdk/gdkglquery.h>
+
+static gboolean gdk_gl_window_impl_quartz_make_context_current (GdkGLDrawable *draw,
+ GdkGLDrawable *read,
+ GdkGLContext *glcontext);
+static gboolean gdk_gl_window_impl_quartz_is_double_buffered (GdkGLDrawable *gldrawable);
+static void gdk_gl_window_impl_quartz_swap_buffers (GdkGLDrawable *gldrawable);
+
+static gboolean gdk_gl_window_impl_quartz_gl_begin (GdkGLDrawable *draw,
+ GdkGLDrawable *read,
+ GdkGLContext *glcontext);
+
+static void gdk_gl_window_impl_quartz_gl_end (GdkGLDrawable *gldrawable);
+static GdkGLConfig *gdk_gl_window_impl_quartz_get_gl_config (GdkGLDrawable *gldrawable);
+
+static void gdk_gl_window_impl_quartz_class_init (GdkGLWindowImplQuartzClass *klass);
+static void gdk_gl_window_impl_quartz_finalize (GObject *object);
+static void gdk_gl_window_impl_quartz_gl_drawable_interface_init (GdkGLDrawableClass *iface);
+
+static gpointer parent_class = NULL;
+
+GType
+gdk_gl_window_impl_quartz_get_type (void)
+{
+ static GType type = 0;
+
+ if (!type)
+ {
+ static const GTypeInfo type_info = {
+ sizeof (GdkGLWindowImplQuartzClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gdk_gl_window_impl_quartz_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (GdkGLWindowImplQuartz),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) NULL
+ };
+ static const GInterfaceInfo gl_drawable_interface_info = {
+ (GInterfaceInitFunc) gdk_gl_window_impl_quartz_gl_drawable_interface_init,
+ (GInterfaceFinalizeFunc) NULL,
+ NULL /* interface_data */
+ };
+
+ type = g_type_register_static (GDK_TYPE_GL_WINDOW,
+ "GdkGLWindowImplQuartz",
+ &type_info, 0);
+ g_type_add_interface_static (type,
+ GDK_TYPE_GL_DRAWABLE,
+ &gl_drawable_interface_info);
+ }
+
+ return type;
+}
+
+static void
+gdk_gl_window_impl_quartz_class_init (GdkGLWindowImplQuartzClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ object_class->finalize = gdk_gl_window_impl_quartz_finalize;
+}
+
+void
+_gdk_gl_window_destroy (GdkGLWindow *glwindow)
+{
+ GdkGLWindowImplQuartz *impl = GDK_GL_WINDOW_IMPL_QUARTZ (glwindow);
+
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ if (impl->is_destroyed)
+ return;
+
+ impl->is_destroyed = TRUE;
+}
+
+static void
+gdk_gl_window_impl_quartz_finalize (GObject *object)
+{
+ GdkGLWindowImplQuartz *impl = GDK_GL_WINDOW_IMPL_QUARTZ (object);
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ _gdk_gl_window_destroy (GDK_GL_WINDOW (object));
+
+ g_object_unref (G_OBJECT (impl->glconfig));
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gdk_gl_window_impl_quartz_gl_drawable_interface_init (GdkGLDrawableClass *iface)
+{
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ iface->create_new_context = _gdk_quartz_gl_context_window_new;
+ iface->make_context_current = gdk_gl_window_impl_quartz_make_context_current;
+ iface->is_double_buffered = gdk_gl_window_impl_quartz_is_double_buffered;
+ iface->swap_buffers = gdk_gl_window_impl_quartz_swap_buffers;
+ iface->wait_gl = _gdk_gl_drawable_impl_quartz_wait_gl;
+ iface->wait_gdk = _gdk_gl_drawable_impl_quartz_wait_gdk;
+ iface->gl_begin = gdk_gl_window_impl_quartz_gl_begin;
+ iface->gl_end = gdk_gl_window_impl_quartz_gl_end;
+ iface->get_gl_config = gdk_gl_window_impl_quartz_get_gl_config;
+ iface->get_size = _gdk_gl_window_get_size;
+}
+
+
+GdkGLWindow *
+gdk_gl_window_new (GdkGLConfig *glconfig,
+ GdkWindow *window,
+ const int *attrib_list)
+{
+ GdkGLWindow *glwindow;
+ GdkGLWindowImplQuartz *impl;
+ NSView *quartzView;
+
+ GDK_GL_NOTE_FUNC ();
+
+ g_return_val_if_fail (GDK_IS_GL_CONFIG_IMPL_QUARTZ (glconfig), NULL);
+ g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
+
+ quartzView = gdk_quartz_window_get_nsview(window);
+
+
+ glwindow = g_object_new (GDK_TYPE_GL_WINDOW_IMPL_QUARTZ, NULL);
+ impl = GDK_GL_WINDOW_IMPL_QUARTZ (glwindow);
+
+ glwindow->drawable = GDK_DRAWABLE (window);
+ g_object_add_weak_pointer (G_OBJECT (glwindow->drawable),
+ (gpointer *) &(glwindow->drawable));
+
+
+ impl->glconfig = glconfig;
+ g_object_ref (G_OBJECT (impl->glconfig));
+
+ impl->quartzView = quartzView;
+
+ impl->is_destroyed = FALSE;
+
+ return glwindow;
+}
+
+static gboolean
+gdk_gl_window_impl_quartz_is_double_buffered (GdkGLDrawable *gldrawable)
+{
+ g_return_val_if_fail (GDK_IS_GL_WINDOW_IMPL_QUARTZ (gldrawable), FALSE);
+
+ return gdk_gl_config_is_double_buffered (GDK_GL_WINDOW_IMPL_QUARTZ (gldrawable)->glconfig);
+}
+
+static void
+gdk_gl_window_impl_quartz_swap_buffers (GdkGLDrawable *gldrawable)
+{
+ NSOpenGLContext *quartzContext=GDK_GL_WINDOW_IMPL_QUARTZ (gldrawable)->quartzContext;
+ [quartzContext flushBuffer];
+}
+
+static gboolean gdk_gl_window_impl_quartz_make_context_current (GdkGLDrawable *draw,
+ GdkGLDrawable *read,
+ GdkGLContext *glcontext)
+{
+ NSOpenGLContext *quartzContext = GDK_GL_CONTEXT_IMPL_QUARTZ(glcontext)->quartzContext;
+ [quartzContext makeCurrentContext];
+ return TRUE;
+}
+
+static gboolean gdk_gl_window_impl_quartz_gl_begin (GdkGLDrawable *draw,
+ GdkGLDrawable *read,
+ GdkGLContext *glcontext)
+{
+ NSOpenGLContext *quartzContext = GDK_GL_CONTEXT_IMPL_QUARTZ(glcontext)->quartzContext;
+ NSView *view = GDK_GL_WINDOW_IMPL_QUARTZ (draw)->quartzView;
+ gboolean ret=gdk_gl_window_impl_quartz_make_context_current (draw, read, glcontext);
+ if (([quartzContext view] != view) && ![view isHidden]) {
+ [quartzContext setView:view];
+ }
+ return ret;
+}
+
+static void
+gdk_gl_window_impl_quartz_gl_end (GdkGLDrawable *gldrawable)
+{
+ /* do nothing */
+}
+
+static GdkGLConfig *
+gdk_gl_window_impl_quartz_get_gl_config (GdkGLDrawable *gldrawable)
+{
+ g_return_val_if_fail (GDK_IS_GL_WINDOW_IMPL_QUARTZ(gldrawable), NULL);
+
+ return GDK_GL_WINDOW_IMPL_QUARTZ (gldrawable)->glconfig;
+}
diff --git a/gtk/Makefile.am b/gtk/Makefile.am
index a633585..09698d5 100644
--- a/gtk/Makefile.am
+++ b/gtk/Makefile.am
@@ -87,12 +87,17 @@ lib_LTLIBRARIES = $(gtkglext_targetlib)
EXTRA_LTLIBRARIES = \
libgtkglext-x11- API_MJ@ API_MI@.la \
+ libgtkglext-quartz- API_MJ@ API_MI@.la \
libgtkglext-win32- API_MJ@ API_MI@.la
libgtkglext_x11_ API_MJ@_ API_MI@_la_SOURCES = $(gtkglext_sources)
libgtkglext_x11_ API_MJ@_ API_MI@_la_LDFLAGS = $(common_ldflags)
libgtkglext_x11_ API_MJ@_ API_MI@_la_LIBADD = $(common_libadd)
+libgtkglext_quartz_ API_MJ@_ API_MI@_la_SOURCES = $(gtkglext_sources)
+libgtkglext_quartz_ API_MJ@_ API_MI@_la_LDFLAGS = $(common_ldflags)
+libgtkglext_quartz_ API_MJ@_ API_MI@_la_LIBADD = $(common_libadd)
+
libgtkglext_win32_ API_MJ@_ API_MI@_la_SOURCES = $(gtkglext_sources)
libgtkglext_win32_ API_MJ@_ API_MI@_la_LDFLAGS = $(common_ldflags)
libgtkglext_win32_ API_MJ@_ API_MI@_la_LIBADD = $(common_libadd)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]