/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
#include <GL/glx.h>
#include <string.h>
#include "swt.h"
#include "structs.h"

#define XGL_NATIVE(func) Java_org_eclipse_swt_opengl_internal_gtk_XGL_##func

JNIEXPORT jint JNICALL XGL_NATIVE(glXChooseVisual)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jintArray arg2)
{
	jint *lparg2=NULL;
	jint rc;

	NATIVE_ENTER(env, that, "glXChooseVisual\n")
	if (arg2) lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL);
	rc = (jint)glXChooseVisual((Display *)arg0, arg1, (int *)lparg2);
	if (arg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	NATIVE_EXIT(env, that, "glXChooseVisual\n")
	return rc;
}

JNIEXPORT void JNICALL XGL_NATIVE(glXCopyContext)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3)
{
	NATIVE_ENTER(env, that, "glXCopyContext\n")
	glXCopyContext((Display *)arg0, (GLXContext)arg1, (GLXContext)arg2, arg3);
	NATIVE_EXIT(env, that, "glXCopyContext\n")
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXCreateContext)
	(JNIEnv *env, jclass that, jint arg0, jobject arg1, jint arg2, jboolean arg3)
{
	XVisualInfo _arg1, *lparg1=NULL;
	jint rc;

	NATIVE_ENTER(env, that, "glXCreateContext\n")
	if (arg1) lparg1 = getXVisualInfoFields(env, arg1, &_arg1);
	rc = (jint)glXCreateContext((Display *)arg0, lparg1, (GLXContext)arg2, arg3);
	if (arg1) setXVisualInfoFields(env, arg1, lparg1);
	NATIVE_EXIT(env, that, "glXCreateContext\n")
	return rc;
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXCreateGLXPixmap)
	(JNIEnv *env, jclass that, jint arg0, jobject arg1, jint arg2)
{
	XVisualInfo _arg1, *lparg1=NULL;
	jint rc;

	NATIVE_ENTER(env, that, "glXCreateGLXPixmap\n")
	if (arg1) lparg1 = getXVisualInfoFields(env, arg1, &_arg1);
	rc = (jint)glXCreateGLXPixmap((Display *)arg0, lparg1, arg2);
	if (arg1) setXVisualInfoFields(env, arg1, lparg1);
	NATIVE_EXIT(env, that, "glXCreateGLXPixmap\n")
	return rc;
}

JNIEXPORT void JNICALL XGL_NATIVE(glXDestroyContext)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	NATIVE_ENTER(env, that, "glXDestroyContext\n")
	glXDestroyContext((Display *)arg0, (GLXContext)arg1);
	NATIVE_EXIT(env, that, "glXDestroyContext\n")
}

JNIEXPORT void JNICALL XGL_NATIVE(glXDestroyGLXPixmap)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	NATIVE_ENTER(env, that, "glXDestroyGLXPixmap\n")
	glXDestroyGLXPixmap((Display *)arg0, arg1);
	NATIVE_EXIT(env, that, "glXDestroyGLXPixmap\n")
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXGetClientString)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
    jint rc;
	NATIVE_ENTER(env, that, "glXGetClientString\n")
	rc = (jint)glXGetClientString((Display *)arg0, arg1);
	NATIVE_EXIT(env, that, "glXGetClientString\n")
	return rc;
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXGetConfig)
	(JNIEnv *env, jclass that, jint arg0, jobject arg1, jint arg2, jintArray arg3)
{
	XVisualInfo _arg1, *lparg1=NULL;
	jint *lparg3=NULL;
	jint rc;

	NATIVE_ENTER(env, that, "glXGetConfig\n")
	if (arg1) lparg1 = getXVisualInfoFields(env, arg1, &_arg1);
	if (arg3) lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL);
	rc = (jint)glXGetConfig((Display *)arg0, lparg1, arg2, (int *)lparg3);
	if (arg1) setXVisualInfoFields(env, arg1, lparg1);
	if (arg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	NATIVE_EXIT(env, that, "glXGetConfig\n")
	return rc;
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXGetCurrentContext)
	(JNIEnv *env, jclass that)
{
    jint rc;
	NATIVE_ENTER(env, that, "glXGetCurrentContext\n")
	rc = (jint)glXGetCurrentContext();
	NATIVE_EXIT(env, that, "glXGetCurrentContext\n")
	return rc;
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXGetCurrentDrawable)
	(JNIEnv *env, jclass that)
{
    jint rc;
	NATIVE_ENTER(env, that, "glXGetCurrentDrawable\n")
	rc = (jint)glXGetCurrentDrawable();
	NATIVE_EXIT(env, that, "glXGetCurrentDrawable\n")
	return rc;
}

JNIEXPORT jboolean JNICALL XGL_NATIVE(glXIsDirect)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
    jboolean result;
	NATIVE_ENTER(env, that, "glXIsDirect\n")
	result = (jboolean)glXIsDirect((Display *)arg0, (GLXContext)arg1);
	NATIVE_EXIT(env, that, "glXIsDirect\n")
	return result;
}

JNIEXPORT jboolean JNICALL XGL_NATIVE(glXMakeCurrent)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2)
{
    jboolean result;
	NATIVE_ENTER(env, that, "glXMakeCurrent\n")
	result = (jboolean)glXMakeCurrent((Display *)arg0, (GLXDrawable)arg1, (GLXContext)arg2);
	NATIVE_EXIT(env, that, "glXMakeCurrent\n")
	return result;
}

JNIEXPORT jboolean JNICALL XGL_NATIVE(glXQueryExtension)
	(JNIEnv *env, jclass that, jint arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	jboolean rc;

	NATIVE_ENTER(env, that, "glXQueryExtension\n")
	if (arg1) lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL);
	if (arg2) lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL);
	rc = (jboolean)glXQueryExtension((Display *)arg0, (int *)lparg1, (int *)lparg2);
	if (arg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	if (arg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	NATIVE_EXIT(env, that, "glXQueryExtension\n")
	return rc;
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXQueryExtensionsString)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
    jint rc;
	NATIVE_ENTER(env, that, "glXQueryExtensionsString\n")
	rc = (jint)glXQueryExtensionsString((Display *)arg0, arg1);
	NATIVE_EXIT(env, that, "glXQueryExtensionsString\n")
	return rc;
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXQueryServerString)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2)
{
    jint rc;
	NATIVE_ENTER(env, that, "glXQueryServerString\n")
	rc = (jint)glXQueryServerString((Display *)arg0, arg1, arg2);
	NATIVE_EXIT(env, that, "glXQueryServerString\n")
	return rc;
}

JNIEXPORT jboolean JNICALL XGL_NATIVE(glXQueryVersion)
	(JNIEnv *env, jclass that, jint arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	jboolean rc;

	NATIVE_ENTER(env, that, "glXQueryVersion\n")
	if (arg1) lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL);
	if (arg2) lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL);
	rc = (jboolean)glXQueryVersion((Display *)arg0, (int *)lparg1, (int *)lparg2);
	if (arg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	if (arg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	NATIVE_EXIT(env, that, "glXQueryVersion\n")
	return rc;
}

JNIEXPORT void JNICALL XGL_NATIVE(glXSwapBuffers)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	NATIVE_ENTER(env, that, "glXSwapBuffers\n")
	glXSwapBuffers((Display *)arg0, (GLXDrawable)arg1);
	NATIVE_EXIT(env, that, "glXSwapBuffers\n")
}

JNIEXPORT void JNICALL XGL_NATIVE(glXUseXFont)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3)
{
	NATIVE_ENTER(env, that, "glXUseXFont\n")
	glXUseXFont(arg0, arg1, arg2, arg3);
	NATIVE_EXIT(env, that, "glXUseXFont\n")
}

JNIEXPORT void JNICALL XGL_NATIVE(glXWaitGL)
	(JNIEnv *env, jclass that)
{
	NATIVE_ENTER(env, that, "glXWaitGL\n")
	glXWaitGL();
	NATIVE_EXIT(env, that, "glXWaitGL\n")
}

JNIEXPORT void JNICALL XGL_NATIVE(glXWaitX)
	(JNIEnv *env, jclass that)
{
	NATIVE_ENTER(env, that, "glXWaitX\n")
	glXWaitX();
	NATIVE_EXIT(env, that, "glXWaitX\n")
}

JNIEXPORT void JNICALL XGL_NATIVE(memmove__Lorg_eclipse_swt_opengl_internal_gtk_XVisualInfo_2II)
	(JNIEnv *env, jclass that, jobject arg0, jint arg1, jint arg2)
{
	XVisualInfo _arg0, *lparg0=NULL;

	NATIVE_ENTER(env, that, "memmove__Lorg_eclipse_swt_opengl_internal_gtk_XVisualInfo_2II\n")
	if (arg0) lparg0 = &_arg0;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
	if (arg0) setXVisualInfoFields(env, arg0, lparg0);
	NATIVE_EXIT(env, that, "memmove__Lorg_eclipse_swt_opengl_internal_gtk_XVisualInfo_2II\n")
}
