12858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 22858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com/* 32858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com * Copyright 2011 Google Inc. 42858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com * 52858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 62858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com * found in the LICENSE file. 72858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com */ 82858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#include "SkTypes.h" 92858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 102858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#if defined(SK_BUILD_FOR_WIN) 112858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 122858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#include <GL/gl.h> 132858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#include <WindowsX.h> 142858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#include "SkWGL.h" 152858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#include "SkWindow.h" 162858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#include "SkCanvas.h" 172858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#include "SkOSMenu.h" 182858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#include "SkTime.h" 192858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#include "SkUtils.h" 202858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 212858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#include "SkGraphics.h" 222858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 232858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#if SK_ANGLE 242858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#include "gl/GrGLInterface.h" 252858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 262858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#include "GLES2/gl2.h" 270dd5ceb6d621c278ab09e97ea7e2172007990a5aborenet@google.com 280dd5ceb6d621c278ab09e97ea7e2172007990a5aborenet@google.com#define ANGLE_GL_CALL(IFACE, X) \ 290dd5ceb6d621c278ab09e97ea7e2172007990a5aborenet@google.com do { \ 30c72425ae368bfcb47de7d2532eb90d305ec0d1cfcommit-bot@chromium.org (IFACE)->fFunctions.f##X; \ 310dd5ceb6d621c278ab09e97ea7e2172007990a5aborenet@google.com } while (false) 320dd5ceb6d621c278ab09e97ea7e2172007990a5aborenet@google.com 332858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#endif 342858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 352858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#define INVALIDATE_DELAY_MS 200 362858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 372858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comstatic SkOSWindow* gCurrOSWin; 382858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comstatic HWND gEventTarget; 392858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 402858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#define WM_EVENT_CALLBACK (WM_USER+0) 412858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 422858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid post_skwinevent() 432858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com{ 442858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com PostMessage(gEventTarget, WM_EVENT_CALLBACK, 0, 0); 452858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 462858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 47cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.comSkOSWindow::SkOSWindow(void* hWnd) { 48cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com fHWND = hWnd; 49cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU 502858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#if SK_ANGLE 51cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com fDisplay = EGL_NO_DISPLAY; 52cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com fContext = EGL_NO_CONTEXT; 53cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com fSurface = EGL_NO_SURFACE; 542858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#endif 55cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com fHGLRC = NULL; 56cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif 57cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com fAttached = kNone_BackEndType; 582858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com gEventTarget = (HWND)hWnd; 592858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 602858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 612858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comSkOSWindow::~SkOSWindow() { 62cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU 6349f085dddff10473b6ebf832a974288300224e60bsalomon if (fHGLRC) { 642858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com wglDeleteContext((HGLRC)fHGLRC); 652858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 662858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#if SK_ANGLE 672858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (EGL_NO_CONTEXT != fContext) { 682858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com eglDestroyContext(fDisplay, fContext); 692858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com fContext = EGL_NO_CONTEXT; 702858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 712858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 722858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (EGL_NO_SURFACE != fSurface) { 732858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com eglDestroySurface(fDisplay, fSurface); 742858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com fSurface = EGL_NO_SURFACE; 752858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 762858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 772858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (EGL_NO_DISPLAY != fDisplay) { 782858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com eglTerminate(fDisplay); 792858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com fDisplay = EGL_NO_DISPLAY; 802858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 81cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_ANGLE 82cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_SUPPORT_GPU 832858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 842858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 852858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comstatic SkKey winToskKey(WPARAM vk) { 862858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com static const struct { 872858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com WPARAM fVK; 882858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SkKey fKey; 892858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } gPair[] = { 902858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { VK_BACK, kBack_SkKey }, 912858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { VK_CLEAR, kBack_SkKey }, 922858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { VK_RETURN, kOK_SkKey }, 932858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { VK_UP, kUp_SkKey }, 942858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { VK_DOWN, kDown_SkKey }, 952858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { VK_LEFT, kLeft_SkKey }, 962858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { VK_RIGHT, kRight_SkKey } 972858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com }; 982858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gPair); i++) { 992858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (gPair[i].fVK == vk) { 1002858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return gPair[i].fKey; 1012858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 1022858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 1032858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return kNONE_SkKey; 1042858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 1052858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 1064d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.comstatic unsigned getModifiers(UINT message) { 1074d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com return 0; // TODO 1084d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com} 1094d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com 1102858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.combool SkOSWindow::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { 1112858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com switch (message) { 1122858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case WM_KEYDOWN: { 1132858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SkKey key = winToskKey(wParam); 1142858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (kNONE_SkKey != key) { 1152858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com this->handleKey(key); 1162858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return true; 1172858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 1182858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } break; 1192858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case WM_KEYUP: { 1202858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SkKey key = winToskKey(wParam); 1212858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (kNONE_SkKey != key) { 1222858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com this->handleKeyUp(key); 1232858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return true; 1242858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 1252858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } break; 1262858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case WM_UNICHAR: 1278b169311b59ab84e8ca6f3630a1e960cc1be751erobertphillips@google.com this->handleChar((SkUnichar) wParam); 128d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com return true; 1292858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case WM_CHAR: { 1302858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com this->handleChar(SkUTF8_ToUnichar((char*)&wParam)); 1312858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return true; 1322858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } break; 133a4662865e37a2ca95b5e3379072f6a274acc8ac8robertphillips@google.com case WM_SIZE: { 134a4662865e37a2ca95b5e3379072f6a274acc8ac8robertphillips@google.com INT width = LOWORD(lParam); 135a4662865e37a2ca95b5e3379072f6a274acc8ac8robertphillips@google.com INT height = HIWORD(lParam); 136a4662865e37a2ca95b5e3379072f6a274acc8ac8robertphillips@google.com this->resize(width, height); 1372858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com break; 138a4662865e37a2ca95b5e3379072f6a274acc8ac8robertphillips@google.com } 1392858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case WM_PAINT: { 1402858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com PAINTSTRUCT ps; 1412858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com HDC hdc = BeginPaint(hWnd, &ps); 1422858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com this->doPaint(hdc); 1432858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EndPaint(hWnd, &ps); 1442858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return true; 1452858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } break; 1462858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 1472858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case WM_TIMER: { 1482858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com RECT* rect = (RECT*)wParam; 1492858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com InvalidateRect(hWnd, rect, FALSE); 1502858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com KillTimer(hWnd, (UINT_PTR)rect); 1512858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com delete rect; 1522858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return true; 1532858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } break; 154d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 155d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com case WM_LBUTTONDOWN: 1564d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com this->handleClick(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 15772708fa18d23ff9d97b90c98a4ead6717045c8c6reed@google.com Click::kDown_State, NULL, getModifiers(message)); 1582858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return true; 159d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1602858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case WM_MOUSEMOVE: 1614d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com this->handleClick(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 16272708fa18d23ff9d97b90c98a4ead6717045c8c6reed@google.com Click::kMoved_State, NULL, getModifiers(message)); 1632858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return true; 1642858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 1652858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case WM_LBUTTONUP: 1664d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com this->handleClick(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 16772708fa18d23ff9d97b90c98a4ead6717045c8c6reed@google.com Click::kUp_State, NULL, getModifiers(message)); 1682858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return true; 1692858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 1702858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case WM_EVENT_CALLBACK: 1712858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (SkEvent::ProcessEvent()) { 1722858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com post_skwinevent(); 1732858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 1742858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return true; 1752858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 1762858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return false; 1772858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 1782858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 1792858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkOSWindow::doPaint(void* ctx) { 1802858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com this->update(NULL); 1812858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 1822858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (kNone_BackEndType == fAttached) 1832858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { 1842858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com HDC hdc = (HDC)ctx; 1852858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com const SkBitmap& bitmap = this->getBitmap(); 1862858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 1872858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com BITMAPINFO bmi; 1882858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com memset(&bmi, 0, sizeof(bmi)); 1892858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 1902858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com bmi.bmiHeader.biWidth = bitmap.width(); 191d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bmi.bmiHeader.biHeight = -bitmap.height(); // top-down image 1922858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com bmi.bmiHeader.biPlanes = 1; 1932858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com bmi.bmiHeader.biBitCount = 32; 1942858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com bmi.bmiHeader.biCompression = BI_RGB; 1952858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com bmi.bmiHeader.biSizeImage = 0; 1962858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 197d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com // 198d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com // Do the SetDIBitsToDevice. 199d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com // 2002858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // TODO(wjmaclean): 2012858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // Fix this call to handle SkBitmaps that have rowBytes != width, 2022858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // i.e. may have padding at the end of lines. The SkASSERT below 2032858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // may be ignored by builds, and the only obviously safe option 2042858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // seems to be to copy the bitmap to a temporary (contiguous) 2052858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // buffer before passing to SetDIBitsToDevice(). 2062858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SkASSERT(bitmap.width() * bitmap.bytesPerPixel() == bitmap.rowBytes()); 2072858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com bitmap.lockPixels(); 208b58a639b2fbe919489654bb506efdb024a308a8ebsalomon@google.com int ret = SetDIBitsToDevice(hdc, 2092858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 0, 0, 2102858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com bitmap.width(), bitmap.height(), 2112858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 0, 0, 2122858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 0, bitmap.height(), 2132858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com bitmap.getPixels(), 2142858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com &bmi, 2152858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com DIB_RGB_COLORS); 216b58a639b2fbe919489654bb506efdb024a308a8ebsalomon@google.com (void)ret; // we're ignoring potential failures for now. 2172858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com bitmap.unlockPixels(); 2182858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 2192858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 2202858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 2212858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#if 0 2222858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkOSWindow::updateSize() 2232858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com{ 2242858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com RECT r; 2252858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com GetWindowRect((HWND)this->getHWND(), &r); 2262858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com this->resize(r.right - r.left, r.bottom - r.top); 2272858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 2282858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#endif 2292858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 2302858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkOSWindow::onHandleInval(const SkIRect& r) { 2312858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com RECT* rect = new RECT; 2322858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com rect->left = r.fLeft; 2332858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com rect->top = r.fTop; 2342858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com rect->right = r.fRight; 2352858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com rect->bottom = r.fBottom; 2362858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SetTimer((HWND)fHWND, (UINT_PTR)rect, INVALIDATE_DELAY_MS, NULL); 2372858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 2382858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 2392858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkOSWindow::onAddMenu(const SkOSMenu* sk_menu) 2402858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com{ 2412858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 2422858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 2432858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkOSWindow::onSetTitle(const char title[]){ 2442858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SetWindowTextA((HWND)fHWND, title); 2452858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 2462858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 2472858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comenum { 2482858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_MacReturnKey = 36, 2492858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_MacDeleteKey = 51, 2502858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_MacEndKey = 119, 2512858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_MacLeftKey = 123, 2522858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_MacRightKey = 124, 2532858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_MacDownKey = 125, 2542858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_MacUpKey = 126, 255d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2562858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_Mac0Key = 0x52, 2572858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_Mac1Key = 0x53, 2582858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_Mac2Key = 0x54, 2592858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_Mac3Key = 0x55, 2602858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_Mac4Key = 0x56, 2612858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_Mac5Key = 0x57, 2622858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_Mac6Key = 0x58, 2632858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_Mac7Key = 0x59, 2642858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_Mac8Key = 0x5b, 2652858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SK_Mac9Key = 0x5c 2662858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com}; 267d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2682858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comstatic SkKey raw2key(uint32_t raw) 2692858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com{ 2702858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com static const struct { 2712858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com uint32_t fRaw; 2722858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SkKey fKey; 2732858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } gKeys[] = { 2742858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_MacUpKey, kUp_SkKey }, 2752858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_MacDownKey, kDown_SkKey }, 2762858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_MacLeftKey, kLeft_SkKey }, 2772858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_MacRightKey, kRight_SkKey }, 2782858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_MacReturnKey, kOK_SkKey }, 2792858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_MacDeleteKey, kBack_SkKey }, 2802858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_MacEndKey, kEnd_SkKey }, 2812858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_Mac0Key, k0_SkKey }, 2822858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_Mac1Key, k1_SkKey }, 2832858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_Mac2Key, k2_SkKey }, 2842858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_Mac3Key, k3_SkKey }, 2852858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_Mac4Key, k4_SkKey }, 2862858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_Mac5Key, k5_SkKey }, 2872858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_Mac6Key, k6_SkKey }, 2882858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_Mac7Key, k7_SkKey }, 2892858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_Mac8Key, k8_SkKey }, 2902858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { SK_Mac9Key, k9_SkKey } 2912858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com }; 292d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2932858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com for (unsigned i = 0; i < SK_ARRAY_COUNT(gKeys); i++) 2942858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (gKeys[i].fRaw == raw) 2952858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return gKeys[i].fKey; 2962858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return kNONE_SkKey; 2972858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 2982858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 2992858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com/////////////////////////////////////////////////////////////////////////////////////// 3002858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 3012858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkEvent::SignalNonEmptyQueue() 3022858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com{ 3032858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com post_skwinevent(); 3042858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com //SkDebugf("signal nonempty\n"); 3052858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 3062858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 3072858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comstatic UINT_PTR gTimer; 3082858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 3092858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comVOID CALLBACK sk_timer_proc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) 3102858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com{ 3112858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SkEvent::ServiceQueueTimer(); 3122858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com //SkDebugf("timer task fired\n"); 3132858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 3142858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 3152858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkEvent::SignalQueueTimer(SkMSec delay) 3162858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com{ 3172858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (gTimer) 3182858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com { 3192858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com KillTimer(NULL, gTimer); 3202858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com gTimer = NULL; 3212858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 3222858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (delay) 323d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com { 3242858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com gTimer = SetTimer(NULL, 0, delay, sk_timer_proc); 3252858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com //SkDebugf("SetTimer of %d returned %d\n", delay, gTimer); 3262858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 3272858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 3282858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 329cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU 3302858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 33164cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.combool SkOSWindow::attachGL(int msaaSampleCount, AttachmentInfo* info) { 332b7f20f20ac4d87819789211aec5935ec1b83ffcdbsalomon@google.com HDC dc = GetDC((HWND)fHWND); 3332858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (NULL == fHGLRC) { 33480549fcdd50269d7e069d6db02b395fca128056ckkinnunen fHGLRC = SkCreateWGLContext(dc, msaaSampleCount, 33580549fcdd50269d7e069d6db02b395fca128056ckkinnunen kGLPreferCompatibilityProfile_SkWGLContextRequest); 3362858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (NULL == fHGLRC) { 3372858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return false; 3382858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 3392858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com glClearStencil(0); 3402858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com glClearColor(0, 0, 0, 0); 3412858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com glStencilMask(0xffffffff); 3422858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 3432858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 344b7f20f20ac4d87819789211aec5935ec1b83ffcdbsalomon@google.com if (wglMakeCurrent(dc, (HGLRC)fHGLRC)) { 34564cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com // use DescribePixelFormat to get the stencil bit depth. 34664cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com int pixelFormat = GetPixelFormat(dc); 34764cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com PIXELFORMATDESCRIPTOR pfd; 34864cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com DescribePixelFormat(dc, pixelFormat, sizeof(pfd), &pfd); 34964cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com info->fStencilBits = pfd.cStencilBits; 35064cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com 35164cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com // Get sample count if the MSAA WGL extension is present 35264cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com SkWGLExtensions extensions; 35364cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com if (extensions.hasExtension(dc, "WGL_ARB_multisample")) { 35464cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com static const int kSampleCountAttr = SK_WGL_SAMPLES; 35564cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com extensions.getPixelFormatAttribiv(dc, 35664cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com pixelFormat, 35764cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com 0, 35864cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com 1, 35964cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com &kSampleCountAttr, 36064cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com &info->fSampleCount); 36164cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com } else { 36264cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com info->fSampleCount = 0; 36364cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com } 36464cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com 365e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com glViewport(0, 0, 366e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com SkScalarRoundToInt(this->width()), 367e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com SkScalarRoundToInt(this->height())); 3682858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return true; 3692858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 3702858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return false; 3712858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 3722858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 3732858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkOSWindow::detachGL() { 3742858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com wglMakeCurrent(GetDC((HWND)fHWND), 0); 3752858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com wglDeleteContext((HGLRC)fHGLRC); 3762858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com fHGLRC = NULL; 3772858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 3782858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 3792858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkOSWindow::presentGL() { 3802858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com glFlush(); 381f44957e7699d1b884c8b977804328257d94235b6bungeman@google.com HDC dc = GetDC((HWND)fHWND); 382f44957e7699d1b884c8b977804328257d94235b6bungeman@google.com SwapBuffers(dc); 383f44957e7699d1b884c8b977804328257d94235b6bungeman@google.com ReleaseDC((HWND)fHWND, dc); 3842858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 3852858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 3862858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#if SK_ANGLE 3871195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.combool create_ANGLE(EGLNativeWindowType hWnd, 3881195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com int msaaSampleCount, 3891195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com EGLDisplay* eglDisplay, 3901195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com EGLContext* eglContext, 39164cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com EGLSurface* eglSurface, 39264cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com EGLConfig* eglConfig) { 3931195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com static const EGLint contextAttribs[] = { 3941195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com EGL_CONTEXT_CLIENT_VERSION, 2, 395d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com EGL_NONE, EGL_NONE 3962858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com }; 3971195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com static const EGLint configAttribList[] = { 3982858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EGL_RED_SIZE, 8, 3992858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EGL_GREEN_SIZE, 8, 4002858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EGL_BLUE_SIZE, 8, 4012858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EGL_ALPHA_SIZE, 8, 4022858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EGL_DEPTH_SIZE, 8, 4032858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EGL_STENCIL_SIZE, 8, 4042858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EGL_NONE 4052858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com }; 4061195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com static const EGLint surfaceAttribList[] = { 4072858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EGL_NONE, EGL_NONE 4082858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com }; 4092858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 4102858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EGLDisplay display = eglGetDisplay(GetDC(hWnd)); 4112858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (display == EGL_NO_DISPLAY ) { 4122858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return false; 4132858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 4142858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 4152858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // Initialize EGL 4162858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EGLint majorVersion, minorVersion; 4172858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (!eglInitialize(display, &majorVersion, &minorVersion)) { 4182858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return false; 4192858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 4202858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 4212858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EGLint numConfigs; 4222858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (!eglGetConfigs(display, NULL, 0, &numConfigs)) { 4232858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return false; 4242858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 4252858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 4262858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // Choose config 4271195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com bool foundConfig = false; 4281195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com if (msaaSampleCount) { 4291195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com static const int kConfigAttribListCnt = 4301195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com SK_ARRAY_COUNT(configAttribList); 4311195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com EGLint msaaConfigAttribList[kConfigAttribListCnt + 4]; 4321195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com memcpy(msaaConfigAttribList, 4331195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com configAttribList, 4341195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com sizeof(configAttribList)); 4351195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com SkASSERT(EGL_NONE == msaaConfigAttribList[kConfigAttribListCnt - 1]); 4361195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com msaaConfigAttribList[kConfigAttribListCnt - 1] = EGL_SAMPLE_BUFFERS; 4371195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com msaaConfigAttribList[kConfigAttribListCnt + 0] = 1; 4381195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com msaaConfigAttribList[kConfigAttribListCnt + 1] = EGL_SAMPLES; 4391195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com msaaConfigAttribList[kConfigAttribListCnt + 2] = msaaSampleCount; 4401195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com msaaConfigAttribList[kConfigAttribListCnt + 3] = EGL_NONE; 44164cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com if (eglChooseConfig(display, configAttribList, eglConfig, 1, &numConfigs)) { 4421195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com SkASSERT(numConfigs > 0); 4431195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com foundConfig = true; 4441195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com } 4451195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com } 4461195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com if (!foundConfig) { 44764cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com if (!eglChooseConfig(display, configAttribList, eglConfig, 1, &numConfigs)) { 4481195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com return false; 4491195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com } 4502858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 4512858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 4522858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // Create a surface 45364cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com EGLSurface surface = eglCreateWindowSurface(display, *eglConfig, 454d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com (EGLNativeWindowType)hWnd, 4552858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com surfaceAttribList); 4562858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (surface == EGL_NO_SURFACE) { 4572858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return false; 4582858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 4592858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 4602858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // Create a GL context 46164cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com EGLContext context = eglCreateContext(display, *eglConfig, 4622858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com EGL_NO_CONTEXT, 4632858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com contextAttribs ); 4642858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (context == EGL_NO_CONTEXT ) { 4652858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return false; 466d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com } 467d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 4682858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // Make the context current 4692858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (!eglMakeCurrent(display, surface, surface, context)) { 4702858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return false; 4712858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 472d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 4732858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com *eglDisplay = display; 4742858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com *eglContext = context; 4752858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com *eglSurface = surface; 4762858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return true; 4772858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 4782858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 47964cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.combool SkOSWindow::attachANGLE(int msaaSampleCount, AttachmentInfo* info) { 4802858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (EGL_NO_DISPLAY == fDisplay) { 4811195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com bool bResult = create_ANGLE((HWND)fHWND, 4821195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com msaaSampleCount, 4831195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com &fDisplay, 4841195925b05ee9d666ea8a8f68fde5d8ca7e49b04bsalomon@google.com &fContext, 48564cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com &fSurface, 48664cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com &fConfig); 4872858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (false == bResult) { 4882858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return false; 4892858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 49082502e2e3966a9b0e48665f20154eaacd2a452b3bsalomon@google.com SkAutoTUnref<const GrGLInterface> intf(GrGLCreateANGLEInterface()); 4912858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 4922858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (intf) { 4930dd5ceb6d621c278ab09e97ea7e2172007990a5aborenet@google.com ANGLE_GL_CALL(intf, ClearStencil(0)); 4940dd5ceb6d621c278ab09e97ea7e2172007990a5aborenet@google.com ANGLE_GL_CALL(intf, ClearColor(0, 0, 0, 0)); 4950dd5ceb6d621c278ab09e97ea7e2172007990a5aborenet@google.com ANGLE_GL_CALL(intf, StencilMask(0xffffffff)); 4960dd5ceb6d621c278ab09e97ea7e2172007990a5aborenet@google.com ANGLE_GL_CALL(intf, Clear(GL_STENCIL_BUFFER_BIT |GL_COLOR_BUFFER_BIT)); 4972858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 4982858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 4992858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { 50064cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com eglGetConfigAttrib(fDisplay, fConfig, EGL_STENCIL_SIZE, &info->fStencilBits); 50164cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com eglGetConfigAttrib(fDisplay, fConfig, EGL_SAMPLES, &info->fSampleCount); 50264cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com 50382502e2e3966a9b0e48665f20154eaacd2a452b3bsalomon@google.com SkAutoTUnref<const GrGLInterface> intf(GrGLCreateANGLEInterface()); 5042858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5052858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (intf ) { 506e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com ANGLE_GL_CALL(intf, Viewport(0, 0, 507e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com SkScalarRoundToInt(this->width()), 508e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com SkScalarRoundToInt(this->height()))); 5092858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 5102858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return true; 5112858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 5122858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return false; 5132858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 5142858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5152858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkOSWindow::detachANGLE() { 5162858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com eglMakeCurrent(fDisplay, EGL_NO_SURFACE , EGL_NO_SURFACE , EGL_NO_CONTEXT); 5172858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5182858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com eglDestroyContext(fDisplay, fContext); 5192858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com fContext = EGL_NO_CONTEXT; 5202858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5212858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com eglDestroySurface(fDisplay, fSurface); 5222858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com fSurface = EGL_NO_SURFACE; 5232858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5242858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com eglTerminate(fDisplay); 5252858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com fDisplay = EGL_NO_DISPLAY; 5262858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 5272858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5282858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkOSWindow::presentANGLE() { 52982502e2e3966a9b0e48665f20154eaacd2a452b3bsalomon@google.com SkAutoTUnref<const GrGLInterface> intf(GrGLCreateANGLEInterface()); 5302858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5312858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (intf) { 5320dd5ceb6d621c278ab09e97ea7e2172007990a5aborenet@google.com ANGLE_GL_CALL(intf, Flush()); 5332858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 5342858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5352858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com eglSwapBuffers(fDisplay, fSurface); 5362858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 537cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_ANGLE 538cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_SUPPORT_GPU 5392858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5402858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com// return true on success 54164cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.combool SkOSWindow::attach(SkBackEndTypes attachType, int msaaSampleCount, AttachmentInfo* info) { 5422858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5432858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // attach doubles as "windowResize" so we need to allo 5442858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // already bound states to pass through again 5452858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // TODO: split out the resize functionality 5462858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com// SkASSERT(kNone_BackEndType == fAttached); 5472858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com bool result = true; 5482858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5492858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com switch (attachType) { 5502858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case kNone_BackEndType: 5512858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // nothing to do 552d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com break; 553cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU 5542858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case kNativeGL_BackEndType: 55564cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com result = attachGL(msaaSampleCount, info); 5562858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com break; 5572858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#if SK_ANGLE 5582858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case kANGLE_BackEndType: 55964cc810ad165724f9c666a75bd52e41c67f13564bsalomon@google.com result = attachANGLE(msaaSampleCount, info); 5602858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com break; 561cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_ANGLE 562cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_SUPPORT_GPU 5632858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com default: 5642858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SkASSERT(false); 5652858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com result = false; 5662858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com break; 5672858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 5682858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5692858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com if (result) { 5702858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com fAttached = attachType; 5712858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 5722858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5732858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com return result; 5742858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 5752858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5762858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkOSWindow::detach() { 5772858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com switch (fAttached) { 5782858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case kNone_BackEndType: 5792858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // nothing to do 580d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com break; 581cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU 5822858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case kNativeGL_BackEndType: 5832858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com detachGL(); 5842858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com break; 5852858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#if SK_ANGLE 5862858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case kANGLE_BackEndType: 5872858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com detachANGLE(); 5882858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com break; 589cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_ANGLE 590cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_SUPPORT_GPU 5912858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com default: 5922858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SkASSERT(false); 5932858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com break; 5942858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 5952858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com fAttached = kNone_BackEndType; 5962858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 5972858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 5982858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.comvoid SkOSWindow::present() { 5992858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com switch (fAttached) { 6002858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case kNone_BackEndType: 6012858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com // nothing to do 602d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com return; 603cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU 6042858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case kNativeGL_BackEndType: 6052858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com presentGL(); 6062858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com break; 6072858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#if SK_ANGLE 6082858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com case kANGLE_BackEndType: 6092858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com presentANGLE(); 6102858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com break; 611cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_ANGLE 612cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_SUPPORT_GPU 6132858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com default: 6142858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com SkASSERT(false); 6152858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com break; 6162858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com } 6172858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com} 6182858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com 6192858b31d4b7b0a2c0e7e090da7bcdf40a0a846cebsalomon@google.com#endif 620