#include #include #include #include #include #if !defined(_MSC_VER) #include #endif static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { (void)ud; (void)osize; if (nsize == 0) { free(ptr); return NULL; } else { return realloc(ptr, nsize); } } void open_image(const char *fname) { png_image image; memset(&image, 0, (sizeof image)); image.version = PNG_IMAGE_VERSION; if(png_image_begin_read_from_file(&image, fname) != 0) { png_bytep buffer; image.format = PNG_FORMAT_RGBA; buffer = malloc(PNG_IMAGE_SIZE(image)); if(png_image_finish_read(&image, NULL, buffer, 0, NULL) != 0) { printf("Image %s read failed: %s\n", fname, image.message); } // png_free_image(&image); free(buffer); } else { printf("Image %s open failed: %s", fname, image.message); } } int printer(lua_State *l) { if(!lua_isstring(l, 1)) { fprintf(stderr, "Incorrect call.\n"); return 0; } open_image(lua_tostring(l, 1)); return 0; } int main(int argc, char **argv) { lua_State *l = lua_newstate(l_alloc, NULL); if(!l) { printf("Lua state allocation failed.\n"); return 1; } lua_register(l, "printer", printer); lua_getglobal(l, "printer"); lua_pushliteral(l, "foobar.png"); lua_call(l, 1, 0); lua_close(l); return 0; }