blob: dd3035ed32787e6d2547c6df72287ab87cfae970 [file]
#ifdef WITH_RIVE_SCRIPTING
#include "lua.h"
#include "lualib.h"
#include "rive/lua/rive_lua_libs.hpp"
#include "rive/assets/blob_asset.hpp"
#include <string.h>
using namespace rive;
static void blob_direct_size(void* udata, void* result)
{
auto* self = (ScriptedBlob*)udata;
BlobAsset* asset = self->asset ? self->asset->as<BlobAsset>() : nullptr;
if (!asset)
{
lua_userdatadirectfield_setnil(result);
return;
}
lua_userdatadirectfield_setnumber(result, (double)asset->bytes().size());
}
static int blob_index(lua_State* L)
{
auto blob = lua_torive<ScriptedBlob>(L, 1);
int atom;
const char* name = lua_tostringatom(L, 2, &atom);
if (!name)
{
luaL_typeerrorL(L, 2, lua_typename(L, LUA_TSTRING));
}
BlobAsset* blobAsset = blob->asset ? blob->asset->as<BlobAsset>() : nullptr;
if (blobAsset == nullptr)
{
lua_pushnil(L);
return 1;
}
switch (atom)
{
case (int)LuaAtoms::size:
lua_pushnumber(L, static_cast<double>(blobAsset->bytes().size()));
return 1;
case (int)LuaAtoms::name:
lua_pushstring(L, blobAsset->name().c_str());
return 1;
case (int)LuaAtoms::data:
{
auto bytes = blobAsset->bytes();
if (bytes.size() > 0)
{
void* bufferData = lua_newbuffer(L, bytes.size());
memcpy(bufferData, bytes.data(), bytes.size());
return 1;
}
lua_pushnil(L);
return 1;
}
}
luaL_error(L,
"'%s' is not a valid index of %s",
name,
ScriptedBlob::luaName);
return 0;
}
int luaopen_rive_blob(lua_State* L)
{
lua_register_rive<ScriptedBlob>(L);
lua_pushcfunction(L, blob_index, nullptr);
lua_setfield(L, -2, "__index");
lua_setreadonly(L, -1, true);
lua_pop(L, 1);
lua_registeruserdatadirectfieldget(L,
ScriptedBlob::luaTag,
"size",
blob_direct_size);
return 0;
}
#endif