From: Steinar H. Gunderson Date: Sat, 15 Jun 2019 22:01:05 +0000 (+0200) Subject: Allow giving class names to Block.choose_alternative. X-Git-Tag: 1.9.0~31 X-Git-Url: https://git.sesse.net/?p=nageru;a=commitdiff_plain;h=ca090e45b28fed464008086fbe3db19437c115dd;hp=67bcd1fb516072bf48e4ac140b057f74a31edba0 Allow giving class names to Block.choose_alternative. --- diff --git a/nageru/scene.cpp b/nageru/scene.cpp index 6eb86ac..a3d3c6a 100644 --- a/nageru/scene.cpp +++ b/nageru/scene.cpp @@ -495,7 +495,22 @@ int Block_choose_alternative(lua_State* L) { assert(lua_gettop(L) == 2); Block *block = *(Block **)luaL_checkudata(L, 1, "Block"); - int alternative_idx = luaL_checknumber(L, 2); + int alternative_idx = -1; + if (lua_isnumber(L, 2)) { + alternative_idx = luaL_checknumber(L, 2); + } else if (lua_istable(L, 2)) { + // See if it's an Effect metatable (e.g. foo:choose_alternative(ResampleEffect)) + lua_getfield(L, 2, "__effect_type_id"); + if (lua_isnumber(L, -1)) { + EffectType effect_type = EffectType(luaL_checknumber(L, -1)); + alternative_idx = find_index_of(block, effect_type); + } + lua_pop(L, 1); + } + + if (alternative_idx == -1) { + luaL_error(L, "choose_alternative() called with something that was not an index or an effect type (e.g. ResampleEffect) that was part of the alternatives"); + } assert(alternative_idx >= 0); assert(size_t(alternative_idx) < block->alternatives.size()); diff --git a/nageru/theme.cpp b/nageru/theme.cpp index fb1fa2f..bf7cdee 100644 --- a/nageru/theme.cpp +++ b/nageru/theme.cpp @@ -1237,16 +1237,16 @@ Theme::Theme(const string &filename, const vector &search_dirs, Resource register_class("ImageInput", ImageInput_funcs); register_class("VideoInput", VideoInput_funcs); register_class("HTMLInput", HTMLInput_funcs); - register_class("IdentityEffect", IdentityEffect_funcs); - register_class("WhiteBalanceEffect", WhiteBalanceEffect_funcs); - register_class("ResampleEffect", ResampleEffect_funcs); - register_class("PaddingEffect", PaddingEffect_funcs); - register_class("IntegralPaddingEffect", IntegralPaddingEffect_funcs); - register_class("OverlayEffect", OverlayEffect_funcs); - register_class("ResizeEffect", ResizeEffect_funcs); - register_class("MultiplyEffect", MultiplyEffect_funcs); - register_class("MixEffect", MixEffect_funcs); - register_class("LiftGammaGainEffect", LiftGammaGainEffect_funcs); + register_class("IdentityEffect", IdentityEffect_funcs, IDENTITY_EFFECT); + register_class("WhiteBalanceEffect", WhiteBalanceEffect_funcs, WHITE_BALANCE_EFFECT); + register_class("ResampleEffect", ResampleEffect_funcs, RESAMPLE_EFFECT); + register_class("PaddingEffect", PaddingEffect_funcs, PADDING_EFFECT); + register_class("IntegralPaddingEffect", IntegralPaddingEffect_funcs, INTEGRAL_PADDING_EFFECT); + register_class("OverlayEffect", OverlayEffect_funcs, OVERLAY_EFFECT); + register_class("ResizeEffect", ResizeEffect_funcs, RESIZE_EFFECT); + register_class("MultiplyEffect", MultiplyEffect_funcs, MULTIPLY_EFFECT); + register_class("MixEffect", MixEffect_funcs, MIX_EFFECT); + register_class("LiftGammaGainEffect", LiftGammaGainEffect_funcs, LIFT_GAMMA_GAIN_EFFECT); register_class("InputStateInfo", InputStateInfo_funcs); register_class("ThemeMenu", ThemeMenu_funcs); @@ -1296,7 +1296,7 @@ void Theme::register_constants() assert(lua_gettop(L) == 0); } -void Theme::register_class(const char *class_name, const luaL_Reg *funcs) +void Theme::register_class(const char *class_name, const luaL_Reg *funcs, EffectType effect_type) { assert(lua_gettop(L) == 0); luaL_newmetatable(L, class_name); // mt = {} @@ -1304,6 +1304,10 @@ void Theme::register_class(const char *class_name, const luaL_Reg *funcs) luaL_setfuncs(L, funcs, 1); // for (name,f in funcs) { mt[name] = f, with upvalue {theme} } lua_pushvalue(L, -1); lua_setfield(L, -2, "__index"); // mt.__index = mt + if (effect_type != NO_EFFECT_TYPE) { + lua_pushnumber(L, effect_type); + lua_setfield(L, -2, "__effect_type_id"); // mt.__effect_type_id = effect_type + } lua_setglobal(L, class_name); // ClassName = mt assert(lua_gettop(L) == 0); } diff --git a/nageru/theme.h b/nageru/theme.h index 7c6b324..1bed992 100644 --- a/nageru/theme.h +++ b/nageru/theme.h @@ -46,7 +46,9 @@ enum EffectType { RESIZE_EFFECT, MULTIPLY_EFFECT, MIX_EFFECT, - LIFT_GAMMA_GAIN_EFFECT + LIFT_GAMMA_GAIN_EFFECT, + + NO_EFFECT_TYPE }; // An EffectBlueprint refers to an Effect before it's being added to the graph. @@ -162,7 +164,7 @@ public: private: void register_constants(); - void register_class(const char *class_name, const luaL_Reg *funcs); + void register_class(const char *class_name, const luaL_Reg *funcs, EffectType effect_type = NO_EFFECT_TYPE); int set_theme_menu(lua_State *L); Chain get_chain_from_effect_chain(movit::EffectChain *effect_chain, unsigned num, const InputState &input_state); diff --git a/nageru/theme.lua b/nageru/theme.lua index 0bbb719..e117e62 100644 --- a/nageru/theme.lua +++ b/nageru/theme.lua @@ -401,9 +401,9 @@ function setup_simple_input(state, signals, signal_num, width, height, hq) simple_scene.input:display(signal_num) if needs_scale(signals, signal_num, width, height) then if hq then - simple_scene.resample_effect:choose_alternative(0) -- High-quality resampling (ResampleEffect) + simple_scene.resample_effect:choose_alternative(ResampleEffect) -- High-quality resampling. else - simple_scene.resample_effect:choose_alternative(1) -- Low-quality resampling (ResizeEffect) + simple_scene.resample_effect:choose_alternative(ResizeEffect) -- Low-quality resampling. end simple_scene.resample_effect:set_int("width", width) simple_scene.resample_effect:set_int("height", height) @@ -509,7 +509,7 @@ function place_rectangle(input, x0, y0, x1, y1, screen_width, screen_height, inp -- Cull. if x0 > screen_width or x1 < 0.0 or y0 > screen_height or y1 < 0.0 then - input.resample_switcher:choose_alternative(1) -- Low-quality resizing. + input.resample_switcher:choose_alternative(ResizeEffect) -- Low-quality resizing. input.resize_effect:set_int("width", 1) input.resize_effect:set_int("height", 1) input.padding_effect:set_int("left", screen_width + 100) @@ -542,7 +542,7 @@ function place_rectangle(input, x0, y0, x1, y1, screen_width, screen_height, inp if hq then -- High-quality resampling. - input.resample_switcher:choose_alternative(0) + input.resample_switcher:choose_alternative(ResampleEffect) local x_subpixel_offset = x0 - math.floor(x0) local y_subpixel_offset = y0 - math.floor(y0) @@ -578,7 +578,7 @@ function place_rectangle(input, x0, y0, x1, y1, screen_width, screen_height, inp input.padding_effect:set_float("border_offset_bottom", y1 - (math.floor(y0) + height)) else -- Lower-quality simple resizing. - input.resample_switcher:choose_alternative(1) + input.resample_switcher:choose_alternative(ResizeEffect) local width = round(x1 - x0) local height = round(y1 - y0)