mirror of
https://github.com/love2d/love.git
synced 2026-08-16 08:11:02 +02:00
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:
@@ -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},
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 },
|
||||
|
||||
Reference in New Issue
Block a user