X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=theme.cpp;h=bd6af3d1a55685af88a3ba38d4533fef0f28452e;hb=e9337db47bc08bac8027414d4cabe0952daa4d25;hp=5a42dff65e585e51e57d9083a8b3d52775d8a5d3;hpb=8cbf100e6126c1550a6436970d777a652ac1182e;p=nageru diff --git a/theme.cpp b/theme.cpp index 5a42dff..bd6af3d 100644 --- a/theme.cpp +++ b/theme.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "theme.h" @@ -52,11 +53,12 @@ Effect *get_effect(lua_State *L, int idx) luaL_testudata(L, idx, "PaddingEffect") || luaL_testudata(L, idx, "IntegralPaddingEffect") || luaL_testudata(L, idx, "OverlayEffect") || - luaL_testudata(L, idx, "ResizeEffect")) { + luaL_testudata(L, idx, "ResizeEffect") || + luaL_testudata(L, idx, "MixEffect")) { return (Effect *)lua_touserdata(L, idx); } - fprintf(stderr, "Error: Index #%d was not an Effect type\n", idx); - exit(1); + luaL_error(L, "Error: Index #%d was not an Effect type\n", idx); + return nullptr; } bool checkbool(lua_State* L, int idx) @@ -127,7 +129,7 @@ int EffectChain_finalize(lua_State* L) YCbCrFormat output_ycbcr_format; output_ycbcr_format.chroma_subsampling_x = 1; output_ycbcr_format.chroma_subsampling_y = 1; - output_ycbcr_format.luma_coefficients = YCBCR_REC_601; + output_ycbcr_format.luma_coefficients = YCBCR_REC_709; output_ycbcr_format.full_range = false; chain->add_ycbcr_output(inout_format, OUTPUT_ALPHA_FORMAT_POSTMULTIPLIED, output_ycbcr_format, YCBCR_OUTPUT_SPLIT_Y_AND_CBCR); @@ -185,6 +187,12 @@ int ResizeEffect_new(lua_State* L) return wrap_lua_object(L, "ResizeEffect"); } +int MixEffect_new(lua_State* L) +{ + assert(lua_gettop(L) == 0); + return wrap_lua_object(L, "MixEffect"); +} + int Effect_set_float(lua_State *L) { assert(lua_gettop(L) == 3); @@ -193,7 +201,9 @@ int Effect_set_float(lua_State *L) const char* cstr = lua_tolstring(L, 2, &len); std::string key(cstr, len); float value = luaL_checknumber(L, 3); - (void)effect->set_float(key, value); + if (!effect->set_float(key, value)) { + luaL_error(L, "Effect refused set_float(\"%s\", %d) (invalid key?)", cstr, int(value)); + } return 0; } @@ -205,7 +215,9 @@ int Effect_set_int(lua_State *L) const char* cstr = lua_tolstring(L, 2, &len); std::string key(cstr, len); float value = luaL_checknumber(L, 3); - (void)effect->set_int(key, value); + if (!effect->set_int(key, value)) { + luaL_error(L, "Effect refused set_int(\"%s\", %d) (invalid key?)", cstr, int(value)); + } return 0; } @@ -221,7 +233,10 @@ int Effect_set_vec4(lua_State *L) v[1] = luaL_checknumber(L, 4); v[2] = luaL_checknumber(L, 5); v[3] = luaL_checknumber(L, 6); - (void)effect->set_vec4(key, v); + if (!effect->set_vec4(key, v)) { + luaL_error(L, "Effect refused set_vec4(\"%s\", %f, %f, %f, %f) (invalid key?)", cstr, + v[0], v[1], v[2], v[3]); + } return 0; } @@ -286,6 +301,14 @@ const luaL_Reg ResizeEffect_funcs[] = { { NULL, NULL } }; +const luaL_Reg MixEffect_funcs[] = { + { "new", MixEffect_new }, + { "set_float", Effect_set_float }, + { "set_int", Effect_set_int }, + { "set_vec4", Effect_set_vec4 }, + { NULL, NULL } +}; + } // namespace LiveInputWrapper::LiveInputWrapper(Theme *theme, EffectChain *chain) @@ -330,6 +353,7 @@ Theme::Theme(const char *filename, ResourcePool *resource_pool) register_class("IntegralPaddingEffect", IntegralPaddingEffect_funcs); register_class("OverlayEffect", OverlayEffect_funcs); register_class("ResizeEffect", ResizeEffect_funcs); + register_class("MixEffect", MixEffect_funcs); // Run script. lua_settop(L, 0); @@ -396,6 +420,25 @@ Theme::get_chain(unsigned num, float t, unsigned width, unsigned height) }); } +std::vector Theme::get_transition_names(float t) +{ + unique_lock lock(m); + lua_getglobal(L, "get_transitions"); + lua_pushnumber(L, t); + if (lua_pcall(L, 1, 1, 0) != 0) { + fprintf(stderr, "error running function `get_transitions': %s\n", lua_tostring(L, -1)); + exit(1); + } + + std::vector ret; + lua_pushnil(L); + while (lua_next(L, -2) != 0) { + ret.push_back(lua_tostring(L, -1)); + lua_pop(L, 1); + } + return ret; +} + void Theme::connect_signal(YCbCrInput *input, int signal_num) { input->set_texture_num(0, input_textures[signal_num].tex_y);