Platform: Fix GUI scaling on devices with non-integer pixel ratio
The fuction GetDevicePixelRatio now returns a `double` instead of an `int`. This should allow the scaling of the GUI on devices where the pixel ratio is non integer to work properly. For example a monitor on Windows where the DPI is not a multiple of 96. It may help with the Web Emscripten port on tablets and phones as well. In addition on Windows the mouse wheel delta calculation is fixed.pull/1310/head
parent
31ac8083ae
commit
c53c592dbe
|
@ -230,7 +230,7 @@ public:
|
||||||
virtual double GetPixelDensity() = 0;
|
virtual double GetPixelDensity() = 0;
|
||||||
// Returns raster graphics and coordinate scale (already applied on the platform side),
|
// Returns raster graphics and coordinate scale (already applied on the platform side),
|
||||||
// i.e. size of logical pixel in physical pixels, or device pixel ratio.
|
// i.e. size of logical pixel in physical pixels, or device pixel ratio.
|
||||||
virtual int GetDevicePixelRatio() = 0;
|
virtual double GetDevicePixelRatio() = 0;
|
||||||
// Returns (fractional) font scale, to be applied on top of (integral) device pixel ratio.
|
// Returns (fractional) font scale, to be applied on top of (integral) device pixel ratio.
|
||||||
virtual double GetDeviceFontScale() {
|
virtual double GetDeviceFontScale() {
|
||||||
return GetPixelDensity() / GetDevicePixelRatio() / 96.0;
|
return GetPixelDensity() / GetDevicePixelRatio() / 96.0;
|
||||||
|
|
|
@ -889,7 +889,7 @@ public:
|
||||||
return gtkWindow.get_screen()->get_resolution();
|
return gtkWindow.get_screen()->get_resolution();
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetDevicePixelRatio() override {
|
double GetDevicePixelRatio() override {
|
||||||
return gtkWindow.get_scale_factor();
|
return gtkWindow.get_scale_factor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -970,8 +970,8 @@ public:
|
||||||
return 96.0 * emscripten_get_device_pixel_ratio();
|
return 96.0 * emscripten_get_device_pixel_ratio();
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetDevicePixelRatio() override {
|
double GetDevicePixelRatio() override {
|
||||||
return (int)emscripten_get_device_pixel_ratio();
|
return emscripten_get_device_pixel_ratio();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsVisible() override {
|
bool IsVisible() override {
|
||||||
|
|
|
@ -987,10 +987,10 @@ public:
|
||||||
return (displayPixelSize.width / displayPhysicalSize.width) * 25.4f;
|
return (displayPixelSize.width / displayPhysicalSize.width) * 25.4f;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetDevicePixelRatio() override {
|
double GetDevicePixelRatio() override {
|
||||||
NSSize unitSize = { 1.0f, 0.0f };
|
NSSize unitSize = { 1.0f, 0.0f };
|
||||||
unitSize = [ssView convertSizeToBacking:unitSize];
|
unitSize = [ssView convertSizeToBacking:unitSize];
|
||||||
return (int)unitSize.width;
|
return unitSize.width;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsVisible() override {
|
bool IsVisible() override {
|
||||||
|
|
|
@ -793,7 +793,7 @@ public:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_SIZING: {
|
case WM_SIZING: {
|
||||||
int pixelRatio = window->GetDevicePixelRatio();
|
double pixelRatio = window->GetDevicePixelRatio();
|
||||||
|
|
||||||
RECT rcw, rcc;
|
RECT rcw, rcc;
|
||||||
sscheck(GetWindowRect(window->hWindow, &rcw));
|
sscheck(GetWindowRect(window->hWindow, &rcw));
|
||||||
|
@ -806,10 +806,10 @@ public:
|
||||||
int adjHeight = rc->bottom - rc->top;
|
int adjHeight = rc->bottom - rc->top;
|
||||||
|
|
||||||
adjWidth -= nonClientWidth;
|
adjWidth -= nonClientWidth;
|
||||||
adjWidth = max(window->minWidth * pixelRatio, adjWidth);
|
adjWidth = max((int)(window->minWidth * pixelRatio), adjWidth);
|
||||||
adjWidth += nonClientWidth;
|
adjWidth += nonClientWidth;
|
||||||
adjHeight -= nonClientHeight;
|
adjHeight -= nonClientHeight;
|
||||||
adjHeight = max(window->minHeight * pixelRatio, adjHeight);
|
adjHeight = max((int)(window->minHeight * pixelRatio), adjHeight);
|
||||||
adjHeight += nonClientHeight;
|
adjHeight += nonClientHeight;
|
||||||
switch(wParam) {
|
switch(wParam) {
|
||||||
case WMSZ_RIGHT:
|
case WMSZ_RIGHT:
|
||||||
|
@ -868,7 +868,7 @@ public:
|
||||||
case WM_MOUSEMOVE:
|
case WM_MOUSEMOVE:
|
||||||
case WM_MOUSEWHEEL:
|
case WM_MOUSEWHEEL:
|
||||||
case WM_MOUSELEAVE: {
|
case WM_MOUSELEAVE: {
|
||||||
int pixelRatio = window->GetDevicePixelRatio();
|
double pixelRatio = window->GetDevicePixelRatio();
|
||||||
|
|
||||||
MouseEvent event = {};
|
MouseEvent event = {};
|
||||||
event.x = GET_X_LPARAM(lParam) / pixelRatio;
|
event.x = GET_X_LPARAM(lParam) / pixelRatio;
|
||||||
|
@ -941,7 +941,7 @@ public:
|
||||||
event.y = pt.y / pixelRatio;
|
event.y = pt.y / pixelRatio;
|
||||||
|
|
||||||
event.type = MouseEvent::Type::SCROLL_VERT;
|
event.type = MouseEvent::Type::SCROLL_VERT;
|
||||||
event.scrollDelta = GET_WHEEL_DELTA_WPARAM(wParam) / WHEEL_DELTA;
|
event.scrollDelta = GET_WHEEL_DELTA_WPARAM(wParam) / (double)WHEEL_DELTA;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MOUSELEAVE:
|
case WM_MOUSELEAVE:
|
||||||
|
@ -1109,10 +1109,10 @@ public:
|
||||||
return (double)dpi;
|
return (double)dpi;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetDevicePixelRatio() override {
|
double GetDevicePixelRatio() override {
|
||||||
UINT dpi;
|
UINT dpi;
|
||||||
sscheck(dpi = ssGetDpiForWindow(hWindow));
|
sscheck(dpi = ssGetDpiForWindow(hWindow));
|
||||||
return dpi / USER_DEFAULT_SCREEN_DPI;
|
return (double)dpi / USER_DEFAULT_SCREEN_DPI;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsVisible() override {
|
bool IsVisible() override {
|
||||||
|
@ -1177,27 +1177,27 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetContentSize(double *width, double *height) override {
|
void GetContentSize(double *width, double *height) override {
|
||||||
int pixelRatio = GetDevicePixelRatio();
|
double pixelRatio = GetDevicePixelRatio();
|
||||||
|
|
||||||
RECT rc;
|
RECT rc;
|
||||||
sscheck(GetClientRect(hWindow, &rc));
|
sscheck(GetClientRect(hWindow, &rc));
|
||||||
*width = (rc.right - rc.left) / pixelRatio;
|
*width = (rc.right - rc.left) / pixelRatio;
|
||||||
*height = (rc.bottom - rc.top) / pixelRatio;
|
*height = (rc.bottom - rc.top) / pixelRatio;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetMinContentSize(double width, double height) {
|
void SetMinContentSize(double width, double height) {
|
||||||
minWidth = (int)width;
|
minWidth = (int)width;
|
||||||
minHeight = (int)height;
|
minHeight = (int)height;
|
||||||
|
|
||||||
int pixelRatio = GetDevicePixelRatio();
|
double pixelRatio = GetDevicePixelRatio();
|
||||||
|
|
||||||
RECT rc;
|
RECT rc;
|
||||||
sscheck(GetClientRect(hWindow, &rc));
|
sscheck(GetClientRect(hWindow, &rc));
|
||||||
if(rc.right - rc.left < minWidth * pixelRatio) {
|
if(rc.right - rc.left < minWidth * pixelRatio) {
|
||||||
rc.right = rc.left + minWidth * pixelRatio;
|
rc.right = rc.left + (LONG)(minWidth * pixelRatio);
|
||||||
}
|
}
|
||||||
if(rc.bottom - rc.top < minHeight * pixelRatio) {
|
if(rc.bottom - rc.top < minHeight * pixelRatio) {
|
||||||
rc.bottom = rc.top + minHeight * pixelRatio;
|
rc.bottom = rc.top + (LONG)(minHeight * pixelRatio);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1270,7 +1270,7 @@ public:
|
||||||
tooltipText = newText;
|
tooltipText = newText;
|
||||||
|
|
||||||
if(!newText.empty()) {
|
if(!newText.empty()) {
|
||||||
int pixelRatio = GetDevicePixelRatio();
|
double pixelRatio = GetDevicePixelRatio();
|
||||||
RECT toolRect;
|
RECT toolRect;
|
||||||
toolRect.left = (int)(x * pixelRatio);
|
toolRect.left = (int)(x * pixelRatio);
|
||||||
toolRect.top = (int)(y * pixelRatio);
|
toolRect.top = (int)(y * pixelRatio);
|
||||||
|
@ -1301,9 +1301,9 @@ public:
|
||||||
bool isMonospace, const std::string &text) override {
|
bool isMonospace, const std::string &text) override {
|
||||||
if(IsEditorVisible()) return;
|
if(IsEditorVisible()) return;
|
||||||
|
|
||||||
int pixelRatio = GetDevicePixelRatio();
|
double pixelRatio = GetDevicePixelRatio();
|
||||||
|
|
||||||
HFONT hFont = CreateFontW(-(LONG)fontHeight * GetDevicePixelRatio(), 0, 0, 0,
|
HFONT hFont = CreateFontW(-(int)(fontHeight * GetDevicePixelRatio()), 0, 0, 0,
|
||||||
FW_REGULAR, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
|
FW_REGULAR, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
|
||||||
DEFAULT_QUALITY, FF_DONTCARE, isMonospace ? L"Lucida Console" : L"Arial");
|
DEFAULT_QUALITY, FF_DONTCARE, isMonospace ? L"Lucida Console" : L"Arial");
|
||||||
if(hFont == NULL) {
|
if(hFont == NULL) {
|
||||||
|
@ -1324,12 +1324,12 @@ public:
|
||||||
sscheck(ReleaseDC(hEditor, hDc));
|
sscheck(ReleaseDC(hEditor, hDc));
|
||||||
|
|
||||||
RECT rc;
|
RECT rc;
|
||||||
rc.left = (LONG)x * pixelRatio;
|
rc.left = (LONG)(x * pixelRatio);
|
||||||
rc.top = (LONG)y * pixelRatio - tm.tmAscent;
|
rc.top = (LONG)(y * pixelRatio) - tm.tmAscent;
|
||||||
// Add one extra char width to avoid scrolling.
|
// Add one extra char width to avoid scrolling.
|
||||||
rc.right = (LONG)x * pixelRatio +
|
rc.right = (LONG)(x * pixelRatio) +
|
||||||
std::max((LONG)minWidth * pixelRatio, ts.cx + tm.tmAveCharWidth);
|
std::max((LONG)(minWidth * pixelRatio), ts.cx + tm.tmAveCharWidth);
|
||||||
rc.bottom = (LONG)y * pixelRatio + tm.tmDescent;
|
rc.bottom = (LONG)(y * pixelRatio) + tm.tmDescent;
|
||||||
sscheck(ssAdjustWindowRectExForDpi(&rc, 0, /*bMenu=*/FALSE, WS_EX_CLIENTEDGE,
|
sscheck(ssAdjustWindowRectExForDpi(&rc, 0, /*bMenu=*/FALSE, WS_EX_CLIENTEDGE,
|
||||||
ssGetDpiForWindow(hWindow)));
|
ssGetDpiForWindow(hWindow)));
|
||||||
|
|
||||||
|
@ -1608,7 +1608,7 @@ public:
|
||||||
|
|
||||||
void AddFilter(std::string name, std::vector<std::string> extensions) override {
|
void AddFilter(std::string name, std::vector<std::string> extensions) override {
|
||||||
std::string desc, patterns;
|
std::string desc, patterns;
|
||||||
for(auto extension : extensions) {
|
for(auto &extension : extensions) {
|
||||||
std::string pattern = "*." + extension;
|
std::string pattern = "*." + extension;
|
||||||
if(!desc.empty()) desc += ", ";
|
if(!desc.empty()) desc += ", ";
|
||||||
desc += pattern;
|
desc += pattern;
|
||||||
|
|
Loading…
Reference in New Issue