diff options
Diffstat (limited to 'source/luametatex/source/luaoptional/lmtimagemagick.c')
-rw-r--r-- | source/luametatex/source/luaoptional/lmtimagemagick.c | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/source/luametatex/source/luaoptional/lmtimagemagick.c b/source/luametatex/source/luaoptional/lmtimagemagick.c new file mode 100644 index 000000000..9af5e6cd7 --- /dev/null +++ b/source/luametatex/source/luaoptional/lmtimagemagick.c @@ -0,0 +1,144 @@ +/* + See license.txt in the root of this project. +*/ + +/* This one is real simple. */ + +# include "luametatex.h" +# include "lmtoptional.h" + +typedef struct imlib_state_info { + + int initialized; + int padding; + + int (*im_MagickCommandGenesis) ( + void *image_info, + // int *command, + void *command, + int argc, + const char **argv, + char **metadata, + void *exception + ); + + void * (*im_AcquireImageInfo) ( + void + ); + + void * (*im_AcquireExceptionInfo) ( + void + ); + + int (*im_ConvertImageCommand) ( + void *image_info, + int argc, + const char **argv, + char **metadata, + void *exception + ); + +} imlib_state_info; + +static imlib_state_info imlib_state = { + + .initialized = 0, + .padding = 0, + + .im_MagickCommandGenesis = NULL, + .im_AcquireImageInfo = NULL, + .im_AcquireExceptionInfo = NULL, + .im_ConvertImageCommand = NULL, + +}; + +static int imlib_initialize(lua_State * L) // todo: table +{ + if (! imlib_state.initialized) { + const char *filename1 = lua_tostring(L,1); + const char *filename2 = lua_tostring(L,2); + if (filename1) { + + lmt_library lib = lmt_library_load(filename1); + + imlib_state.initialized = lmt_library_okay(lib); + + imlib_state.im_AcquireImageInfo = lmt_library_find(lib, "AcquireImageInfo"); + imlib_state.im_AcquireExceptionInfo = lmt_library_find(lib, "AcquireExceptionInfo"); + + } + if (imlib_state.initialized && filename2) { + + lmt_library lib = lmt_library_load(filename2); + + imlib_state.im_MagickCommandGenesis = lmt_library_find(lib, "MagickCommandGenesis"); + imlib_state.im_ConvertImageCommand = lmt_library_find(lib, "ConvertImageCommand"); + + imlib_state.initialized = lmt_library_okay(lib); + } + } + lua_pushboolean(L, imlib_state.initialized); + return 1; +} + +static int imlib_execute(lua_State * L) +{ + if (imlib_state.initialized) { + if (lua_type(L, 1) == LUA_TTABLE) { + const char *inpname = NULL; + const char *outname = NULL; + lua_getfield(L, -1, "inputfile" ); inpname = lua_tostring(L, -1); lua_pop(L, 1); + lua_getfield(L, -1, "outputfile"); outname = lua_tostring(L, -1); lua_pop(L, 1); + if (inpname && outname) { + lua_Integer nofarguments = 0; + lua_Integer nofoptions = 0; + const char **arguments = NULL; + void *info = imlib_state.im_AcquireImageInfo(); + void *exep = imlib_state.im_AcquireExceptionInfo(); + if (lua_getfield(L, -1, "options" ) == LUA_TTABLE) { + nofoptions = luaL_len(L, -1); + } + arguments = lmt_memory_malloc((nofoptions + 4) * sizeof(char *)); + arguments[nofarguments++] = "convert"; + arguments[nofarguments++] = inpname; + for (lua_Integer i = 1; i <= nofoptions; i++) { + switch (lua_rawgeti(L, -1, i)) { + case LUA_TSTRING: + case LUA_TNUMBER: + arguments[nofarguments++] = lua_tostring(L, -1); + break; + case LUA_TBOOLEAN: + arguments[nofarguments++] = lua_toboolean(L, -1) ? "true" : "false"; + break; + } + lua_pop(L, 1); + } + arguments[nofarguments++] = outname; + imlib_state.im_MagickCommandGenesis(info, imlib_state.im_ConvertImageCommand, (int) nofarguments, arguments, NULL, exep); + lmt_memory_free((char *) arguments); + lua_pop(L, 1); + lua_pushboolean(L, 1); + return 2; + } + } else { + lua_pushboolean(L, 0); + lua_pushliteral(L, "invalid specification"); + return 2; + } + } + lua_pushboolean(L, 0); + lua_pushliteral(L, "not initialized"); + return 2; +} + +static struct luaL_Reg imlib_function_list[] = { + { "initialize", imlib_initialize }, + { "execute", imlib_execute }, + { NULL, NULL }, +}; + +int luaopen_imagemagick(lua_State * L) +{ + lmt_library_register(L, "imagemagick", imlib_function_list); + return 0; +} |