From f610ac01f50165b2ea6bc4a81d02abf2e222d876 Mon Sep 17 00:00:00 2001 From: Kenneth Russel Date: Sun, 11 Nov 2001 21:30:13 +0000 Subject: Support for NVidia AllocateMemoryNV extension and fixed problem with extensions not being loaded --- CNativeCode/OpenGL_JauJNI14_funcs.c | 224 ++-- CNativeCode/OpenGL_misc.c | 33 +- CNativeCode/gl4java_utils_DirectBufferCleanup.c | 12 + CNativeCode/gltool.c | 47 +- CNativeCode/gltool.h | 20 +- CNativeCode/glxtool.c | 12 +- CNativeCode/glxtool.h | 2 +- CNativeCode/ptrtypes.h | 26 + CNativeCode/wgltool.c | 1442 ++++++++++++----------- CNativeCode/wgltool.h | 84 +- 10 files changed, 1006 insertions(+), 896 deletions(-) create mode 100644 CNativeCode/gl4java_utils_DirectBufferCleanup.c create mode 100644 CNativeCode/ptrtypes.h (limited to 'CNativeCode') diff --git a/CNativeCode/OpenGL_JauJNI14_funcs.c b/CNativeCode/OpenGL_JauJNI14_funcs.c index fd518d5..691fd11 100644 --- a/CNativeCode/OpenGL_JauJNI14_funcs.c +++ b/CNativeCode/OpenGL_JauJNI14_funcs.c @@ -4,87 +4,149 @@ */ -/* - * Leo Chan -- 1995 - * lchan@cgl.uwaterloo.ca - * - * This mammoth C file takes care of all the native implementation for the - * bulk of OpenGL commands - * --------------- - * - * Sven Goethel - * - * September 1997 - */ - -/* - * need to include the JAVA internal header files for macros and function - * prototypes required to maipulated JAVA data structures and functions - * - * StubPreamble.h includes the structure and macro definitions neede to - * convert JAVA data structures into C data structures. - * - */ - -#include "OpenGL_misc.h" - -/* - * the next thing to include are special headers that were created by - * JAVAH. They include the C structure definitions for the JAVA classes - */ -#include "gl4java_GLFunc14JauJNI.h" - -/*-------------------------------------------------------------------------- - * here on in is just regular apple pie C - */ - -#ifndef LIBAPIENTRY - #define LIBAPIENTRY -#endif -#ifndef LIBAPI - #define LIBAPI -#endif - -#ifndef CALLBACK - #define CALLBACK -#endif -/** THIS IS A MANUAL CODED PART - gl-manualCodedImplJNI.java -*/ - -static const char _gl_n_a_string[] = "GL-String not avaiable !"; - -JNIEXPORT jstring JNICALL -Java_gl4java_GLFunc14JauJNI_glGetString ( JNIEnv *env, jobject obj, - jint name ) -{ - const char * tmpString=0; - - if ( disp__glGetString == NULL ) - return (*env)->NewStringUTF(env, _gl_n_a_string); - - tmpString = disp__glGetString ( /* jint */ name); - if(tmpString==NULL) - tmpString=_gl_n_a_string; - - return (*env)->NewStringUTF(env, tmpString); -} - -static const char * _gl_lib_vendor_="Jausoft - Sven Goethel Software Development"; -static const char * _gl_lib_version_="2.8.0.8"; - -JNIEXPORT jstring JNICALL -Java_gl4java_GLFunc14JauJNI_getNativeVendor ( JNIEnv *env, jobject obj ) -{ - return (*env)->NewStringUTF(env, _gl_lib_vendor_); -} - -JNIEXPORT jstring JNICALL -Java_gl4java_GLFunc14JauJNI_getNativeVersion ( JNIEnv *env, jobject obj ) -{ - return (*env)->NewStringUTF(env, _gl_lib_version_); -} - +/* + * Leo Chan -- 1995 + * lchan@cgl.uwaterloo.ca + * + * This mammoth C file takes care of all the native implementation for the + * bulk of OpenGL commands + * --------------- + * + * Sven Goethel + * + * September 1997 + */ + +/* + * need to include the JAVA internal header files for macros and function + * prototypes required to maipulated JAVA data structures and functions + * + * StubPreamble.h includes the structure and macro definitions neede to + * convert JAVA data structures into C data structures. + * + */ + +#include "OpenGL_misc.h" + +/* + * the next thing to include are special headers that were created by + * JAVAH. They include the C structure definitions for the JAVA classes + */ +#include "gl4java_GLFunc14JauJNI.h" + +/*-------------------------------------------------------------------------- + * here on in is just regular apple pie C + */ + +#ifndef LIBAPIENTRY + #define LIBAPIENTRY +#endif +#ifndef LIBAPI + #define LIBAPI +#endif + +#ifndef CALLBACK + #define CALLBACK +#endif +/** THIS IS A MANUAL CODED PART + gl-manualCodedImplJNI.java +*/ + +static const char _gl_n_a_string[] = "GL-String not avaiable !"; + +JNIEXPORT jstring JNICALL +Java_gl4java_GLFunc14JauJNI_glGetString ( JNIEnv *env, jobject obj, + jint name ) +{ + const char * tmpString=0; + + if ( disp__glGetString == NULL ) + return (*env)->NewStringUTF(env, _gl_n_a_string); + + tmpString = disp__glGetString ( /* jint */ name); + if(tmpString==NULL) + tmpString=_gl_n_a_string; + + return (*env)->NewStringUTF(env, tmpString); +} + +static const char * _gl_lib_vendor_="Jausoft - Sven Goethel Software Development"; +static const char * _gl_lib_version_="2.8.0.8"; + +JNIEXPORT jstring JNICALL +Java_gl4java_GLFunc14JauJNI_getNativeVendor ( JNIEnv *env, jobject obj ) +{ + return (*env)->NewStringUTF(env, _gl_lib_vendor_); +} + +JNIEXPORT jstring JNICALL +Java_gl4java_GLFunc14JauJNI_getNativeVersion ( JNIEnv *env, jobject obj ) +{ + return (*env)->NewStringUTF(env, _gl_lib_version_); +} + +//---------------------------------------------------------------------- +// Support for NVidia routines +// + +#include "ptrtypes.h" + +#ifdef _X11_ + #include + #include + #include "glxtool.h" + #include +#endif + +#ifdef _WIN32_ + #include "wgltool.h" +#endif + +#define GET_GL_PROCADDRESS(a) getGLProcAddressHelper (NULL, NULL, (a), NULL, 1, 0); + +JNIEXPORT jlong JNICALL +Java_gl4java_GLFunc14JauJNI_glAllocateMemoryNV0(JNIEnv* env, jobject unused, + jint size, + jfloat readFreq, + jfloat writeFreq, + jfloat priority) +{ + void* (CALLBACK *disp__glAllocateMemoryNV)(int, float, float, float) = +#ifdef _WIN32_ + disp__wglAllocateMemoryNV; +#elif defined(_X11_) + disp__glXAllocateMemoryNV; +#else + NULL; +#endif + + if (disp__glAllocateMemoryNV == NULL) return 0; + + return ((uintptr_t) disp__glAllocateMemoryNV(size, readFreq, writeFreq, priority)); +} + +JNIEXPORT void JNICALL +Java_gl4java_GLFunc14JauJNI_glFreeMemoryNV0(JNIEnv* env, jobject unused, jlong address) +{ + void (CALLBACK *disp__glFreeMemoryNV)(void*) = +#if (defined(_WIN32_)) + disp__wglFreeMemoryNV; +#elif defined(_X11_) + disp__glXFreeMemoryNV; +#else + NULL; +#endif + + if (disp__glFreeMemoryNV == NULL) return; + + disp__glFreeMemoryNV((void*) ((uintptr_t) address)); +} + +JNIEXPORT jobject JNICALL +Java_gl4java_GLFunc14JauJNI_newDirectByteBuffer(JNIEnv* env, jobject unused, jlong addr, jint capacity) +{ + return (*env)->NewDirectByteBuffer(env, (void *) ((uintptr_t) addr), capacity); +} /** * C2J Parser Version 3.0 * Jausoft - Sven Goethel Software Development diff --git a/CNativeCode/OpenGL_misc.c b/CNativeCode/OpenGL_misc.c index ff00cce..babb470 100644 --- a/CNativeCode/OpenGL_misc.c +++ b/CNativeCode/OpenGL_misc.c @@ -793,6 +793,9 @@ Java_gl4java_GLContext_gljFetchOSGLFunctions ( JNIEnv *env, jclass jclass, jstring gllibname, jstring glulibname, jboolean force ) { + // FIXME: this routine is currently unused by the GL4Java + // implementation and should be removed in a subsequent + // release const char * gllib; const char * glulib; @@ -808,42 +811,44 @@ Java_gl4java_GLContext_gljFetchOSGLFunctions ( (*env)->ReleaseStringUTFChars(env, glulibname, glulib); #ifdef _X11_ - fetch_GLX_FUNCS (libGLName, libGLUName, (force==JNI_TRUE)?1:0); + fetch_GLX_FUNCS (libGLName, libGLUName, (force==JNI_TRUE)?1:0, 0); #endif #ifdef _WIN32_ - fetch_WGL_FUNCS (libGLName, libGLUName, (force==JNI_TRUE)?1:0); + fetch_WGL_FUNCS (libGLName, libGLUName, (force==JNI_TRUE)?1:0, 0); #endif return JNI_TRUE; } JNIEXPORT jboolean JNICALL -Java_gl4java_GLContext_gljFetchGLFunctions ( +Java_gl4java_GLContext_gljFetchGLFunctions0 ( JNIEnv *env, jclass jclass, - jstring gllibname, jstring glulibname, jboolean force ) + jstring gllibname, jstring glulibname, jboolean force, jboolean reload ) { const char * gllib; const char * glulib; - gllib = (*env)->GetStringUTFChars(env, gllibname, 0); - glulib = (*env)->GetStringUTFChars(env, glulibname, 0); + if (!reload) { + gllib = (*env)->GetStringUTFChars(env, gllibname, 0); + glulib = (*env)->GetStringUTFChars(env, glulibname, 0); - strncpy (libGLName, gllib, 798); - strncpy (libGLUName, glulib, 798); - libGLName[799] = 0; - libGLUName[799] = 0; + strncpy (libGLName, gllib, 798); + strncpy (libGLUName, glulib, 798); + libGLName[799] = 0; + libGLUName[799] = 0; - (*env)->ReleaseStringUTFChars(env, gllibname, gllib); - (*env)->ReleaseStringUTFChars(env, glulibname, glulib); + (*env)->ReleaseStringUTFChars(env, gllibname, gllib); + (*env)->ReleaseStringUTFChars(env, glulibname, glulib); + } - fetch_GL_FUNCS (libGLName, libGLUName, (force==JNI_TRUE)?1:0); + fetch_GL_FUNCS (libGLName, libGLUName, (force==JNI_TRUE)?1:0, (reload==JNI_TRUE)?1:0); return JNI_TRUE; } JNIEXPORT jboolean JNICALL -Java_gl4java_GLContext_gljTestGLProc ( +Java_gl4java_GLContext_gljTestGLProc0 ( JNIEnv *env, jobject obj, jstring name, jboolean verbose ) { jboolean res; diff --git a/CNativeCode/gl4java_utils_DirectBufferCleanup.c b/CNativeCode/gl4java_utils_DirectBufferCleanup.c new file mode 100644 index 0000000..14f32b8 --- /dev/null +++ b/CNativeCode/gl4java_utils_DirectBufferCleanup.c @@ -0,0 +1,12 @@ +#include "gl4java_utils_DirectBufferCleanup.h" + +/* + * Class: hiperf_DirectBufferCleanup + * Method: getDirectBufferAddress + * Signature: (Ljava/nio/Buffer;)J + */ +JNIEXPORT jlong JNICALL Java_gl4java_utils_DirectBufferCleanup_getDirectBufferAddress + (JNIEnv *env, jclass unused, jobject buf) +{ + return (jlong) (*env)->GetDirectBufferAddress(env, buf); +} diff --git a/CNativeCode/gltool.c b/CNativeCode/gltool.c index 9854180..5676290 100755 --- a/CNativeCode/gltool.c +++ b/CNativeCode/gltool.c @@ -27,10 +27,10 @@ #ifdef _X11_ #include "glxtool.h" #endif - -#ifdef _WIN32_ - #include "wgltool.h" -#endif + +#ifdef _WIN32_ + #include "wgltool.h" +#endif static int _glLibsLoaded = 0; @@ -84,8 +84,8 @@ void LIBAPIENTRY check_wgl_error (HWND wnd, const char *file, int line) #endif void LIBAPIENTRY check_gl_error (const char *file, int line) -{ - print_gl_error("GLCHECK", file, line, disp__glGetError()); +{ + print_gl_error("GLCHECK", file, line, disp__glGetError()); } void LIBAPIENTRY __sglBegin(const char * file, int line, GLenum mode) @@ -304,7 +304,7 @@ void * LIBAPIENTRY getGLProcAddressHelper if(!loadGLLibrary (libGLName, libGLUName)) return NULL; - + if (disp__wglGetProcAddress == NULL && __firstAccess) { disp__wglGetProcAddress = ( PROC (CALLBACK *)(LPCSTR) ) @@ -523,21 +523,22 @@ void * LIBAPIENTRY getGLProcAddressHelper void LIBAPIENTRY fetch_GL_FUNCS (const char * libGLName, - const char * libGLUName, int force) + const char * libGLUName, int force, int reload) { static int _firstRun = 1; - if(force) - { - unloadGLLibrary(); - _firstRun = 1; - } + if (!reload) { + if(force) { + unloadGLLibrary(); + _firstRun = 1; + } - if(!_firstRun) - return; + if(!_firstRun) + return; - if(!loadGLLibrary (libGLName, libGLUName)) - return; + if(!loadGLLibrary (libGLName, libGLUName)) + return; + } #define GET_GL_PROCADDRESS(a) getGLProcAddressHelper (libGLName, libGLUName, (a), NULL, 0, 0); @@ -547,12 +548,12 @@ void LIBAPIENTRY fetch_GL_FUNCS (const char * libGLName, _firstRun=0; #ifdef _X11_ - fetch_GLX_FUNCS (libGLName, libGLUName, force); -#endif - -#ifdef _WIN32_ - fetch_WGL_FUNCS (libGLName, libGLUName, force); -#endif + fetch_GLX_FUNCS (libGLName, libGLUName, force, reload); +#endif + +#ifdef _WIN32_ + fetch_WGL_FUNCS (libGLName, libGLUName, force, reload); +#endif } diff --git a/CNativeCode/gltool.h b/CNativeCode/gltool.h index 6939e03..fa8a639 100755 --- a/CNativeCode/gltool.h +++ b/CNativeCode/gltool.h @@ -28,7 +28,7 @@ #include #ifdef _WIN32_ - #include + #include #ifdef LIBAPIENTRY #undef LIBAPIENTRY @@ -81,14 +81,14 @@ #include "gl-disp-var.h" #include "glu-disp-var.h" - #ifndef GLDEBUG + #ifndef GLDEBUG #ifndef NDEBUG #define NDEBUG - #endif - #else - #ifdef NDEBUG - #undef NDEBUG - #endif + #endif + #else + #ifdef NDEBUG + #undef NDEBUG + #endif #endif #ifdef _WIN32_ @@ -122,8 +122,8 @@ (HWND wnd, const char *file, int line); #endif - LIBAPI void LIBAPIENTRY print_gl_error - (const char *msg, const char *file, int line, GLenum errorcode); + LIBAPI void LIBAPIENTRY print_gl_error + (const char *msg, const char *file, int line, GLenum errorcode); LIBAPI void LIBAPIENTRY check_gl_error (const char *file, int line); @@ -150,5 +150,5 @@ const char *func, int *method, int debug, int verbose); LIBAPI void LIBAPIENTRY fetch_GL_FUNCS - (const char * libGLName, const char * libGLUName, int force); + (const char * libGLName, const char * libGLUName, int force, int reload); #endif diff --git a/CNativeCode/glxtool.c b/CNativeCode/glxtool.c index c027f5c..449933d 100644 --- a/CNativeCode/glxtool.c +++ b/CNativeCode/glxtool.c @@ -19,15 +19,17 @@ * use fetch_GL_FUNCS (gltool.c) instead */ void LIBAPIENTRY fetch_GLX_FUNCS (const char * libGLName, - const char * libGLUName, int force) + const char * libGLUName, int force, int reload) { static int _firstRun = 1; - if(force) - _firstRun = 1; + if (!reload) { + if(force) + _firstRun = 1; - if(!_firstRun) - return; + if(!_firstRun) + return; + } #define GET_GL_PROCADDRESS(a) getGLProcAddressHelper (libGLName, libGLUName, (a), NULL, 1, 0); diff --git a/CNativeCode/glxtool.h b/CNativeCode/glxtool.h index 03e28a5..d6d7332 100755 --- a/CNativeCode/glxtool.h +++ b/CNativeCode/glxtool.h @@ -91,7 +91,7 @@ */ LIBAPI void LIBAPIENTRY fetch_GLX_FUNCS (const char * libGLName, - const char * libGLUName, int force); + const char * libGLUName, int force, int reload); LIBAPI int LIBAPIENTRY x11gl_myErrorHandler( Display *pDisp, XErrorEvent *p_error); diff --git a/CNativeCode/ptrtypes.h b/CNativeCode/ptrtypes.h new file mode 100644 index 0000000..5d730ce --- /dev/null +++ b/CNativeCode/ptrtypes.h @@ -0,0 +1,26 @@ +#ifndef _PTRTYPES_H_ +#define _PTRTYPES_H_ + +#if (defined(WIN32)) + +typedef unsigned int uintptr_t; + +#elif defined(linux) + +typedef unsigned int uintptr_t; + +#elif defined(__sun) /* Solaris */ + +#ifdef _LP64 +typedef unsigned long uintptr_t; +#else +typedef unsigned int uintptr_t; +#endif + +#else + +#error Please port ptrtypes.h to your platform + +#endif + +#endif /* #defined _PTRTYPES_H_ */ diff --git a/CNativeCode/wgltool.c b/CNativeCode/wgltool.c index d57335c..73d7a10 100755 --- a/CNativeCode/wgltool.c +++ b/CNativeCode/wgltool.c @@ -19,734 +19,736 @@ * use fetch_GL_FUNCS (gltool.c) instead */ void LIBAPIENTRY fetch_WGL_FUNCS (const char * libGLName, - const char * libGLUName, int force) + const char * libGLUName, int force, int reload) { static int _firstRun = 1; - if(force) - _firstRun = 1; + if (!reload) { + if(force) + _firstRun = 1; - if(!_firstRun) - return; + if(!_firstRun) + return; - if(!loadGLLibrary (libGLName, libGLUName)) - return; - - #define GET_GL_PROCADDRESS(a) getGLProcAddressHelper (libGLName, libGLUName, (a), NULL, 1, 0); + if(!loadGLLibrary (libGLName, libGLUName)) + return; + } + + #define GET_GL_PROCADDRESS(a) getGLProcAddressHelper (libGLName, libGLUName, (a), NULL, 1, 0); #include "wgl-disp-fetch.hc" _firstRun=0; } - - -HGLRC LIBAPIENTRY get_GC( HDC * hDC, GLCapabilities *glCaps, - HGLRC shareWith, - int offScreenRenderer, - int width, int height, HBITMAP *pix, - int verbose) - -{ - const char * text=0; - HDC hDCOrig = 0; - - // Color Palette handle - HPALETTE hPalette = NULL; - HGLRC tempRC=0; - - if( *hDC == 0 && !offScreenRenderer) - printf( "get_GC: Error, HDC is zero\n"); - - // Select the pixel format - if(offScreenRenderer) - { - hDCOrig = *hDC; - *hDC = CreateCompatibleDC(hDCOrig); - // setupDIB(*hDC, pix, width, height); - setupDIB(hDCOrig, *hDC, pix, width, height); - /* SetDCPixelFormat(hDCOffScr, doubleBuffer, stereo, stencilBits, offScreenRenderer); */ - /* setupPalette(hDC); USE MY PROC */ - } - - SetDCPixelFormat(*hDC, glCaps, offScreenRenderer, verbose); - - // Create palette if needed - hPalette = GetOpenGLPalette(*hDC); - - tempRC = disp__wglCreateContext( *hDC ); - - if(verbose) - { - fprintf(stderr,"\n\nPIXELFORMAT OF GL-Context SETTINGS:\n"); - text=GetTextualPixelFormatByHDC(*hDC); - fprintf(stderr,text); - } - - /* check if the context could be created */ - if( tempRC == NULL ) { - fprintf(stderr, "getGC context could NOT be created \n"); - return( 0 ); - } - - /* associated the context with the X window */ - if( disp__wglMakeCurrent( *hDC, tempRC ) == FALSE) { - fprintf(stderr,"wglMakeCurrent(%p,%p) failed on new context!!!\n", *hDC,tempRC); - fprintf(stderr,"Error code = %d\n",(int)GetLastError()); - disp__wglMakeCurrent(NULL, NULL); - disp__wglDeleteContext( tempRC ); - return( 0 ); - } - - if(shareWith!=NULL && disp__wglShareLists(shareWith, tempRC)==FALSE) - { - fprintf(stderr,"\nERROR: Could not share lists between the new and the given GLContext (Win32Native)!\n"); - fprintf(stderr,"Error code = %d\n",(int)GetLastError()); - disp__wglMakeCurrent(NULL, NULL); - disp__wglDeleteContext( tempRC ); - return( 0 ); - } - - if(verbose) - printf( "HGLRC (glContext) created: %p\n", tempRC ); - - return tempRC; -} - -void LIBAPIENTRY setPixelFormatByGLCapabilities( - PIXELFORMATDESCRIPTOR *pfd, - GLCapabilities *glCaps, - int offScreenRenderer, - HDC hdc) -{ - - int colorBits = glCaps->redBits + glCaps->greenBits + glCaps->blueBits; - - pfd->nSize=sizeof(PIXELFORMATDESCRIPTOR); - pfd->nVersion=1; - pfd->dwFlags=PFD_SUPPORT_OPENGL | PFD_GENERIC_ACCELERATED; /* refined later */ - pfd->iPixelType=0; - pfd->cColorBits=0; - pfd->cRedBits=0; - pfd->cRedShift=0; - pfd->cGreenBits=0; - pfd->cGreenShift=0; - pfd->cBlueBits=0; - pfd->cBlueShift=0; - pfd->cAlphaBits=0; - pfd->cAlphaShift=0; - pfd->cAccumBits=0; - pfd->cAccumRedBits=0; - pfd->cAccumGreenBits=0; - pfd->cAccumBlueBits=0; - pfd->cAccumAlphaBits=0; - pfd->cDepthBits=32; - pfd->cStencilBits=0; - pfd->cAuxBuffers=0; - pfd->iLayerType=PFD_MAIN_PLANE; - pfd->bReserved=0; - pfd->dwLayerMask=0; - pfd->dwVisibleMask=0; - pfd->dwDamageMask=0; - - if(COLOR_RGBA == glCaps->color) - pfd->iPixelType=PFD_TYPE_RGBA; - else - pfd->iPixelType=PFD_TYPE_COLORINDEX; - - if(offScreenRenderer) - pfd->dwFlags |= PFD_DRAW_TO_BITMAP; // Draw to Bitmap - else - pfd->dwFlags |= PFD_DRAW_TO_WINDOW; // Draw to Window (not to bitmap) - - - if(BUFFER_DOUBLE==glCaps->buffer) - pfd->dwFlags |= PFD_DOUBLEBUFFER ; // Double buffered is optional - - if(STEREO_ON==glCaps->stereo) - pfd->dwFlags |= PFD_STEREO ; // Stereo is optional - - if(hdc!=NULL && GetDeviceCaps(hdc, BITSPIXEL)cColorBits = GetDeviceCaps(hdc, BITSPIXEL); - else - pfd->cColorBits = (BYTE)colorBits; - - pfd->cStencilBits = (BYTE) glCaps->stencilBits; -} - - -void LIBAPIENTRY SetDCPixelFormat(HDC hDC, GLCapabilities *glCaps, - int offScreenRenderer, int verbose) -{ - int nPixelFormat=-1; - const char * text=0; - - PIXELFORMATDESCRIPTOR pfd ; - - if(verbose) - { - fprintf(stdout, "GL4Java SetDCPixelFormat: input capabilities:\n"); - printGLCapabilities ( glCaps ); - } - - if(glCaps->nativeVisualID>=0) - { - if ( 0 < DescribePixelFormat( hDC, (int)(glCaps->nativeVisualID), - sizeof(pfd), &pfd ) ) - { - nPixelFormat=(int)(glCaps->nativeVisualID); - if(verbose) - { - fprintf(stderr,"\n\nUSER found stored PIXELFORMAT number: %ld\n", - nPixelFormat); - fflush(stderr); - } - } else { - fprintf(stderr,"\n\nUSER no stored PIXELFORMAT number found !!\n"); - nPixelFormat = -1; - fflush(stderr); - } - } - - if(nPixelFormat<0) - setPixelFormatByGLCapabilities( &pfd, glCaps, offScreenRenderer, hDC); - - if(verbose) - { - fprintf(stderr,"\n\nUSER CHOOSED PIXELFORMAT (TRYING):\n"); - text=GetTextualPixelFormatByPFD(&pfd, nPixelFormat); - fprintf(stderr,text); - fflush(stderr); - } - - // Choose a pixel format that best matches that described in pfd - if( hDC == 0 ) - printf( "SetDCPixelFormat: Error, no HDC-Contex is given\n"); - else if(nPixelFormat<0) - nPixelFormat = ChoosePixelFormat(hDC, &pfd); - - if( nPixelFormat == 0 ) - printf( "SetDCPixelFormat: Error with PixelFormat\n" ); - - // Set the pixel format for the device context - if( SetPixelFormat(hDC, nPixelFormat, &pfd) == FALSE) - printf( "setpixel failed\n" ); - else { - (void) setGLCapabilities ( hDC, nPixelFormat, glCaps ); - if(verbose) - { - fprintf(stdout, "GL4Java SetDCPixelFormat: used capabilities:\n"); - printGLCapabilities ( glCaps ); - } - } - fflush(stdout); - fflush(stderr); -} - - -// If necessary, creates a 3-3-2 palette for the device context listed. -HPALETTE LIBAPIENTRY GetOpenGLPalette(HDC hDC) -{ - HPALETTE hRetPal = NULL; // Handle to palette to be created - PIXELFORMATDESCRIPTOR pfd; // Pixel Format Descriptor - LOGPALETTE *pPal=0; // Pointer to memory for logical palette - int nPixelFormat=0; // Pixel format index - int nColors=0; // Number of entries in palette - int i=0; // Counting variable - BYTE RedRange=0,GreenRange=0,BlueRange=0; - // Range for each color entry (7,7,and 3) - - - // Get the pixel format index and retrieve the pixel format description - nPixelFormat = GetPixelFormat(hDC); - DescribePixelFormat(hDC, nPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); - - // Does this pixel format require a palette? If not, do not create a - // palette and just return NULL - if(!(pfd.dwFlags & PFD_NEED_PALETTE)) - return NULL; - - // Number of entries in palette. 8 bits yeilds 256 entries - nColors = 1 << pfd.cColorBits; - - // Allocate space for a logical palette structure plus all the palette entries - pPal = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) + nColors*sizeof(PALETTEENTRY)); - - // Fill in palette header - pPal->palVersion = 0x300; // Windows 3.0 - pPal->palNumEntries = nColors; // table size - - // Build mask of all 1's. This creates a number represented by having - // the low order x bits set, where x = pfd.cRedBits, pfd.cGreenBits, and - // pfd.cBlueBits. - RedRange = (1 << pfd.cRedBits) -1; - GreenRange = (1 << pfd.cGreenBits) - 1; - BlueRange = (1 << pfd.cBlueBits) -1; - - // Loop through all the palette entries - for(i = 0; i < nColors; i++) - { - // Fill in the 8-bit equivalents for each component - pPal->palPalEntry[i].peRed = (i >> pfd.cRedShift) & RedRange; - pPal->palPalEntry[i].peRed = (unsigned char)( - (double) pPal->palPalEntry[i].peRed * 255.0 / RedRange); - - pPal->palPalEntry[i].peGreen = (i >> pfd.cGreenShift) & GreenRange; - pPal->palPalEntry[i].peGreen = (unsigned char)( - (double)pPal->palPalEntry[i].peGreen * 255.0 / GreenRange); - - pPal->palPalEntry[i].peBlue = (i >> pfd.cBlueShift) & BlueRange; - pPal->palPalEntry[i].peBlue = (unsigned char)( - (double)pPal->palPalEntry[i].peBlue * 255.0 / BlueRange); - - pPal->palPalEntry[i].peFlags = (unsigned char) NULL; - } - - - // Create the palette - hRetPal = CreatePalette(pPal); - - // Go ahead and select and realize the palette for this device context - SelectPalette(hDC,hRetPal,FALSE); - RealizePalette(hDC); - - // Free the memory used for the logical palette structure - free(pPal); - - // Return the handle to the new palette - return hRetPal; -} - - -static void -PrintMessage( const char *Format, ... ) -{ - va_list ArgList; - char Buffer[256]; - - va_start(ArgList, Format); - vsprintf(Buffer, Format, ArgList); - va_end(ArgList); - - fprintf(stderr, Buffer); -} - - -int LIBAPIENTRY -PixelFormatDescriptorFromDc( HDC Dc, PIXELFORMATDESCRIPTOR *Pfd ) -{ - int PfdIndex; - - if ( 0 < (PfdIndex = GetPixelFormat( Dc )) ) - { - if ( 0 < DescribePixelFormat( Dc, PfdIndex, sizeof(*Pfd), Pfd ) ) - { - return(PfdIndex); - } - else - { - PrintMessage("Could not get a description of pixel format %d\n", - PfdIndex ); - } - } - else - { - PrintMessage("Could not get pixel format for Dc 0x%08lX\n", Dc ); - } - return( 0 ); -} - - -const char * LIBAPIENTRY -GetTextualPixelFormatByPFD(PIXELFORMATDESCRIPTOR *ppfd, int format) -{ - static char buffer[2000]; - char line[200]; - - sprintf(buffer,"Pixel format %d\n", format); - sprintf(line," dwFlags - 0x%x\n", ppfd->dwFlags); - if (ppfd->dwFlags & PFD_DOUBLEBUFFER) { strcat(buffer, line); sprintf(line,"\tPFD_DOUBLEBUFFER\n "); } - if (ppfd->dwFlags & PFD_STEREO) { strcat(buffer, line); sprintf(line,"\tPFD_STEREO\n "); } - if (ppfd->dwFlags & PFD_DRAW_TO_WINDOW) { strcat(buffer, line); sprintf(line,"\tPFD_DRAW_TO_WINDOW\n "); } - if (ppfd->dwFlags & PFD_DRAW_TO_BITMAP) { strcat(buffer, line); sprintf(line,"\tPFD_DRAW_TO_BITMAP\n "); } - if (ppfd->dwFlags & PFD_SUPPORT_GDI) { strcat(buffer, line); sprintf(line,"\tPFD_SUPPORT_GDI\n "); } - if (ppfd->dwFlags & PFD_SUPPORT_OPENGL) { strcat(buffer, line); sprintf(line,"\tPFD_SUPPORT_OPENGL\n "); } - if (ppfd->dwFlags & PFD_GENERIC_ACCELERATED) { strcat(buffer, line); sprintf(line,"\tPFD_GENERIC_ACCELERATED\n "); } - if (ppfd->dwFlags & PFD_GENERIC_FORMAT) { strcat(buffer, line); sprintf(line,"\tPFD_GENERIC_FORMAT\n "); } - if (ppfd->dwFlags & PFD_NEED_PALETTE) { strcat(buffer, line); sprintf(line,"\tPFD_NEED_PALETTE\n "); } - if (ppfd->dwFlags & PFD_NEED_SYSTEM_PALETTE) { strcat(buffer, line); sprintf(line,"\tPFD_NEED_SYSTEM_PALETTE\n "); } - strcat(buffer, line); sprintf(line,"\n"); - strcat(buffer, line); sprintf(line," iPixelType - %d\n", ppfd->iPixelType); - if (ppfd->iPixelType == PFD_TYPE_RGBA) { strcat(buffer, line); sprintf(line,"\tPGD_TYPE_RGBA\n"); } - if (ppfd->iPixelType == PFD_TYPE_COLORINDEX) { strcat(buffer, line); sprintf(line,"\tPGD_TYPE_COLORINDEX\n"); } - strcat(buffer, line); sprintf(line," cColorBits - %d\n", ppfd->cColorBits); - strcat(buffer, line); sprintf(line," cRedBits - %d\n", ppfd->cRedBits); - strcat(buffer, line); sprintf(line," cRedShift - %d\n", ppfd->cRedShift); - strcat(buffer, line); sprintf(line," cGreenBits - %d\n", ppfd->cGreenBits); - strcat(buffer, line); sprintf(line," cGreenShift - %d\n", ppfd->cGreenShift); - strcat(buffer, line); sprintf(line," cBlueBits - %d\n", ppfd->cBlueBits); - strcat(buffer, line); sprintf(line," cBlueShift - %d\n", ppfd->cBlueShift); - strcat(buffer, line); sprintf(line," cAlphaBits - %d (N.A.)\n", ppfd->cAlphaBits); - strcat(buffer, line); sprintf(line," cAlphaShift - 0x%x (N.A.)\n", ppfd->cAlphaShift); - strcat(buffer, line); sprintf(line," cAccumBits - %d\n", ppfd->cAccumBits); - strcat(buffer, line); sprintf(line," cAccumRedBits - %d\n", ppfd->cAccumRedBits); - strcat(buffer, line); sprintf(line," cAccumGreenBits - %d\n", ppfd->cAccumGreenBits); - strcat(buffer, line); sprintf(line," cAccumBlueBits - %d\n", ppfd->cAccumBlueBits); - strcat(buffer, line); sprintf(line," cAccumAlphaBits - %d\n", ppfd->cAccumAlphaBits); - strcat(buffer, line); sprintf(line," cDepthBits - %d\n", ppfd->cDepthBits); - strcat(buffer, line); sprintf(line," cStencilBits - %d\n", ppfd->cStencilBits); - strcat(buffer, line); sprintf(line," cAuxBuffers - %d\n", ppfd->cAuxBuffers); - strcat(buffer, line); sprintf(line," iLayerType - %d\n", ppfd->iLayerType); - strcat(buffer, line); sprintf(line," bReserved - %d\n", ppfd->bReserved); - strcat(buffer, line); sprintf(line," dwLayerMask - 0x%x\n", ppfd->dwLayerMask); - strcat(buffer, line); sprintf(line," dwVisibleMask - 0x%x\n", ppfd->dwVisibleMask); - strcat(buffer, line); sprintf(line," dwDamageMask - 0x%x\n", ppfd->dwDamageMask); - strcat(buffer, line); - return buffer; -} - -const char * LIBAPIENTRY GetTextualPixelFormatByHDC(HDC hdc) -{ - PIXELFORMATDESCRIPTOR pfd, *ppfd=0; - int format=0; - - ppfd = &pfd; - format = PixelFormatDescriptorFromDc( hdc, ppfd ); - - return GetTextualPixelFormatByPFD(ppfd, format); -} - -/*****************************************************************/ - -/* Struct used to manage color ramps */ -typedef struct { - GLfloat amb[3]; /* ambient color / bottom of ramp */ - GLfloat diff[3]; /* diffuse color / middle of ramp */ - GLfloat spec[3]; /* specular color / top of ramp */ - GLfloat ratio; /* ratio of diffuse to specular in ramp */ - GLint indexes[3]; /* where ramp was placed in palette */ -} colorIndexState ; - -#define NUM_COLORS (sizeof(colors) / sizeof(colors[0])) - -void LIBAPIENTRY -setupDIB(HDC hDCOrig, HDC hDC, HBITMAP * hBitmap, int width, int height) -{ - BITMAPINFO *bmInfo=0; - BITMAPINFOHEADER *bmHeader=0; - UINT usage=0; - VOID *base=0; - int bmiSize=0; - int bitsPerPixel=0; - HBITMAP hOldBitmap=0; - - bmiSize = sizeof(*bmInfo); - bitsPerPixel = GetDeviceCaps(hDC, BITSPIXEL); - - switch (bitsPerPixel) { - case 8: - // bmiColors is 256 WORD palette indices - bmiSize += (256 * sizeof(WORD)) - sizeof(RGBQUAD); - break; - case 16: - // bmiColors is 3 WORD component masks - bmiSize += (3 * sizeof(DWORD)) - sizeof(RGBQUAD); - break; - case 24: - case 32: - default: - // bmiColors not used - break; - } - - bmInfo = (BITMAPINFO *) calloc(1, bmiSize); - bmHeader = &bmInfo->bmiHeader; - - bmHeader->biSize = sizeof(*bmHeader); - bmHeader->biWidth = width; - bmHeader->biHeight = height; - bmHeader->biPlanes = 1; // must be 1 - bmHeader->biBitCount = bitsPerPixel; - bmHeader->biXPelsPerMeter = 0; - bmHeader->biYPelsPerMeter = 0; - bmHeader->biClrUsed = 0; // all are used - bmHeader->biClrImportant = 0; // all are important - - switch (bitsPerPixel) { - case 8: - bmHeader->biCompression = BI_RGB; - bmHeader->biSizeImage = 0; - usage = DIB_PAL_COLORS; - // bmiColors is 256 WORD palette indices - { - WORD *palIndex = (WORD *) &bmInfo->bmiColors[0]; - int i; - - for (i=0; i<256; i++) { - palIndex[i] = i; - } - } - break; - case 16: - bmHeader->biCompression = BI_RGB; - bmHeader->biSizeImage = 0; - usage = DIB_RGB_COLORS; - // bmiColors is 3 WORD component masks - { - DWORD *compMask = (DWORD *) &bmInfo->bmiColors[0]; - - compMask[0] = 0xF800; - compMask[1] = 0x07E0; - compMask[2] = 0x001F; - } - break; - case 24: - case 32: - default: - bmHeader->biCompression = BI_RGB; - bmHeader->biSizeImage = 0; - usage = DIB_RGB_COLORS; - // bmiColors not used - break; - } - - *hBitmap = CreateDIBSection(hDC, bmInfo, usage, &base, NULL, 0); - if (*hBitmap == NULL) { - (void) MessageBox(WindowFromDC(hDC), - "Failed to create DIBSection.", - "OpenGL application error", - MB_ICONERROR | MB_OK); - exit(1); - } - - hOldBitmap = SelectObject(hDC, *hBitmap); - if(hOldBitmap!=0) - DeleteObject(hOldBitmap); - - free(bmInfo); -} - - -/* -static void -setupDIB(HDC hDCOrig, HDC hDC, HBITMAP * hBitmap, int width, int height) -{ - HBITMAP hOldBitmap=0; - - *hBitmap = CreateCompatibleBitmap( hDCOrig, width, height ); - if (*hBitmap == NULL) { - fprintf(stderr,"Failed to create CreateCompatibleBitmap! \n"); - fflush(stderr); - return; - } - - hOldBitmap = SelectObject(hDC, *hBitmap); - if(hOldBitmap!=0) - DeleteObject(hOldBitmap); -} -*/ - - -void LIBAPIENTRY resizeDIB(HDC hDC, HBITMAP *hOldBitmap, HBITMAP *hBitmap) -{ - /* - SelectObject(hDC, *hOldBitmap); - DeleteObject(*hBitmap); - setupDIB(hDC, hBitmap); - */ -} - -HPALETTE LIBAPIENTRY setupPalette(HDC hDC) -{ - HPALETTE hPalette = NULL; - PIXELFORMATDESCRIPTOR pfd; - LOGPALETTE* pPal=0; - int pixelFormat = GetPixelFormat(hDC); - int paletteSize=0; - colorIndexState colors[] = { - { - { 0.0F, 0.0F, 0.0F }, - { 0.1F, 0.6F, 0.3F }, - { 1.0F, 1.0F, 1.0F }, - 0.75F, { 0, 0, 0 }, - }, - { - { 0.0F, 0.0F, 0.0F }, - { 0.0F, 0.2F, 0.5F }, - { 1.0F, 1.0F, 1.0F }, - 0.75F, { 0, 0, 0 }, - }, - { - { 0.0F, 0.05F, 0.05F }, - { 0.6F, 0.0F, 0.8F }, - { 1.0F, 1.0F, 1.0F }, - 0.75F, { 0, 0, 0 }, - }, - }; - - - DescribePixelFormat(hDC, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); - - /* - ** Determine if a palette is needed and if so what size. - */ - if (pfd.dwFlags & PFD_NEED_PALETTE) { - paletteSize = 1 << pfd.cColorBits; - } else if (pfd.iPixelType == PFD_TYPE_COLORINDEX) { - paletteSize = 4096; - } else { - return NULL; - } - - pPal = (LOGPALETTE*) - malloc(sizeof(LOGPALETTE) + paletteSize * sizeof(PALETTEENTRY)); - pPal->palVersion = 0x300; - pPal->palNumEntries = paletteSize; - - if (pfd.iPixelType == PFD_TYPE_RGBA) { - /* - ** Fill the logical paletee with RGB color ramps - */ - int redMask = (1 << pfd.cRedBits) - 1; - int greenMask = (1 << pfd.cGreenBits) - 1; - int blueMask = (1 << pfd.cBlueBits) - 1; - int i; - - - - for (i=0; ipalPalEntry[i].peRed = - (((i >> pfd.cRedShift) & redMask) * 255) / redMask; - pPal->palPalEntry[i].peGreen = - (((i >> pfd.cGreenShift) & greenMask) * 255) / greenMask; - pPal->palPalEntry[i].peBlue = - (((i >> pfd.cBlueShift) & blueMask) * 255) / blueMask; - pPal->palPalEntry[i].peFlags = 0; - } - } else { - /* - ** Fill the logical palette with color ramps. - ** - ** Set up the logical palette so that it can be realized - ** into the system palette as an identity palette. - ** - ** 1) The default static entries should be present and at the right - ** location. The easiest way to do this is to grab them from - ** the current system palette. - ** - ** 2) All non-static entries should be initialized to unique values. - ** The easiest way to do this is to ensure that all of the non-static - ** entries have the PC_NOCOLLAPSE flag bit set. - */ - int numRamps = NUM_COLORS; - int rampSize = (paletteSize - 20) / numRamps; - int extra = (paletteSize - 20) - (numRamps * rampSize); - int i, r; - - /* - ** Initialize static entries by copying them from the - ** current system palette. - */ - GetSystemPaletteEntries(hDC, 0, paletteSize, &pPal->palPalEntry[0]); - - /* - ** Fill in non-static entries with desired colors. - */ - for (r=0; rpalPalEntry[rampBase]; - int diffSize = (int) (rampSize * colors[r].ratio); - int specSize = rampSize - diffSize; - - for (i=0; ipalPalEntry[index]; - - pe->peRed = (BYTE) 0; - pe->peGreen = (BYTE) 0; - pe->peBlue = (BYTE) 0; - pe->peFlags = PC_NOCOLLAPSE; - } - } - - hPalette = CreatePalette(pPal); - free(pPal); - - if (hPalette) { - SelectPalette(hDC, hPalette, FALSE); - RealizePalette(hDC); - } - - return hPalette; -} - - -int LIBAPIENTRY setGLCapabilities ( HDC hdc, - int nPixelFormat, - GLCapabilities *glCaps ) -{ - PIXELFORMATDESCRIPTOR pfd; - - (void) PixelFormatDescriptorFromDc( hdc, &pfd); - - if (pfd.dwFlags & PFD_DOUBLEBUFFER) - glCaps->buffer=BUFFER_DOUBLE; - else - glCaps->buffer=BUFFER_SINGLE; - - if (pfd.dwFlags & PFD_STEREO) - glCaps->stereo=STEREO_ON; - else - glCaps->stereo=STEREO_OFF; - - if (pfd.iPixelType == PFD_TYPE_RGBA) - glCaps->color=COLOR_RGBA; - - if (pfd.iPixelType == PFD_TYPE_COLORINDEX) - glCaps->color=COLOR_INDEX; - - glCaps->depthBits = pfd.cDepthBits; - glCaps->stencilBits = pfd.cStencilBits; - - glCaps->redBits = pfd.cRedBits; - glCaps->greenBits= pfd.cGreenBits; - glCaps->blueBits= pfd.cBlueBits; - /* glCaps->alphaBits= pfd.cAlphaBits; N.A. */ - glCaps->accumRedBits = pfd.cAccumRedBits; - glCaps->accumGreenBits= pfd.cAccumGreenBits; - glCaps->accumBlueBits= pfd.cAccumBlueBits; - glCaps->accumAlphaBits= pfd.cAccumAlphaBits; - - glCaps->nativeVisualID=nPixelFormat; - - return 1; -} - + + +HGLRC LIBAPIENTRY get_GC( HDC * hDC, GLCapabilities *glCaps, + HGLRC shareWith, + int offScreenRenderer, + int width, int height, HBITMAP *pix, + int verbose) + +{ + const char * text=0; + HDC hDCOrig = 0; + + // Color Palette handle + HPALETTE hPalette = NULL; + HGLRC tempRC=0; + + if( *hDC == 0 && !offScreenRenderer) + printf( "get_GC: Error, HDC is zero\n"); + + // Select the pixel format + if(offScreenRenderer) + { + hDCOrig = *hDC; + *hDC = CreateCompatibleDC(hDCOrig); + // setupDIB(*hDC, pix, width, height); + setupDIB(hDCOrig, *hDC, pix, width, height); + /* SetDCPixelFormat(hDCOffScr, doubleBuffer, stereo, stencilBits, offScreenRenderer); */ + /* setupPalette(hDC); USE MY PROC */ + } + + SetDCPixelFormat(*hDC, glCaps, offScreenRenderer, verbose); + + // Create palette if needed + hPalette = GetOpenGLPalette(*hDC); + + tempRC = disp__wglCreateContext( *hDC ); + + if(verbose) + { + fprintf(stderr,"\n\nPIXELFORMAT OF GL-Context SETTINGS:\n"); + text=GetTextualPixelFormatByHDC(*hDC); + fprintf(stderr,text); + } + + /* check if the context could be created */ + if( tempRC == NULL ) { + fprintf(stderr, "getGC context could NOT be created \n"); + return( 0 ); + } + + /* associated the context with the X window */ + if( disp__wglMakeCurrent( *hDC, tempRC ) == FALSE) { + fprintf(stderr,"wglMakeCurrent(%p,%p) failed on new context!!!\n", *hDC,tempRC); + fprintf(stderr,"Error code = %d\n",(int)GetLastError()); + disp__wglMakeCurrent(NULL, NULL); + disp__wglDeleteContext( tempRC ); + return( 0 ); + } + + if(shareWith!=NULL && disp__wglShareLists(shareWith, tempRC)==FALSE) + { + fprintf(stderr,"\nERROR: Could not share lists between the new and the given GLContext (Win32Native)!\n"); + fprintf(stderr,"Error code = %d\n",(int)GetLastError()); + disp__wglMakeCurrent(NULL, NULL); + disp__wglDeleteContext( tempRC ); + return( 0 ); + } + + if(verbose) + printf( "HGLRC (glContext) created: %p\n", tempRC ); + + return tempRC; +} + +void LIBAPIENTRY setPixelFormatByGLCapabilities( + PIXELFORMATDESCRIPTOR *pfd, + GLCapabilities *glCaps, + int offScreenRenderer, + HDC hdc) +{ + + int colorBits = glCaps->redBits + glCaps->greenBits + glCaps->blueBits; + + pfd->nSize=sizeof(PIXELFORMATDESCRIPTOR); + pfd->nVersion=1; + pfd->dwFlags=PFD_SUPPORT_OPENGL | PFD_GENERIC_ACCELERATED; /* refined later */ + pfd->iPixelType=0; + pfd->cColorBits=0; + pfd->cRedBits=0; + pfd->cRedShift=0; + pfd->cGreenBits=0; + pfd->cGreenShift=0; + pfd->cBlueBits=0; + pfd->cBlueShift=0; + pfd->cAlphaBits=0; + pfd->cAlphaShift=0; + pfd->cAccumBits=0; + pfd->cAccumRedBits=0; + pfd->cAccumGreenBits=0; + pfd->cAccumBlueBits=0; + pfd->cAccumAlphaBits=0; + pfd->cDepthBits=32; + pfd->cStencilBits=0; + pfd->cAuxBuffers=0; + pfd->iLayerType=PFD_MAIN_PLANE; + pfd->bReserved=0; + pfd->dwLayerMask=0; + pfd->dwVisibleMask=0; + pfd->dwDamageMask=0; + + if(COLOR_RGBA == glCaps->color) + pfd->iPixelType=PFD_TYPE_RGBA; + else + pfd->iPixelType=PFD_TYPE_COLORINDEX; + + if(offScreenRenderer) + pfd->dwFlags |= PFD_DRAW_TO_BITMAP; // Draw to Bitmap + else + pfd->dwFlags |= PFD_DRAW_TO_WINDOW; // Draw to Window (not to bitmap) + + + if(BUFFER_DOUBLE==glCaps->buffer) + pfd->dwFlags |= PFD_DOUBLEBUFFER ; // Double buffered is optional + + if(STEREO_ON==glCaps->stereo) + pfd->dwFlags |= PFD_STEREO ; // Stereo is optional + + if(hdc!=NULL && GetDeviceCaps(hdc, BITSPIXEL)cColorBits = GetDeviceCaps(hdc, BITSPIXEL); + else + pfd->cColorBits = (BYTE)colorBits; + + pfd->cStencilBits = (BYTE) glCaps->stencilBits; +} + + +void LIBAPIENTRY SetDCPixelFormat(HDC hDC, GLCapabilities *glCaps, + int offScreenRenderer, int verbose) +{ + int nPixelFormat=-1; + const char * text=0; + + PIXELFORMATDESCRIPTOR pfd ; + + if(verbose) + { + fprintf(stdout, "GL4Java SetDCPixelFormat: input capabilities:\n"); + printGLCapabilities ( glCaps ); + } + + if(glCaps->nativeVisualID>=0) + { + if ( 0 < DescribePixelFormat( hDC, (int)(glCaps->nativeVisualID), + sizeof(pfd), &pfd ) ) + { + nPixelFormat=(int)(glCaps->nativeVisualID); + if(verbose) + { + fprintf(stderr,"\n\nUSER found stored PIXELFORMAT number: %ld\n", + nPixelFormat); + fflush(stderr); + } + } else { + fprintf(stderr,"\n\nUSER no stored PIXELFORMAT number found !!\n"); + nPixelFormat = -1; + fflush(stderr); + } + } + + if(nPixelFormat<0) + setPixelFormatByGLCapabilities( &pfd, glCaps, offScreenRenderer, hDC); + + if(verbose) + { + fprintf(stderr,"\n\nUSER CHOOSED PIXELFORMAT (TRYING):\n"); + text=GetTextualPixelFormatByPFD(&pfd, nPixelFormat); + fprintf(stderr,text); + fflush(stderr); + } + + // Choose a pixel format that best matches that described in pfd + if( hDC == 0 ) + printf( "SetDCPixelFormat: Error, no HDC-Contex is given\n"); + else if(nPixelFormat<0) + nPixelFormat = ChoosePixelFormat(hDC, &pfd); + + if( nPixelFormat == 0 ) + printf( "SetDCPixelFormat: Error with PixelFormat\n" ); + + // Set the pixel format for the device context + if( SetPixelFormat(hDC, nPixelFormat, &pfd) == FALSE) + printf( "setpixel failed\n" ); + else { + (void) setGLCapabilities ( hDC, nPixelFormat, glCaps ); + if(verbose) + { + fprintf(stdout, "GL4Java SetDCPixelFormat: used capabilities:\n"); + printGLCapabilities ( glCaps ); + } + } + fflush(stdout); + fflush(stderr); +} + + +// If necessary, creates a 3-3-2 palette for the device context listed. +HPALETTE LIBAPIENTRY GetOpenGLPalette(HDC hDC) +{ + HPALETTE hRetPal = NULL; // Handle to palette to be created + PIXELFORMATDESCRIPTOR pfd; // Pixel Format Descriptor + LOGPALETTE *pPal=0; // Pointer to memory for logical palette + int nPixelFormat=0; // Pixel format index + int nColors=0; // Number of entries in palette + int i=0; // Counting variable + BYTE RedRange=0,GreenRange=0,BlueRange=0; + // Range for each color entry (7,7,and 3) + + + // Get the pixel format index and retrieve the pixel format description + nPixelFormat = GetPixelFormat(hDC); + DescribePixelFormat(hDC, nPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); + + // Does this pixel format require a palette? If not, do not create a + // palette and just return NULL + if(!(pfd.dwFlags & PFD_NEED_PALETTE)) + return NULL; + + // Number of entries in palette. 8 bits yeilds 256 entries + nColors = 1 << pfd.cColorBits; + + // Allocate space for a logical palette structure plus all the palette entries + pPal = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) + nColors*sizeof(PALETTEENTRY)); + + // Fill in palette header + pPal->palVersion = 0x300; // Windows 3.0 + pPal->palNumEntries = nColors; // table size + + // Build mask of all 1's. This creates a number represented by having + // the low order x bits set, where x = pfd.cRedBits, pfd.cGreenBits, and + // pfd.cBlueBits. + RedRange = (1 << pfd.cRedBits) -1; + GreenRange = (1 << pfd.cGreenBits) - 1; + BlueRange = (1 << pfd.cBlueBits) -1; + + // Loop through all the palette entries + for(i = 0; i < nColors; i++) + { + // Fill in the 8-bit equivalents for each component + pPal->palPalEntry[i].peRed = (i >> pfd.cRedShift) & RedRange; + pPal->palPalEntry[i].peRed = (unsigned char)( + (double) pPal->palPalEntry[i].peRed * 255.0 / RedRange); + + pPal->palPalEntry[i].peGreen = (i >> pfd.cGreenShift) & GreenRange; + pPal->palPalEntry[i].peGreen = (unsigned char)( + (double)pPal->palPalEntry[i].peGreen * 255.0 / GreenRange); + + pPal->palPalEntry[i].peBlue = (i >> pfd.cBlueShift) & BlueRange; + pPal->palPalEntry[i].peBlue = (unsigned char)( + (double)pPal->palPalEntry[i].peBlue * 255.0 / BlueRange); + + pPal->palPalEntry[i].peFlags = (unsigned char) NULL; + } + + + // Create the palette + hRetPal = CreatePalette(pPal); + + // Go ahead and select and realize the palette for this device context + SelectPalette(hDC,hRetPal,FALSE); + RealizePalette(hDC); + + // Free the memory used for the logical palette structure + free(pPal); + + // Return the handle to the new palette + return hRetPal; +} + + +static void +PrintMessage( const char *Format, ... ) +{ + va_list ArgList; + char Buffer[256]; + + va_start(ArgList, Format); + vsprintf(Buffer, Format, ArgList); + va_end(ArgList); + + fprintf(stderr, Buffer); +} + + +int LIBAPIENTRY +PixelFormatDescriptorFromDc( HDC Dc, PIXELFORMATDESCRIPTOR *Pfd ) +{ + int PfdIndex; + + if ( 0 < (PfdIndex = GetPixelFormat( Dc )) ) + { + if ( 0 < DescribePixelFormat( Dc, PfdIndex, sizeof(*Pfd), Pfd ) ) + { + return(PfdIndex); + } + else + { + PrintMessage("Could not get a description of pixel format %d\n", + PfdIndex ); + } + } + else + { + PrintMessage("Could not get pixel format for Dc 0x%08lX\n", Dc ); + } + return( 0 ); +} + + +const char * LIBAPIENTRY +GetTextualPixelFormatByPFD(PIXELFORMATDESCRIPTOR *ppfd, int format) +{ + static char buffer[2000]; + char line[200]; + + sprintf(buffer,"Pixel format %d\n", format); + sprintf(line," dwFlags - 0x%x\n", ppfd->dwFlags); + if (ppfd->dwFlags & PFD_DOUBLEBUFFER) { strcat(buffer, line); sprintf(line,"\tPFD_DOUBLEBUFFER\n "); } + if (ppfd->dwFlags & PFD_STEREO) { strcat(buffer, line); sprintf(line,"\tPFD_STEREO\n "); } + if (ppfd->dwFlags & PFD_DRAW_TO_WINDOW) { strcat(buffer, line); sprintf(line,"\tPFD_DRAW_TO_WINDOW\n "); } + if (ppfd->dwFlags & PFD_DRAW_TO_BITMAP) { strcat(buffer, line); sprintf(line,"\tPFD_DRAW_TO_BITMAP\n "); } + if (ppfd->dwFlags & PFD_SUPPORT_GDI) { strcat(buffer, line); sprintf(line,"\tPFD_SUPPORT_GDI\n "); } + if (ppfd->dwFlags & PFD_SUPPORT_OPENGL) { strcat(buffer, line); sprintf(line,"\tPFD_SUPPORT_OPENGL\n "); } + if (ppfd->dwFlags & PFD_GENERIC_ACCELERATED) { strcat(buffer, line); sprintf(line,"\tPFD_GENERIC_ACCELERATED\n "); } + if (ppfd->dwFlags & PFD_GENERIC_FORMAT) { strcat(buffer, line); sprintf(line,"\tPFD_GENERIC_FORMAT\n "); } + if (ppfd->dwFlags & PFD_NEED_PALETTE) { strcat(buffer, line); sprintf(line,"\tPFD_NEED_PALETTE\n "); } + if (ppfd->dwFlags & PFD_NEED_SYSTEM_PALETTE) { strcat(buffer, line); sprintf(line,"\tPFD_NEED_SYSTEM_PALETTE\n "); } + strcat(buffer, line); sprintf(line,"\n"); + strcat(buffer, line); sprintf(line," iPixelType - %d\n", ppfd->iPixelType); + if (ppfd->iPixelType == PFD_TYPE_RGBA) { strcat(buffer, line); sprintf(line,"\tPGD_TYPE_RGBA\n"); } + if (ppfd->iPixelType == PFD_TYPE_COLORINDEX) { strcat(buffer, line); sprintf(line,"\tPGD_TYPE_COLORINDEX\n"); } + strcat(buffer, line); sprintf(line," cColorBits - %d\n", ppfd->cColorBits); + strcat(buffer, line); sprintf(line," cRedBits - %d\n", ppfd->cRedBits); + strcat(buffer, line); sprintf(line," cRedShift - %d\n", ppfd->cRedShift); + strcat(buffer, line); sprintf(line," cGreenBits - %d\n", ppfd->cGreenBits); + strcat(buffer, line); sprintf(line," cGreenShift - %d\n", ppfd->cGreenShift); + strcat(buffer, line); sprintf(line," cBlueBits - %d\n", ppfd->cBlueBits); + strcat(buffer, line); sprintf(line," cBlueShift - %d\n", ppfd->cBlueShift); + strcat(buffer, line); sprintf(line," cAlphaBits - %d (N.A.)\n", ppfd->cAlphaBits); + strcat(buffer, line); sprintf(line," cAlphaShift - 0x%x (N.A.)\n", ppfd->cAlphaShift); + strcat(buffer, line); sprintf(line," cAccumBits - %d\n", ppfd->cAccumBits); + strcat(buffer, line); sprintf(line," cAccumRedBits - %d\n", ppfd->cAccumRedBits); + strcat(buffer, line); sprintf(line," cAccumGreenBits - %d\n", ppfd->cAccumGreenBits); + strcat(buffer, line); sprintf(line," cAccumBlueBits - %d\n", ppfd->cAccumBlueBits); + strcat(buffer, line); sprintf(line," cAccumAlphaBits - %d\n", ppfd->cAccumAlphaBits); + strcat(buffer, line); sprintf(line," cDepthBits - %d\n", ppfd->cDepthBits); + strcat(buffer, line); sprintf(line," cStencilBits - %d\n", ppfd->cStencilBits); + strcat(buffer, line); sprintf(line," cAuxBuffers - %d\n", ppfd->cAuxBuffers); + strcat(buffer, line); sprintf(line," iLayerType - %d\n", ppfd->iLayerType); + strcat(buffer, line); sprintf(line," bReserved - %d\n", ppfd->bReserved); + strcat(buffer, line); sprintf(line," dwLayerMask - 0x%x\n", ppfd->dwLayerMask); + strcat(buffer, line); sprintf(line," dwVisibleMask - 0x%x\n", ppfd->dwVisibleMask); + strcat(buffer, line); sprintf(line," dwDamageMask - 0x%x\n", ppfd->dwDamageMask); + strcat(buffer, line); + return buffer; +} + +const char * LIBAPIENTRY GetTextualPixelFormatByHDC(HDC hdc) +{ + PIXELFORMATDESCRIPTOR pfd, *ppfd=0; + int format=0; + + ppfd = &pfd; + format = PixelFormatDescriptorFromDc( hdc, ppfd ); + + return GetTextualPixelFormatByPFD(ppfd, format); +} + +/*****************************************************************/ + +/* Struct used to manage color ramps */ +typedef struct { + GLfloat amb[3]; /* ambient color / bottom of ramp */ + GLfloat diff[3]; /* diffuse color / middle of ramp */ + GLfloat spec[3]; /* specular color / top of ramp */ + GLfloat ratio; /* ratio of diffuse to specular in ramp */ + GLint indexes[3]; /* where ramp was placed in palette */ +} colorIndexState ; + +#define NUM_COLORS (sizeof(colors) / sizeof(colors[0])) + +void LIBAPIENTRY +setupDIB(HDC hDCOrig, HDC hDC, HBITMAP * hBitmap, int width, int height) +{ + BITMAPINFO *bmInfo=0; + BITMAPINFOHEADER *bmHeader=0; + UINT usage=0; + VOID *base=0; + int bmiSize=0; + int bitsPerPixel=0; + HBITMAP hOldBitmap=0; + + bmiSize = sizeof(*bmInfo); + bitsPerPixel = GetDeviceCaps(hDC, BITSPIXEL); + + switch (bitsPerPixel) { + case 8: + // bmiColors is 256 WORD palette indices + bmiSize += (256 * sizeof(WORD)) - sizeof(RGBQUAD); + break; + case 16: + // bmiColors is 3 WORD component masks + bmiSize += (3 * sizeof(DWORD)) - sizeof(RGBQUAD); + break; + case 24: + case 32: + default: + // bmiColors not used + break; + } + + bmInfo = (BITMAPINFO *) calloc(1, bmiSize); + bmHeader = &bmInfo->bmiHeader; + + bmHeader->biSize = sizeof(*bmHeader); + bmHeader->biWidth = width; + bmHeader->biHeight = height; + bmHeader->biPlanes = 1; // must be 1 + bmHeader->biBitCount = bitsPerPixel; + bmHeader->biXPelsPerMeter = 0; + bmHeader->biYPelsPerMeter = 0; + bmHeader->biClrUsed = 0; // all are used + bmHeader->biClrImportant = 0; // all are important + + switch (bitsPerPixel) { + case 8: + bmHeader->biCompression = BI_RGB; + bmHeader->biSizeImage = 0; + usage = DIB_PAL_COLORS; + // bmiColors is 256 WORD palette indices + { + WORD *palIndex = (WORD *) &bmInfo->bmiColors[0]; + int i; + + for (i=0; i<256; i++) { + palIndex[i] = i; + } + } + break; + case 16: + bmHeader->biCompression = BI_RGB; + bmHeader->biSizeImage = 0; + usage = DIB_RGB_COLORS; + // bmiColors is 3 WORD component masks + { + DWORD *compMask = (DWORD *) &bmInfo->bmiColors[0]; + + compMask[0] = 0xF800; + compMask[1] = 0x07E0; + compMask[2] = 0x001F; + } + break; + case 24: + case 32: + default: + bmHeader->biCompression = BI_RGB; + bmHeader->biSizeImage = 0; + usage = DIB_RGB_COLORS; + // bmiColors not used + break; + } + + *hBitmap = CreateDIBSection(hDC, bmInfo, usage, &base, NULL, 0); + if (*hBitmap == NULL) { + (void) MessageBox(WindowFromDC(hDC), + "Failed to create DIBSection.", + "OpenGL application error", + MB_ICONERROR | MB_OK); + exit(1); + } + + hOldBitmap = SelectObject(hDC, *hBitmap); + if(hOldBitmap!=0) + DeleteObject(hOldBitmap); + + free(bmInfo); +} + + +/* +static void +setupDIB(HDC hDCOrig, HDC hDC, HBITMAP * hBitmap, int width, int height) +{ + HBITMAP hOldBitmap=0; + + *hBitmap = CreateCompatibleBitmap( hDCOrig, width, height ); + if (*hBitmap == NULL) { + fprintf(stderr,"Failed to create CreateCompatibleBitmap! \n"); + fflush(stderr); + return; + } + + hOldBitmap = SelectObject(hDC, *hBitmap); + if(hOldBitmap!=0) + DeleteObject(hOldBitmap); +} +*/ + + +void LIBAPIENTRY resizeDIB(HDC hDC, HBITMAP *hOldBitmap, HBITMAP *hBitmap) +{ + /* + SelectObject(hDC, *hOldBitmap); + DeleteObject(*hBitmap); + setupDIB(hDC, hBitmap); + */ +} + +HPALETTE LIBAPIENTRY setupPalette(HDC hDC) +{ + HPALETTE hPalette = NULL; + PIXELFORMATDESCRIPTOR pfd; + LOGPALETTE* pPal=0; + int pixelFormat = GetPixelFormat(hDC); + int paletteSize=0; + colorIndexState colors[] = { + { + { 0.0F, 0.0F, 0.0F }, + { 0.1F, 0.6F, 0.3F }, + { 1.0F, 1.0F, 1.0F }, + 0.75F, { 0, 0, 0 }, + }, + { + { 0.0F, 0.0F, 0.0F }, + { 0.0F, 0.2F, 0.5F }, + { 1.0F, 1.0F, 1.0F }, + 0.75F, { 0, 0, 0 }, + }, + { + { 0.0F, 0.05F, 0.05F }, + { 0.6F, 0.0F, 0.8F }, + { 1.0F, 1.0F, 1.0F }, + 0.75F, { 0, 0, 0 }, + }, + }; + + + DescribePixelFormat(hDC, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); + + /* + ** Determine if a palette is needed and if so what size. + */ + if (pfd.dwFlags & PFD_NEED_PALETTE) { + paletteSize = 1 << pfd.cColorBits; + } else if (pfd.iPixelType == PFD_TYPE_COLORINDEX) { + paletteSize = 4096; + } else { + return NULL; + } + + pPal = (LOGPALETTE*) + malloc(sizeof(LOGPALETTE) + paletteSize * sizeof(PALETTEENTRY)); + pPal->palVersion = 0x300; + pPal->palNumEntries = paletteSize; + + if (pfd.iPixelType == PFD_TYPE_RGBA) { + /* + ** Fill the logical paletee with RGB color ramps + */ + int redMask = (1 << pfd.cRedBits) - 1; + int greenMask = (1 << pfd.cGreenBits) - 1; + int blueMask = (1 << pfd.cBlueBits) - 1; + int i; + + + + for (i=0; ipalPalEntry[i].peRed = + (((i >> pfd.cRedShift) & redMask) * 255) / redMask; + pPal->palPalEntry[i].peGreen = + (((i >> pfd.cGreenShift) & greenMask) * 255) / greenMask; + pPal->palPalEntry[i].peBlue = + (((i >> pfd.cBlueShift) & blueMask) * 255) / blueMask; + pPal->palPalEntry[i].peFlags = 0; + } + } else { + /* + ** Fill the logical palette with color ramps. + ** + ** Set up the logical palette so that it can be realized + ** into the system palette as an identity palette. + ** + ** 1) The default static entries should be present and at the right + ** location. The easiest way to do this is to grab them from + ** the current system palette. + ** + ** 2) All non-static entries should be initialized to unique values. + ** The easiest way to do this is to ensure that all of the non-static + ** entries have the PC_NOCOLLAPSE flag bit set. + */ + int numRamps = NUM_COLORS; + int rampSize = (paletteSize - 20) / numRamps; + int extra = (paletteSize - 20) - (numRamps * rampSize); + int i, r; + + /* + ** Initialize static entries by copying them from the + ** current system palette. + */ + GetSystemPaletteEntries(hDC, 0, paletteSize, &pPal->palPalEntry[0]); + + /* + ** Fill in non-static entries with desired colors. + */ + for (r=0; rpalPalEntry[rampBase]; + int diffSize = (int) (rampSize * colors[r].ratio); + int specSize = rampSize - diffSize; + + for (i=0; ipalPalEntry[index]; + + pe->peRed = (BYTE) 0; + pe->peGreen = (BYTE) 0; + pe->peBlue = (BYTE) 0; + pe->peFlags = PC_NOCOLLAPSE; + } + } + + hPalette = CreatePalette(pPal); + free(pPal); + + if (hPalette) { + SelectPalette(hDC, hPalette, FALSE); + RealizePalette(hDC); + } + + return hPalette; +} + + +int LIBAPIENTRY setGLCapabilities ( HDC hdc, + int nPixelFormat, + GLCapabilities *glCaps ) +{ + PIXELFORMATDESCRIPTOR pfd; + + (void) PixelFormatDescriptorFromDc( hdc, &pfd); + + if (pfd.dwFlags & PFD_DOUBLEBUFFER) + glCaps->buffer=BUFFER_DOUBLE; + else + glCaps->buffer=BUFFER_SINGLE; + + if (pfd.dwFlags & PFD_STEREO) + glCaps->stereo=STEREO_ON; + else + glCaps->stereo=STEREO_OFF; + + if (pfd.iPixelType == PFD_TYPE_RGBA) + glCaps->color=COLOR_RGBA; + + if (pfd.iPixelType == PFD_TYPE_COLORINDEX) + glCaps->color=COLOR_INDEX; + + glCaps->depthBits = pfd.cDepthBits; + glCaps->stencilBits = pfd.cStencilBits; + + glCaps->redBits = pfd.cRedBits; + glCaps->greenBits= pfd.cGreenBits; + glCaps->blueBits= pfd.cBlueBits; + /* glCaps->alphaBits= pfd.cAlphaBits; N.A. */ + glCaps->accumRedBits = pfd.cAccumRedBits; + glCaps->accumGreenBits= pfd.cAccumGreenBits; + glCaps->accumBlueBits= pfd.cAccumBlueBits; + glCaps->accumAlphaBits= pfd.cAccumAlphaBits; + + glCaps->nativeVisualID=nPixelFormat; + + return 1; +} + diff --git a/CNativeCode/wgltool.h b/CNativeCode/wgltool.h index cb64425..b44e366 100755 --- a/CNativeCode/wgltool.h +++ b/CNativeCode/wgltool.h @@ -13,13 +13,13 @@ #define _WGLTOOL_H - #include "gltool.h" + #include "gltool.h" - #include "glcaps.h" + #include "glcaps.h" - #include + #include #include - + #include "wgl-disp-var.h" /** @@ -28,43 +28,43 @@ */ LIBAPI void LIBAPIENTRY fetch_WGL_FUNCS (const char * libGLName, - const char * libGLUName, int force); - - - LIBAPI void LIBAPIENTRY setPixelFormatByGLCapabilities( - PIXELFORMATDESCRIPTOR *pfd, - GLCapabilities *glCaps, - int offScreenRenderer, - HDC hdc); - - // Set Pixel Format function - forward declaration - LIBAPI void LIBAPIENTRY SetDCPixelFormat(HDC hDC, GLCapabilities *glCaps, - int offScreenRenderer, int verbose); - - LIBAPI HPALETTE LIBAPIENTRY GetOpenGLPalette(HDC hDC); - - LIBAPI HGLRC LIBAPIENTRY get_GC( HDC *hDC, GLCapabilities *glCaps, - HGLRC shareWith, int offScreenRenderer, - int width, int height, HBITMAP *pix, - int verbose); - - LIBAPI int LIBAPIENTRY PixelFormatDescriptorFromDc( HDC Dc, - PIXELFORMATDESCRIPTOR *Pfd ); - - const char * LIBAPIENTRY GetTextualPixelFormatByHDC(HDC hdc); - - const char * LIBAPIENTRY GetTextualPixelFormatByPFD( - PIXELFORMATDESCRIPTOR *ppfd, int format); - - LIBAPI void LIBAPIENTRY setupDIB(HDC hDCOrig, HDC hDC, HBITMAP * hBitmap, - int width, int height); - - LIBAPI void LIBAPIENTRY resizeDIB(HDC hDC, HBITMAP *hOldBitmap, - HBITMAP *hBitmap); - - LIBAPI HPALETTE LIBAPIENTRY setupPalette(HDC hDC); - - LIBAPI int LIBAPIENTRY setGLCapabilities ( HDC hdc, int nPixelFormat, - GLCapabilities *glCaps ); + const char * libGLUName, int force, int reload); + + + LIBAPI void LIBAPIENTRY setPixelFormatByGLCapabilities( + PIXELFORMATDESCRIPTOR *pfd, + GLCapabilities *glCaps, + int offScreenRenderer, + HDC hdc); + + // Set Pixel Format function - forward declaration + LIBAPI void LIBAPIENTRY SetDCPixelFormat(HDC hDC, GLCapabilities *glCaps, + int offScreenRenderer, int verbose); + + LIBAPI HPALETTE LIBAPIENTRY GetOpenGLPalette(HDC hDC); + + LIBAPI HGLRC LIBAPIENTRY get_GC( HDC *hDC, GLCapabilities *glCaps, + HGLRC shareWith, int offScreenRenderer, + int width, int height, HBITMAP *pix, + int verbose); + + LIBAPI int LIBAPIENTRY PixelFormatDescriptorFromDc( HDC Dc, + PIXELFORMATDESCRIPTOR *Pfd ); + + const char * LIBAPIENTRY GetTextualPixelFormatByHDC(HDC hdc); + + const char * LIBAPIENTRY GetTextualPixelFormatByPFD( + PIXELFORMATDESCRIPTOR *ppfd, int format); + + LIBAPI void LIBAPIENTRY setupDIB(HDC hDCOrig, HDC hDC, HBITMAP * hBitmap, + int width, int height); + + LIBAPI void LIBAPIENTRY resizeDIB(HDC hDC, HBITMAP *hOldBitmap, + HBITMAP *hBitmap); + + LIBAPI HPALETTE LIBAPIENTRY setupPalette(HDC hDC); + + LIBAPI int LIBAPIENTRY setGLCapabilities ( HDC hdc, int nPixelFormat, + GLCapabilities *glCaps ); #endif -- cgit v1.2.3