From 5a27e30cfbb38ebb450b82ca28199e06d93ca78f Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Thu, 8 Oct 2015 00:56:42 +0200 Subject: [PATCH] Hook up ResampleEffect, and generalize things a bit. --- theme.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++-------- theme.lua | 5 ++++- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/theme.cpp b/theme.cpp index 31eb23d..006149d 100644 --- a/theme.cpp +++ b/theme.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include "theme.h" @@ -41,6 +42,16 @@ Theme *get_theme_updata(lua_State* L) return (Theme *)lua_touserdata(L, lua_upvalueindex(1)); } +Effect *get_effect(lua_State *L, int idx) +{ + if (luaL_testudata(L, idx, "WhiteBalanceEffect") || + luaL_testudata(L, idx, "ResampleEffect")) { + return (Effect *)lua_touserdata(L, idx); + } + fprintf(stderr, "Error: Index #%d was not an Effect type\n", idx); + exit(1); +} + bool checkbool(lua_State* L, int idx) { luaL_checktype(L, idx, LUA_TBOOLEAN); @@ -69,10 +80,15 @@ int EffectChain_add_effect(lua_State* L) assert(lua_gettop(L) == 3); EffectChain *chain = (EffectChain *)luaL_checkudata(L, 1, "EffectChain"); - // FIXME: This needs a lot of work. - Effect *effect1 = (Effect *)luaL_checkudata(L, 2, "WhiteBalanceEffect"); - LiveInputWrapper *effect2 = (LiveInputWrapper *)luaL_checkudata(L, 3, "LiveInputWrapper"); - chain->add_effect(effect1, effect2->get_input()); + // TODO: Better error reporting. + Effect *effect1 = get_effect(L, 2); + if (luaL_testudata(L, 3, "LiveInputWrapper")) { + LiveInputWrapper *effect2 = (LiveInputWrapper *)lua_touserdata(L, 3); + chain->add_effect(effect1, effect2->get_input()); + } else { + Effect *effect2 = get_effect(L, 3); + chain->add_effect(effect1, effect2); + } lua_settop(L, 2); return 1; @@ -120,10 +136,16 @@ int WhiteBalanceEffect_new(lua_State* L) return wrap_lua_object(L, "WhiteBalanceEffect"); } -int WhiteBalanceEffect_set_float(lua_State *L) +int ResampleEffect_new(lua_State* L) +{ + assert(lua_gettop(L) == 0); + return wrap_lua_object(L, "ResampleEffect"); +} + +int Effect_set_float(lua_State *L) { assert(lua_gettop(L) == 3); - WhiteBalanceEffect *effect = (WhiteBalanceEffect *)luaL_checkudata(L, 1, "WhiteBalanceEffect"); + Effect *effect = (Effect *)get_effect(L, 1); size_t len; const char* cstr = lua_tolstring(L, 2, &len); std::string key(cstr, len); @@ -132,6 +154,18 @@ int WhiteBalanceEffect_set_float(lua_State *L) return 0; } +int Effect_set_int(lua_State *L) +{ + assert(lua_gettop(L) == 3); + Effect *effect = (Effect *)get_effect(L, 1); + size_t len; + 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); + return 0; +} + const luaL_Reg EffectChain_funcs[] = { { "new", EffectChain_new }, { "add_live_input", EffectChain_add_live_input }, @@ -147,7 +181,15 @@ const luaL_Reg LiveInputWrapper_funcs[] = { const luaL_Reg WhiteBalanceEffect_funcs[] = { { "new", WhiteBalanceEffect_new }, - { "set_float", WhiteBalanceEffect_set_float }, + { "set_float", Effect_set_float }, + { "set_int", Effect_set_int }, + { NULL, NULL } +}; + +const luaL_Reg ResampleEffect_funcs[] = { + { "new", ResampleEffect_new }, + { "set_float", Effect_set_float }, + { "set_int", Effect_set_int }, { NULL, NULL } }; @@ -189,7 +231,8 @@ Theme::Theme(const char *filename, ResourcePool *resource_pool) register_class("EffectChain", EffectChain_funcs); register_class("LiveInputWrapper", LiveInputWrapper_funcs); - register_class("WhiteBalanceEffect", WhiteBalanceEffect_funcs); + register_class("WhiteBalanceEffect", WhiteBalanceEffect_funcs); + register_class("ResampleEffect", ResampleEffect_funcs); // Run script. lua_settop(L, 0); diff --git a/theme.lua b/theme.lua index bf88f98..d7c624a 100644 --- a/theme.lua +++ b/theme.lua @@ -15,7 +15,10 @@ local preview_signal_num = 1; local main_chain = EffectChain.new(16, 9); local input0 = main_chain:add_live_input(); input0:connect_signal(0); -local wb_effect = main_chain:add_effect(WhiteBalanceEffect.new(), input0); +local resample_effect = main_chain:add_effect(ResampleEffect.new(), input0); +resample_effect:set_int("width", 320); +resample_effect:set_int("height", 180); +local wb_effect = main_chain:add_effect(WhiteBalanceEffect.new(), resample_effect); main_chain:finalize(true); -- local input1 = main_chain.add_input(Inputs.create(1)); -- local resample_effect = main_chain.add_effect(ResampleEffect.new(), input0); -- 2.39.2