1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

SAPI: Accept either ARGB8 table or ColorString to specify colors

This commit is contained in:
kwolekr 2015-05-16 12:26:57 -04:00
parent 8f9af57314
commit fb36c471d7
5 changed files with 77 additions and 54 deletions

View file

@ -23,35 +23,23 @@ extern "C" {
}
#include "util/numeric.h"
#include "util/string.h"
#include "common/c_converter.h"
#include "constants.h"
#define CHECK_TYPE(index, name, type) do { \
int t = lua_type(L, (index)); \
if (t != (type)) { \
throw LuaError(std::string("Invalid ") + (name) + \
" (expected " + lua_typename(L, (type)) + \
" got " + lua_typename(L, t) + ")."); \
} \
} while(0)
int t = lua_type(L, (index)); \
if (t != (type)) { \
throw LuaError(std::string("Invalid ") + (name) + \
" (expected " + lua_typename(L, (type)) + \
" got " + lua_typename(L, t) + ")."); \
} \
} while(0)
#define CHECK_POS_COORD(name) CHECK_TYPE(-1, "position coordinate '" name "'", LUA_TNUMBER)
#define CHECK_POS_TAB(index) CHECK_TYPE(index, "position", LUA_TTABLE)
void push_ARGB8(lua_State *L, video::SColor color)
{
lua_newtable(L);
lua_pushnumber(L, color.getAlpha());
lua_setfield(L, -2, "a");
lua_pushnumber(L, color.getRed());
lua_setfield(L, -2, "r");
lua_pushnumber(L, color.getGreen());
lua_setfield(L, -2, "g");
lua_pushnumber(L, color.getBlue());
lua_setfield(L, -2, "b");
}
void push_v3f(lua_State *L, v3f p)
{
lua_newtable(L);
@ -176,6 +164,19 @@ v3f check_v3f(lua_State *L, int index)
return pos;
}
void push_ARGB8(lua_State *L, video::SColor color)
{
lua_newtable(L);
lua_pushnumber(L, color.getAlpha());
lua_setfield(L, -2, "a");
lua_pushnumber(L, color.getRed());
lua_setfield(L, -2, "r");
lua_pushnumber(L, color.getGreen());
lua_setfield(L, -2, "g");
lua_pushnumber(L, color.getBlue());
lua_setfield(L, -2, "b");
}
void pushFloatPos(lua_State *L, v3f p)
{
p /= BS;
@ -212,13 +213,31 @@ v3s16 check_v3s16(lua_State *L, int index)
return floatToInt(pf, 1.0);
}
video::SColor readARGB8(lua_State *L, int index)
bool read_color(lua_State *L, int index, video::SColor *color)
{
if (lua_istable(L, index)) {
*color = read_ARGB8(L, index);
} else if (lua_isnumber(L, index)) {
color->set(lua_tonumber(L, index));
} else if (lua_isstring(L, index)) {
video::SColor parsed_color;
if (!parseColorString(lua_tostring(L, index), parsed_color, true))
return false;
*color = parsed_color;
} else {
return false;
}
return true;
}
video::SColor read_ARGB8(lua_State *L, int index)
{
video::SColor color(0);
CHECK_TYPE(index, "ARGB color", LUA_TTABLE);
lua_getfield(L, index, "a");
if(lua_isnumber(L, -1))
color.setAlpha(lua_tonumber(L, -1));
color.setAlpha(lua_isnumber(L, -1) ? lua_tonumber(L, -1) : 0xFF);
lua_pop(L, 1);
lua_getfield(L, index, "r");
color.setRed(lua_tonumber(L, -1));