| #ifdef RIVE_WASM_MODULE |
| // The script module's ScriptingContext: enough for the compiled-in binding |
| // files, whose only host contact is factory() and the print/pcall policy. |
| #include "rive/lua/rive_lua_libs.hpp" |
| #include "rive/wasm/module_render.hpp" |
| |
| #include "lualib.h" |
| |
| #include <stdio.h> |
| |
| using namespace rive; |
| |
| int luaopen_rive_path(lua_State* L); |
| int luaopen_rive_gradient(lua_State* L); |
| int luaopen_rive_paint(lua_State* L); |
| int luaopen_rive_renderer(lua_State* L); |
| int luaopen_rive_image(lua_State* L); |
| int luaopen_rive_mesh(lua_State* L); |
| int luaopen_rive_blob(lua_State* L); |
| |
| namespace |
| { |
| class ModuleScriptingContext : public ScriptingContext |
| { |
| public: |
| ModuleScriptingContext() : ScriptingContext(wasmModuleFactory()) {} |
| |
| void printError(lua_State* state) override |
| { |
| const char* message = lua_tostring(state, -1); |
| fprintf(stderr, "script error: %s\n", message ? message : "?"); |
| } |
| void printBeginLine(lua_State*) override {} |
| void print(Span<const char> data) override |
| { |
| fwrite(data.data(), 1, data.size(), stdout); |
| } |
| void printEndLine() override { fputc('\n', stdout); } |
| int pCall(lua_State* state, int nargs, int nresults) override |
| { |
| int status = lua_pcall(state, nargs, nresults, 0); |
| if (status != LUA_OK) |
| { |
| printError(state); |
| } |
| return status; |
| } |
| }; |
| } // namespace |
| |
| namespace rive |
| { |
| ScriptingContext* wasmModuleContext() |
| { |
| static ModuleScriptingContext context; |
| return &context; |
| } |
| |
| // Path caching keys on the artboard frame id, which lives host side. A |
| // constant here makes every dirty rebuild count as same-frame, which |
| // allocates a fresh render path instead of rewinding — conservative and |
| // never stale. |
| uint64_t Artboard::sm_frameId = 0; |
| |
| // The module has no async work pool. |
| void ScriptingContext::shutdownAsync() {} |
| |
| // Host side this is a helper in the Luau backend TU; the blob only needs |
| // the ref pushed. |
| int rive_lua_pushRef(lua_State* L, int ref) |
| { |
| lua_getref(L, ref); |
| return 1; |
| } |
| } // namespace rive |
| |
| // Rendering surface for the module: the untouched binding files over the |
| // handle-backed proxies. |
| int luaopen_rive_renderer_module(lua_State* L) |
| { |
| return luaopen_rive_path(L) + luaopen_rive_gradient(L) + |
| luaopen_rive_paint(L) + luaopen_rive_renderer(L) + |
| luaopen_rive_image(L) + luaopen_rive_mesh(L) + luaopen_rive_blob(L); |
| } |
| |
| #endif |