static void copy_image(lua_State * L, lua_Number scale) { image *a, **aa, *b, **bb; image_dict *d; if (lua_gettop(L) == 0) luaL_error(L, "img.copy needs an image as argument"); aa = (image **) luaL_checkudata(L, 1, TYPE_IMG); /* a */ lua_pop(L, 1); /* - */ a = *aa; bb = (image **) lua_newuserdata(L, sizeof(image *)); /* b */ luaL_getmetatable(L, TYPE_IMG); /* m b */ lua_setmetatable(L, -2); /* b */ b = *bb = new_image(); if (!is_wd_running(a)) img_width(b) = do_zround(img_width(a) * scale); if (!is_ht_running(a)) img_height(b) = do_zround(img_height(a) * scale); if (!is_dp_running(a)) img_depth(b) = do_zround(img_depth(a) * scale); img_transform(b) = img_transform(a); img_dict(b) = img_dict(a); if (img_dictref(a) != LUA_NOREF) { lua_rawgeti(L, LUA_REGISTRYINDEX, img_dictref(a)); /* ad b */ img_dictref(b) = luaL_ref(L, LUA_REGISTRYINDEX); /* b */ d = img_dict(*aa); img_luaref(d) += 1; } else if (img_state(img_dict(a)) < DICT_REFERED) { luaL_error(L, "img.copy needs an proper image as argument"); } }
static void copy_image(lua_State * L, lua_Number scale) { image *a, **aa, *b, **bb; if (lua_gettop(L) != 1) luaL_error(L, "img.copy() needs exactly 1 argument"); aa = (image **) luaL_checkudata(L, 1, TYPE_IMG); /* a */ lua_pop(L, 1); /* - */ a = *aa; bb = (image **) lua_newuserdata(L, sizeof(image *)); /* b */ luaL_getmetatable(L, TYPE_IMG); /* m b */ lua_setmetatable(L, -2); /* b */ b = *bb = new_image(); if (!is_wd_running(a)) img_width(b) = do_zround(img_width(a) * scale); if (!is_ht_running(a)) img_height(b) = do_zround(img_height(a) * scale); if (!is_dp_running(a)) img_depth(b) = do_zround(img_depth(a) * scale); img_transform(b) = img_transform(a); img_dict(b) = img_dict(a); if (img_dictref(a) != LUA_NOREF) { lua_rawgeti(L, LUA_GLOBALSINDEX, img_dictref(a)); /* ad b */ img_dictref(b) = luaL_ref(L, LUA_GLOBALSINDEX); /* b */ } else assert(img_state(img_dict(a)) >= DICT_REFERED); }
static int m_img_gc(lua_State * L) { image *a, **aa; image_dict *d; aa = (image **) luaL_checkudata(L, 1, TYPE_IMG); a = *aa; d = img_dict(*aa); #ifdef DEBUG printf("\n===== IMG GC ===== a=%d ad=%d\n", a, img_dict(a)); #endif luaL_unref(L, LUA_GLOBALSINDEX, img_dictref(a)); if (!img_is_refered(d)) xfree(a); return 0; }
static void write_image_or_node(lua_State * L, wrtype_e writetype) { image *a, **aa; image_dict *ad; halfword n; if (lua_gettop(L) != 1) luaL_error(L, "%s expects an argument", wrtype_s[writetype]); if (lua_istable(L, 1)) (void) l_new_image(L); aa = (image **) luaL_checkudata(L, 1, TYPE_IMG); a = *aa; ad = img_dict(a); setup_image(static_pdf, a, writetype); switch (writetype) { case WR_WRITE: n = img_to_node(L, a); tail_append(n); break; case WR_IMMEDIATEWRITE: write_img(static_pdf, ad); break; case WR_NODE: lua_pop(L, 1); /* - */ n = img_to_node(L, a); lua_nodelib_push_fast(L, n); break; default: luaL_error(L, "%s expects an valid image", wrtype_s[writetype]); } if (img_state(ad) < DICT_REFERED) img_state(ad) = DICT_REFERED; }
int l_new_image(lua_State * L) { image *a, **aa; image_dict **add; if (lua_gettop(L) > 1) luaL_error(L, "img.new() needs maximum 1 argument"); if (lua_gettop(L) == 1 && !lua_istable(L, -1)) luaL_error(L, "img.new() needs table as optional argument"); /* (t) */ aa = (image **) lua_newuserdata(L, sizeof(image *)); /* i (t) */ luaL_getmetatable(L, TYPE_IMG); /* m i (t) */ lua_setmetatable(L, -2); /* i (t) */ a = *aa = new_image(); add = (image_dict **) lua_newuserdata(L, sizeof(image_dict *)); /* ad i (t) */ luaL_getmetatable(L, TYPE_IMG_DICT); /* m ad i (t) */ lua_setmetatable(L, -2); /* ad i (t) */ img_dict(a) = *add = new_image_dict(); img_dictref(a) = luaL_ref(L, LUA_GLOBALSINDEX); /* i (t) */ if (lua_gettop(L) == 2) { /* i t, else just i */ lua_insert(L, -2); /* t i */ lua_pushnil(L); /* n t i (1st key for iterator) */ while (lua_next(L, -2) != 0) { /* v k t i */ lua_to_image(L, a); /* v k t i */ lua_pop(L, 1); /* k t i */ } /* t i */ lua_pop(L, 1); /* i */ } /* i */ return 1; /* i */ }
static void write_image_or_node(lua_State * L, wrtype_e writetype) { image *a, **aa; image_dict *ad; halfword n; if (lua_gettop(L) != 1) luaL_error(L, "%s needs exactly 1 argument", wrtype_s[writetype]); if (lua_istable(L, 1)) (void) l_new_image(L); /* image --- if everything worked well */ aa = (image **) luaL_checkudata(L, 1, TYPE_IMG); /* image */ a = *aa; ad = img_dict(a); setup_image(static_pdf, a, writetype); switch (writetype) { case WR_WRITE: n = img_to_node(a); tail_append(n); break; /* image */ case WR_IMMEDIATEWRITE: write_img(static_pdf, ad); break; /* image */ case WR_NODE: /* image */ lua_pop(L, 1); /* - */ n = img_to_node(a); lua_nodelib_push_fast(L, n); break; /* node */ default: assert(0); } if (img_state(ad) < DICT_REFERED) img_state(ad) = DICT_REFERED; }
static void read_scale_img(image * a) { image_dict *ad; if (a == NULL) { luaL_error(Luas, "the image scaler needs a valid image"); } else { ad = img_dict(a); if (a == NULL) { luaL_error(Luas, "the image scaler needs a valid dictionary"); } else { if (img_state(ad) == DICT_NEW) { if (img_type(ad) == IMG_TYPE_PDFSTREAM) check_pdfstream_dict(ad); else { read_img(ad); } } if ((img_type(ad) == IMG_TYPE_NONE) || (img_state(ad) == DICT_NEW)) { normal_warning("image","don't rely on the image data to be okay"); img_width(a) = 0; img_height(a) = 0; img_depth(a) = 0; } else if (is_wd_running(a) || is_ht_running(a) || is_dp_running(a)) { img_dimen(a) = scale_img(ad, img_dimen(a), img_transform(a)); } } } }
image *new_image(void) { image *p = xtalloc(1, image); set_wd_running(p); set_ht_running(p); set_dp_running(p); img_transform(p) = 0; img_dict(p) = NULL; img_dictref(p) = LUA_NOREF; return p; }
static int m_img_set(lua_State * L) { image **a = (image **) luaL_checkudata(L, 1, TYPE_IMG); /* v k u */ image_dict *d = img_dict(*a); if (d == NULL) { luaL_error(L, "invalid image dictionary"); } else { lua_to_image(L, *a, d); } return 0; }
static int m_img_print(lua_State * L) { image **aa; image_dict *d; aa = (image **) luaL_checkudata(L, 1, TYPE_IMG); d = img_dict(*aa); if (img_pagename(d) != NULL && strlen(img_pagename(d)) != 0) lua_pushfstring(L, "<img{filename=\"%s\", page=\"%s\"}>", img_filename(d), img_pagename(d)); else lua_pushfstring(L, "<img{filename=\"%s\", page=%d}>", img_filename(d), img_pagenum(d)); return 1; }
void vf_out_image(PDF pdf, unsigned i) { image *a, **aa; image_dict *ad; lua_State *L = Luas; /* ... */ lua_rawgeti(L, LUA_GLOBALSINDEX, (int) i); /* image ... */ aa = (image **) luaL_checkudata(L, -1, TYPE_IMG); a = *aa; ad = img_dict(a); assert(ad != NULL); setup_image(pdf, a, WR_VF_IMG); /* image ... */ place_img(pdf, ad, img_dimen(a), img_transform(a)); lua_pop(L, 1); /* ... */ }
void vf_out_image(PDF pdf, unsigned i) { image *a, **aa; image_dict *ad; lua_rawgeti(Luas, LUA_REGISTRYINDEX, (int) i); aa = (image **) luaL_checkudata(Luas, -1, TYPE_IMG); a = *aa; ad = img_dict(a); if (ad == NULL) { luaL_error(Luas, "invalid image dictionary"); } setup_image(pdf, a, WR_VF_IMG); place_img(pdf, ad, img_dimen(a), img_transform(a)); lua_pop(Luas, 1); }
static int m_img_gc(lua_State * L) { image *a, **aa; image_dict *d; aa = (image **) luaL_checkudata(L, 1, TYPE_IMG); a = *aa; d = img_dict(*aa); luaL_unref(L, LUA_REGISTRYINDEX, img_dictref(a)); img_luaref(d) -= 1; /* we need to check this */ if (!img_is_refered(d)) { xfree(a); } /* till here */ return 0; }
static halfword img_to_node(image * a) { image_dict *ad; halfword n; assert(a != NULL); ad = img_dict(a); assert(ad != NULL); assert(img_objnum(ad) != 0); n = new_node(whatsit_node, pdf_refximage_node); pdf_ximage_index(n) = img_index(ad); width(n) = img_width(a); height(n) = img_height(a); depth(n) = img_depth(a); pdf_ximage_transform(n) = img_transform(a); return n; }
static void setup_image(PDF pdf, image * a, wrtype_e writetype) { image_dict *ad; if (a == NULL) luaL_error(Luas, "no valid image passed"); /* todo, also check in caller */ ad = img_dict(a); check_o_mode(pdf, wrtype_s[writetype], 1 << OMODE_PDF, false); read_scale_img(a); if (img_objnum(ad) == 0) { /* latest needed just before out_img() */ pdf->ximage_count++; img_objnum(ad) = pdf_create_obj(pdf, obj_type_ximage, pdf->ximage_count); img_index(ad) = pdf->ximage_count; idict_to_array(ad); /* from now on ad is read-only */ obj_data_ptr(pdf, pdf->obj_ptr) = img_index(ad); } }
static void setup_image(PDF pdf, image * a, wrtype_e writetype) { image_dict *ad; assert(a != NULL); ad = img_dict(a); check_o_mode(pdf, wrtype_s[writetype], 1 << OMODE_PDF, false); /* flush_str(last_tex_string); *//* ?? */ read_scale_img(a); if (img_objnum(ad) == 0) { /* latest needed just before out_img() */ pdf->ximage_count++; img_objnum(ad) = pdf_create_obj(pdf, obj_type_ximage, pdf->ximage_count); img_index(ad) = pdf->ximage_count; idict_to_array(ad); /* now ad is read-only */ obj_data_ptr(pdf, pdf->obj_ptr) = img_index(ad); } }
static void read_scale_img(image * a) { image_dict *ad; assert(a != NULL); ad = img_dict(a); assert(ad != NULL); if (img_state(ad) == DICT_NEW) { if (img_type(ad) == IMG_TYPE_PDFSTREAM) check_pdfstream_dict(ad); else { fix_pdf_minorversion(static_pdf); read_img(static_pdf, ad, pdf_minor_version, pdf_inclusion_errorlevel); } } if (is_wd_running(a) || is_ht_running(a) || is_dp_running(a)) img_dimen(a) = scale_img(ad, img_dimen(a), img_transform(a)); }
static int m_img_print(lua_State * L) { image **aa; image_dict *d; aa = (image **) luaL_checkudata(L, 1, TYPE_IMG); d = img_dict(*aa); /* formatted a bit like a node */ if (img_filename(d) == NULL) { if (img_pagename(d) != NULL && strlen(img_pagename(d)) != 0) { lua_pushfstring(L, "<img unset : %d >", img_dictref(*aa)); } else { lua_pushfstring(L, "<img unset : %d >", img_dictref(*aa)); } } else { if (img_pagename(d) != NULL && strlen(img_pagename(d)) != 0) { lua_pushfstring(L, "<img %s : %s : %d >", img_filename(d), img_pagename(d), img_dictref(*aa)); } else { lua_pushfstring(L, "<img %s : %d : %d >", img_filename(d), img_pagenum(d), img_dictref(*aa)); } } return 1; }
static halfword img_to_node(lua_State * L, image * a) { image_dict *ad; halfword n = null; if (a == NULL) { luaL_error(L, "img.tonode needs a valid image"); } else { ad = img_dict(a); if (a == NULL) { luaL_error(L, "img.tonode image has no dictionary"); } else if (img_objnum(ad) == 0) { luaL_error(L, "img.tonode got image without object number"); } else { n = new_rule(image_rule); rule_index(n) = img_index(ad); width(n) = img_width(a); height(n) = img_height(a); depth(n) = img_depth(a); rule_transform(n) = img_transform(a); } } return n; }
static image_dict *read_image(char *file_name, int page_num, char *page_name, int colorspace, int page_box, char *user_password, char *owner_password, char *visible_filename) { image *a = new_image(); image_dict *idict = img_dict(a) = new_image_dict(); static_pdf->ximage_count++; img_objnum(idict) = pdf_create_obj(static_pdf, obj_type_ximage, static_pdf->ximage_count); img_index(idict) = static_pdf->ximage_count; set_obj_data_ptr(static_pdf, img_objnum(idict), img_index(idict)); idict_to_array(idict); img_colorspace(idict) = colorspace; img_pagenum(idict) = page_num; img_pagename(idict) = page_name; img_userpassword(idict) = user_password; img_ownerpassword(idict) = owner_password; img_visiblefilename(idict) = visible_filename; if (file_name == NULL) { normal_error("pdf backend","no image filename given"); } cur_file_name = file_name; img_filename(idict) = file_name; img_pagebox(idict) = page_box; read_img(idict); return idict; }
static void lua_to_image(lua_State * L, image * a) { /* value key table ... */ int i; image_dict *d = img_dict(a); assert(d != NULL); lua_pushstring(L, IMG_ENV); /* s v k t ... */ lua_gettable(L, LUA_REGISTRYINDEX); /* t v k t ... */ lua_pushvalue(L, -3); /* k t v k t ... */ lua_gettable(L, -2); /* i? t v k t ... */ if (!lua_isnumber(L, -1)) /* !i t v k t ... */ luaL_error(L, "lua_to_image(): %s is not a valid image key", lua_tostring(L, -4)); i = (int) lua_tointeger(L, -1); /* i t v k t ... */ lua_pop(L, 2); /* v k t ... */ switch (i) { case P_WIDTH: if (lua_isnil(L, -1)) set_wd_running(a); else if (lua_type(L, -1) == LUA_TNUMBER) img_width(a) = (int) lua_tointeger(L, -1); else if (lua_type(L, -1) == LUA_TSTRING) img_width(a) = dimen_to_number(L, lua_tostring(L, -1)); else luaL_error(L, "image.width needs integer or nil value or dimension string"); break; case P_HEIGHT: if (lua_isnil(L, -1)) set_ht_running(a); else if (lua_type(L, -1) == LUA_TNUMBER) img_height(a) = (int) lua_tointeger(L, -1); else if (lua_type(L, -1) == LUA_TSTRING) img_height(a) = dimen_to_number(L, lua_tostring(L, -1)); else luaL_error(L, "image.height needs integer or nil value or dimension string"); break; case P_DEPTH: if (lua_isnil(L, -1)) set_dp_running(a); else if (lua_type(L, -1) == LUA_TNUMBER) img_depth(a) = (int) lua_tointeger(L, -1); else if (lua_type(L, -1) == LUA_TSTRING) img_depth(a) = dimen_to_number(L, lua_tostring(L, -1)); else luaL_error(L, "image.depth needs integer or nil value or dimension string"); break; case P_TRANSFORM: if (lua_isnumber(L, -1)) img_transform(a) = (int) lua_tointeger(L, -1); else luaL_error(L, "image.transform needs integer value"); break; /* now follow all image_dict entries */ case P_FILENAME: if (img_state(d) >= DICT_FILESCANNED) luaL_error(L, "image.filename is now read-only"); if (img_type(d) == IMG_TYPE_PDFSTREAM) luaL_error(L, "image.filename can't be used with image.stream"); if (lua_isstring(L, -1)) { xfree(img_filename(d)); img_filename(d) = xstrdup(lua_tostring(L, -1)); } else luaL_error(L, "image.filename needs string value"); break; case P_VISIBLEFILENAME: if (img_state(d) >= DICT_FILESCANNED) luaL_error(L, "image.visiblefilename is now read-only"); if (img_type(d) == IMG_TYPE_PDFSTREAM) luaL_error(L, "image.visiblefilename can't be used with image.stream"); if (lua_isstring(L, -1)) { xfree(img_visiblefilename(d)); img_visiblefilename(d) = xstrdup(lua_tostring(L, -1)); } else luaL_error(L, "image.visiblefilename needs string value"); break; case P_ATTR: if (img_state(d) >= DICT_FILESCANNED) luaL_error(L, "image.attr is now read-only"); if (lua_isstring(L, -1) || lua_isnil(L, -1)) { xfree(img_attr(d)); if (lua_isstring(L, -1)) img_attr(d) = xstrdup(lua_tostring(L, -1)); } else luaL_error(L, "image.attr needs string or nil value"); break; case P_PAGE: if (img_state(d) >= DICT_FILESCANNED) luaL_error(L, "image.page is now read-only"); if (lua_type(L, -1) == LUA_TSTRING) { xfree(img_pagename(d)); img_pagename(d) = xstrdup(lua_tostring(L, -1)); img_pagenum(d) = 0; } else if (lua_type(L, -1) == LUA_TNUMBER) { img_pagenum(d) = (int) lua_tointeger(L, -1); xfree(img_pagename(d)); } else luaL_error(L, "image.page needs integer or string value"); break; case P_COLORSPACE: if (img_state(d) >= DICT_FILESCANNED) luaL_error(L, "image.colorspace is now read-only"); if (lua_isnil(L, -1)) img_colorspace(d) = 0; else if (lua_isnumber(L, -1)) img_colorspace(d) = (int) lua_tointeger(L, -1); else luaL_error(L, "image.colorspace needs integer or nil value"); break; case P_PAGEBOX: if (img_state(d) >= DICT_FILESCANNED) luaL_error(L, "image.pagebox is now read-only"); if (lua_isnil(L, -1)) img_pagebox(d) = PDF_BOX_SPEC_NONE; else if (lua_isstring(L, -1)) img_pagebox(d) = luaL_checkoption(L, -1, "none", pdfboxspec_s); else luaL_error(L, "image.pagebox needs string or nil value"); break; case P_BBOX: if (img_state(d) >= DICT_FILESCANNED) luaL_error(L, "image.bbox is now read-only"); if (!lua_istable(L, -1)) luaL_error(L, "image.bbox needs table value"); if (lua_objlen(L, -1) != 4) luaL_error(L, "image.bbox table must have exactly 4 elements"); for (i = 1; i <= 4; i++) { /* v k t ... */ lua_pushinteger(L, i); /* idx v k t ... */ lua_gettable(L, -2); /* int v k t ... */ if (lua_type(L, -1) == LUA_TNUMBER) img_bbox(d)[i - 1] = (int) lua_tointeger(L, -1); else if (lua_type(L, -1) == LUA_TSTRING) img_bbox(d)[i - 1] = dimen_to_number(L, lua_tostring(L, -1)); else luaL_error(L, "image.bbox table needs integer value or dimension string elements"); lua_pop(L, 1); /* v k t ... */ } img_set_bbox(d); break; case P_STREAM: if (img_filename(d) != NULL) luaL_error(L, "image.stream can't be used with image.filename"); if (img_state(d) >= DICT_FILESCANNED) luaL_error(L, "image.stream is now read-only"); if (img_pdfstream_ptr(d) == NULL) new_img_pdfstream_struct(d); xfree(img_pdfstream_stream(d)); img_pdfstream_stream(d) = xstrdup(lua_tostring(L, -1)); img_type(d) = IMG_TYPE_PDFSTREAM; break; case P_FILEPATH: case P_TOTALPAGES: case P_XSIZE: case P_YSIZE: case P_XRES: case P_YRES: case P_ROTATION: case P_IMAGETYPE: case P_OBJNUM: case P_INDEX: case P_COLORDEPTH: luaL_error(L, "image.%s is a read-only variable", img_parms[i].name); break; default: assert(0); } /* v k t ... */ }
static void image_to_lua(lua_State * L, image * a) { /* key user ... */ int i, j; image_dict *d = img_dict(a); assert(d != NULL); lua_pushstring(L, IMG_ENV); /* s k u ... */ lua_gettable(L, LUA_REGISTRYINDEX); /* t k u ... */ lua_pushvalue(L, -2); /* k t k u ... */ lua_gettable(L, -2); /* i? t k u ... */ if (!lua_isnumber(L, -1)) /* !i t k u ... */ luaL_error(L, "image_to_lua(): %s is not a valid image key", lua_tostring(L, -3)); i = (int) lua_tointeger(L, -1); /* i t k u ... */ lua_pop(L, 3); /* u ... */ switch (i) { case P_WIDTH: if (is_wd_running(a)) lua_pushnil(L); else lua_pushinteger(L, img_width(a)); break; case P_HEIGHT: if (is_ht_running(a)) lua_pushnil(L); else lua_pushinteger(L, img_height(a)); break; case P_DEPTH: if (is_dp_running(a)) lua_pushnil(L); else lua_pushinteger(L, img_depth(a)); break; case P_TRANSFORM: lua_pushinteger(L, img_transform(a)); break; /* now follow all image_dict entries */ case P_FILENAME: if (img_filename(d) == NULL || strlen(img_filename(d)) == 0) lua_pushnil(L); else lua_pushstring(L, img_filename(d)); break; case P_VISIBLEFILENAME: if (img_visiblefilename(d) == NULL || strlen(img_visiblefilename(d)) == 0) lua_pushnil(L); else lua_pushstring(L, img_visiblefilename(d)); break; case P_FILEPATH: if (img_filepath(d) == NULL || strlen(img_filepath(d)) == 0) lua_pushnil(L); else lua_pushstring(L, img_filepath(d)); break; case P_ATTR: if (img_attr(d) == NULL || strlen(img_attr(d)) == 0) lua_pushnil(L); else lua_pushstring(L, img_attr(d)); break; case P_PAGE: if (img_pagename(d) != NULL && strlen(img_pagename(d)) != 0) lua_pushstring(L, img_pagename(d)); else lua_pushinteger(L, img_pagenum(d)); break; case P_TOTALPAGES: lua_pushinteger(L, img_totalpages(d)); break; case P_XSIZE: /* Modify by /Rotate only for output */ if ((img_rotation(d) & 1) == 0) lua_pushinteger(L, img_xsize(d)); else lua_pushinteger(L, img_ysize(d)); break; case P_YSIZE: /* Modify by /Rotate only for output */ if ((img_rotation(d) & 1) == 0) lua_pushinteger(L, img_ysize(d)); else lua_pushinteger(L, img_xsize(d)); break; case P_XRES: lua_pushinteger(L, img_xres(d)); break; case P_YRES: lua_pushinteger(L, img_yres(d)); break; case P_ROTATION: lua_pushinteger(L, img_rotation(d)); break; case P_COLORSPACE: if (img_colorspace(d) == 0) lua_pushnil(L); else lua_pushinteger(L, img_colorspace(d)); break; case P_COLORDEPTH: if (img_colordepth(d) == 0) lua_pushnil(L); else lua_pushinteger(L, img_colordepth(d)); break; case P_IMAGETYPE: j = img_type(d); if (j >= 0 && j <= imgtype_max) { if (j == IMG_TYPE_NONE) lua_pushnil(L); else lua_pushstring(L, imgtype_s[j]); } else assert(0); break; case P_PAGEBOX: j = img_pagebox(d); if (j >= 0 && j <= pagebox_max) { if (j == PDF_BOX_SPEC_NONE) lua_pushnil(L); else lua_pushstring(L, pdfboxspec_s[j]); } else assert(0); break; case P_BBOX: if (!img_is_bbox(d)) { img_bbox(d)[0] = img_xorig(d); img_bbox(d)[1] = img_yorig(d); img_bbox(d)[2] = img_xorig(d) + img_xsize(d); img_bbox(d)[3] = img_yorig(d) + img_ysize(d); } lua_newtable(L); lua_pushinteger(L, 1); lua_pushinteger(L, img_bbox(d)[0]); lua_settable(L, -3); lua_pushinteger(L, 2); lua_pushinteger(L, img_bbox(d)[1]); lua_settable(L, -3); lua_pushinteger(L, 3); lua_pushinteger(L, img_bbox(d)[2]); lua_settable(L, -3); lua_pushinteger(L, 4); lua_pushinteger(L, img_bbox(d)[3]); lua_settable(L, -3); break; case P_OBJNUM: if (img_objnum(d) == 0) lua_pushnil(L); else lua_pushinteger(L, img_objnum(d)); break; case P_INDEX: if (img_index(d) == 0) lua_pushnil(L); else lua_pushinteger(L, img_index(d)); break; case P_STREAM: if (img_type(d) != IMG_TYPE_PDFSTREAM || img_pdfstream_ptr(d) == NULL || img_pdfstream_stream(d) == NULL || strlen(img_pdfstream_stream(d)) == 0) lua_pushnil(L); else lua_pushstring(L, img_pdfstream_stream(d)); break; default: assert(0); } /* v u ... */ }
static int m_img_get(lua_State * L) { int j; const char *s; image **a = (image **) luaL_checkudata(L, 1, TYPE_IMG); /* k u */ image_dict *d = img_dict(*a); if (d == NULL) { luaL_error(L, "invalid image dictionary"); } s = lua_tostring(L, 2); if (lua_key_eq(s,width)) { if (is_wd_running(*a)) { lua_pushnil(L); } else { lua_pushinteger(L, img_width(*a)); } } else if (lua_key_eq(s,height)) { if (is_ht_running(*a)) { lua_pushnil(L); } else { lua_pushinteger(L, img_height(*a)); } } else if (lua_key_eq(s,depth)) { if (is_dp_running(*a)) { lua_pushnil(L); } else { lua_pushinteger(L, img_depth(*a)); } } else if (lua_key_eq(s,transform)) { lua_pushinteger(L, img_transform(*a)); } else if (lua_key_eq(s,filename)) { if (img_filename(d) == NULL || strlen(img_filename(d)) == 0) { lua_pushnil(L); } else { lua_pushstring(L, img_filename(d)); } } else if (lua_key_eq(s,visiblefilename)) { if (img_visiblefilename(d) == NULL || strlen(img_visiblefilename(d)) == 0) { lua_pushnil(L); } else { lua_pushstring(L, img_visiblefilename(d)); } } else if (lua_key_eq(s,keepopen)) { lua_pushboolean(L, img_keepopen(d)); } else if (lua_key_eq(s,filepath)) { if (img_filepath(d) == NULL || strlen(img_filepath(d)) == 0) { lua_pushnil(L); } else { lua_pushstring(L, img_filepath(d)); } } else if (lua_key_eq(s,attr)) { if (img_attr(d) == NULL || strlen(img_attr(d)) == 0) { lua_pushnil(L); } else { lua_pushstring(L, img_attr(d)); } } else if (lua_key_eq(s,page)) { if (img_pagename(d) != NULL && strlen(img_pagename(d)) != 0) { lua_pushstring(L, img_pagename(d)); } else { lua_pushinteger(L, img_pagenum(d)); } } else if (lua_key_eq(s,pages)) { lua_pushinteger(L, img_totalpages(d)); } else if (lua_key_eq(s,xsize)) { if ((img_rotation(d) & 1) == 0) { lua_pushinteger(L, img_xsize(d)); } else { lua_pushinteger(L, img_ysize(d)); } } else if (lua_key_eq(s,ysize)) { if ((img_rotation(d) & 1) == 0) { lua_pushinteger(L, img_ysize(d)); } else { lua_pushinteger(L, img_xsize(d)); } } else if (lua_key_eq(s,xres)) { lua_pushinteger(L, img_xres(d)); } else if (lua_key_eq(s,yres)) { lua_pushinteger(L, img_yres(d)); } else if (lua_key_eq(s,rotation)) { lua_pushinteger(L, img_rotation(d)); } else if (lua_key_eq(s,colorspace)) { if (img_colorspace(d) == 0) { lua_pushnil(L); } else { lua_pushinteger(L, img_colorspace(d)); } } else if (lua_key_eq(s,colordepth)) { if (img_colordepth(d) == 0) { lua_pushnil(L); } else { lua_pushinteger(L, img_colordepth(d)); } } else if (lua_key_eq(s,imagetype)) { j = img_type(d); if (j >= 0 && j <= img_types_max) { if (j == IMG_TYPE_NONE) { lua_pushnil(L); } else { lua_pushstring(L, img_types[j]); } } else { lua_pushnil(L); } } else if (lua_key_eq(s,pagebox)) { j = img_pagebox(d); if (j < 0 || j >= img_pageboxes_max) { j = 0; } lua_push_img_pagebox(L, j); } else if (lua_key_eq(s,bbox)) { if (!img_is_bbox(d)) { img_bbox(d)[0] = img_xorig(d); img_bbox(d)[1] = img_yorig(d); img_bbox(d)[2] = img_xorig(d) + img_xsize(d); img_bbox(d)[3] = img_yorig(d) + img_ysize(d); } lua_newtable(L); lua_pushinteger(L, 1); lua_pushinteger(L, img_bbox(d)[0]); lua_settable(L, -3); lua_pushinteger(L, 2); lua_pushinteger(L, img_bbox(d)[1]); lua_settable(L, -3); lua_pushinteger(L, 3); lua_pushinteger(L, img_bbox(d)[2]); lua_settable(L, -3); lua_pushinteger(L, 4); lua_pushinteger(L, img_bbox(d)[3]); lua_settable(L, -3); } else if (lua_key_eq(s,objnum)) { if (img_objnum(d) == 0) { lua_pushnil(L); } else { lua_pushinteger(L, img_objnum(d)); } } else if (lua_key_eq(s,index)) { if (img_index(d) == 0) { lua_pushnil(L); } else { lua_pushinteger(L, img_index(d)); } } else if (lua_key_eq(s,stream)) { if (img_type(d) != IMG_TYPE_PDFSTREAM || img_pdfstream_ptr(d) == NULL || img_pdfstream_stream(d) == NULL || strlen(img_pdfstream_stream(d)) == 0) { lua_pushnil(L); } else { lua_pushstring(L, img_pdfstream_stream(d)); } } else if (lua_key_eq(s,ref_count)) { lua_pushinteger(L, img_luaref(d)); } else { lua_pushnil(L); } return 1; }