main.c
#include "inc.h"
static void appendToMetatable(lua_State* L, const struct luaL_Reg* lib){
for(int i = 0; lib[i].func; i++){
lua_pushcfunction(L, lib[i].func);
lua_setfield(L, -2, lib[i].name);
}
}
static void createMetatable(lua_State* L, const char* id, const struct luaL_Reg* lib){
luaL_newmetatable(L, id);
lua_pushvalue(L, -1);
lua_setfield(L, -2, "__index");
lua_pushstring(L, id);
lua_setfield(L, -2, "__name");
appendToMetatable(L, lib);
}
static void addHandler(lua_State* L, const char* id, const char* pattern, const char** extensions, void* import, void* export){
lua_newtable(L);
lua_pushcfunction(L, import);
lua_setfield(L, -2, "import");
lua_pushcfunction(L, export);
lua_setfield(L, -2, "export");
lua_pushstring(L, pattern);
lua_setfield(L, -2, "pattern");
int a;
for(a = 0; extensions[a]; a++);
lua_createtable(L, a, 0);
for(int e = 0; e < a; e++){
lua_pushstring(L, extensions[e]);
lua_rawseti(L, -2, e + 1);
}
lua_setfield(L, -2, "extensions");
lua_setfield(L, -2, id);
}
extern LUAREG(lilLib);
extern LUAREG(colourLib);
extern LUAREG(imgLib);
extern LUAREG(imgUdLib);
extern LUAREG(imgFilterLib);
extern LUAREG(imgDrawLib);
#ifdef LIL_USE_FREETYPE
extern LUAREG(fontUdLib);
#endif
#define DEF(id) LUAFUNC(import ## id); LUAFUNC(export ## id)
#ifdef LIL_USE_FARBFELD
DEF(Farbfeld);
#endif
#ifdef LIL_USE_WEBP
DEF(Webp);
#endif
#ifdef LIL_USE_PNG
DEF(Png);
#endif
#ifdef LIL_USE_JPEG
DEF(Jpeg);
#endif
#ifdef LIL_USE_GIF
DEF(Gif);
#endif
#undef DEF
static LUAFUNC(clean_gc){
#ifdef LIL_USE_FREETYPE
lil_freeFreetype();
#endif
return 0;
}
static LUAREG(cleanLib) = {
{ "__gc", LUAFUNCD(clean_gc) },
{ NULL, NULL }
};
int LUAOPEN_LIL(lua_State* L){
createMetatable(L, LIL_MT, LUAREGD(lilLib));
createMetatable(L, LIL_IMG_MT, LUAREGD(imgLib));
createMetatable(L, LIL_CLEAN_MT, LUAREGD(cleanLib));
createMetatable(L, LIL_IMG_UD_MT, LUAREGD(imgUdLib));
#ifdef LIL_USE_FREETYPE
createMetatable(L, LIL_FONT_UD_MT, LUAREGD(fontUdLib));
#endif
lua_createtable(L, 0, 6);
luaL_newmetatable(L, LIL_MT);
appendToMetatable(L, LUAREGD(colourLib));
lua_pushstring(L, LIL_MT);
lua_setfield(L, -2, "__name");
lua_setmetatable(L, -2);
lua_createtable(L, 0, 3);
#define ARR (const char*[])
#ifdef LIL_USE_FARBFELD
addHandler(L, "farbfeld", "^farbfeld", ARR{ "%.farbfeld$", "%.ff$", NULL }, LUAFUNCD(importFarbfeld), LUAFUNCD(exportFarbfeld));
#endif
#ifdef LIL_USE_WEBP
addHandler(L, "webp", "^RIFF....WEBP", ARR{ "%.webp$", NULL }, LUAFUNCD(importWebp), LUAFUNCD(exportWebp));
#endif
#ifdef LIL_USE_PNG
addHandler(L, "png", "^\x89PNG\x0d\x0a\x1a\x0a", ARR{ "%.png$", NULL }, LUAFUNCD(importPng), LUAFUNCD(exportPng));
#endif
#ifdef LIL_USE_JPEG
addHandler(L, "jpeg", "^\xff\xd8\xff", ARR{ "%.jpe?g$", "%.jfif?$", "%.jpe$", "%.jif$", NULL }, LUAFUNCD(importJpeg), LUAFUNCD(exportJpeg));
#endif
#ifdef LIL_USE_GIF
addHandler(L, "gif", "^GIF8.a", ARR{ "%.gif$", NULL }, LUAFUNCD(importGif), LUAFUNCD(exportGif));
#endif
#undef ARR
lua_setfield(L, -2, "formatHandlers");
luaL_getmetatable(L, LIL_IMG_MT);
appendToMetatable(L, LUAREGD(imgFilterLib));
appendToMetatable(L, LUAREGD(imgDrawLib));
lua_setfield(L, -2, "imgMT");
lua_pushstring(L, "lil 0.1.0");
lua_setfield(L, -2, "_VERSION");
lua_pushstring(L, "MPL-2.0");
lua_setfield(L, -2, "_LICENSE");
lua_getglobal(L, "require");
lua_pushstring(L, "lil-aux");
lua_call(L, 1, 1);
lua_pushvalue(L, -2);
lua_call(L, 1, 0);
#ifdef LIL_USE_FREETYPE
lil_initFreetype();
#endif
lua_newuserdata(L, 1);
luaL_getmetatable(L, LIL_CLEAN_MT);
lua_setmetatable(L, -2);
lua_setfield(L, -2, "__clean");
return 1;
}