/** * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 */ #include #include #include #include #ifndef GLAD_IMPL_UTIL_C_ #define GLAD_IMPL_UTIL_C_ #ifdef _MSC_VER #define GLAD_IMPL_UTIL_SSCANF sscanf_s #else #define GLAD_IMPL_UTIL_SSCANF sscanf #endif #endif /* GLAD_IMPL_UTIL_C_ */ #ifdef __cplusplus extern "C" { #endif int GLAD_WGL_VERSION_1_0 = 0; int GLAD_WGL_ARB_extensions_string = 0; int GLAD_WGL_EXT_extensions_string = 0; int GLAD_WGL_EXT_swap_control = 0; PFNWGLGETEXTENSIONSSTRINGARBPROC glad_wglGetExtensionsStringARB = NULL; PFNWGLGETEXTENSIONSSTRINGEXTPROC glad_wglGetExtensionsStringEXT = NULL; PFNWGLGETSWAPINTERVALEXTPROC glad_wglGetSwapIntervalEXT = NULL; PFNWGLSWAPINTERVALEXTPROC glad_wglSwapIntervalEXT = NULL; static void glad_wgl_load_WGL_ARB_extensions_string(GLADuserptrloadfunc load, void *userptr) { if(!GLAD_WGL_ARB_extensions_string) return; glad_wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) load(userptr, "wglGetExtensionsStringARB"); } static void glad_wgl_load_WGL_EXT_extensions_string(GLADuserptrloadfunc load, void *userptr) { if(!GLAD_WGL_EXT_extensions_string) return; glad_wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) load(userptr, "wglGetExtensionsStringEXT"); } static void glad_wgl_load_WGL_EXT_swap_control(GLADuserptrloadfunc load, void *userptr) { if(!GLAD_WGL_EXT_swap_control) return; glad_wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) load(userptr, "wglGetSwapIntervalEXT"); glad_wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) load(userptr, "wglSwapIntervalEXT"); } static int glad_wgl_has_extension(HDC hdc, const char *ext) { const char *terminator; const char *loc; const char *extensions; if(wglGetExtensionsStringEXT == NULL && wglGetExtensionsStringARB == NULL) return 0; if(wglGetExtensionsStringARB == NULL || hdc == INVALID_HANDLE_VALUE) extensions = wglGetExtensionsStringEXT(); else extensions = wglGetExtensionsStringARB(hdc); if(extensions == NULL || ext == NULL) return 0; while(1) { loc = strstr(extensions, ext); if(loc == NULL) break; terminator = loc + strlen(ext); if((loc == extensions || *(loc - 1) == ' ') && (*terminator == ' ' || *terminator == '\0')) { return 1; } extensions = terminator; } return 0; } static GLADapiproc glad_wgl_get_proc_from_userptr(void *userptr, const char* name) { return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); } static int glad_wgl_find_extensions_wgl(HDC hdc) { GLAD_WGL_ARB_extensions_string = glad_wgl_has_extension(hdc, "WGL_ARB_extensions_string"); GLAD_WGL_EXT_extensions_string = glad_wgl_has_extension(hdc, "WGL_EXT_extensions_string"); GLAD_WGL_EXT_swap_control = glad_wgl_has_extension(hdc, "WGL_EXT_swap_control"); return 1; } static int glad_wgl_find_core_wgl(void) { int major = 1, minor = 0; GLAD_WGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; return GLAD_MAKE_VERSION(major, minor); } int gladLoadWGLUserPtr(HDC hdc, GLADuserptrloadfunc load, void *userptr) { int version; wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) load(userptr, "wglGetExtensionsStringARB"); wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) load(userptr, "wglGetExtensionsStringEXT"); if(wglGetExtensionsStringARB == NULL && wglGetExtensionsStringEXT == NULL) return 0; version = glad_wgl_find_core_wgl(); if (!glad_wgl_find_extensions_wgl(hdc)) return 0; glad_wgl_load_WGL_ARB_extensions_string(load, userptr); glad_wgl_load_WGL_EXT_extensions_string(load, userptr); glad_wgl_load_WGL_EXT_swap_control(load, userptr); return version; } int gladLoadWGL(HDC hdc, GLADloadfunc load) { return gladLoadWGLUserPtr(hdc, glad_wgl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); } #ifdef __cplusplus } #endif