Edit

IABSD.fr/xenocara/dist/libepoxy/test/wgl_common.c

Branch :

  • Show log

    Commit

  • Author : matthieu
    Date : 2018-05-25 06:24:59
    Hash : 9d6c7364
    Message : Update to libepoxy 1.5.2. ok aja@

  • dist/libepoxy/test/wgl_common.c
  • /*
     * Copyright © 2013 Intel Corporation
     *
     * Permission is hereby granted, free of charge, to any person obtaining a
     * copy of this software and associated documentation files (the "Software"),
     * to deal in the Software without restriction, including without limitation
     * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     * and/or sell copies of the Software, and to permit persons to whom the
     * Software is furnished to do so, subject to the following conditions:
     *
     * The above copyright notice and this permission notice (including the next
     * paragraph) shall be included in all copies or substantial portions of the
     * Software.
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     * IN THE SOFTWARE.
     */
    
    #include <stdio.h>
    #include <epoxy/wgl.h>
    #include "wgl_common.h"
    
    static int (*test_callback)(HDC hdc);
    
    static void
    setup_pixel_format(HDC hdc)
    {
        PIXELFORMATDESCRIPTOR pfd = {
            sizeof(PIXELFORMATDESCRIPTOR),
            1,
            PFD_SUPPORT_OPENGL |
            PFD_DRAW_TO_WINDOW |
            PFD_DOUBLEBUFFER,
            PFD_TYPE_RGBA,
            32,
            0, 0, 0, 0, 0, 0,
            0,
            0,
            0,
            0, 0, 0, 0,
            16,
            0,
            0,
            PFD_MAIN_PLANE,
            0,
            0, 0, 0,
        };
        int pixel_format;
    
        pixel_format = ChoosePixelFormat(hdc, &pfd);
        if (!pixel_format) {
            fputs("ChoosePixelFormat failed.\n", stderr);
            exit(1);
        }
    
        if (SetPixelFormat(hdc, pixel_format, &pfd) != TRUE) {
            fputs("SetPixelFormat() failed.\n", stderr);
            exit(1);
        }
    }
    
    static LRESULT CALLBACK
    window_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
    {
        HDC hdc = GetDC(hwnd);
        int ret;
    
        switch (message) {
        case WM_CREATE:
            setup_pixel_format(hdc);
            ret = test_callback(hdc);
            ReleaseDC(hwnd, hdc);
            exit(ret);
            return 0;
        default:
            return DefWindowProc(hwnd, message, wparam, lparam);
        }
    }
    
    void
    make_window_and_test(int (*callback)(HDC hdc))
    {
        const char *class_name = "epoxy";
        const char *window_name = "epoxy";
        int width = 150;
        int height = 150;
        HWND hwnd;
        HINSTANCE hcurrentinst = NULL;
        WNDCLASS window_class;
        MSG msg;
    
        test_callback = callback;
    
        memset(&window_class, 0, sizeof(window_class));
        window_class.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
        window_class.lpfnWndProc = window_proc;
        window_class.cbClsExtra = 0;
        window_class.cbWndExtra = 0;
        window_class.hInstance = hcurrentinst;
        window_class.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        window_class.hCursor = LoadCursor(NULL, IDC_ARROW);
        window_class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
        window_class.lpszMenuName = NULL;
        window_class.lpszClassName = class_name;
        if (!RegisterClass(&window_class)) {
            fputs("Failed to register window class\n", stderr);
            exit(1);
        }
    
        /* create window */
        hwnd = CreateWindow(class_name, window_name,
                            WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
                            0, 0, width, height,
                            NULL, NULL, hcurrentinst, NULL);
    
        ShowWindow(hwnd, SW_SHOWDEFAULT);
        UpdateWindow(hwnd);
    
        while (GetMessage(&msg, NULL, 0, 0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }