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