1 /*
2  * Copyright © 2013 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23 
24 #include <stdio.h>
25 #include <epoxy/wgl.h>
26 #include "wgl_common.h"
27 
28 static int (*test_callback)(HDC hdc);
29 
30 static void
setup_pixel_format(HDC hdc)31 setup_pixel_format(HDC hdc)
32 {
33     PIXELFORMATDESCRIPTOR pfd = {
34         sizeof(PIXELFORMATDESCRIPTOR),
35         1,
36         PFD_SUPPORT_OPENGL |
37         PFD_DRAW_TO_WINDOW |
38         PFD_DOUBLEBUFFER,
39         PFD_TYPE_RGBA,
40         32,
41         0, 0, 0, 0, 0, 0,
42         0,
43         0,
44         0,
45         0, 0, 0, 0,
46         16,
47         0,
48         0,
49         PFD_MAIN_PLANE,
50         0,
51         0, 0, 0,
52     };
53     int pixel_format;
54 
55     pixel_format = ChoosePixelFormat(hdc, &pfd);
56     if (!pixel_format) {
57         fputs("ChoosePixelFormat failed.\n", stderr);
58         exit(1);
59     }
60 
61     if (SetPixelFormat(hdc, pixel_format, &pfd) != TRUE) {
62         fputs("SetPixelFormat() failed.\n", stderr);
63         exit(1);
64     }
65 }
66 
67 static LRESULT CALLBACK
window_proc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)68 window_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
69 {
70     HDC hdc = GetDC(hwnd);
71     int ret;
72 
73     switch (message) {
74     case WM_CREATE:
75         setup_pixel_format(hdc);
76         ret = test_callback(hdc);
77         ReleaseDC(hwnd, hdc);
78         exit(ret);
79         return 0;
80     default:
81         return DefWindowProc(hwnd, message, wparam, lparam);
82     }
83 }
84 
85 void
make_window_and_test(int (* callback)(HDC hdc))86 make_window_and_test(int (*callback)(HDC hdc))
87 {
88     const char *class_name = "epoxy";
89     const char *window_name = "epoxy";
90     int width = 150;
91     int height = 150;
92     HWND hwnd;
93     HINSTANCE hcurrentinst = NULL;
94     WNDCLASS window_class;
95     MSG msg;
96 
97     test_callback = callback;
98 
99     memset(&window_class, 0, sizeof(window_class));
100     window_class.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
101     window_class.lpfnWndProc = window_proc;
102     window_class.cbClsExtra = 0;
103     window_class.cbWndExtra = 0;
104     window_class.hInstance = hcurrentinst;
105     window_class.hIcon = LoadIcon(NULL, IDI_APPLICATION);
106     window_class.hCursor = LoadCursor(NULL, IDC_ARROW);
107     window_class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
108     window_class.lpszMenuName = NULL;
109     window_class.lpszClassName = class_name;
110     if (!RegisterClass(&window_class)) {
111         fputs("Failed to register window class\n", stderr);
112         exit(1);
113     }
114 
115     /* create window */
116     hwnd = CreateWindow(class_name, window_name,
117                         WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
118                         0, 0, width, height,
119                         NULL, NULL, hcurrentinst, NULL);
120 
121     ShowWindow(hwnd, SW_SHOWDEFAULT);
122     UpdateWindow(hwnd);
123 
124     while (GetMessage(&msg, NULL, 0, 0)) {
125         TranslateMessage(&msg);
126         DispatchMessage(&msg);
127     }
128 }
129