/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "tools/window/ANGLEWindowContext.h" #include "tools/window/win/WindowContextFactory_win.h" using skwindow::DisplayParams; using skwindow::internal::ANGLEWindowContext; namespace { class ANGLEWindowContext_win : public ANGLEWindowContext { public: ANGLEWindowContext_win(HWND, std::unique_ptr); protected: EGLDisplay onGetEGLDisplay( PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT) const override; NativeWindowType onGetNativeWindow() const override; SkISize onGetSize() const override; int onGetStencilBits() const override; private: HWND fHWND; HDC fHDC; }; ANGLEWindowContext_win::ANGLEWindowContext_win(HWND wnd, std::unique_ptr params) : ANGLEWindowContext(std::move(params)), fHWND(wnd), fHDC(GetDC(fHWND)) { this->initializeContext(); } EGLDisplay ANGLEWindowContext_win::onGetEGLDisplay( PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT) const { // We currently only support D3D11 ANGLE. static constexpr EGLint kType = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE; static constexpr EGLint attribs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, kType, EGL_NONE}; return eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, fHDC, attribs); } NativeWindowType ANGLEWindowContext_win::onGetNativeWindow() const { return fHWND; } int ANGLEWindowContext_win::onGetStencilBits() const { // use DescribePixelFormat to get the stencil depth. int pixelFormat = GetPixelFormat(fHDC); PIXELFORMATDESCRIPTOR pfd; DescribePixelFormat(fHDC, pixelFormat, sizeof(pfd), &pfd); return pfd.cStencilBits; } SkISize ANGLEWindowContext_win::onGetSize() const { RECT rect; GetClientRect(fHWND, &rect); return SkISize::Make(rect.right - rect.left, rect.bottom - rect.top); } } // anonymous namespace namespace skwindow { std::unique_ptr MakeANGLEForWin(HWND wnd, std::unique_ptr params) { std::unique_ptr ctx(new ANGLEWindowContext_win(wnd, std::move(params))); if (!ctx->isValid()) { return nullptr; } return ctx; } } // namespace skwindow