• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "tools/window/ANGLEWindowContext.h"
9 #include "tools/window/win/WindowContextFactory_win.h"
10 
11 using skwindow::DisplayParams;
12 using skwindow::internal::ANGLEWindowContext;
13 
14 namespace {
15 
16 class ANGLEWindowContext_win : public ANGLEWindowContext {
17 public:
18     ANGLEWindowContext_win(HWND, const DisplayParams&);
19 
20 protected:
21     EGLDisplay onGetEGLDisplay(
22             PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT) const override;
23     NativeWindowType onGetNativeWindow() const override;
24     SkISize onGetSize() const override;
25     int onGetStencilBits() const override;
26 
27 private:
28     HWND fHWND;
29     HDC fHDC;
30 };
31 
ANGLEWindowContext_win(HWND wnd,const DisplayParams & params)32 ANGLEWindowContext_win::ANGLEWindowContext_win(HWND wnd, const DisplayParams& params)
33         : ANGLEWindowContext(params), fHWND(wnd), fHDC(GetDC(fHWND)) {
34     this->initializeContext();
35 }
36 
onGetEGLDisplay(PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT) const37 EGLDisplay ANGLEWindowContext_win::onGetEGLDisplay(
38         PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT) const {
39     // We currently only support D3D11 ANGLE.
40     static constexpr EGLint kType = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE;
41     static constexpr EGLint attribs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, kType, EGL_NONE};
42     return eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, fHDC, attribs);
43 }
44 
onGetNativeWindow() const45 NativeWindowType ANGLEWindowContext_win::onGetNativeWindow() const { return fHWND; }
46 
onGetStencilBits() const47 int ANGLEWindowContext_win::onGetStencilBits() const {
48     // use DescribePixelFormat to get the stencil depth.
49     int pixelFormat = GetPixelFormat(fHDC);
50     PIXELFORMATDESCRIPTOR pfd;
51     DescribePixelFormat(fHDC, pixelFormat, sizeof(pfd), &pfd);
52     return pfd.cStencilBits;
53 }
54 
onGetSize() const55 SkISize ANGLEWindowContext_win::onGetSize() const {
56     RECT rect;
57     GetClientRect(fHWND, &rect);
58     return SkISize::Make(rect.right - rect.left, rect.bottom - rect.top);
59 }
60 
61 }  // anonymous namespace
62 
63 namespace skwindow {
64 
MakeANGLEForWin(HWND wnd,const DisplayParams & params)65 std::unique_ptr<WindowContext> MakeANGLEForWin(HWND wnd, const DisplayParams& params) {
66     std::unique_ptr<WindowContext> ctx(new ANGLEWindowContext_win(wnd, params));
67     if (!ctx->isValid()) {
68         return nullptr;
69     }
70     return ctx;
71 }
72 
73 }  // namespace skwindow
74