Edit

kc3-lang/angle/samples/WindowTest

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2019-01-03 13:01:08
    Hash : ad398ee8
    Message : Free OSWindow and EGLWindow through helpers. This cleans up any potential problems with allocating and freeing resources in different shared objects or DLLs. Previously we were using a dynamically linked allocation function and then calling the standard delete function. Also adds a base class helper for EGLWindow. Will base the WGL Window class on this. Needed for running ANGLE tests against native drivers. Bug: angleproject:2995 Change-Id: Ic92b447649ebb32c547605c20086c07a601842f0 Reviewed-on: https://chromium-review.googlesource.com/c/1393443 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Yuly Novikov <ynovikov@chromium.org>

  • WindowTest.cpp
  • //
    // Copyright The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // WindowTest.cpp: Sample used to test various function of OSWindow
    
    #include <algorithm>
    #include <iostream>
    
    #include "util/OSWindow.h"
    #include "util/system_utils.h"
    
    int main(int argc, char *argv[])
    {
        OSWindow *window = OSWindow::New();
        int width        = 400;
        int height       = 400;
        int x            = 0;
        int y            = 0;
    
        if (!window->initialize("Window Test", width, height))
        {
            return -1;
        }
        window->setVisible(true);
        window->setPosition(x, y);
    
        bool running = true;
        while (running)
        {
            Event event;
            while (window->popEvent(&event))
            {
                if (event.Type == Event::EVENT_CLOSED)
                {
                    running = false;
                    break;
                }
    
                if (event.Type == Event::EVENT_KEY_PRESSED)
                {
                    int newWidth  = width;
                    int newHeight = height;
                    int newX      = x;
                    int newY      = y;
                    switch (event.Key.Code)
                    {
                        case KEY_ESCAPE:
                            running = false;
                            break;
    
                        case KEY_W:
                            newWidth = std::max(0, width + (event.Key.Shift ? -20 : 20));
                            break;
                        case KEY_H:
                            newHeight = std::max(0, height + (event.Key.Shift ? -20 : 20));
                            break;
    
                        case KEY_LEFT:
                            newX = x - 20;
                            break;
                        case KEY_RIGHT:
                            newX = x + 20;
                            break;
                        case KEY_UP:
                            newY = y - 20;
                            break;
                        case KEY_DOWN:
                            newY = y + 20;
                            break;
    
                        case KEY_C:
                            window->setMousePosition(width / 2, height / 2);
                            break;
                        case KEY_T:
                            window->signalTestEvent();
                            window->messageLoop();
                            if (window->didTestEventFire())
                            {
                                std::cout << "Test event did fire" << std::endl;
                            }
                            else
                            {
                                std::cout << "Test event did not fire" << std::endl;
                            }
                            break;
                        case KEY_S:
                            window->setVisible(false);
                            window->messageLoop();
                            angle::Sleep(1000);
                            window->setVisible(true);
                            window->messageLoop();
                            break;
    
                        default:
                            break;
                    }
    
                    if (newWidth != width || newHeight != height)
                    {
                        width  = newWidth;
                        height = newHeight;
                        window->resize(width, height);
                    }
                    if (newX != x || newY != y)
                    {
                        x = newX;
                        y = newY;
                        window->setPosition(x, y);
                    }
    
                    angle::Sleep(0);
                    window->messageLoop();
                    if (window->getWidth() != width || window->getHeight() != height)
                    {
                        std::cout << "Discrepancy between set dimensions and retrieved dimensions"
                                  << std::endl;
                        std::cout << "Width: " << width << " vs. " << window->getWidth() << std::endl;
                        std::cout << "Height: " << height << " vs. " << window->getHeight()
                                  << std::endl;
                    }
                    if (window->getX() != x || window->getY() != y)
                    {
                        std::cout << "Discrepancy between set position and retrieved position"
                                  << std::endl;
                        std::cout << "X: " << x << " vs. " << window->getX() << std::endl;
                        std::cout << "Y: " << y << " vs. " << window->getY() << std::endl;
                    }
                }
            }
    
            angle::Sleep(0);
            window->messageLoop();
        }
    
        window->destroy();
    }