X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Ftheme.cpp;h=71a59a24525a8c123da024212e40d9395f5d1769;hb=021fa9fa5ce103ae5843647fee3d5d1d7038d32f;hp=780c7cec3be04467d68c53061d3836deb0fac5e0;hpb=ace7c97abd704ad38a3287c22ae42f05c1f9a5b4;p=nageru diff --git a/nageru/theme.cpp b/nageru/theme.cpp index 780c7ce..71a59a2 100644 --- a/nageru/theme.cpp +++ b/nageru/theme.cpp @@ -37,6 +37,7 @@ #include "flags.h" #include "image_input.h" #include "input_state.h" +#include "lua_utils.h" #include "pbo_frame_allocator.h" class Mixer; @@ -115,59 +116,6 @@ InputStateInfo::InputStateInfo(const InputState &input_state) } } -class LuaRefWithDeleter { -public: - LuaRefWithDeleter(mutex *m, lua_State *L, int ref) : m(m), L(L), ref(ref) {} - ~LuaRefWithDeleter() { - lock_guard lock(*m); - luaL_unref(L, LUA_REGISTRYINDEX, ref); - } - int get() const { return ref; } - -private: - LuaRefWithDeleter(const LuaRefWithDeleter &) = delete; - - mutex *m; - lua_State *L; - int ref; -}; - -template -int wrap_lua_object(lua_State* L, const char *class_name, Args&&... args) -{ - // Construct the C++ object and put it on the stack. - void *mem = lua_newuserdata(L, sizeof(T)); - new(mem) T(forward(args)...); - - // Look up the metatable named , and set it on the new object. - luaL_getmetatable(L, class_name); - lua_setmetatable(L, -2); - - return 1; -} - -// Like wrap_lua_object, but the object is not owned by Lua; ie. it's not freed -// by Lua GC. This is typically the case for Effects, which are owned by EffectChain -// and expected to be destructed by it. The object will be of type T** instead of T* -// when exposed to Lua. -// -// Note that we currently leak if you allocate an Effect in this way and never call -// add_effect. We should see if there's a way to e.g. set __gc on it at construction time -// and then release that once add_effect() takes ownership. -template -int wrap_lua_object_nonowned(lua_State* L, const char *class_name, Args&&... args) -{ - // Construct the pointer ot the C++ object and put it on the stack. - T **obj = (T **)lua_newuserdata(L, sizeof(T *)); - *obj = new T(forward(args)...); - - // Look up the metatable named , and set it on the new object. - luaL_getmetatable(L, class_name); - lua_setmetatable(L, -2); - - return 1; -} - enum EffectType { WHITE_BALANCE_EFFECT, RESAMPLE_EFFECT,