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.
This commit is contained in:
parent
31ac8083ae
commit
c53c592dbe
@ -230,7 +230,7 @@ public:
|
||||
virtual double GetPixelDensity() = 0;
|
||||
// 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.
|
||||
virtual int GetDevicePixelRatio() = 0;
|
||||
virtual double GetDevicePixelRatio() = 0;
|
||||
// Returns (fractional) font scale, to be applied on top of (integral) device pixel ratio.
|
||||
virtual double GetDeviceFontScale() {
|
||||
return GetPixelDensity() / GetDevicePixelRatio() / 96.0;
|
||||
|
@ -889,7 +889,7 @@ public:
|
||||
return gtkWindow.get_screen()->get_resolution();
|
||||
}
|
||||
|
||||
int GetDevicePixelRatio() override {
|
||||
double GetDevicePixelRatio() override {
|
||||
return gtkWindow.get_scale_factor();
|
||||
}
|
||||
|
||||
|
@ -970,8 +970,8 @@ public:
|
||||
return 96.0 * emscripten_get_device_pixel_ratio();
|
||||
}
|
||||
|
||||
int GetDevicePixelRatio() override {
|
||||
return (int)emscripten_get_device_pixel_ratio();
|
||||
double GetDevicePixelRatio() override {
|
||||
return emscripten_get_device_pixel_ratio();
|
||||
}
|
||||
|
||||
bool IsVisible() override {
|
||||
|
@ -987,10 +987,10 @@ public:
|
||||
return (displayPixelSize.width / displayPhysicalSize.width) * 25.4f;
|
||||
}
|
||||
|
||||
int GetDevicePixelRatio() override {
|
||||
double GetDevicePixelRatio() override {
|
||||
NSSize unitSize = { 1.0f, 0.0f };
|
||||
unitSize = [ssView convertSizeToBacking:unitSize];
|
||||
return (int)unitSize.width;
|
||||
return unitSize.width;
|
||||
}
|
||||
|
||||
bool IsVisible() override {
|
||||
|
@ -793,7 +793,7 @@ public:
|
||||
break;
|
||||
|
||||
case WM_SIZING: {
|
||||
int pixelRatio = window->GetDevicePixelRatio();
|
||||
double pixelRatio = window->GetDevicePixelRatio();
|
||||
|
||||
RECT rcw, rcc;
|
||||
sscheck(GetWindowRect(window->hWindow, &rcw));
|
||||
@ -806,10 +806,10 @@ public:
|
||||
int adjHeight = rc->bottom - rc->top;
|
||||
|
||||
adjWidth -= nonClientWidth;
|
||||
adjWidth = max(window->minWidth * pixelRatio, adjWidth);
|
||||
adjWidth += nonClientWidth;
|
||||
adjWidth = max((int)(window->minWidth * pixelRatio), adjWidth);
|
||||
adjWidth += nonClientWidth;
|
||||
adjHeight -= nonClientHeight;
|
||||
adjHeight = max(window->minHeight * pixelRatio, adjHeight);
|
||||
adjHeight = max((int)(window->minHeight * pixelRatio), adjHeight);
|
||||
adjHeight += nonClientHeight;
|
||||
switch(wParam) {
|
||||
case WMSZ_RIGHT:
|
||||
@ -868,7 +868,7 @@ public:
|
||||
case WM_MOUSEMOVE:
|
||||
case WM_MOUSEWHEEL:
|
||||
case WM_MOUSELEAVE: {
|
||||
int pixelRatio = window->GetDevicePixelRatio();
|
||||
double pixelRatio = window->GetDevicePixelRatio();
|
||||
|
||||
MouseEvent event = {};
|
||||
event.x = GET_X_LPARAM(lParam) / pixelRatio;
|
||||
@ -941,7 +941,7 @@ public:
|
||||
event.y = pt.y / pixelRatio;
|
||||
|
||||
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;
|
||||
|
||||
case WM_MOUSELEAVE:
|
||||
@ -1109,10 +1109,10 @@ public:
|
||||
return (double)dpi;
|
||||
}
|
||||
|
||||
int GetDevicePixelRatio() override {
|
||||
double GetDevicePixelRatio() override {
|
||||
UINT dpi;
|
||||
sscheck(dpi = ssGetDpiForWindow(hWindow));
|
||||
return dpi / USER_DEFAULT_SCREEN_DPI;
|
||||
return (double)dpi / USER_DEFAULT_SCREEN_DPI;
|
||||
}
|
||||
|
||||
bool IsVisible() override {
|
||||
@ -1177,27 +1177,27 @@ public:
|
||||
}
|
||||
|
||||
void GetContentSize(double *width, double *height) override {
|
||||
int pixelRatio = GetDevicePixelRatio();
|
||||
double pixelRatio = GetDevicePixelRatio();
|
||||
|
||||
RECT rc;
|
||||
sscheck(GetClientRect(hWindow, &rc));
|
||||
*width = (rc.right - rc.left) / pixelRatio;
|
||||
*height = (rc.bottom - rc.top) / pixelRatio;
|
||||
*width = (rc.right - rc.left) / pixelRatio;
|
||||
*height = (rc.bottom - rc.top) / pixelRatio;
|
||||
}
|
||||
|
||||
void SetMinContentSize(double width, double height) {
|
||||
minWidth = (int)width;
|
||||
minHeight = (int)height;
|
||||
|
||||
int pixelRatio = GetDevicePixelRatio();
|
||||
double pixelRatio = GetDevicePixelRatio();
|
||||
|
||||
RECT rc;
|
||||
sscheck(GetClientRect(hWindow, &rc));
|
||||
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) {
|
||||
rc.bottom = rc.top + minHeight * pixelRatio;
|
||||
rc.bottom = rc.top + (LONG)(minHeight * pixelRatio);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1270,7 +1270,7 @@ public:
|
||||
tooltipText = newText;
|
||||
|
||||
if(!newText.empty()) {
|
||||
int pixelRatio = GetDevicePixelRatio();
|
||||
double pixelRatio = GetDevicePixelRatio();
|
||||
RECT toolRect;
|
||||
toolRect.left = (int)(x * pixelRatio);
|
||||
toolRect.top = (int)(y * pixelRatio);
|
||||
@ -1301,9 +1301,9 @@ public:
|
||||
bool isMonospace, const std::string &text) override {
|
||||
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,
|
||||
DEFAULT_QUALITY, FF_DONTCARE, isMonospace ? L"Lucida Console" : L"Arial");
|
||||
if(hFont == NULL) {
|
||||
@ -1324,12 +1324,12 @@ public:
|
||||
sscheck(ReleaseDC(hEditor, hDc));
|
||||
|
||||
RECT rc;
|
||||
rc.left = (LONG)x * pixelRatio;
|
||||
rc.top = (LONG)y * pixelRatio - tm.tmAscent;
|
||||
rc.left = (LONG)(x * pixelRatio);
|
||||
rc.top = (LONG)(y * pixelRatio) - tm.tmAscent;
|
||||
// Add one extra char width to avoid scrolling.
|
||||
rc.right = (LONG)x * pixelRatio +
|
||||
std::max((LONG)minWidth * pixelRatio, ts.cx + tm.tmAveCharWidth);
|
||||
rc.bottom = (LONG)y * pixelRatio + tm.tmDescent;
|
||||
rc.right = (LONG)(x * pixelRatio) +
|
||||
std::max((LONG)(minWidth * pixelRatio), ts.cx + tm.tmAveCharWidth);
|
||||
rc.bottom = (LONG)(y * pixelRatio) + tm.tmDescent;
|
||||
sscheck(ssAdjustWindowRectExForDpi(&rc, 0, /*bMenu=*/FALSE, WS_EX_CLIENTEDGE,
|
||||
ssGetDpiForWindow(hWindow)));
|
||||
|
||||
@ -1608,7 +1608,7 @@ public:
|
||||
|
||||
void AddFilter(std::string name, std::vector<std::string> extensions) override {
|
||||
std::string desc, patterns;
|
||||
for(auto extension : extensions) {
|
||||
for(auto &extension : extensions) {
|
||||
std::string pattern = "*." + extension;
|
||||
if(!desc.empty()) desc += ", ";
|
||||
desc += pattern;
|
||||
|
Loading…
Reference in New Issue
Block a user