{
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());
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);
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 = {}
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);
}
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.
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);
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)
-- 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)
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)
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)