mirror of
https://github.com/holub/mame
synced 2025-06-07 13:23:50 +03:00
luaengine: accept any LUA number type as coordinate
This commit fixes a type confusion bug in all draw_*() API methods. When decimal (ie. subpixels) values were passed by user scripts, they were incorrectly casted from float to plain integers, resulting in incorrect graphical artifacts. As this may happen quite often within scripts manipulating numerical values in LUA, we now also accept decimal values as coordinates. Signed-off-by: Luca Bruno <lucab@debian.org>
This commit is contained in:
parent
0d7860c675
commit
d1436e698a
@ -642,10 +642,10 @@ int lua_engine::lua_screen::l_draw_box(lua_State *L)
|
|||||||
int sc_width = sc->visible_area().width();
|
int sc_width = sc->visible_area().width();
|
||||||
int sc_height = sc->visible_area().height();
|
int sc_height = sc->visible_area().height();
|
||||||
float x1, y1, x2, y2;
|
float x1, y1, x2, y2;
|
||||||
x1 = MIN(MAX(0, lua_tointeger(L, 2)), sc_width-1) / static_cast<float>(sc_width);
|
x1 = MIN(MAX(0, lua_tonumber(L, 2)), sc_width-1) / static_cast<float>(sc_width);
|
||||||
y1 = MIN(MAX(0, lua_tointeger(L, 3)), sc_height-1) / static_cast<float>(sc_height);
|
y1 = MIN(MAX(0, lua_tonumber(L, 3)), sc_height-1) / static_cast<float>(sc_height);
|
||||||
x2 = MIN(MAX(0, lua_tointeger(L, 4)), sc_width-1) / static_cast<float>(sc_width);
|
x2 = MIN(MAX(0, lua_tonumber(L, 4)), sc_width-1) / static_cast<float>(sc_width);
|
||||||
y2 = MIN(MAX(0, lua_tointeger(L, 5)), sc_height-1) / static_cast<float>(sc_height);
|
y2 = MIN(MAX(0, lua_tonumber(L, 5)), sc_height-1) / static_cast<float>(sc_height);
|
||||||
UINT32 bgcolor = lua_tounsigned(L, 6);
|
UINT32 bgcolor = lua_tounsigned(L, 6);
|
||||||
UINT32 fgcolor = lua_tounsigned(L, 7);
|
UINT32 fgcolor = lua_tounsigned(L, 7);
|
||||||
|
|
||||||
@ -680,10 +680,10 @@ int lua_engine::lua_screen::l_draw_line(lua_State *L)
|
|||||||
int sc_width = sc->visible_area().width();
|
int sc_width = sc->visible_area().width();
|
||||||
int sc_height = sc->visible_area().height();
|
int sc_height = sc->visible_area().height();
|
||||||
float x1, y1, x2, y2;
|
float x1, y1, x2, y2;
|
||||||
x1 = MIN(MAX(0, lua_tointeger(L, 2)), sc_width-1) / static_cast<float>(sc_width);
|
x1 = MIN(MAX(0, lua_tonumber(L, 2)), sc_width-1) / static_cast<float>(sc_width);
|
||||||
y1 = MIN(MAX(0, lua_tointeger(L, 3)), sc_height-1) / static_cast<float>(sc_height);
|
y1 = MIN(MAX(0, lua_tonumber(L, 3)), sc_height-1) / static_cast<float>(sc_height);
|
||||||
x2 = MIN(MAX(0, lua_tointeger(L, 4)), sc_width-1) / static_cast<float>(sc_width);
|
x2 = MIN(MAX(0, lua_tonumber(L, 4)), sc_width-1) / static_cast<float>(sc_width);
|
||||||
y2 = MIN(MAX(0, lua_tointeger(L, 5)), sc_height-1) / static_cast<float>(sc_height);
|
y2 = MIN(MAX(0, lua_tonumber(L, 5)), sc_height-1) / static_cast<float>(sc_height);
|
||||||
UINT32 color = lua_tounsigned(L, 6);
|
UINT32 color = lua_tounsigned(L, 6);
|
||||||
|
|
||||||
// draw the line
|
// draw the line
|
||||||
@ -711,8 +711,8 @@ int lua_engine::lua_screen::l_draw_text(lua_State *L)
|
|||||||
// retrieve all parameters
|
// retrieve all parameters
|
||||||
int sc_width = sc->visible_area().width();
|
int sc_width = sc->visible_area().width();
|
||||||
int sc_height = sc->visible_area().height();
|
int sc_height = sc->visible_area().height();
|
||||||
float x = MIN(MAX(0, lua_tointeger(L, 2)), sc_width-1) / static_cast<float>(sc_width);
|
float x = MIN(MAX(0, lua_tonumber(L, 2)), sc_width-1) / static_cast<float>(sc_width);
|
||||||
float y = MIN(MAX(0, lua_tointeger(L, 3)), sc_height-1) / static_cast<float>(sc_height);
|
float y = MIN(MAX(0, lua_tonumber(L, 3)), sc_height-1) / static_cast<float>(sc_height);
|
||||||
const char *msg = luaL_checkstring(L,4);
|
const char *msg = luaL_checkstring(L,4);
|
||||||
// TODO: add optional parameters (colors, etc.)
|
// TODO: add optional parameters (colors, etc.)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user