| Index: tools/vulkan/win/Window_win.cpp
|
| diff --git a/tools/vulkan/win/Window_win.cpp b/tools/vulkan/win/Window_win.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..20cf08480108a10257ba4143bd500fe05636e9d2
|
| --- /dev/null
|
| +++ b/tools/vulkan/win/Window_win.cpp
|
| @@ -0,0 +1,206 @@
|
| +/*
|
| +* Copyright 2016 Google Inc.
|
| +*
|
| +* Use of this source code is governed by a BSD-style license that can be
|
| +* found in the LICENSE file.
|
| +*/
|
| +
|
| +#include "Window_win.h"
|
| +
|
| +#include <tchar.h>
|
| +#include <windows.h>
|
| +#include <windowsx.h>
|
| +
|
| +#include "VulkanTestContext_win.h"
|
| +
|
| +Window* Window::CreateNativeWindow(void* platformData) {
|
| + HINSTANCE hInstance = (HINSTANCE)platformData;
|
| +
|
| + Window_win* window = new Window_win();
|
| + if (!window->init(hInstance)) {
|
| + delete window;
|
| + return nullptr;
|
| + }
|
| +
|
| + return window;
|
| +}
|
| +
|
| +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
| +
|
| +bool Window_win::init(HINSTANCE hInstance) {
|
| + fHInstance = hInstance ? hInstance : GetModuleHandle(nullptr);
|
| +
|
| + WNDCLASSEX wcex;
|
| + // The main window class name
|
| + static const TCHAR gSZWindowClass[] = _T("SkiaApp");
|
| +
|
| + wcex.cbSize = sizeof(WNDCLASSEX);
|
| +
|
| + wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
|
| + wcex.lpfnWndProc = WndProc;
|
| + wcex.cbClsExtra = 0;
|
| + wcex.cbWndExtra = 0;
|
| + wcex.hInstance = fHInstance;
|
| + wcex.hIcon = LoadIcon(fHInstance, (LPCTSTR)IDI_WINLOGO);
|
| + wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);;
|
| + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
| + wcex.lpszMenuName = nullptr;
|
| + wcex.lpszClassName = gSZWindowClass;
|
| + wcex.hIconSm = LoadIcon(fHInstance, (LPCTSTR)IDI_WINLOGO);;
|
| +
|
| + if (!RegisterClassEx(&wcex)) {
|
| + return false;
|
| + }
|
| +
|
| + /*
|
| + if (fullscreen)
|
| + {
|
| + DEVMODE dmScreenSettings;
|
| + // If full screen set the screen to maximum size of the users desktop and 32bit.
|
| + memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));
|
| + dmScreenSettings.dmSize = sizeof(dmScreenSettings);
|
| + dmScreenSettings.dmPelsWidth = (unsigned long)width;
|
| + dmScreenSettings.dmPelsHeight = (unsigned long)height;
|
| + dmScreenSettings.dmBitsPerPel = 32;
|
| + dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
|
| +
|
| + // Change the display settings to full screen.
|
| + ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
|
| +
|
| + // Set the position of the window to the top left corner.
|
| + posX = posY = 0;
|
| + }
|
| + */
|
| + // gIsFullscreen = fullscreen;
|
| +
|
| + fHWnd = CreateWindow(gSZWindowClass, nullptr, WS_OVERLAPPEDWINDOW,
|
| + CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, fHInstance, nullptr);
|
| + if (!fHWnd)
|
| + {
|
| + return false;
|
| + }
|
| +
|
| + SetWindowLongPtr(fHWnd, GWLP_USERDATA, (LONG_PTR)this);
|
| +
|
| + return true;
|
| +}
|
| +
|
| +
|
| +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
| +{
|
| + PAINTSTRUCT ps;
|
| + HDC hdc;
|
| +
|
| + Window_win* window = (Window_win*) GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
| +
|
| + switch (message)
|
| + {
|
| + case WM_PAINT:
|
| + hdc = BeginPaint(hWnd, &ps);
|
| + window->onPaint();
|
| + EndPaint(hWnd, &ps);
|
| + break;
|
| +
|
| + case WM_CLOSE:
|
| + case WM_DESTROY:
|
| + PostQuitMessage(0);
|
| + break;
|
| +
|
| + case WM_ACTIVATE:
|
| + // disable/enable rendering here, depending on wParam != WA_INACTIVE
|
| + break;
|
| +
|
| + case WM_SIZE:
|
| + window->onSize();
|
| + break;
|
| +
|
| + case WM_KEYDOWN:
|
| + case WM_SYSKEYDOWN:
|
| + {
|
| + DWORD dwMask = (1 << 29);
|
| + bool bAltDown = ((lParam & dwMask) != 0);
|
| + UINT theChar = MapVirtualKey((UINT)wParam, 2);
|
| + // Handle Extended ASCII only
|
| + if (theChar < 256) {
|
| + return window->onKeyboard(theChar, true, bAltDown);
|
| + }
|
| + }
|
| + break;
|
| +
|
| + case WM_KEYUP:
|
| + case WM_SYSKEYUP:
|
| + {
|
| + DWORD dwMask = (1 << 29);
|
| + bool bAltDown = ((lParam & dwMask) != 0);
|
| + UINT theChar = MapVirtualKey((UINT)wParam, 2);
|
| + // Handle Extended ASCII only
|
| + if (theChar < 256) {
|
| + return window->onKeyboard(theChar, false, bAltDown);
|
| + }
|
| + }
|
| + break;
|
| +
|
| + case WM_LBUTTONDOWN:
|
| + case WM_RBUTTONDOWN:
|
| + case WM_MBUTTONDOWN:
|
| + case WM_LBUTTONUP:
|
| + case WM_RBUTTONUP:
|
| + case WM_MBUTTONUP:
|
| + {
|
| + bool bLeftDown = ((wParam & MK_LBUTTON) != 0);
|
| + bool bRightDown = ((wParam & MK_RBUTTON) != 0);
|
| + bool bMiddleDown = ((wParam & MK_MBUTTON) != 0);
|
| +
|
| + int xPos = GET_X_LPARAM(lParam);
|
| + int yPos = GET_Y_LPARAM(lParam);
|
| + //if (!gIsFullscreen)
|
| + //{
|
| + // RECT rc = { 0, 0, 640, 480 };
|
| + // AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
|
| + // xPos -= rc.left;
|
| + // yPos -= rc.top;
|
| + //}
|
| +
|
| + return window->onMouse(bLeftDown, bRightDown, bMiddleDown, false, false, 0, xPos, yPos);
|
| + }
|
| + break;
|
| +
|
| + default:
|
| + return DefWindowProc(hWnd, message, wParam, lParam);
|
| + }
|
| +
|
| + return 0;
|
| +}
|
| +
|
| +bool Window_win::onKeyboard(UINT nChar, bool bKeyDown, bool bAltDown) {
|
| + return fKeyFunc(nChar, bKeyDown, fKeyUserData);
|
| +}
|
| +
|
| +bool Window_win::onMouse(bool bLeftButtonDown, bool bRightButtonDown, bool bMiddleButtonDown,
|
| + bool bSideButton1Down, bool bSideButton2Down, int nMouseWheelDelta,
|
| + int xPos, int yPos) {
|
| + return fMouseFunc(xPos, yPos, bLeftButtonDown, fMouseUserData);
|
| +}
|
| +
|
| +void Window_win::setTitle(const char* title) {
|
| + SetWindowTextA(fHWnd, title);
|
| +}
|
| +
|
| +void Window_win::show() {
|
| + ShowWindow(fHWnd, SW_SHOW);
|
| +}
|
| +
|
| +
|
| +bool Window_win::attach(BackEndTypes attachType, int msaaSampleCount, AttachmentInfo*) {
|
| + if (kVulkan_BackendType != attachType) {
|
| + return false;
|
| + }
|
| +
|
| + ContextPlatformData_win platformData;
|
| + platformData.fHInstance = fHInstance;
|
| + platformData.fHWnd = fHWnd;
|
| +
|
| + fTestContext = VulkanTestContext::Create((void*)&platformData, msaaSampleCount);
|
| +
|
| + return (SkToBool(fTestContext));
|
| +}
|
|
|