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

Resize support #24030

Merged
merged 2 commits into from Aug 23, 2019
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -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,6 +51,8 @@ void ServoControl::OnLoaded(IInspectable const &, RoutedEventArgs const &) {
});
panel.ManipulationDelta(
std::bind(&ServoControl::OnSurfaceManipulationDelta, this, _1, _2));
Panel().SizeChanged(
std::bind(&ServoControl::OnSurfaceResized, this, _1, _2));
InitializeConditionVariable(&mGLCondVar);
InitializeCriticalSection(&mGLLock);
CreateRenderSurface();
@@ -62,7 +66,7 @@ Controls::SwapChainPanel ServoControl::Panel() {

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

@@ -81,23 +85,31 @@ 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);
}

void ServoControl::OnSurfaceResized(IInspectable const &,
SizeChangedEventArgs const &e) {
auto size = e.NewSize();
auto w = size.Width * mDPI;
auto h = size.Height * mDPI;
RunOnGLThread([=] { mServo->SetSize(w, h); });
}

void ServoControl::GoBack() {
RunOnGLThread([=] { mServo->GoBack(); });
}
@@ -153,7 +165,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.
@@ -62,7 +62,7 @@ struct ServoControl : ServoControlT<ServoControl>, public servo::ServoDelegate {
mOnCaptureGesturesStartedEvent.remove(token);
}

winrt::event_token OnCaptureGesturesEnded(EventDelegate const &handler) {
winrt::event_token OnCaptureGesturesEnded(EventDelegate const &handler) {
return mOnCaptureGesturesEndedEvent.add(handler);
};
void OnCaptureGesturesEnded(winrt::event_token const &token) noexcept {
@@ -92,6 +92,7 @@ struct ServoControl : ServoControlT<ServoControl>, public servo::ServoDelegate {
winrt::event<EventDelegate> mOnCaptureGesturesStartedEvent;
winrt::event<EventDelegate> mOnCaptureGesturesEndedEvent;

float mDPI = 1;
hstring mInitialURL = L"https://servo.org";

Windows::UI::Xaml::Controls::SwapChainPanel ServoControl::Panel();
@@ -117,7 +118,10 @@ struct ServoControl : ServoControlT<ServoControl>, public servo::ServoDelegate {

void OnSurfaceManipulationDelta(
IInspectable const &,
Windows::UI::Xaml::Input::ManipulationDeltaRoutedEventArgs const &e);
Windows::UI::Xaml::Input::ManipulationDeltaRoutedEventArgs const &);

void OnSurfaceResized(IInspectable const &,
Windows::UI::Xaml::SizeChangedEventArgs const &);

template <typename Callable> void RunOnUIThread(Callable);
void RunOnGLThread(std::function<void()>);
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.