aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--support/hololens/ServoApp/ServoControl/OpenGLES.cpp35
-rw-r--r--support/hololens/ServoApp/ServoControl/OpenGLES.h4
-rw-r--r--support/hololens/ServoApp/ServoControl/Servo.cpp4
-rw-r--r--support/hololens/ServoApp/ServoControl/Servo.h2
-rw-r--r--support/hololens/ServoApp/ServoControl/ServoControl.cpp28
-rw-r--r--support/hololens/ServoApp/ServoControl/ServoControl.h8
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()>);