Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support hidpi #24029

Closed
wants to merge 1 commit into from
Closed

Support hidpi #24029

Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Support hidpi

  • Loading branch information
paulrouget committed Aug 23, 2019
commit ed5c88d75c308bd158ec321d3a39d1bb2e120b82
@@ -191,36 +191,7 @@ void OpenGLES::Reset() {
Initialize();
}

// FIXME: simplify this. Duplicating code with CreateSurface(SwapChainPanel)
EGLSurface
OpenGLES::CreateSurface(winrt::Windows::UI::Core::CoreWindow const &cwin) {
EGLSurface surface = EGL_NO_SURFACE;

const EGLint surfaceAttributes[] = {EGL_ANGLE_SURFACE_RENDER_TO_BACK_BUFFER,
EGL_TRUE, EGL_NONE};

PropertySet surfaceCreationProperties;

surfaceCreationProperties.Insert(EGLNativeWindowTypeProperty, cwin);
// How to set size and or scale:
// Insert(EGLRenderSurfaceSizeProperty),
// PropertyValue::CreateSize(*renderSurfaceSize));
// Insert(EGLRenderResolutionScaleProperty),
// PropertyValue::CreateSingle(*resolutionScale));

EGLNativeWindowType win = static_cast<EGLNativeWindowType>(
winrt::get_abi(surfaceCreationProperties));
surface =
eglCreateWindowSurface(mEglDisplay, mEglConfig, win, surfaceAttributes);

if (surface == EGL_NO_SURFACE) {
throw winrt::hresult_error(E_FAIL, L"Failed to create EGL surface");
}

return surface;
}

EGLSurface OpenGLES::CreateSurface(SwapChainPanel const &panel) {
EGLSurface OpenGLES::CreateSurface(SwapChainPanel const &panel, float dpi) {
EGLSurface surface = EGL_NO_SURFACE;

const EGLint surfaceAttributes[] = {EGL_ANGLE_SURFACE_RENDER_TO_BACK_BUFFER,
@@ -232,8 +203,8 @@ EGLSurface OpenGLES::CreateSurface(SwapChainPanel const &panel) {
// How to set size and or scale:
// Insert(EGLRenderSurfaceSizeProperty),
// PropertyValue::CreateSize(*renderSurfaceSize));
// Insert(EGLRenderResolutionScaleProperty),
// PropertyValue::CreateSingle(*resolutionScale));
surfaceCreationProperties.Insert(EGLRenderResolutionScaleProperty,
PropertyValue::CreateSingle(dpi));

EGLNativeWindowType win = static_cast<EGLNativeWindowType>(
winrt::get_abi(surfaceCreationProperties));
@@ -10,8 +10,8 @@ class OpenGLES {
~OpenGLES();

EGLSurface
CreateSurface(winrt::Windows::UI::Xaml::Controls::SwapChainPanel const &);
EGLSurface CreateSurface(winrt::Windows::UI::Core::CoreWindow const &);
CreateSurface(winrt::Windows::UI::Xaml::Controls::SwapChainPanel const &,
float dpi);

void GetSurfaceDimensions(const EGLSurface surface, EGLint *width,
EGLint *height);
@@ -56,7 +56,7 @@ const char* get_clipboard_contents() {
return nullptr;
}

Servo::Servo(hstring url, GLsizei width, GLsizei height,
Servo::Servo(hstring url, GLsizei width, GLsizei height, float dpi,
ServoDelegate &aDelegate)
: mWindowHeight(height), mWindowWidth(width), mDelegate(aDelegate) {

@@ -65,7 +65,7 @@ Servo::Servo(hstring url, GLsizei width, GLsizei height,
o.url = *hstring2char(url);
o.width = mWindowWidth;
o.height = mWindowHeight;
o.density = 1.0;
o.density = dpi;
o.enable_subpixel_text_antialiasing = false;
o.vr_pointer = NULL;

@@ -43,7 +43,7 @@ class ServoDelegate {

class Servo {
public:
Servo(hstring, GLsizei, GLsizei, ServoDelegate &);
Servo(hstring, GLsizei, GLsizei, float, ServoDelegate &);
~Servo();
ServoDelegate &Delegate() { return mDelegate; }

@@ -4,6 +4,7 @@
#include <stdlib.h>

using namespace std::placeholders;
using namespace winrt::Windows::Graphics::Display;
using namespace winrt::Windows::UI::Xaml;
using namespace winrt::Windows::UI::Core;
using namespace winrt::Windows::Foundation;
@@ -13,6 +14,7 @@ using namespace winrt::servo;
namespace winrt::ServoApp::implementation {

ServoControl::ServoControl() {
mDPI = (float)DisplayInformation::GetForCurrentView().ResolutionScale() / 100;
DefaultStyleKey(winrt::box_value(L"ServoApp.ServoControl"));
Loaded(std::bind(&ServoControl::OnLoaded, this, _1, _2));
}
@@ -49,7 +51,7 @@ Controls::SwapChainPanel ServoControl::Panel() {

void ServoControl::CreateRenderSurface() {
if (mRenderSurface == EGL_NO_SURFACE) {
mRenderSurface = mOpenGLES.CreateSurface(Panel());
mRenderSurface = mOpenGLES.CreateSurface(Panel(), mDPI);
}
}

@@ -68,19 +70,19 @@ void ServoControl::RecoverFromLostDevice() {

void ServoControl::OnSurfaceManipulationDelta(
IInspectable const &, Input::ManipulationDeltaRoutedEventArgs const &e) {
auto x = e.Position().X;
auto y = e.Position().Y;
auto dx = e.Delta().Translation.X;
auto dy = e.Delta().Translation.Y;
auto x = e.Position().X * mDPI;
auto y = e.Position().Y * mDPI;
auto dx = e.Delta().Translation.X * mDPI;
auto dy = e.Delta().Translation.Y * mDPI;
RunOnGLThread([=] { mServo->Scroll(dx, dy, x, y); });
e.Handled(true);
}

void ServoControl::OnSurfaceClicked(IInspectable const &,
Input::PointerRoutedEventArgs const &e) {
auto coords = e.GetCurrentPoint(Panel());
auto x = coords.Position().X;
auto y = coords.Position().Y;
auto x = coords.Position().X * mDPI;
auto y = coords.Position().Y * mDPI;
RunOnGLThread([=] { mServo->Click(x, y); });
e.Handled(true);
}
@@ -140,7 +142,7 @@ void ServoControl::Loop() {
if (mServo == nullptr) {
log("Entering loop");
ServoDelegate *sd = static_cast<ServoDelegate *>(this);
mServo = std::make_unique<Servo>(mInitialURL, panelWidth, panelHeight, *sd);
mServo = std::make_unique<Servo>(mInitialURL, panelWidth, panelHeight, mDPI, *sd);
} else {
// FIXME: this will fail since create_task didn't pick the thread
// where Servo was running initially.
@@ -64,6 +64,7 @@ struct ServoControl : ServoControlT<ServoControl>, public servo::ServoDelegate {
winrt::event<HistoryChangedDelegate> mOnHistoryChangedEvent;
winrt::event<LoadStatusChangedDelegate> mOnLoadStartedEvent;
winrt::event<LoadStatusChangedDelegate> mOnLoadEndedEvent;
float mDPI = 1;
hstring mInitialURL = L"https://servo.org";

Windows::UI::Xaml::Controls::SwapChainPanel ServoControl::Panel();
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.