Home | History | Annotate | Line # | Download | only in test
      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
     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
     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
     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