Browse Source

Added love.window.toPixels(x [, y]) and love.window.fromPixels(x [, y]), for easier conversion between window-space and pixel-space values when highdpi mode is enabled on a retina display in OS X (and in the iOS and Android ports of LÖVE.)

Alex Szpakowski 11 years ago
parent
commit
00944c5f5d

+ 5 - 0
src/modules/window/Window.h

@@ -148,6 +148,11 @@ public:
 
 	virtual double getPixelScale() const = 0;
 
+	virtual double toPixels(double x) const = 0;
+	virtual void toPixels(double wx, double wy, double &px, double &py) const = 0;
+	virtual double fromPixels(double x) const = 0;
+	virtual void fromPixels(double px, double py, double &wx, double &wy) const = 0;
+
 	virtual const void *getHandle() const = 0;
 
 	virtual bool showMessageBox(MessageBoxType type, const std::string &title, const std::string &message, bool attachtowindow) = 0;

+ 24 - 0
src/modules/window/sdl/Window.cpp

@@ -682,6 +682,30 @@ double Window::getPixelScale() const
 	return scale;
 }
 
+double Window::toPixels(double x) const
+{
+	return x * getPixelScale();
+}
+
+void Window::toPixels(double wx, double wy, double &px, double &py) const
+{
+	double scale = getPixelScale();
+	px = wx * scale;
+	py = wy * scale;
+}
+
+double Window::fromPixels(double x) const
+{
+	return x / getPixelScale();
+}
+
+void Window::fromPixels(double px, double py, double &wx, double &wy) const
+{
+	double scale = getPixelScale();
+	wx = px / scale;
+	wy = py / scale;
+}
+
 const void *Window::getHandle() const
 {
 	return window;

+ 5 - 0
src/modules/window/sdl/Window.h

@@ -85,6 +85,11 @@ public:
 
 	double getPixelScale() const;
 
+	double toPixels(double x) const;
+	void toPixels(double wx, double wy, double &px, double &py) const;
+	double fromPixels(double x) const;
+	void fromPixels(double px, double py, double &wx, double &wy) const;
+
 	const void *getHandle() const;
 
 	bool showMessageBox(MessageBoxType type, const std::string &title, const std::string &message, bool attachtowindow);

+ 44 - 0
src/modules/window/wrap_Window.cpp

@@ -333,6 +333,48 @@ int w_getPixelScale(lua_State *L)
 	return 1;
 }
 
+int w_toPixels(lua_State *L)
+{
+	double wx = luaL_checknumber(L, 1);
+
+	if (lua_isnoneornil(L, 2))
+	{
+		lua_pushnumber(L, instance()->toPixels(wx));
+		return 1;
+	}
+
+	double wy = luaL_checknumber(L, 2);
+	double px = 0.0, py = 0.0;
+
+	instance()->toPixels(wx, wy, px, py);
+
+	lua_pushnumber(L, px);
+	lua_pushnumber(L, py);
+
+	return 2;
+}
+
+int w_fromPixels(lua_State *L)
+{
+	double px = luaL_checknumber(L, 1);
+
+	if (lua_isnoneornil(L, 2))
+	{
+		lua_pushnumber(L, instance()->fromPixels(px));
+		return 1;
+	}
+
+	double py = luaL_checknumber(L, 2);
+	double wx = 0.0, wy = 0.0;
+
+	instance()->fromPixels(px, py, wx, wy);
+
+	lua_pushnumber(L, wx);
+	lua_pushnumber(L, wy);
+
+	return 2;
+}
+
 int w_minimize(lua_State* /*L*/)
 {
 	instance()->minimize();
@@ -421,6 +463,8 @@ static const luaL_Reg functions[] =
 	{ "hasMouseFocus", w_hasMouseFocus },
 	{ "isVisible", w_isVisible },
 	{ "getPixelScale", w_getPixelScale },
+	{ "toPixels", w_toPixels },
+	{ "fromPixels", w_fromPixels },
 	{ "minimize", w_minimize },
 	{ "showMessageBox", w_showMessageBox },
 	{ 0, 0 }

+ 2 - 0
src/modules/window/wrap_Window.h

@@ -49,6 +49,8 @@ int w_hasFocus(lua_State *L);
 int w_hasMouseFocus(lua_State *L);
 int w_isVisible(lua_State *L);
 int w_getPixelScale(lua_State *L);
+int w_toPixels(lua_State *L);
+int w_fromPixels(lua_State *L);
 int w_minimize(lua_State *L);
 int w_showMessageBox(lua_State *L);
 extern "C" LOVE_EXPORT int luaopen_love_window(lua_State *L);

+ 4 - 5
src/scripts/boot.lua

@@ -1427,9 +1427,8 @@ function love.nogame()
 		g_time = g_time + dt / 2
 		local int, frac = math.modf(g_time)
 		update_rain(frac)
-		local scale = love.window.getPixelScale()
-		inspector.x = love.graphics.getWidth() * 0.45 / scale
-		inspector.y = love.graphics.getHeight() * 0.55 / scale
+		inspector.x = love.window.fromPixels(love.graphics.getWidth() * 0.45)
+		inspector.y = love.window.fromPixels(love.graphics.getHeight() * 0.55)
 	end
 
 	local function draw_grid()
@@ -1565,7 +1564,7 @@ function love.errhand(msg)
 	end
 	if love.audio then love.audio.stop() end
 	love.graphics.reset()
-	local font = love.graphics.setNewFont(math.floor(14 * love.window.getPixelScale()))
+	local font = love.graphics.setNewFont(math.floor(love.window.toPixels(14)))
 
 	local sRGB = select(3, love.window.getMode()).srgb
 	if sRGB and love.math then
@@ -1599,7 +1598,7 @@ function love.errhand(msg)
 	p = string.gsub(p, "%[string \"(.-)\"%]", "%1")
 
 	local function draw()
-		local pos = 70 * love.window.getPixelScale()
+		local pos = love.window.toPixels(70)
 		love.graphics.clear()
 		love.graphics.printf(p, pos, pos, love.graphics.getWidth() - pos)
 		love.graphics.present()

+ 12 - 15
src/scripts/boot.lua.h

@@ -5027,17 +5027,14 @@ const unsigned char boot_lua[] =
 	0x29, 0x0a,
 	0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x66, 0x72, 0x61, 0x63, 
 	0x29, 0x0a,
-	0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 
-	0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x69, 0x78, 0x65, 0x6c, 
-	0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x29, 0x0a,
 	0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 
-	0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 
-	0x74, 0x68, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x20, 0x2f, 0x20, 0x73, 0x63, 0x61, 0x6c, 
-	0x65, 0x0a,
+	0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x69, 0x78, 0x65, 
+	0x6c, 0x73, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 
+	0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x29, 0x0a,
 	0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 
-	0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 
-	0x67, 0x68, 0x74, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x35, 0x20, 0x2f, 0x20, 0x73, 0x63, 0x61, 
-	0x6c, 0x65, 0x0a,
+	0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x69, 0x78, 0x65, 
+	0x6c, 0x73, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 
+	0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x35, 0x29, 0x0a,
 	0x09, 0x65, 0x6e, 0x64, 0x0a,
 	0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, 
 	0x61, 0x77, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x28, 0x29, 0x0a,
@@ -5293,9 +5290,9 @@ const unsigned char boot_lua[] =
 	0x65, 0x74, 0x28, 0x29, 0x0a,
 	0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 
 	0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x46, 0x6f, 
-	0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x31, 0x34, 0x20, 0x2a, 
-	0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x69, 
-	0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x29, 0x29, 0x29, 0x0a,
+	0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x6c, 0x6f, 0x76, 0x65, 
+	0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x74, 0x6f, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x28, 0x31, 
+	0x34, 0x29, 0x29, 0x29, 0x0a,
 	0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x52, 0x47, 0x42, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 
 	0x63, 0x74, 0x28, 0x33, 0x2c, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 
 	0x67, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x29, 0x29, 0x2e, 0x73, 0x72, 0x67, 0x62, 0x0a,
@@ -5348,9 +5345,9 @@ const unsigned char boot_lua[] =
 	0x5c, 0x22, 0x25, 0x5d, 0x22, 0x2c, 0x20, 0x22, 0x25, 0x31, 0x22, 0x29, 0x0a,
 	0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, 
 	0x61, 0x77, 0x28, 0x29, 0x0a,
-	0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x37, 0x30, 0x20, 0x2a, 
-	0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x69, 
-	0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x29, 0x0a,
+	0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 
+	0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x74, 0x6f, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x28, 0x37, 
+	0x30, 0x29, 0x0a,
 	0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x63, 0x6c, 
 	0x65, 0x61, 0x72, 0x28, 0x29, 0x0a,
 	0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72,