#ifndef MR4TH_WGL_H
#define MR4TH_WGL_H

////////////////////////////////
// WGL Definitions

// WGL_ARB_pixel_format constants

#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
#define WGL_DRAW_TO_WINDOW_ARB   0x2001
#define WGL_DRAW_TO_BITMAP_ARB   0x2002
#define WGL_ACCELERATION_ARB     0x2003
#define WGL_NEED_PALETTE_ARB     0x2004
#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
#define WGL_SWAP_LAYER_BUFFERS_ARB  0x2006
#define WGL_SWAP_METHOD_ARB      0x2007
#define WGL_NUMBER_OVERLAYS_ARB  0x2008
#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
#define WGL_TRANSPARENT_ARB      0x200A
#define WGL_TRANSPARENT_RED_VALUE_ARB   0x2037
#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
#define WGL_TRANSPARENT_BLUE_VALUE_ARB  0x2039
#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
#define WGL_SHARE_DEPTH_ARB      0x200C
#define WGL_SHARE_STENCIL_ARB    0x200D
#define WGL_SHARE_ACCUM_ARB      0x200E
#define WGL_SUPPORT_GDI_ARB      0x200F
#define WGL_SUPPORT_OPENGL_ARB   0x2010
#define WGL_DOUBLE_BUFFER_ARB    0x2011
#define WGL_STEREO_ARB           0x2012
#define WGL_PIXEL_TYPE_ARB       0x2013
#define WGL_COLOR_BITS_ARB       0x2014
#define WGL_RED_BITS_ARB         0x2015
#define WGL_RED_SHIFT_ARB        0x2016
#define WGL_GREEN_BITS_ARB       0x2017
#define WGL_GREEN_SHIFT_ARB      0x2018
#define WGL_BLUE_BITS_ARB        0x2019
#define WGL_BLUE_SHIFT_ARB       0x201A
#define WGL_ALPHA_BITS_ARB       0x201B
#define WGL_ALPHA_SHIFT_ARB      0x201C
#define WGL_ACCUM_BITS_ARB       0x201D
#define WGL_ACCUM_RED_BITS_ARB   0x201E
#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
#define WGL_ACCUM_BLUE_BITS_ARB  0x2020
#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
#define WGL_DEPTH_BITS_ARB       0x2022
#define WGL_STENCIL_BITS_ARB     0x2023
#define WGL_AUX_BUFFERS_ARB      0x2024

#define WGL_NO_ACCELERATION_ARB      0x2025
#define WGL_GENERIC_ACCELERATION_ARB 0x2026
#define WGL_FULL_ACCELERATION_ARB    0x2027

#define WGL_SWAP_EXCHANGE_ARB  0x2028
#define WGL_SWAP_COPY_ARB      0x2029
#define WGL_SWAP_UNDEFINED_ARB 0x202A

#define WGL_TYPE_RGBA_ARB       0x202B
#define WGL_TYPE_COLORINDEX_ARB 0x202C

// WGL_ARB_framebuffer_sRGB constants

#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9

// WGL_ARB_create_context constants

#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
#define WGL_CONTEXT_LAYER_PLANE_ARB   0x2093
#define WGL_CONTEXT_FLAGS_ARB         0x2094
#define WGL_CONTEXT_PROFILE_MASK_ARB  0x9126

#define WGL_CONTEXT_DEBUG_BIT_ARB              0x0001
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002

#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB          0x00000001
#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002

#define ERROR_INVALID_VERSION_ARB 0x2095
#define ERROR_INVALID_PROFILE_ARB 0x2096

// wgl function X-list

#define MR4TH_WGL_FUNCTION_XLIST(X)               \
X(wglCreateContext,  HGLRC, (HDC dc))            \
X(wglDeleteContext,  BOOL,  (HGLRC glrc))        \
X(wglMakeCurrent,    BOOL,  (HDC dc,HGLRC glrc)) \
X(wglGetProcAddress, PROC,  (LPCSTR name))

// wgl ext function X-list

#define MR4TH_WGL_EXT_FUNCTION_XLIST(X) \
X(wglChoosePixelFormatARB,    BOOL, (HDC dc,const int*atri,const FLOAT*atrf,UINT max_fmts,int*fmts,UINT *num_fmts)) \
X(wglCreateContextAttribsARB, HGLRC, (HDC dc,HGLRC share,const int*atri))

// wgl function types

#define X(N,R,P) typedef R W32_##N P;
MR4TH_WGL_FUNCTION_XLIST(X)
MR4TH_WGL_EXT_FUNCTION_XLIST(X)
#undef X

// wgl function pointers

#define X(N,R,P) MR4TH_SYMBOL_STATIC W32_##N * w32_##N = 0;
MR4TH_WGL_FUNCTION_XLIST(X)
MR4TH_WGL_EXT_FUNCTION_XLIST(X)
#undef X

#endif //MR4TH_WGL_H
