1#define GF_EXPOSE_DRAW_PLATFORM
21typedef const char*(APIENTRY* PFNWGLGETEXTENSIONSSTRINGARB)(HDC);
22#ifdef DO_SWAP_INTERVAL
23typedef BOOL(APIENTRY* PFNWGLSWAPINTERVALPROC)(int);
26void gf_draw_platform_begin(
void) {}
27void gf_draw_platform_end(
void) {}
29LRESULT CALLBACK gf_draw_platform_proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
35 BeginPaint(hWnd, &ps);
40 GetClientRect(hWnd, &rect);
43 draw->
width = rect.right - rect.left;
44 draw->
height = rect.bottom - rect.top;
46 gf_draw_reshape(draw);
56 return DefWindowProc(hWnd, msg, wp, lp);
61int gf_draw_platform_has_extension(
gf_draw_t* draw,
const char* query) {
62 const char* ext = NULL;
64 const int len = strlen(query);
65 PFNWGLGETEXTENSIONSSTRINGARB proc;
69 proc = (PFNWGLGETEXTENSIONSSTRINGARB)wglGetProcAddress(
"wglGetExtensionsStringARB");
73 ptr = strstr(ext, query);
74 return ((ptr != NULL) && ((ptr[len] ==
' ') || (ptr[len] ==
'\0')));
79int gf_draw_platform_step(
gf_draw_t* draw) {
83 while(PeekMessage(&msg, draw->
platform->window, 0, 0, PM_NOREMOVE)) {
84 if(GetMessage(&msg, draw->
platform->window, 0, 0)) {
85 TranslateMessage(&msg);
86 DispatchMessage(&msg);
93 gf_draw_driver_before(draw);
95 gf_draw_driver_after(draw);
104 PIXELFORMATDESCRIPTOR desc;
105#ifdef DO_SWAP_INTERVAL
106 PFNWGLSWAPINTERVALPROC wglSwapIntervalEXT;
112 memset(platform, 0,
sizeof(*platform));
113 platform->engine = engine;
115 platform->instance = (HINSTANCE)GetModuleHandle(NULL);
116 if(platform->instance == NULL) {
118 gf_draw_platform_destroy(platform);
122 wc.cbSize =
sizeof(wc);
123 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
124 wc.lpfnWndProc = gf_draw_platform_proc;
127 wc.hInstance = platform->instance;
128 wc.hIcon = LoadIcon(platform->instance,
"GAME");
129 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
130 wc.hbrBackground = NULL;
131 wc.lpszMenuName = NULL;
132 wc.lpszClassName =
"goldfish";
133 wc.hIconSm = LoadIcon(platform->instance,
"GAME");
134 if(!RegisterClassEx(&wc)) {
136 gf_draw_platform_destroy(platform);
140 platform->window = CreateWindow(
"goldfish", draw->
title, (WS_OVERLAPPEDWINDOW), draw->
x, draw->
y, draw->
width, draw->
height, NULL, 0, platform->instance, NULL);
141 if(platform->window == NULL) {
143 gf_draw_platform_destroy(platform);
147 SetWindowLongPtr(platform->window, GWLP_USERDATA, (LONG_PTR)draw);
149 memset(&desc, 0,
sizeof(desc));
150 desc.nSize =
sizeof(desc);
152 desc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
153 desc.iPixelType = PFD_TYPE_RGBA;
154 desc.cColorBits = 24;
156 desc.cDepthBits = 32;
158 platform->dc = GetDC(platform->window);
160 fmt = ChoosePixelFormat(platform->dc, &desc);
161 SetPixelFormat(platform->dc, fmt, &desc);
163 platform->glrc = wglCreateContext(platform->dc);
164 if(platform->glrc == NULL) {
166 gf_draw_platform_destroy(platform);
169 wglMakeCurrent(platform->dc, platform->glrc);
171#ifdef DO_SWAP_INTERVAL
172 wglSwapIntervalEXT = (PFNWGLSWAPINTERVALPROC)wglGetProcAddress(
"wglSwapIntervalEXT");
173 if(wglSwapIntervalEXT != NULL) {
175 wglSwapIntervalEXT(1);
180 style = (DWORD)GetWindowLongPtr(platform->window, GWL_STYLE);
181 AdjustWindowRect(&rect, style, FALSE);
182 SetWindowPos(platform->window, NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOMOVE);
184 ShowWindow(platform->window, SW_NORMAL);
185 UpdateWindow(platform->window);
191 if(platform->glrc != NULL) {
192 wglMakeCurrent(NULL, NULL);
194 if(platform->dc != NULL) {
195 ReleaseDC(platform->window, platform->dc);
197 if(platform->glrc != NULL) {
198 wglDeleteContext(platform->glrc);
200 if(platform->window != NULL) {
201 DestroyWindow(platform->window);
203 gf_log_function(platform->engine,
"Destroyed platform-dependent part of drawing driver",
"");
#define gf_log_function(engine, fmt,...)
Output log with line number and function name.
Required headers before anything.
char title[128]
Window title.
int close
1 if it was requested to be closed, otherwise 0
gf_draw_platform_t * platform
Platform-dependent part of drawing driver.
int width
Width of window.
int height
Height of window.