1 /* 2 * ReactOS Gdi32 3 * Copyright (C) 2003 ReactOS Team 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18 * 19 * 20 * 21 * 22 */ 23 24 #include <precomp.h> 25 26 #define NDEBUG 27 #include <debug.h> 28 29 30 31 typedef int (WINAPI *CHOOSEPIXELFMT) (HDC, CONST PIXELFORMATDESCRIPTOR *); 32 typedef BOOL (WINAPI *SETPIXELFMT) (HDC, int, CONST PIXELFORMATDESCRIPTOR *); 33 typedef BOOL (WINAPI *SWAPBUFFERS) (HDC hdc); 34 typedef int (WINAPI *DESCRIBEPIXELFMT) (HDC, int, UINT, LPPIXELFORMATDESCRIPTOR); 35 typedef int (WINAPI *GETPIXELFMT) (HDC); 36 37 38 static CHOOSEPIXELFMT glChoosePixelFormat = NULL; 39 static SETPIXELFMT glSetPixelFormat = NULL; 40 static SWAPBUFFERS glSwapBuffers = NULL; 41 static DESCRIBEPIXELFMT glDescribePixelFormat = NULL; 42 static GETPIXELFMT glGetPixelFormat = NULL; 43 44 /* 45 OpenGL Handle. 46 */ 47 HINSTANCE hOpenGL = NULL; 48 49 static BOOL OpenGLInitFunction(PCSTR name, 50 FARPROC *funcptr) 51 { 52 PVOID func; 53 54 func = (PVOID)GetProcAddress(hOpenGL, name); 55 if (func != NULL) 56 { 57 (void)InterlockedCompareExchangePointer((PVOID*)funcptr, 58 func, 59 NULL); 60 return TRUE; 61 } 62 63 return FALSE; 64 } 65 66 static BOOL OpenGLEnable(void) 67 { 68 HMODULE hModOpengl32; 69 BOOL Ret = TRUE; 70 71 hModOpengl32 = LoadLibraryW(L"OPENGL32.DLL"); 72 if (hModOpengl32 == NULL) 73 return FALSE; 74 75 if (InterlockedCompareExchangePointer((PVOID*)&hOpenGL, 76 (PVOID)hModOpengl32, 77 NULL) != NULL) 78 { 79 FreeLibrary(hModOpengl32); 80 81 /* NOTE: Even though another thread was faster loading the 82 library we can't just bail out here. We really need 83 to *try* to locate every function. This is slow but 84 thread-safe */ 85 } 86 87 /* The cast is required on x64, because FARPROC has INT_PTR sized return */ 88 if (!OpenGLInitFunction("wglChoosePixelFormat", (FARPROC*)&glChoosePixelFormat)) 89 Ret = FALSE; 90 91 if (!OpenGLInitFunction("wglSetPixelFormat", (FARPROC*)&glSetPixelFormat)) 92 Ret = FALSE; 93 94 if (!OpenGLInitFunction("wglSwapBuffers", (FARPROC*)&glSwapBuffers)) 95 Ret = FALSE; 96 97 if (!OpenGLInitFunction("wglDescribePixelFormat", (FARPROC*)&glDescribePixelFormat)) 98 Ret = FALSE; 99 100 if (!OpenGLInitFunction("wglGetPixelFormat", (FARPROC*)&glGetPixelFormat)) 101 Ret = FALSE; 102 103 return Ret; 104 } 105 106 107 108 /* 109 * @implemented 110 */ 111 INT 112 WINAPI 113 ChoosePixelFormat(HDC hdc, 114 CONST PIXELFORMATDESCRIPTOR * ppfd) 115 { 116 if (glChoosePixelFormat == NULL) 117 if (OpenGLEnable() == FALSE) 118 return(0); 119 120 return(glChoosePixelFormat(hdc, ppfd)); 121 } 122 123 124 125 /* 126 * @implemented 127 */ 128 INT 129 WINAPI 130 DescribePixelFormat(HDC hdc, 131 INT iPixelFormat, 132 UINT nBytes, 133 LPPIXELFORMATDESCRIPTOR ppfd) 134 { 135 if (glDescribePixelFormat == NULL) 136 if (OpenGLEnable() == FALSE) 137 return(0); 138 139 return(glDescribePixelFormat(hdc, iPixelFormat, nBytes, ppfd)); 140 } 141 142 143 144 /* 145 * @implemented 146 */ 147 INT 148 WINAPI 149 GetPixelFormat(HDC hdc) 150 { 151 if (glGetPixelFormat == NULL) 152 if (OpenGLEnable() == FALSE) 153 return(0); 154 155 return(glGetPixelFormat(hdc)); 156 } 157 158 159 160 /* 161 * @implemented 162 */ 163 BOOL 164 WINAPI 165 SetPixelFormat(HDC hdc, 166 INT iPixelFormat, 167 CONST PIXELFORMATDESCRIPTOR * ppfd) 168 { 169 /* Can only be set once */ 170 INT current = GetPixelFormat(hdc); 171 if(current) return current == iPixelFormat ; 172 173 if (glSetPixelFormat == NULL) 174 if (OpenGLEnable() == FALSE) 175 return(0); 176 177 return(glSetPixelFormat(hdc, iPixelFormat, ppfd)); 178 } 179 180 181 182 /* 183 * @implemented 184 */ 185 BOOL 186 WINAPI 187 SwapBuffers(HDC hdc) 188 { 189 if (glSwapBuffers == NULL) 190 if (OpenGLEnable() == FALSE) 191 return(0); 192 193 194 return(glSwapBuffers(hdc)); 195 } 196 197 198 /* 199 Do this here for now. 200 */ 201 202 /* EOF */ 203