blob: d47321994f58721cc17c46e1d1008c839bd836c8 [file] [log] [blame]
/*
* 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, const DisplayParams&);
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, const DisplayParams& params)
: ANGLEWindowContext(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<WindowContext> MakeANGLEForWin(HWND wnd, const DisplayParams& params) {
std::unique_ptr<WindowContext> ctx(new ANGLEWindowContext_win(wnd, params));
if (!ctx->isValid()) {
return nullptr;
}
return ctx;
}
} // namespace skwindow