diff options
6 files changed, 34 insertions, 47 deletions
diff --git a/support/hololens/ServoApp/ServoControl/OpenGLES.cpp b/support/hololens/ServoApp/ServoControl/OpenGLES.cpp index 31467a4ed60..b8f56b62912 100644 --- a/support/hololens/ServoApp/ServoControl/OpenGLES.cpp +++ b/support/hololens/ServoApp/ServoControl/OpenGLES.cpp @@ -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)); diff --git a/support/hololens/ServoApp/ServoControl/OpenGLES.h b/support/hololens/ServoApp/ServoControl/OpenGLES.h index 6d17798acf1..96d96859194 100644 --- a/support/hololens/ServoApp/ServoControl/OpenGLES.h +++ b/support/hololens/ServoApp/ServoControl/OpenGLES.h @@ -10,8 +10,8 @@ public: ~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); diff --git a/support/hololens/ServoApp/ServoControl/Servo.cpp b/support/hololens/ServoApp/ServoControl/Servo.cpp index df9d58f8fe3..270865182a8 100644 --- a/support/hololens/ServoApp/ServoControl/Servo.cpp +++ b/support/hololens/ServoApp/ServoControl/Servo.cpp @@ -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; diff --git a/support/hololens/ServoApp/ServoControl/Servo.h b/support/hololens/ServoApp/ServoControl/Servo.h index bdfe7dc5e20..170bc466e4b 100644 --- a/support/hololens/ServoApp/ServoControl/Servo.h +++ b/support/hololens/ServoApp/ServoControl/Servo.h @@ -43,7 +43,7 @@ protected: class Servo { public: - Servo(hstring, GLsizei, GLsizei, ServoDelegate &); + Servo(hstring, GLsizei, GLsizei, float, ServoDelegate &); ~Servo(); ServoDelegate &Delegate() { return mDelegate; } diff --git a/support/hololens/ServoApp/ServoControl/ServoControl.cpp b/support/hololens/ServoApp/ServoControl/ServoControl.cpp index 4c01dac15f8..56c4938490e 100644 --- a/support/hololens/ServoApp/ServoControl/ServoControl.cpp +++ b/support/hololens/ServoApp/ServoControl/ServoControl.cpp @@ -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,10 +85,10 @@ 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); } @@ -92,12 +96,20 @@ void ServoControl::OnSurfaceManipulationDelta( 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. diff --git a/support/hololens/ServoApp/ServoControl/ServoControl.h b/support/hololens/ServoApp/ServoControl/ServoControl.h index 5d571830490..54d1caf8c12 100644 --- a/support/hololens/ServoApp/ServoControl/ServoControl.h +++ b/support/hololens/ServoApp/ServoControl/ServoControl.h @@ -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 @@ private: 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 @@ private: 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()>); |