main.c

///
// @module Lil
// @license MPL-2.0
// @author eiko
#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

	// Root library table
	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);

	// Format handlers
	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");

	// Metatables
	luaL_getmetatable(L, LIL_IMG_MT);
	appendToMetatable(L, LUAREGD(imgFilterLib));
	appendToMetatable(L, LUAREGD(imgDrawLib));
	lua_setfield(L, -2, "imgMT");

	// Metafields
	lua_pushstring(L, "lil 0.1.0");
	lua_setfield(L, -2, "_VERSION");
	lua_pushstring(L, "MPL-2.0");
	lua_setfield(L, -2, "_LICENSE");

	// Load aux TODO luaL_requiref
	lua_getglobal(L, "require");
	lua_pushstring(L, "lil-aux");
	lua_call(L, 1, 1);
	lua_pushvalue(L, -2);
	lua_call(L, 1, 0);

	// Freetype
	#ifdef LIL_USE_FREETYPE
	lil_initFreetype();
	#endif

	// Cleanup UD
	lua_newuserdata(L, 1);
	luaL_getmetatable(L, LIL_CLEAN_MT);
	lua_setmetatable(L, -2);
	lua_setfield(L, -2, "__clean");

	return 1;
}
generated by LDoc 1.4.6 Last updated 2023-04-13 13:58:34