/*******************************************************************************
 * 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 <windows.h>
#include <wingdi.h>
#include "jni.h"
#include "swt.h"
#include "structs.h"

#define WGL_NATIVE(func) Java_org_eclipse_swt_opengl_internal_win32_WGL_##func

JNIEXPORT jint JNICALL WGL_NATIVE(ChoosePixelFormat)
	(JNIEnv *env, jclass that, jint arg0, jobject arg1)
{
	PIXELFORMATDESCRIPTOR _arg1, *lparg1=NULL;
	jint rc;

	DEBUG_CALL("ChoosePixelFormat\n")

	if (arg1) lparg1 = getPIXELFORMATDESCRIPTORFields(env, arg1, &_arg1);
	rc = (jint)ChoosePixelFormat((HDC)arg0, (CONST PIXELFORMATDESCRIPTOR *)lparg1);
	if (arg1) setPIXELFORMATDESCRIPTORFields(env, arg1, lparg1);
	return rc;
}

JNIEXPORT jint JNICALL WGL_NATIVE(DescribePixelFormat)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jobject arg3)
{
	PIXELFORMATDESCRIPTOR _arg3, *lparg3=NULL;
	jint rc;

	DEBUG_CALL("DescribePixelFormat\n")

	if (arg3) lparg3 = getPIXELFORMATDESCRIPTORFields(env, arg3, &_arg3);
	rc = (jint)DescribePixelFormat((HDC)arg0, arg1, arg2, (LPPIXELFORMATDESCRIPTOR)lparg3);
	if (arg3) setPIXELFORMATDESCRIPTORFields(env, arg3, lparg3);
	return rc;
}

JNIEXPORT jint JNICALL WGL_NATIVE(GetPixelFormat)
	(JNIEnv *env, jclass that, jint arg0)
{
	DEBUG_CALL("GetPixelFormat\n")

	return (jint)GetPixelFormat((HDC)arg0);
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(SetPixelFormat)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jobject arg2)
{
	PIXELFORMATDESCRIPTOR _arg2, *lparg2=NULL;
	jboolean rc;

	DEBUG_CALL("SetPixelFormat\n")

	if (arg2) lparg2 = getPIXELFORMATDESCRIPTORFields(env, arg2, &_arg2);
	rc = (jboolean)SetPixelFormat((HDC)arg0, arg1, (CONST PIXELFORMATDESCRIPTOR *)lparg2);
	if (arg2) setPIXELFORMATDESCRIPTORFields(env, arg2, lparg2);
	return rc;
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(SwapBuffers)
	(JNIEnv *env, jclass that, jint arg0)
{
	DEBUG_CALL("SwapBuffers\n")

	return (jboolean)SwapBuffers((HDC)arg0);
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(wglCopyContext)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2)
{
	DEBUG_CALL("wglCopyContext\n")

	return (jboolean)wglCopyContext((HGLRC)arg0, (HGLRC)arg1, (UINT)arg2);
}

JNIEXPORT jint JNICALL WGL_NATIVE(wglCreateContext)
	(JNIEnv *env, jclass that, jint arg0)
{
	DEBUG_CALL("wglCreateContext\n")

	return (jint)wglCreateContext((HDC)arg0);
}

JNIEXPORT jint JNICALL WGL_NATIVE(wglCreateLayerContext)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	DEBUG_CALL("wglCreateLayerContext\n")

	return (jint)wglCreateLayerContext((HDC)arg0, arg1);
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(wglDeleteContext)
	(JNIEnv *env, jclass that, jint arg0)
{
	DEBUG_CALL("wglDeleteContext\n")

	return (jboolean)wglDeleteContext((HGLRC)arg0);
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(wglDescribeLayerPlane)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3, jobject arg4)
{
	LAYERPLANEDESCRIPTOR _arg4, *lparg4=NULL;
	jboolean rc;

	DEBUG_CALL("wglDescribeLayerPlane\n")

	if (arg4) lparg4 = getLAYERPLANEDESCRIPTORFields(env, arg4, &_arg4);
	rc = (jboolean)wglDescribeLayerPlane((HDC)arg0, arg1, arg2, arg3, (LPLAYERPLANEDESCRIPTOR)lparg4);
	if (arg4) setLAYERPLANEDESCRIPTORFields(env, arg4, lparg4);
	return rc;
}

JNIEXPORT jint JNICALL WGL_NATIVE(wglGetCurrentContext)
	(JNIEnv *env, jclass that)
{
	DEBUG_CALL("wglGetCurrentContext\n")

	return (jint)wglGetCurrentContext();
}

JNIEXPORT jint JNICALL WGL_NATIVE(wglGetCurrentDC)
	(JNIEnv *env, jclass that)
{
	DEBUG_CALL("wglGetCurrentDC\n")

	return (jint)wglGetCurrentDC();
}

JNIEXPORT jint JNICALL WGL_NATIVE(wglGetLayerPaletteEntries)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3, jintArray arg4)
{
	jint *lparg4=NULL;
	jint rc;

	DEBUG_CALL("wglGetLayerPaletteEntries\n")

	if (arg4) lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL);
	rc = (jint)wglGetLayerPaletteEntries((HDC)arg0, arg1, arg2, arg3, (COLORREF *)lparg4);
	if (arg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	return rc;
}

JNIEXPORT jint JNICALL WGL_NATIVE(wglGetProcAddress)
	(JNIEnv *env, jclass that, jbyteArray arg0)
{
	jbyte *lparg0=NULL;
	jint rc;

	DEBUG_CALL("wglGetProcAddress\n")

	if (arg0) lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL);
	rc = (jint)wglGetProcAddress((LPCSTR)lparg0);
	if (arg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, 0);
	return rc;
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(wglMakeCurrent)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	DEBUG_CALL("wglMakeCurrent\n")

	return (jboolean)wglMakeCurrent((HDC)arg0, (HGLRC)arg1);
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(wglRealizeLayerPalette)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jboolean arg2)
{
	DEBUG_CALL("wglRealizeLayerPalette\n")

	return (jboolean)wglRealizeLayerPalette((HDC)arg0, arg1, (BOOL)arg2);
}

JNIEXPORT jint JNICALL WGL_NATIVE(wglSetLayerPaletteEntries)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3, jintArray arg4)
{
	jint *lparg4=NULL;
	jint rc;

	DEBUG_CALL("wglSetLayerPaletteEntries\n")

	if (arg4) lparg4 = (*env)->GetIntArrayElements(env, arg4, NULL);
	rc = (jint)wglSetLayerPaletteEntries((HDC)arg0, arg1, arg2, arg3, (CONST COLORREF *)lparg4);
	if (arg4) (*env)->ReleaseIntArrayElements(env, arg4, lparg4, 0);
	return rc;
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(wglShareLists)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	DEBUG_CALL("wglShareLists\n")

	return (jboolean)wglShareLists((HGLRC)arg0, (HGLRC)arg1);
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(wglSwapLayerBuffers)
	(JNIEnv *env, jclass that, jint arg0, jint arg1)
{
	DEBUG_CALL("wglSwapLayerBuffers\n")

	return (jboolean)wglSwapLayerBuffers((HDC)arg0, arg1);
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(wglUseFontBitmapsA)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3)
{
	DEBUG_CALL("wglUseFontBitmapsA\n")

	return (jboolean)wglUseFontBitmapsA((HDC)arg0, arg1, arg2, arg3);
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(wglUseFontBitmapsW)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3)
{
	DEBUG_CALL("wglUseFontBitmapsW\n")

	return (jboolean)wglUseFontBitmapsW((HDC)arg0, arg1, arg2, arg3);
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(wglUseFontOutlinesA)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3, jfloat arg4, jfloat arg5, jint arg6, jobject arg7)
{
//	GLYPHMETRICSFLOAT _arg7, *lparg7=NULL;
	jboolean rc;

	DEBUG_CALL("wglUseFontOutlinesA\n")

//	if (arg7) lparg7 = getGLYPHMETRICSFLOATFields(env, arg7, &_arg7);
	rc = (jboolean)wglUseFontOutlinesA((HDC)arg0, arg1, arg2, arg3, (FLOAT)arg4, (FLOAT)arg5, arg6, (LPGLYPHMETRICSFLOAT)arg7);
//	if (arg7) setGLYPHMETRICSFLOATFields(env, arg7, lparg7);
	return rc;
}

JNIEXPORT jboolean JNICALL WGL_NATIVE(wglUseFontOutlinesW)
	(JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3, jfloat arg4, jfloat arg5, jint arg6, jobject arg7)
{
//	GLYPHMETRICSFLOAT _arg7, *lparg7=NULL;
	jboolean rc;

	DEBUG_CALL("wglUseFontOutlinesW\n")

//	if (arg7) lparg7 = getGLYPHMETRICSFLOATFields(env, arg7, &_arg7);
	rc = (jboolean)wglUseFontOutlinesW((HDC)arg0, arg1, arg2, arg3, (FLOAT)arg4, (FLOAT)arg5, arg6, (LPGLYPHMETRICSFLOAT)arg7);
//	if (arg7) setGLYPHMETRICSFLOATFields(env, arg7, lparg7);
	return rc;
}

JNIEXPORT void JNICALL WGL_NATIVE(MoveMemoryW__Lorg_eclipse_swt_opengl_internal_win32_GLYPHMETRICSFLOAT_2II)
	(JNIEnv *env, jclass that, jobject arg0, jint arg1, jint arg2)
{
	GLYPHMETRICSFLOAT _arg0, *lparg0=NULL;

	DEBUG_CALL("MoveMemoryW__Lorg_eclipse_swt_opengl_internal_win32_GLYPHMETRICSFLOAT_2II\n")
	DEBUG_CHECK_NULL(env, arg1)
	
	if (arg0) lparg0 = &_arg0;
	MoveMemory((PVOID)lparg0, (CONST VOID *)arg1, arg2);
	if (arg0) setGLYPHMETRICSFLOATFields(env, arg0, lparg0);
}

JNIEXPORT void JNICALL WGL_NATIVE(MoveMemoryA__Lorg_eclipse_swt_opengl_internal_win32_GLYPHMETRICSFLOAT_2II)
	(JNIEnv *env, jclass that, jobject arg0, jint arg1, jint arg2)
{
	GLYPHMETRICSFLOAT _arg0, *lparg0=NULL;

	DEBUG_CALL("MoveMemoryA__Lorg_eclipse_swt_opengl_internal_win32_GLYPHMETRICSFLOAT_2II\n")
	DEBUG_CHECK_NULL(env, arg1)
	
	if (arg0) lparg0 = &_arg0;
	MoveMemory((PVOID)lparg0, (CONST VOID *)arg1, arg2);
	if (arg0) setGLYPHMETRICSFLOATFields(env, arg0, lparg0);
}


