From 00944c5f5de658958ceccd84b8da67f4c68ef2b6 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 14 Sep 2014 15:58:37 -0300 Subject: [PATCH] =?UTF-8?q?Added=20love.window.toPixels(x=20[,=20y])=20and?= =?UTF-8?q?=20love.window.fromPixels(x=20[,=20y]),=20for=20easier=20conver?= =?UTF-8?q?sion=20between=20window-space=20and=20pixel-space=20values=20wh?= =?UTF-8?q?en=20highdpi=20mode=20is=20enabled=20on=20a=20retina=20display?= =?UTF-8?q?=20in=20OS=20X=20(and=20in=20the=20iOS=20and=20Android=20ports?= =?UTF-8?q?=20of=20L=C3=96VE.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/window/Window.h | 5 ++++ src/modules/window/sdl/Window.cpp | 24 ++++++++++++++++ src/modules/window/sdl/Window.h | 5 ++++ src/modules/window/wrap_Window.cpp | 44 ++++++++++++++++++++++++++++++ src/modules/window/wrap_Window.h | 2 ++ src/scripts/boot.lua | 9 +++--- src/scripts/boot.lua.h | 27 ++++++++---------- 7 files changed, 96 insertions(+), 20 deletions(-) diff --git a/src/modules/window/Window.h b/src/modules/window/Window.h index b7988f313..d1e8a1688 100644 --- a/src/modules/window/Window.h +++ b/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; diff --git a/src/modules/window/sdl/Window.cpp b/src/modules/window/sdl/Window.cpp index 8bc0d1935..5a18cf6cb 100644 --- a/src/modules/window/sdl/Window.cpp +++ b/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; diff --git a/src/modules/window/sdl/Window.h b/src/modules/window/sdl/Window.h index 495dd6870..3f3df0a05 100644 --- a/src/modules/window/sdl/Window.h +++ b/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); diff --git a/src/modules/window/wrap_Window.cpp b/src/modules/window/wrap_Window.cpp index c828c1379..2e91c39c5 100644 --- a/src/modules/window/wrap_Window.cpp +++ b/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 } diff --git a/src/modules/window/wrap_Window.h b/src/modules/window/wrap_Window.h index ea7383aac..1f784d09c 100644 --- a/src/modules/window/wrap_Window.h +++ b/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); diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index 90d8d14ad..424779d57 100644 --- a/src/scripts/boot.lua +++ b/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() diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index ea01b84db..0c67f66c5 100644 --- a/src/scripts/boot.lua.h +++ b/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,