/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/

#include "swt.h"
#include "glx_structs.h"
#include "glx_stats.h"

#define GLX_NATIVE(func) Java_org_eclipse_swt_internal_opengl_gtk_GLX_##func

#ifndef NO_glXChooseVisual
JNIEXPORT jint JNICALL GLX_NATIVE(glXChooseVisual)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jintArray arg2)
{
	jint *lparg2=NULL;
	jint rc = 0;
	GLX_NATIVE_ENTER(env, that, glXChooseVisual_FUNC);
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jint)glXChooseVisual(arg0, arg1, lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	GLX_NATIVE_EXIT(env, that, glXChooseVisual_FUNC);
	return rc;
}
#endif

#ifndef NO_glXCopyContext
JNIEXPORT void JNICALL GLX_NATIVE(glXCopyContext)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3)
{
	GLX_NATIVE_ENTER(env, that, glXCopyContext_FUNC);
	glXCopyContext(arg0, arg1, arg2, arg3);
	GLX_NATIVE_EXIT(env, that, glXCopyContext_FUNC);
}
#endif

#ifndef NO_glXCreateContext
JNIEXPORT jint JNICALL GLX_NATIVE(glXCreateContext)
	(JNIEnv *env, jclass that, jint arg0, jobject arg1, jint arg2, jboolean arg3)
{
	XVisualInfo _arg1, *lparg1=NULL;
	jint rc = 0;
	GLX_NATIVE_ENTER(env, that, glXCreateContext_FUNC);
	if (arg1) if ((lparg1 = getXVisualInfoFields(env, arg1, &_arg1)) == NULL) goto fail;
	rc = (jint)glXCreateContext(arg0, lparg1, arg2, arg3);
fail:
	if (arg1 && lparg1) setXVisualInfoFields(env, arg1, lparg1);
	GLX_NATIVE_EXIT(env, that, glXCreateContext_FUNC);
	return rc;
}
#endif

#ifndef NO_glXCreateGLXPixmap
JNIEXPORT jint JNICALL GLX_NATIVE(glXCreateGLXPixmap)
	(JNIEnv *env, jclass that, jint arg0, jobject arg1, jint arg2)
{
	XVisualInfo _arg1, *lparg1=NULL;
	jint rc = 0;
	GLX_NATIVE_ENTER(env, that, glXCreateGLXPixmap_FUNC);
	if (arg1) if ((lparg1 = getXVisualInfoFields(env, arg1, &_arg1)) == NULL) goto fail;
	rc = (jint)glXCreateGLXPixmap(arg0, lparg1, arg2);
fail:
	if (arg1 && lparg1) setXVisualInfoFields(env, arg1, lparg1);
	GLX_NATIVE_EXIT(env, that, glXCreateGLXPixmap_FUNC);
	return rc;
}
#endif

#ifndef NO_glXDestroyContext
JNIEXPORT void JNICALL GLX_NATIVE(glXDestroyContext)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	GLX_NATIVE_ENTER(env, that, glXDestroyContext_FUNC);
	glXDestroyContext(arg0, arg1);
	GLX_NATIVE_EXIT(env, that, glXDestroyContext_FUNC);
}
#endif

#ifndef NO_glXDestroyGLXPixmap
JNIEXPORT void JNICALL GLX_NATIVE(glXDestroyGLXPixmap)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	GLX_NATIVE_ENTER(env, that, glXDestroyGLXPixmap_FUNC);
	glXDestroyGLXPixmap(arg0, arg1);
	GLX_NATIVE_EXIT(env, that, glXDestroyGLXPixmap_FUNC);
}
#endif

#ifndef NO_glXGetClientString
JNIEXPORT jint JNICALL GLX_NATIVE(glXGetClientString)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	jint rc = 0;
	GLX_NATIVE_ENTER(env, that, glXGetClientString_FUNC);
	rc = (jint)glXGetClientString(arg0, arg1);
	GLX_NATIVE_EXIT(env, that, glXGetClientString_FUNC);
	return rc;
}
#endif

#ifndef NO_glXGetConfig
JNIEXPORT jint JNICALL GLX_NATIVE(glXGetConfig)
	(JNIEnv *env, jclass that, jint arg0, jobject arg1, jint arg2, jintArray arg3)
{
	XVisualInfo _arg1, *lparg1=NULL;
	jint *lparg3=NULL;
	jint rc = 0;
	GLX_NATIVE_ENTER(env, that, glXGetConfig_FUNC);
	if (arg1) if ((lparg1 = getXVisualInfoFields(env, arg1, &_arg1)) == NULL) goto fail;
	if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail;
	rc = (jint)glXGetConfig(arg0, lparg1, arg2, lparg3);
fail:
	if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0);
	if (arg1 && lparg1) setXVisualInfoFields(env, arg1, lparg1);
	GLX_NATIVE_EXIT(env, that, glXGetConfig_FUNC);
	return rc;
}
#endif

#ifndef NO_glXGetCurrentContext
JNIEXPORT jint JNICALL GLX_NATIVE(glXGetCurrentContext)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GLX_NATIVE_ENTER(env, that, glXGetCurrentContext_FUNC);
	rc = (jint)glXGetCurrentContext();
	GLX_NATIVE_EXIT(env, that, glXGetCurrentContext_FUNC);
	return rc;
}
#endif

#ifndef NO_glXGetCurrentDrawable
JNIEXPORT jint JNICALL GLX_NATIVE(glXGetCurrentDrawable)
	(JNIEnv *env, jclass that)
{
	jint rc = 0;
	GLX_NATIVE_ENTER(env, that, glXGetCurrentDrawable_FUNC);
	rc = (jint)glXGetCurrentDrawable();
	GLX_NATIVE_EXIT(env, that, glXGetCurrentDrawable_FUNC);
	return rc;
}
#endif

#ifndef NO_glXIsDirect
JNIEXPORT jboolean JNICALL GLX_NATIVE(glXIsDirect)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	jboolean rc = 0;
	GLX_NATIVE_ENTER(env, that, glXIsDirect_FUNC);
	rc = (jboolean)glXIsDirect(arg0, arg1);
	GLX_NATIVE_EXIT(env, that, glXIsDirect_FUNC);
	return rc;
}
#endif

#ifndef NO_glXMakeCurrent
JNIEXPORT jboolean JNICALL GLX_NATIVE(glXMakeCurrent)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2)
{
	jboolean rc = 0;
	GLX_NATIVE_ENTER(env, that, glXMakeCurrent_FUNC);
	rc = (jboolean)glXMakeCurrent(arg0, arg1, arg2);
	GLX_NATIVE_EXIT(env, that, glXMakeCurrent_FUNC);
	return rc;
}
#endif

#ifndef NO_glXQueryExtension
JNIEXPORT jboolean JNICALL GLX_NATIVE(glXQueryExtension)
	(JNIEnv *env, jclass that, jint arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	jboolean rc = 0;
	GLX_NATIVE_ENTER(env, that, glXQueryExtension_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jboolean)glXQueryExtension(arg0, lparg1, lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GLX_NATIVE_EXIT(env, that, glXQueryExtension_FUNC);
	return rc;
}
#endif

#ifndef NO_glXQueryExtensionsString
JNIEXPORT jint JNICALL GLX_NATIVE(glXQueryExtensionsString)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	jint rc = 0;
	GLX_NATIVE_ENTER(env, that, glXQueryExtensionsString_FUNC);
	rc = (jint)glXQueryExtensionsString(arg0, arg1);
	GLX_NATIVE_EXIT(env, that, glXQueryExtensionsString_FUNC);
	return rc;
}
#endif

#ifndef NO_glXQueryServerString
JNIEXPORT jint JNICALL GLX_NATIVE(glXQueryServerString)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2)
{
	jint rc = 0;
	GLX_NATIVE_ENTER(env, that, glXQueryServerString_FUNC);
	rc = (jint)glXQueryServerString(arg0, arg1, arg2);
	GLX_NATIVE_EXIT(env, that, glXQueryServerString_FUNC);
	return rc;
}
#endif

#ifndef NO_glXQueryVersion
JNIEXPORT jboolean JNICALL GLX_NATIVE(glXQueryVersion)
	(JNIEnv *env, jclass that, jint arg0, jintArray arg1, jintArray arg2)
{
	jint *lparg1=NULL;
	jint *lparg2=NULL;
	jboolean rc = 0;
	GLX_NATIVE_ENTER(env, that, glXQueryVersion_FUNC);
	if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail;
	if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail;
	rc = (jboolean)glXQueryVersion(arg0, lparg1, lparg2);
fail:
	if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0);
	if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0);
	GLX_NATIVE_EXIT(env, that, glXQueryVersion_FUNC);
	return rc;
}
#endif

#ifndef NO_glXSwapBuffers
JNIEXPORT void JNICALL GLX_NATIVE(glXSwapBuffers)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	GLX_NATIVE_ENTER(env, that, glXSwapBuffers_FUNC);
	glXSwapBuffers(arg0, arg1);
	GLX_NATIVE_EXIT(env, that, glXSwapBuffers_FUNC);
}
#endif

#ifndef NO_glXUseXFont
JNIEXPORT void JNICALL GLX_NATIVE(glXUseXFont)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3)
{
	GLX_NATIVE_ENTER(env, that, glXUseXFont_FUNC);
	glXUseXFont(arg0, arg1, arg2, arg3);
	GLX_NATIVE_EXIT(env, that, glXUseXFont_FUNC);
}
#endif

#ifndef NO_glXWaitGL
JNIEXPORT void JNICALL GLX_NATIVE(glXWaitGL)
	(JNIEnv *env, jclass that)
{
	GLX_NATIVE_ENTER(env, that, glXWaitGL_FUNC);
	glXWaitGL();
	GLX_NATIVE_EXIT(env, that, glXWaitGL_FUNC);
}
#endif

#ifndef NO_glXWaitX
JNIEXPORT void JNICALL GLX_NATIVE(glXWaitX)
	(JNIEnv *env, jclass that)
{
	GLX_NATIVE_ENTER(env, that, glXWaitX_FUNC);
	glXWaitX();
	GLX_NATIVE_EXIT(env, that, glXWaitX_FUNC);
}
#endif

#ifndef NO_memmove
JNIEXPORT void JNICALL GLX_NATIVE(memmove)
	(JNIEnv *env, jclass that, jobject arg0, jint arg1, jint arg2)
{
	XVisualInfo _arg0, *lparg0=NULL;
	GLX_NATIVE_ENTER(env, that, memmove_FUNC);
	if (arg0) if ((lparg0 = getXVisualInfoFields(env, arg0, &_arg0)) == NULL) goto fail;
	memmove(lparg0, arg1, arg2);
fail:
	if (arg0 && lparg0) setXVisualInfoFields(env, arg0, lparg0);
	GLX_NATIVE_EXIT(env, that, memmove_FUNC);
}
#endif

