#include #include #include #include #include #include #if LUA_VERSION_NUM >= 503 #define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) #endif #define PNG_DEBUG 3 #include #define torch_(NAME) TH_CONCAT_3(torch_, Real, NAME) #define torch_Tensor TH_CONCAT_STRING_3(torch., Real, Tensor) #define libpng_(NAME) TH_CONCAT_3(libpng_, Real, NAME) /* * Bookkeeping struct for reading png data from memory */ typedef struct { unsigned char* buffer; png_size_t offset; png_size_t length; } libpng_inmem_buffer; /* * Call back for reading png data from memory */ static void libpng_userReadData(png_structp pngPtrSrc, png_bytep dest, png_size_t length) { libpng_inmem_buffer* src = png_get_io_ptr(pngPtrSrc); assert(src->offset+length <= src->length); memcpy(dest, src->buffer + src->offset, length); src->offset += length; } struct libpng_inmem_write_struct { unsigned char *inmem; /* destination memory (if saving to memory) */ unsigned long inmem_size; /* destination memory size (bytes) */ }; /* * Call back for writing png data to memory */ static void libpng_userWriteData(png_structp png_ptr, png_bytep data, png_size_t length) { struct libpng_inmem_write_struct *p = (struct libpng_inmem_write_struct*)png_get_io_ptr(png_ptr); p->inmem=realloc(p->inmem,p->inmem_size+length); memmove(p->inmem+p->inmem_size,data,length); p->inmem_size+=length; } /* * Error message wrapper (single member struct to preserve `str` size info) */ typedef struct { char str[256]; } libpng_errmsg; /* * Custom error handling function (see `png_set_error_fn`) */ static void libpng_error_fn(png_structp png_ptr, png_const_charp error_msg) { libpng_errmsg *errmsg = png_get_error_ptr(png_ptr); int max = sizeof(errmsg->str) - 1; strncpy(errmsg->str, error_msg, max); errmsg->str[max] = '\0'; longjmp(png_jmpbuf(png_ptr), 1); } #include "generic/png.c" #include "THGenerateAllTypes.h" DLL_EXPORT int luaopen_liblua_png(lua_State *L) { libpng_FloatMain_init(L); libpng_DoubleMain_init(L); libpng_ByteMain_init(L); lua_newtable(L); lua_pushvalue(L, -1); lua_setglobal(L, "libpng"); lua_newtable(L); luaT_setfuncs(L, libpng_DoubleMain__, 0); lua_setfield(L, -2, "double"); lua_newtable(L); luaT_setfuncs(L, libpng_FloatMain__, 0); lua_setfield(L, -2, "float"); lua_newtable(L); luaT_setfuncs(L, libpng_ByteMain__, 0); lua_setfield(L, -2, "byte"); return 1; }