Add 'usedpiscale' boolean (true by default) to love.window.setMode's settings table and love.conf's t.window table. Add love.window.getNativeDPIScale.

When usedpiscale=false, love will no longer automatically scale coordinates by the screen's DPI scale factor (so all coordinates will be in pixels), even when highdpi=true. love.window.getDPIScale will return 1, love.graphics.newCanvas will default to a dpi scale of 1 instead of the screen's dpi scale, etc.

love.window.getNativeDPIScale() will return the screen's DPI scale as reported by the OS no matter what usedpiscale is set to.
This commit is contained in:
Alex Szpakowski
2019-06-24 21:54:09 -03:00
parent 2e6644fd44
commit 37472d6f5e
7 changed files with 30 additions and 0 deletions
+1
View File
@@ -104,6 +104,7 @@ StringMap<Window::Setting, Window::SETTING_MAX_ENUM>::Entry Window::settingEntri
{"centered", SETTING_CENTERED},
{"display", SETTING_DISPLAY},
{"highdpi", SETTING_HIGHDPI},
{"usedpiscale", SETTING_USE_DPISCALE},
{"refreshrate", SETTING_REFRESHRATE},
{"x", SETTING_X},
{"y", SETTING_Y},
+4
View File
@@ -25,6 +25,7 @@
#include "common/Module.h"
#include "common/StringMap.h"
#include "common/math.h"
#include "common/Optional.h"
#include "image/ImageData.h"
// C++
@@ -66,6 +67,7 @@ public:
SETTING_CENTERED,
SETTING_DISPLAY,
SETTING_HIGHDPI,
SETTING_USE_DPISCALE,
SETTING_REFRESHRATE,
SETTING_X,
SETTING_Y,
@@ -200,6 +202,7 @@ public:
virtual void DPIToWindowCoords(double *x, double *y) const = 0;
virtual double getDPIScale() const = 0;
virtual double getNativeDPIScale() const = 0;
virtual double toPixels(double x) const = 0;
virtual void toPixels(double wx, double wy, double &px, double &py) const = 0;
@@ -259,6 +262,7 @@ struct WindowSettings
bool centered = true;
int display = 0;
bool highdpi = false;
bool usedpiscale = true;
double refreshrate = 0.0;
bool useposition = false;
int x = 0;
+6
View File
@@ -593,6 +593,7 @@ void Window::updateSettings(const WindowSettings &newsettings, bool updateGraphi
getPosition(settings.x, settings.y, settings.display);
settings.highdpi = (wflags & SDL_WINDOW_ALLOW_HIGHDPI) != 0;
settings.usedpiscale = newsettings.usedpiscale;
// Only minimize on focus loss if the window is in exclusive-fullscreen mode
if (settings.fullscreen && settings.fstype == FULLSCREEN_EXCLUSIVE)
@@ -1114,6 +1115,11 @@ void Window::DPIToWindowCoords(double *x, double *y) const
}
double Window::getDPIScale() const
{
return settings.usedpiscale ? getNativeDPIScale() : 1.0;
}
double Window::getNativeDPIScale() const
{
#ifdef LOVE_ANDROID
return love::android::getScreenScale();
+1
View File
@@ -111,6 +111,7 @@ public:
void DPIToWindowCoords(double *x, double *y) const override;
double getDPIScale() const override;
double getNativeDPIScale() const override;
double toPixels(double x) const override;
void toPixels(double wx, double wy, double &px, double &py) const override;
+11
View File
@@ -76,6 +76,7 @@ static int readWindowSettings(lua_State *L, int idx, WindowSettings &settings)
settings.centered = luax_boolflag(L, idx, settingName(Window::SETTING_CENTERED), settings.centered);
settings.display = luax_intflag(L, idx, settingName(Window::SETTING_DISPLAY), settings.display+1) - 1;
settings.highdpi = luax_boolflag(L, idx, settingName(Window::SETTING_HIGHDPI), settings.highdpi);
settings.usedpiscale = luax_boolflag(L, idx, settingName(Window::SETTING_USE_DPISCALE), settings.usedpiscale);
lua_getfield(L, idx, settingName(Window::SETTING_VSYNC));
if (lua_isnumber(L, -1))
@@ -203,6 +204,9 @@ int w_getMode(lua_State *L)
luax_pushboolean(L, settings.highdpi);
lua_setfield(L, -2, settingName(Window::SETTING_HIGHDPI));
luax_pushboolean(L, settings.usedpiscale);
lua_setfield(L, -2, settingName(Window::SETTING_USE_DPISCALE));
lua_pushnumber(L, settings.refreshrate);
lua_setfield(L, -2, settingName(Window::SETTING_REFRESHRATE));
@@ -457,6 +461,12 @@ int w_getDPIScale(lua_State *L)
return 1;
}
int w_getNativeDPIScale(lua_State *L)
{
lua_pushnumber(L, instance()->getNativeDPIScale());
return 1;
}
int w_toPixels(lua_State *L)
{
double wx = luaL_checknumber(L, 1);
@@ -630,6 +640,7 @@ static const luaL_Reg functions[] =
{ "hasMouseFocus", w_hasMouseFocus },
{ "isVisible", w_isVisible },
{ "getDPIScale", w_getDPIScale },
{ "nativeDPIScale", w_getNativeDPIScale },
{ "toPixels", w_toPixels },
{ "fromPixels", w_fromPixels },
{ "minimize", w_minimize },