1#define GF_EXPOSE_DRAW_PLATFORM
23typedef const char*(APIENTRY* PFNWGLGETEXTENSIONSSTRINGARB)(HDC);
24#ifdef DO_SWAP_INTERVAL
25typedef BOOL(APIENTRY* PFNWGLSWAPINTERVALPROC)(int);
28void gf_draw_platform_begin(
void) {}
29void gf_draw_platform_end(
void) {}
31LRESULT CALLBACK gf_draw_platform_proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
37 BeginPaint(hWnd, &ps);
42 GetClientRect(hWnd, &rect);
45 draw->
width = rect.right - rect.left;
46 draw->
height = rect.bottom - rect.top;
48 gf_draw_reshape(draw);
52 if(draw->
input != NULL) {
59 if(draw->
input != NULL) {
60 if(msg == WM_LBUTTONDOWN) {
71 if(draw->
input != NULL) {
72 if(msg == WM_MBUTTONDOWN) {
83 if(draw->
input != NULL) {
84 if(msg == WM_RBUTTONDOWN) {
100 return DefWindowProc(hWnd, msg, wp, lp);
105int gf_draw_platform_has_extension(
gf_draw_t* draw,
const char* query) {
106 const char* ext = NULL;
108 const int len = strlen(query);
109 PFNWGLGETEXTENSIONSSTRINGARB proc;
113 proc = (PFNWGLGETEXTENSIONSSTRINGARB)wglGetProcAddress(
"wglGetExtensionsStringARB");
117 ptr = strstr(ext, query);
118 return ((ptr != NULL) && ((ptr[len] ==
' ') || (ptr[len] ==
'\0')));
123int gf_draw_platform_step(
gf_draw_t* draw) {
127 while(PeekMessage(&msg, draw->
platform->window, 0, 0, PM_NOREMOVE)) {
128 if(GetMessage(&msg, draw->
platform->window, 0, 0)) {
129 TranslateMessage(&msg);
130 DispatchMessage(&msg);
137 gf_draw_driver_before(draw);
139 gf_draw_driver_after(draw);
148 PIXELFORMATDESCRIPTOR desc;
149#ifdef DO_SWAP_INTERVAL
150 PFNWGLSWAPINTERVALPROC wglSwapIntervalEXT;
156 memset(platform, 0,
sizeof(*platform));
157 platform->engine = engine;
159 platform->instance = (HINSTANCE)GetModuleHandle(NULL);
160 if(platform->instance == NULL) {
162 gf_draw_platform_destroy(platform);
166 wc.cbSize =
sizeof(wc);
167 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
168 wc.lpfnWndProc = gf_draw_platform_proc;
171 wc.hInstance = platform->instance;
172 wc.hIcon = LoadIcon(platform->instance,
"GAME");
173 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
174 wc.hbrBackground = NULL;
175 wc.lpszMenuName = NULL;
176 wc.lpszClassName =
"goldfish";
177 wc.hIconSm = LoadIcon(platform->instance,
"GAME");
178 if(!RegisterClassEx(&wc)) {
180 gf_draw_platform_destroy(platform);
184 platform->window = CreateWindow(
"goldfish", draw->
title, (WS_OVERLAPPEDWINDOW), draw->
x, draw->
y, draw->
width, draw->
height, NULL, 0, platform->instance, NULL);
185 if(platform->window == NULL) {
187 gf_draw_platform_destroy(platform);
191 SetWindowLongPtr(platform->window, GWLP_USERDATA, (LONG_PTR)draw);
193 memset(&desc, 0,
sizeof(desc));
194 desc.nSize =
sizeof(desc);
196 desc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
197 desc.iPixelType = PFD_TYPE_RGBA;
198 desc.cColorBits = 24;
200 desc.cDepthBits = 32;
202 platform->dc = GetDC(platform->window);
204 fmt = ChoosePixelFormat(platform->dc, &desc);
205 SetPixelFormat(platform->dc, fmt, &desc);
207 platform->glrc = wglCreateContext(platform->dc);
208 if(platform->glrc == NULL) {
210 gf_draw_platform_destroy(platform);
213 wglMakeCurrent(platform->dc, platform->glrc);
215#ifdef DO_SWAP_INTERVAL
216 wglSwapIntervalEXT = (PFNWGLSWAPINTERVALPROC)wglGetProcAddress(
"wglSwapIntervalEXT");
217 if(wglSwapIntervalEXT != NULL) {
219 wglSwapIntervalEXT(1);
224 style = (DWORD)GetWindowLongPtr(platform->window, GWL_STYLE);
225 AdjustWindowRect(&rect, style, FALSE);
226 SetWindowPos(platform->window, NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOMOVE);
228 ShowWindow(platform->window, SW_NORMAL);
229 UpdateWindow(platform->window);
235 if(platform->glrc != NULL) {
236 wglMakeCurrent(NULL, NULL);
238 if(platform->dc != NULL) {
239 ReleaseDC(platform->window, platform->dc);
241 if(platform->glrc != NULL) {
242 wglDeleteContext(platform->glrc);
244 if(platform->window != NULL) {
245 DestroyWindow(platform->window);
247 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.
gf_input_t * input
Input interface.
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.