/*******************************************************************************
 * 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 "swt.h"
#include "structs.h"

#define XGL_NATIVE(func) Java_org_eclipse_swt_opengl_internal_motif_XGL_##func

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

	DEBUG_CALL("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);
	return rc;
}

JNIEXPORT void JNICALL XGL_NATIVE(glXCopyContext)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3)
{
	DEBUG_CALL("glXCopyContext\n")

	glXCopyContext((Display *)arg0, (GLXContext)arg1, (GLXContext)arg2, arg3);
}

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

	DEBUG_CALL("glXCreateContext\n")

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

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

	DEBUG_CALL("glXCreateGLXPixmap\n")

	if (arg1) lparg1 = getXVisualInfoFields(env, arg1, &_arg1);
	rc = (jint)glXCreateGLXPixmap((Display *)arg0, lparg1, arg2);
	if (arg1) setXVisualInfoFields(env, arg1, lparg1);
	return rc;
}

JNIEXPORT void JNICALL XGL_NATIVE(glXDestroyContext)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	DEBUG_CALL("glXDestroyContext\n")

	glXDestroyContext((Display *)arg0, (GLXContext)arg1);
}

JNIEXPORT void JNICALL XGL_NATIVE(glXDestroyGLXPixmap)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	DEBUG_CALL("glXDestroyGLXPixmap\n")

	glXDestroyGLXPixmap((Display *)arg0, arg1);
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXGetClientString)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	DEBUG_CALL("glXGetClientString\n")

	return (jint)glXGetClientString((Display *)arg0, arg1);
}

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;

	DEBUG_CALL("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);
	return rc;
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXGetCurrentContext)
	(JNIEnv *env, jclass that)
{
	DEBUG_CALL("glXGetCurrentContext\n")

	return (jint)glXGetCurrentContext();
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXGetCurrentDrawable)
	(JNIEnv *env, jclass that)
{
	DEBUG_CALL("glXGetCurrentDrawable\n")

	return (jint)glXGetCurrentDrawable();
}

JNIEXPORT jboolean JNICALL XGL_NATIVE(glXIsDirect)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	DEBUG_CALL("glXIsDirect\n")

	return (jboolean)glXIsDirect((Display *)arg0, (GLXContext)arg1);
}

JNIEXPORT jboolean JNICALL XGL_NATIVE(glXMakeCurrent)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2)
{
	DEBUG_CALL("glXMakeCurrent\n")

	return (jboolean)glXMakeCurrent((Display *)arg0, (GLXDrawable)arg1, (GLXContext)arg2);
}

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

	DEBUG_CALL("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);
	return rc;
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXQueryExtensionsString)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	DEBUG_CALL("glXQueryExtensionsString\n")

	return (jint)glXQueryExtensionsString((Display *)arg0, arg1);
}

JNIEXPORT jint JNICALL XGL_NATIVE(glXQueryServerString)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2)
{
	DEBUG_CALL("glXQueryServerString\n")

	return (jint)glXQueryServerString((Display *)arg0, arg1, arg2);
}

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

	DEBUG_CALL("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);
	return rc;
}

JNIEXPORT void JNICALL XGL_NATIVE(glXSwapBuffers)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	DEBUG_CALL("glXSwapBuffers\n")

	glXSwapBuffers((Display *)arg0, (GLXDrawable)arg1);
}

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

	glXUseXFont(arg0, arg1, arg2, arg3);
}

JNIEXPORT void JNICALL XGL_NATIVE(glXWaitGL)
	(JNIEnv *env, jclass that)
{
	DEBUG_CALL("glXWaitGL\n")

	glXWaitGL();
}

JNIEXPORT void JNICALL XGL_NATIVE(glXWaitX)
	(JNIEnv *env, jclass that)
{
	DEBUG_CALL("glXWaitX\n")

	glXWaitX();
}

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

	DEBUG_CALL("memmove__Lorg_eclipse_swt_opengl_internal_motif_XVisualInfo_2II\n")

	if (arg0) lparg0 = &_arg0;
	memmove((void *)lparg0, (const void *)arg1, (size_t)arg2);
	if (arg0) setXVisualInfoFields(env, arg0, lparg0);
}
