From 632abcdde570001e5f8e7509d630749e73cf2732 Mon Sep 17 00:00:00 2001 From: Akira Kakuto Date: Wed, 30 Dec 2015 05:25:52 +0000 Subject: texk/dvipdfm-x: patches by S. Hirata git-svn-id: svn://tug.org/texlive/trunk@39238 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/texk/dvipdfm-x/ChangeLog | 6 + Build/source/texk/dvipdfm-x/epdf.c | 184 +++++------------------- Build/source/texk/dvipdfm-x/epdf.h | 7 +- Build/source/texk/dvipdfm-x/pdfdoc.c | 60 ++++++-- Build/source/texk/dvipdfm-x/pdfdoc.h | 3 +- Build/source/texk/dvipdfm-x/pdfximage.c | 113 ++++++++------- Build/source/texk/dvipdfm-x/pdfximage.h | 24 +++- Build/source/texk/dvipdfm-x/spc_dvips.c | 13 +- Build/source/texk/dvipdfm-x/spc_html.c | 4 +- Build/source/texk/dvipdfm-x/spc_misc.c | 3 +- Build/source/texk/dvipdfm-x/spc_pdfm.c | 40 +++--- Build/source/texk/dvipdfm-x/spc_util.c | 238 ++++++++++++++++++++++++++++---- Build/source/texk/dvipdfm-x/spc_util.h | 25 +++- Build/source/texk/dvipdfm-x/xbb.c | 4 +- 14 files changed, 433 insertions(+), 291 deletions(-) (limited to 'Build/source/texk') diff --git a/Build/source/texk/dvipdfm-x/ChangeLog b/Build/source/texk/dvipdfm-x/ChangeLog index 78ceb3384b8..4c901a06862 100644 --- a/Build/source/texk/dvipdfm-x/ChangeLog +++ b/Build/source/texk/dvipdfm-x/ChangeLog @@ -1,3 +1,9 @@ +2015-12-30 Shunsaku Hirata + + * epdf.[ch], pdfdoc.[ch], pdfximage.[ch], + spc_{dvips,html,misc,pdfm,util}.c, spc_util.h: Don't use global variables + for selecting boundary box. Cleanups. + 2015-12-29 Shunsaku Hirata * dvipdfmx.c, dvi.c: Allow empty password in pdf:encrypt special. diff --git a/Build/source/texk/dvipdfm-x/epdf.c b/Build/source/texk/dvipdfm-x/epdf.c index 2f2eb972a78..411534ca5f7 100644 --- a/Build/source/texk/dvipdfm-x/epdf.c +++ b/Build/source/texk/dvipdfm-x/epdf.c @@ -164,7 +164,7 @@ pdf_get_page_obj (pdf_file *pf, int page_no, if (markinfo) { tmp = pdf_lookup_dict(markinfo, "Marked"); if (PDF_OBJ_BOOLEANTYPE(tmp) && pdf_boolean_value(tmp)) - WARN("File contains tagged PDF. Ignoring tags."); + WARN("PDF file is tagged... Ignoring tags."); pdf_release_obj(markinfo); } @@ -215,25 +215,28 @@ pdf_get_page_obj (pdf_file *pf, int page_no, if (bbox) pdf_release_obj(bbox); bbox = tmp; - } else + } else { pdf_release_obj(tmp); } + } if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "TrimBox")))) { if (!rect_equal(tmp, bbox)) { if (bbox) pdf_release_obj(bbox); bbox = tmp; - } else + } else { pdf_release_obj(tmp); } + } if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "ArtBox")))) { if (!rect_equal(tmp, bbox)) { if (bbox) pdf_release_obj(bbox); bbox = tmp; - } else + } else { pdf_release_obj(tmp); } + } if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "CropBox")))) { if (crop_box) pdf_release_obj(crop_box); @@ -270,10 +273,10 @@ pdf_get_page_obj (pdf_file *pf, int page_no, /* Pages object */ count = pdf_number_value(tmp); pdf_release_obj(tmp); - } else + } else { /* Page object */ count = 1; - + } if (page_idx < count) break; @@ -312,7 +315,8 @@ pdf_get_page_obj (pdf_file *pf, int page_no, if (rotate) { if (pdf_number_value(rotate) != 0.0) - WARN("<< /Rotate %d >> found. (Not supported yet)", (int)pdf_number_value(rotate)); + WARN("<< /Rotate %d >> found. (Not supported yet)", + (int)pdf_number_value(rotate)); pdf_release_obj(rotate); rotate = NULL; } @@ -391,41 +395,32 @@ pdf_get_page_content (pdf_obj* page) return contents; } +/* ximage here is the result. DONT USE IT FOR PASSING OPTIONS! */ int -pdf_include_page (pdf_ximage *ximage, FILE *image_file, const char *filename) +pdf_include_page (pdf_ximage *ximage, + FILE *image_file, + const char *ident, + load_options options) { pdf_file *pf; xform_info info; pdf_obj *contents = NULL, *catalog; pdf_obj *page = NULL, *resources = NULL, *markinfo = NULL; - int page_no; - pf = pdf_open(filename, image_file); + pf = pdf_open(ident, image_file); if (!pf) return -1; - /* - * Try to embed the PDF, even if the PDF version is newer than the setting. - */ -#if 0 - if (pdf_file_get_version(pf) > pdf_get_version()) - goto too_recent; -#endif + if (pdf_file_get_version(pf) > pdf_get_version()) { + WARN("Trying to include PDF file which has newer version number " \ + "than output PDF: %d.", pdf_get_version()); + } pdf_ximage_init_form_info(&info); - /* - * Get Page. - */ - page_no = pdf_ximage_get_page(ximage); - if (page_no == 0) - page_no = 1; - - page = pdf_doc_get_page(pf, page_no, NULL, &info.bbox, &resources); -/* - Recover the default value of PageBox -*/ - PageBox = 0; + page = pdf_doc_get_page(pf, + options.page_no, options.bbox_type, + &info.bbox, &resources); if(!page) goto error_silent; @@ -439,8 +434,9 @@ pdf_include_page (pdf_ximage *ximage, FILE *image_file, const char *filename) if (tmp) pdf_release_obj(tmp); goto error; - } else if (pdf_boolean_value(tmp)) - WARN("File contains tagged PDF. Ignoring tags."); + } else if (pdf_boolean_value(tmp)) { + WARN("PDF file is tagged... Ignoring tags."); + } pdf_release_obj(tmp); } @@ -482,8 +478,9 @@ pdf_include_page (pdf_ximage *ximage, FILE *image_file, const char *filename) } pdf_release_obj(content_seg); } - } else + } else { goto error; + } if (contents) pdf_release_obj(contents); @@ -498,14 +495,11 @@ pdf_include_page (pdf_ximage *ximage, FILE *image_file, const char *filename) contents_dict = pdf_stream_dict(contents); pdf_add_dict(contents_dict, - pdf_new_name("Type"), - pdf_new_name("XObject")); + pdf_new_name("Type"), pdf_new_name("XObject")); pdf_add_dict(contents_dict, - pdf_new_name("Subtype"), - pdf_new_name("Form")); + pdf_new_name("Subtype"), pdf_new_name("Form")); pdf_add_dict(contents_dict, - pdf_new_name("FormType"), - pdf_new_number(1.0)); + pdf_new_name("FormType"), pdf_new_number(1.0)); bbox = pdf_new_array(); pdf_add_array(bbox, pdf_new_number(info.bbox.llx)); @@ -551,19 +545,6 @@ pdf_include_page (pdf_ximage *ximage, FILE *image_file, const char *filename) pdf_close(pf); return -1; - -#if 0 - too_recent: - pdf_close(pf); - WARN("PDF version of input file more recent than in output file."); - if (compat_mode) { - WARN("Converting. Use \"-V\" switch to change output PDF version."); - return 1; - } else { - WARN("Use \"-V\" switch to change output PDF version."); - return -1; - } -#endif } typedef enum { @@ -877,104 +858,3 @@ pdf_copy_clip (FILE *image_file, int pageNo, double x_user, double y_user) return 0; } - -#if 0 -#define WBUF_SIZE 4096 -#if HAVE_ZLIB -static int -add_stream_flate (pdf_obj *dst, const void *data, int len) -{ - z_stream z; - Bytef wbuf[WBUF_SIZE]; - - z.zalloc = Z_NULL; z.zfree = Z_NULL; z.opaque = Z_NULL; - - z.next_in = (z_const Bytef *) data; z.avail_in = len; - z.next_out = (Bytef *) wbuf; z.avail_out = WBUF_SIZE; - - if (inflateInit(&z) != Z_OK) { - WARN("inflateInit() failed."); - return -1; - } - - for (;;) { - int status; - status = inflate(&z, Z_NO_FLUSH); - if (status == Z_STREAM_END) - break; - else if (status != Z_OK) { - WARN("inflate() failed. Broken PDF file?"); - inflateEnd(&z); - return -1; - } - - if (z.avail_out == 0) { - pdf_add_stream(dst, wbuf, WBUF_SIZE); - z.next_out = wbuf; - z.avail_out = WBUF_SIZE; - } - } - - if (WBUF_SIZE - z.avail_out > 0) - pdf_add_stream(dst, wbuf, WBUF_SIZE - z.avail_out); - - return (inflateEnd(&z) == Z_OK ? 0 : -1); -} -#endif - -static int -concat_stream (pdf_obj *dst, pdf_obj *src) -{ - const char *stream_data; - int stream_length; - pdf_obj *stream_dict; - pdf_obj *filter; - - if (!PDF_OBJ_STREAMTYPE(dst) || !PDF_OBJ_STREAMTYPE(src)) - ERROR("Invalid type."); - - stream_data = pdf_stream_dataptr(src); - stream_length = pdf_stream_length (src); - stream_dict = pdf_stream_dict (src); - - if (pdf_lookup_dict(stream_dict, "DecodeParms")) { - WARN("DecodeParams not supported."); - return -1; - } - - filter = pdf_lookup_dict(stream_dict, "Filter"); - if (!filter) { - pdf_add_stream(dst, stream_data, stream_length); - return 0; -#if HAVE_ZLIB - } else { - char *filter_name; - if (PDF_OBJ_NAMETYPE(filter)) { - filter_name = pdf_name_value(filter); - if (filter_name && !strcmp(filter_name, "FlateDecode")) - return add_stream_flate(dst, stream_data, stream_length); - else { - WARN("DecodeFilter \"%s\" not supported.", filter_name); - return -1; - } - } else if (PDF_OBJ_ARRAYTYPE(filter)) { - if (pdf_array_length(filter) > 1) { - WARN("Multiple DecodeFilter not supported."); - return -1; - } else { - filter_name = pdf_name_value(pdf_get_array(filter, 0)); - if (filter_name && !strcmp(filter_name, "FlateDecode")) - return add_stream_flate(dst, stream_data, stream_length); - else { - WARN("DecodeFilter \"%s\" not supported.", filter_name); - return -1; - } - } - } else - ERROR("Broken PDF file?"); -#endif /* HAVE_ZLIB */ - } - - return -1; -} -#endif diff --git a/Build/source/texk/dvipdfm-x/epdf.h b/Build/source/texk/dvipdfm-x/epdf.h index c51f15f084c..19571b22caf 100644 --- a/Build/source/texk/dvipdfm-x/epdf.h +++ b/Build/source/texk/dvipdfm-x/epdf.h @@ -32,9 +32,10 @@ #define pdfbox_trim 4 #define pdfbox_art 5 -extern int pdf_copy_clip (FILE *image_file, int page_index, double x_user, double y_user); +extern int pdf_copy_clip (FILE *image_file, int page_index, + double x_user, double y_user); -extern int pdf_include_page (pdf_ximage *ximage, FILE *file, - const char *filename); +extern int pdf_include_page (pdf_ximage * ximage, FILE *file, + const char *ident, load_options options); #endif /* _EPDF_H_ */ diff --git a/Build/source/texk/dvipdfm-x/pdfdoc.c b/Build/source/texk/dvipdfm-x/pdfdoc.c index ecda8351ff3..95e464804cf 100644 --- a/Build/source/texk/dvipdfm-x/pdfdoc.c +++ b/Build/source/texk/dvipdfm-x/pdfdoc.c @@ -88,6 +88,7 @@ read_thumbnail (const char *thumb_filename) pdf_obj *image_ref; int xobj_id; FILE *fp; + load_options options = {1, 0, NULL}; fp = MFOPEN(thumb_filename, FOPEN_RBIN_MODE); if (!fp) { @@ -101,7 +102,7 @@ read_thumbnail (const char *thumb_filename) } MFCLOSE(fp); - xobj_id = pdf_ximage_findresource(thumb_filename, 0, NULL); + xobj_id = pdf_ximage_findresource(thumb_filename, options); if (xobj_id < 0) { WARN("Could not read thumbnail file \"%s\".", thumb_filename); image_ref = NULL; @@ -880,6 +881,35 @@ pdf_doc_close_page_tree (pdf_doc *p) return; } +int +pdf_doc_get_page_count (pdf_file *pf) +{ + int count = 0; + pdf_obj *page_tree = NULL; + pdf_obj *catalog; + + catalog = pdf_file_get_catalog(pf); + + page_tree = pdf_deref_obj(pdf_lookup_dict(catalog, "Pages")); + + if (!PDF_OBJ_DICTTYPE(page_tree)) { + return 0; + } + + { + pdf_obj *tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "Count")); + if (!PDF_OBJ_NUMBERTYPE(tmp)) { + if (tmp) + pdf_release_obj(tmp); + return 0; + } + count = pdf_number_value(tmp); + pdf_release_obj(tmp); + } + + return count; +} + /* * From PDFReference15_v6.pdf (p.119 and p.834) * @@ -932,9 +962,14 @@ pdf_doc_close_page_tree (pdf_doc *p) * displayed or printed. The value must be a multiple of 90. Default value: 0. */ +/* count_p removed: Please use different interface if you want to get total page + * number. pdf_doc_get_page() is obviously not an interface to do such. + */ pdf_obj * -pdf_doc_get_page (pdf_file *pf, int page_no, int *count_p, - pdf_rect *bbox, pdf_obj **resources_p) { +pdf_doc_get_page (pdf_file *pf, + int page_no, int options, /* load options */ + pdf_rect *bbox, pdf_obj **resources_p /* returned values */ + ) { pdf_obj *page_tree = NULL; pdf_obj *resources = NULL, *box = NULL, *rotate = NULL, *medbox = NULL; pdf_obj *catalog; @@ -956,9 +991,7 @@ pdf_doc_get_page (pdf_file *pf, int page_no, int *count_p, } count = pdf_number_value(tmp); pdf_release_obj(tmp); - if (count_p) - *count_p = count; - if (page_no <= 0 || page_no > count) { + if (page_no < 0 || page_no > count) { WARN("Page %ld does not exist.", page_no); goto error_silent; } @@ -1064,7 +1097,8 @@ pdf_doc_get_page (pdf_file *pf, int page_no, int *count_p, goto error; } - if (PageBox == 0) { + /* Nasty BBox selection... */ + if (options == 0) { if (crop_box) box = crop_box; else { @@ -1086,7 +1120,7 @@ pdf_doc_get_page (pdf_file *pf, int page_no, int *count_p, } } } - } else if (PageBox == 1) { + } else if (options == 1) { if (crop_box) box = crop_box; else @@ -1096,7 +1130,7 @@ pdf_doc_get_page (pdf_file *pf, int page_no, int *count_p, art_box) { box = art_box; } - } else if (PageBox == 2) { + } else if (options == 2) { if (media_box) box = media_box; else @@ -1106,7 +1140,7 @@ pdf_doc_get_page (pdf_file *pf, int page_no, int *count_p, art_box) { box = art_box; } - } else if (PageBox == 3) { + } else if (options == 3) { if (art_box) box = art_box; else @@ -1116,7 +1150,7 @@ pdf_doc_get_page (pdf_file *pf, int page_no, int *count_p, trim_box) { box = trim_box; } - } else if (PageBox == 4) { + } else if (options == 4) { if (trim_box) box = trim_box; else @@ -1126,7 +1160,7 @@ pdf_doc_get_page (pdf_file *pf, int page_no, int *count_p, art_box) { box = art_box; } - } else if (PageBox == 5) { + } else if (options == 5) { if (bleed_box) box = bleed_box; else @@ -1174,7 +1208,7 @@ pdf_doc_get_page (pdf_file *pf, int page_no, int *count_p, } /* New scheme only for XDV files */ - if (medbox && (is_xdv || PageBox)) { + if (medbox && (is_xdv || options)) { for (i = 4; i--; ) { double x; pdf_obj *tmp = pdf_deref_obj(pdf_get_array(medbox, i)); diff --git a/Build/source/texk/dvipdfm-x/pdfdoc.h b/Build/source/texk/dvipdfm-x/pdfdoc.h index 61a806e9c8d..20b58807bd4 100644 --- a/Build/source/texk/dvipdfm-x/pdfdoc.h +++ b/Build/source/texk/dvipdfm-x/pdfdoc.h @@ -56,7 +56,8 @@ extern pdf_obj *pdf_doc_get_reference (const char *category); #define pdf_doc_names() pdf_doc_get_dictionary("Names") #define pdf_doc_this_page() pdf_doc_get_dictionary("@THISPAGE") -extern pdf_obj *pdf_doc_get_page (pdf_file *pf, int page_no, int *count_p, +extern int pdf_doc_get_page_count (pdf_file *pf); +extern pdf_obj *pdf_doc_get_page (pdf_file *pf, int page_no, int options, pdf_rect *bbox, pdf_obj **resources_p); extern int pdf_doc_current_page_number (void); diff --git a/Build/source/texk/dvipdfm-x/pdfximage.c b/Build/source/texk/dvipdfm-x/pdfximage.c index b96dbc5ced2..3cda219d1b9 100644 --- a/Build/source/texk/dvipdfm-x/pdfximage.c +++ b/Build/source/texk/dvipdfm-x/pdfximage.c @@ -47,7 +47,8 @@ static int check_for_ps (FILE *image_file); static int check_for_mp (FILE *image_file); -static int ps_include_page (pdf_ximage *ximage, const char *file_name); +static int ps_include_page (pdf_ximage *ximage, + const char *ident, load_options options); #define IMAGE_TYPE_UNKNOWN -1 @@ -65,13 +66,19 @@ struct attr_ int width, height; double xdensity, ydensity; pdf_rect bbox; + + /* Not appropriate place but... someone need them. */ + int page_no; + int page_count; + int bbox_type; /* Ugh */ + pdf_obj *dict; + char tempfile; }; struct pdf_ximage_ { char *ident; char res_name[16]; - int page_no, page_count; int subtype; @@ -80,9 +87,7 @@ struct pdf_ximage_ char *filename; pdf_obj *reference; pdf_obj *resource; - pdf_obj *attr_dict; - char tempfile; }; @@ -111,34 +116,27 @@ static struct ic_ _ic = { }; static void -pdf_init_ximage_struct (pdf_ximage *I, - const char *ident, const char *filename, - int page_no, pdf_obj *dict) +pdf_init_ximage_struct (pdf_ximage *I) { - if (ident) { - I->ident = NEW(strlen(ident)+1, char); - strcpy(I->ident, ident); - } else - I ->ident = NULL; - I->page_no = page_no; - I->page_count = 0; - if (filename) { - I->filename = NEW(strlen(filename)+1, char); - strcpy(I->filename, filename); - } else + I->ident = NULL; I->filename = NULL; + I->subtype = -1; memset(I->res_name, 0, 16); I->reference = NULL; I->resource = NULL; - I->attr_dict = dict; I->attr.width = I->attr.height = 0; I->attr.xdensity = I->attr.ydensity = 1.0; I->attr.bbox.llx = I->attr.bbox.lly = 0; I->attr.bbox.urx = I->attr.bbox.ury = 0; - I->tempfile = 0; + I->attr.page_no = 1; + I->attr.page_count = 1; + I->attr.bbox_type = 0; + + I->attr.dict = NULL; + I->attr.tempfile = 0; } static void @@ -148,7 +146,7 @@ pdf_set_ximage_tempfile (pdf_ximage *I, const char *filename) RELEASE(I->filename); I->filename = NEW(strlen(filename)+1, char); strcpy(I->filename, filename); - I->tempfile = 1; + I->attr.tempfile = 1; } static void @@ -162,9 +160,9 @@ pdf_clean_ximage_struct (pdf_ximage *I) pdf_release_obj(I->reference); if (I->resource) pdf_release_obj(I->resource); - if (I->attr_dict) - pdf_release_obj(I->attr_dict); - pdf_init_ximage_struct(I, NULL, NULL, 0, NULL); + if (I->attr.dict) /* unsafe? */ + pdf_release_obj(I->attr.dict); + pdf_init_ximage_struct(I); } @@ -185,7 +183,7 @@ pdf_close_images (void) int i; for (i = 0; i < ic->count; i++) { pdf_ximage *I = ic->ximages+i; - if (I->tempfile) { + if (I->attr.tempfile) { /* * It is important to remove temporary files at the end because * we cache file names. Since we use mkstemp to create them, we @@ -254,7 +252,7 @@ source_image_type (FILE *fp) static int load_image (const char *ident, const char *fullname, int format, FILE *fp, - int page_no, pdf_obj *dict) + load_options options) { struct ic_ *ic = &_ic; int id = -1; /* ret */ @@ -267,7 +265,19 @@ load_image (const char *ident, const char *fullname, int format, FILE *fp, } I = &ic->ximages[id]; - pdf_init_ximage_struct(I, ident, fullname, page_no, dict); + pdf_init_ximage_struct(I); + if (ident) { + I->ident = NEW(strlen(ident)+1, char); + strcpy(I->ident, ident); + } + if (fullname) { + I->filename = NEW(strlen(fullname)+1, char); + strcpy(I->filename, fullname); + } + + I->attr.page_no = options.page_no; + I->attr.bbox_type = options.bbox_type; + I->attr.dict = options.dict; /* unsafe? */ switch (format) { case IMAGE_TYPE_JPEG: @@ -304,15 +314,15 @@ load_image (const char *ident, const char *fullname, int format, FILE *fp, if (_opts.verbose) MESG("[PDF]"); { - int result = pdf_include_page(I, fp, fullname); + int result = pdf_include_page(I, fp, fullname, options); if (result > 0) /* PDF version too recent */ - result = ps_include_page(I, fullname); + result = ps_include_page(I, fullname, options); if (result < 0) goto error; } if (_opts.verbose) - MESG(",Page:%ld", I->page_no); + MESG(",Page:%ld", I->attr.page_no); I->subtype = PDF_XOBJECT_TYPE_FORM; break; /* @@ -321,10 +331,10 @@ load_image (const char *ident, const char *fullname, int format, FILE *fp, default: if (_opts.verbose) MESG(format == IMAGE_TYPE_EPS ? "[PS]" : "[UNKNOWN]"); - if (ps_include_page(I, fullname) < 0) + if (ps_include_page(I, fullname, options) < 0) goto error; if (_opts.verbose) - MESG(",Page:%ld", I->page_no); + MESG(",Page:%ld", I->attr.page_no); I->subtype = PDF_XOBJECT_TYPE_FORM; } @@ -354,10 +364,8 @@ load_image (const char *ident, const char *fullname, int format, FILE *fp, #define dpx_fopen(n,m) (MFOPEN((n),(m))) #define dpx_fclose(f) (MFCLOSE((f))) -uint8_t PageBox_of_id[MAX_IMAGES]; - int -pdf_ximage_findresource (const char *ident, int page_no, pdf_obj *dict) +pdf_ximage_findresource (const char *ident, load_options options) { struct ic_ *ic = &_ic; int id = -1; @@ -366,21 +374,20 @@ pdf_ximage_findresource (const char *ident, int page_no, pdf_obj *dict) int format; FILE *fp; + /* I don't understand why there is comparision against I->attr.dict here... + * I->attr.dict and options.dict are simply pointers to PDF dictionaries. + */ for (id = 0; id < ic->count; id++) { I = &ic->ximages[id]; if (I->ident && !strcmp(ident, I->ident)) { f = I->filename; - if (I->page_no == page_no + (page_no < 0 ? I->page_count+1 : 0) && - I->attr_dict == dict) { - if (ImageSpecial) { - if ((int)PageBox_of_id[id] == PageBox) - return id; - } else { + if (I->attr.page_no == options.page_no /* Not sure */ + && I->attr.dict == options.dict /* ????? */ + && I->attr.bbox_type == options.bbox_type) { return id; } } } - } if (f) { /* we already have converted this file; f is the temporary file name */ @@ -420,7 +427,7 @@ pdf_ximage_findresource (const char *ident, int page_no, pdf_obj *dict) } else break; default: - id = load_image(ident, fullname, format, fp, page_no, dict); + id = load_image(ident, fullname, format, fp, options); break; } dpx_fclose(fp); @@ -534,8 +541,8 @@ pdf_ximage_set_image (pdf_ximage *I, void *image_info, pdf_obj *resource) if (info->bits_per_component > 0) /* Ignored for JPXDecode filter. FIXME */ pdf_add_dict(dict, pdf_new_name("BitsPerComponent"), pdf_new_number(info->bits_per_component)); - if (I->attr_dict) - pdf_merge_dict(dict, I->attr_dict); + if (I->attr.dict) + pdf_merge_dict(dict, I->attr.dict); pdf_release_obj(resource); /* Caller don't know we are using reference. */ I->resource = NULL; @@ -562,7 +569,7 @@ pdf_ximage_set_form (pdf_ximage *I, void *form_info, pdf_obj *resource) int pdf_ximage_get_page (pdf_ximage *I) { - return I->page_no; + return I->attr.page_no; } #define CHECK_ID(c,n) do {\ @@ -604,7 +611,12 @@ pdf_ximage_defineresource (const char *ident, I = &ic->ximages[id]; - pdf_init_ximage_struct(I, ident, NULL, 0, NULL); + pdf_init_ximage_struct(I); + + if (ident) { + I->ident = NEW(strlen(ident)+1, char); + strcpy(I->ident, ident); + } switch (subtype) { case PDF_XOBJECT_TYPE_IMAGE: @@ -889,7 +901,7 @@ char *get_distiller_template (void) } static int -ps_include_page (pdf_ximage *ximage, const char *filename) +ps_include_page (pdf_ximage *ximage, const char *filename, load_options options) { char *distiller_template = _opts.cmdtmpl; char *temp; @@ -950,10 +962,7 @@ ps_include_page (pdf_ximage *ximage, const char *filename) return -1; } pdf_set_ximage_tempfile(ximage, temp); -#if 0 - error = pdf_include_page(ximage, fp, 0, pdfbox_crop); -#endif - error = pdf_include_page(ximage, fp, temp); + error = pdf_include_page(ximage, fp, temp, options); MFCLOSE(fp); /* See pdf_close_images for why we cannot delete temporary files here. */ diff --git a/Build/source/texk/dvipdfm-x/pdfximage.h b/Build/source/texk/dvipdfm-x/pdfximage.h index e3507a5d199..dab463e890e 100644 --- a/Build/source/texk/dvipdfm-x/pdfximage.h +++ b/Build/source/texk/dvipdfm-x/pdfximage.h @@ -49,6 +49,12 @@ typedef struct { pdf_tmatrix matrix; } xform_info; +typedef struct { + int page_no; + int bbox_type; + pdf_obj *dict; +} load_options; + typedef struct pdf_ximage_ pdf_ximage; extern void pdf_ximage_set_verbose (void); @@ -59,17 +65,22 @@ extern void pdf_close_images (void); extern char *pdf_ximage_get_resname (int xobj_id); extern pdf_obj *pdf_ximage_get_reference (int xobj_id); - -extern int pdf_ximage_findresource (const char *ident, int page_no, - pdf_obj *dict); +/* Please use different interface than findresource... + * This is not intended to be used for specifying page number and others. + * Only pdf:image special in spc_pdfm.c want optinal dict! + */ +extern int pdf_ximage_findresource (const char *ident, + load_options options); extern int pdf_ximage_defineresource (const char *ident, int subtype, void *cdata, pdf_obj *resource); /* Called by pngimage, jpegimage, epdf, mpost, etc. */ extern void pdf_ximage_init_image_info (ximage_info *info); extern void pdf_ximage_init_form_info (xform_info *info); -extern void pdf_ximage_set_image (pdf_ximage *ximage, void *info, pdf_obj *resource); -extern void pdf_ximage_set_form (pdf_ximage *ximage, void *info, pdf_obj *resource); +extern void pdf_ximage_set_image (pdf_ximage *ximage, + void *info, pdf_obj *resource); +extern void pdf_ximage_set_form (pdf_ximage *ximage, + void *info, pdf_obj *resource); extern int pdf_ximage_get_page (pdf_ximage *I); /* from pdfximage.c */ @@ -90,4 +101,7 @@ pdf_ximage_set_attr (int xobj_id, int width, int height, double xdensity, double ydensity, double llx, double lly, double urx, double ury); +/* Migrated from pdfobj.h. Those are not PDF object related... */ +#define MAX_IMAGES 5000 /* This may be enough */ + #endif /* _PDFXIMAGE_H_ */ diff --git a/Build/source/texk/dvipdfm-x/spc_dvips.c b/Build/source/texk/dvipdfm-x/spc_dvips.c index 3fbae93436d..2da287fda50 100644 --- a/Build/source/texk/dvipdfm-x/spc_dvips.c +++ b/Build/source/texk/dvipdfm-x/spc_dvips.c @@ -140,6 +140,7 @@ spc_handler_ps_file (struct spc_env *spe, struct spc_arg *args) int form_id; char *filename; transform_info ti; + load_options options = {1, 0, NULL}; ASSERT(spe && args); @@ -158,12 +159,12 @@ spc_handler_ps_file (struct spc_env *spe, struct spc_arg *args) } transform_info_clear(&ti); - if (spc_util_read_dimtrns(spe, &ti, args, NULL, 1) < 0) { + if (spc_util_read_dimtrns(spe, &ti, args, 1) < 0) { RELEASE(filename); return -1; } - form_id = pdf_ximage_findresource(filename, 1, NULL); + form_id = pdf_ximage_findresource(filename, options); if (form_id < 0) { spc_warn(spe, "Failed to read image file: %s", filename); RELEASE(filename); @@ -184,6 +185,7 @@ spc_handler_ps_plotfile (struct spc_env *spe, struct spc_arg *args) int form_id; char *filename; transform_info p; + load_options options = {1, 0, NULL}; ASSERT(spe && args); @@ -196,7 +198,7 @@ spc_handler_ps_plotfile (struct spc_env *spe, struct spc_arg *args) return -1; } - form_id = pdf_ximage_findresource(filename, 1, NULL); + form_id = pdf_ximage_findresource(filename, options); if (form_id < 0) { spc_warn(spe, "Could not open PS file: %s", filename); error = -1; @@ -632,9 +634,10 @@ spc_handler_ps_tricks_parse_path (struct spc_env *spe, struct spc_arg *args) static int spc_handler_ps_tricks_render (struct spc_env *spe, struct spc_arg *args) { - FILE* fp; + FILE *fp; int k; pdf_tmatrix M; + load_options options = {1, 0, NULL}; if (!distiller_template) distiller_template = get_distiller_template(); @@ -706,7 +709,7 @@ spc_handler_ps_tricks_render (struct spc_env *spe, struct spc_arg *args) return error; } - form_id = pdf_ximage_findresource(gs_out, 1, NULL); + form_id = pdf_ximage_findresource(gs_out, options); if (form_id < 0) { spc_warn(spe, "Failed to read converted PSTricks image file."); RELEASE(gs_in); diff --git a/Build/source/texk/dvipdfm-x/spc_html.c b/Build/source/texk/dvipdfm-x/spc_html.c index d5fc656ae58..a49c06bc47c 100644 --- a/Build/source/texk/dvipdfm-x/spc_html.c +++ b/Build/source/texk/dvipdfm-x/spc_html.c @@ -570,6 +570,7 @@ spc_html__img_empty (struct spc_env *spe, pdf_obj *attr) { pdf_obj *src, *obj; transform_info ti; + load_options options = {1, 0, NULL}; int id, error = 0; #ifdef ENABLE_HTML_SVG_OPACITY double alpha = 1.0; /* meaning fully opaque */ @@ -636,7 +637,7 @@ spc_html__img_empty (struct spc_env *spe, pdf_obj *attr) return error; } - id = pdf_ximage_findresource(pdf_string_value(src), 0, NULL); + id = pdf_ximage_findresource(pdf_string_value(src), options); if (id < 0) { spc_warn(spe, "Could not find/load image: %s", pdf_string_value(src)); error = -1; @@ -939,4 +940,3 @@ spc_html_setup_handler (struct spc_handler *sph, return 0; } - diff --git a/Build/source/texk/dvipdfm-x/spc_misc.c b/Build/source/texk/dvipdfm-x/spc_misc.c index 0b5355145f3..7bdf80ec4e6 100644 --- a/Build/source/texk/dvipdfm-x/spc_misc.c +++ b/Build/source/texk/dvipdfm-x/spc_misc.c @@ -52,6 +52,7 @@ spc_handler_postscriptbox (struct spc_env *spe, struct spc_arg *ap) { int form_id, len; transform_info ti; + load_options options = {1, 0, NULL}; char filename[256], *fullname; char buf[512]; FILE *fp; @@ -109,7 +110,7 @@ spc_handler_postscriptbox (struct spc_env *spe, struct spc_arg *ap) } MFCLOSE(fp); - form_id = pdf_ximage_findresource(filename, 0, NULL); + form_id = pdf_ximage_findresource(filename, options); if (form_id < 0) { spc_warn(spe, "Failed to load image file: %s", filename); return -1; diff --git a/Build/source/texk/dvipdfm-x/spc_pdfm.c b/Build/source/texk/dvipdfm-x/spc_pdfm.c index 1b12dd966eb..c8d2bef7c56 100644 --- a/Build/source/texk/dvipdfm-x/spc_pdfm.c +++ b/Build/source/texk/dvipdfm-x/spc_pdfm.c @@ -567,7 +567,7 @@ spc_handler_pdfm_annot (struct spc_env *spe, struct spc_arg *args) } transform_info_clear(&ti); - if (spc_util_read_dimtrns(spe, &ti, args, NULL, 0) < 0) { + if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) { if (ident) RELEASE(ident); return -1; @@ -745,7 +745,7 @@ spc_handler_pdfm_btrans (struct spc_env *spe, struct spc_arg *args) transform_info ti; transform_info_clear(&ti); - if (spc_util_read_dimtrns(spe, &ti, args, NULL, 0) < 0) { + if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) { return -1; } @@ -908,7 +908,7 @@ spc_handler_pdfm_bead (struct spc_env *spe, struct spc_arg *args) /* If okay so far, try to get a bounding box */ transform_info_clear(&ti); - if (spc_util_read_dimtrns(spe, &ti, args, NULL, 0) < 0) { + if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) { RELEASE(article_name); return -1; } @@ -962,8 +962,6 @@ spc_handler_pdfm_bead (struct spc_env *spe, struct spc_arg *args) return 0; } -int ImageSpecial = 0; /* default value */ - static int spc_handler_pdfm_image (struct spc_env *spe, struct spc_arg *args) { @@ -972,12 +970,7 @@ spc_handler_pdfm_image (struct spc_env *spe, struct spc_arg *args) char *ident = NULL; pdf_obj *fspec, *attr = NULL; transform_info ti; - int page_no; - -/* - Initialize the PageBox as the default value -*/ - PageBox = 0; + load_options options = {1, 0, NULL}; skip_white(&args->curptr, args->endptr); if (args->curptr[0] == '@') { @@ -990,9 +983,15 @@ spc_handler_pdfm_image (struct spc_env *spe, struct spc_arg *args) } } + /* 2015/12/29 + * There should not be "page" and "pagebox" in read_dimtrns(). + * It is for reading "dimensions" and "transformations" and "page" is + * completely unrelated. + */ transform_info_clear(&ti); - page_no = 1; - if (spc_util_read_dimtrns(spe, &ti, args, &page_no, 0) < 0) { + if (spc_util_read_blahblah(spe, &ti, + &options.page_no, &options.bbox_type, args) < 0) { + spc_warn(spe, "Reading option field in pdf:image failed."); if (ident) RELEASE(ident); return -1; @@ -1015,16 +1014,14 @@ spc_handler_pdfm_image (struct spc_env *spe, struct spc_arg *args) skip_white(&args->curptr, args->endptr); if (args->curptr < args->endptr) { - attr = parse_pdf_object(&args->curptr, args->endptr, NULL); + options.dict = parse_pdf_object(&args->curptr, args->endptr, NULL); if (!attr || !PDF_OBJ_DICTTYPE(attr)) { spc_warn(spe, "Ignore invalid attribute dictionary."); if (attr) pdf_release_obj(attr); } } - ImageSpecial = 1; - xobj_id = pdf_ximage_findresource(pdf_string_value(fspec), page_no, attr); - ImageSpecial = 0; + xobj_id = pdf_ximage_findresource(pdf_string_value(fspec), options); if (xobj_id < 0) { spc_warn(spe, "Could not find image resource..."); @@ -1042,8 +1039,6 @@ spc_handler_pdfm_image (struct spc_env *spe, struct spc_arg *args) return -1; } - PageBox_of_id[xobj_id] = (uint8_t)PageBox; - if (!(ti.flags & INFO_DO_HIDE)) pdf_dev_put_image(xobj_id, &ti, spe->x_user, spe->y_user); @@ -1553,7 +1548,7 @@ spc_handler_pdfm_bform (struct spc_env *spe, struct spc_arg *args) } transform_info_clear(&ti); - if (spc_util_read_dimtrns(spe, &ti, args, NULL, 0) < 0) { + if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) { RELEASE(ident); return -1; } @@ -1653,6 +1648,7 @@ spc_handler_pdfm_uxobj (struct spc_env *spe, struct spc_arg *args) int xobj_id; char *ident; transform_info ti; + load_options options = {1, 0, NULL}; skip_white(&args->curptr, args->endptr); @@ -1664,7 +1660,7 @@ spc_handler_pdfm_uxobj (struct spc_env *spe, struct spc_arg *args) transform_info_clear(&ti); if (args->curptr < args->endptr) { - if (spc_util_read_dimtrns(spe, &ti, args, NULL, 0) < 0) { + if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) { RELEASE(ident); return -1; } @@ -1676,7 +1672,7 @@ spc_handler_pdfm_uxobj (struct spc_env *spe, struct spc_arg *args) */ xobj_id = findresource(sd, ident); if (xobj_id < 0) { - xobj_id = pdf_ximage_findresource(ident, 0, NULL); + xobj_id = pdf_ximage_findresource(ident, options); if (xobj_id < 0) { spc_warn(spe, "Specified (image) object doesn't exist: %s", ident); RELEASE(ident); diff --git a/Build/source/texk/dvipdfm-x/spc_util.c b/Build/source/texk/dvipdfm-x/spc_util.c index 0c84a9c79b2..3f4b0a139e9 100644 --- a/Build/source/texk/dvipdfm-x/spc_util.c +++ b/Build/source/texk/dvipdfm-x/spc_util.c @@ -365,7 +365,8 @@ make_transmatrix (pdf_tmatrix *M, } static int -spc_read_dimtrns_dvips (struct spc_env *spe, transform_info *t, struct spc_arg *ap) +spc_read_dimtrns_dvips (struct spc_env *spe, + transform_info *t, struct spc_arg *ap) { static const char *_dtkeys[] = { #define K_TRN__HOFFSET 0 @@ -507,9 +508,13 @@ spc_read_dimtrns_dvips (struct spc_env *spe, transform_info *t, struct spc_arg * return error; } - +/* "page" and "pagebox" are not dimension nor transformation nor + * something acceptable to put into here. + * PLEASE DONT ADD HERE! + */ static int -spc_read_dimtrns_pdfm (struct spc_env *spe, transform_info *p, struct spc_arg *ap, int *page_no) +spc_read_dimtrns_pdfm (struct spc_env *spe, + transform_info *p, struct spc_arg *ap) { int has_scale, has_xscale, has_yscale, has_rotate, has_matrix; const char *_dtkeys[] = { @@ -529,10 +534,195 @@ spc_read_dimtrns_pdfm (struct spc_env *spe, transform_info *p, struct spc_arg *a #undef K__CLIP #define K__CLIP 9 "clip", -#define K__PAGE 10 - "page", -#define K__HIDE 11 +#define K__HIDE 10 + "hide", + NULL + }; + double xscale, yscale, rotate; + int error = 0; + + has_xscale = has_yscale = has_scale = has_rotate = has_matrix = 0; + xscale = yscale = 1.0; rotate = 0.0; + p->flags |= INFO_DO_CLIP; /* default: do clipping */ + p->flags &= ~INFO_DO_HIDE; /* default: do clipping */ + + skip_blank(&ap->curptr, ap->endptr); + + while (!error && ap->curptr < ap->endptr) { + char *kp, *vp; + int k; + + kp = parse_c_ident(&ap->curptr, ap->endptr); + if (!kp) + break; + + skip_blank(&ap->curptr, ap->endptr); + for (k = 0; _dtkeys[k] && strcmp(_dtkeys[k], kp); k++); + switch (k) { + case K_DIM__WIDTH: + error = spc_util_read_length(spe, &p->width , ap); + p->flags |= INFO_HAS_WIDTH; + break; + case K_DIM__HEIGHT: + error = spc_util_read_length(spe, &p->height, ap); + p->flags |= INFO_HAS_HEIGHT; + break; + case K_DIM__DEPTH: + error = spc_util_read_length(spe, &p->depth , ap); + p->flags |= INFO_HAS_HEIGHT; + break; + case K_TRN__SCALE: + vp = parse_float_decimal(&ap->curptr, ap->endptr); + if (!vp) + error = -1; + else { + xscale = yscale = atof(vp); + has_scale = 1; + RELEASE(vp); + } + break; + case K_TRN__XSCALE: + vp = parse_float_decimal(&ap->curptr, ap->endptr); + if (!vp) + error = -1; + else { + xscale = atof(vp); + has_xscale = 1; + RELEASE(vp); + } + break; + case K_TRN__YSCALE: + vp = parse_float_decimal(&ap->curptr, ap->endptr); + if (!vp) + error = -1; + else { + yscale = atof(vp); + has_yscale = 1; + RELEASE(vp); + } + break; + case K_TRN__ROTATE: + vp = parse_float_decimal(&ap->curptr, ap->endptr); + if (!vp) + error = -1; + else { + rotate = M_PI * atof(vp) / 180.0; + has_rotate = 1; + RELEASE(vp); + } + break; + case K_TRN__BBOX: + { + double v[4]; + if (spc_util_read_numbers(v, 4, ap) != 4) + error = -1; + else { + p->bbox.llx = v[0]; + p->bbox.lly = v[1]; + p->bbox.urx = v[2]; + p->bbox.ury = v[3]; + p->flags |= INFO_HAS_USER_BBOX; + } + } + break; + case K_TRN__MATRIX: + { + double v[6]; + if (spc_util_read_numbers(v, 6, ap) != 6) + error = -1; + else { + pdf_setmatrix(&(p->matrix), v[0], v[1], v[2], v[3], v[4], v[5]); + has_matrix = 1; + } + } + break; + case K__CLIP: + vp = parse_float_decimal(&ap->curptr, ap->endptr); + if (!vp) + error = -1; + else { + if (atof(vp)) + p->flags |= INFO_DO_CLIP; + else + p->flags &= ~INFO_DO_CLIP; + RELEASE(vp); + } + break; + case K__HIDE: + p->flags |= INFO_DO_HIDE; + break; + + default: + error = -1; + break; + } + if (error) + spc_warn(spe, "Unrecognized key or invalid value for " \ + "dimension/transformation: %s", kp); + else + skip_blank(&ap->curptr, ap->endptr); + RELEASE(kp); + } + + if (!error) { + /* Check consistency */ + if (has_xscale && (p->flags & INFO_HAS_WIDTH)) { + spc_warn(spe, "Can't supply both width and xscale. Ignore xscale."); + xscale = 1.0; + } else if (has_yscale && + (p->flags & INFO_HAS_HEIGHT)) { + spc_warn(spe, "Can't supply both height/depth and yscale. Ignore yscale."); + yscale = 1.0; + } else if (has_scale && + (has_xscale || has_yscale)) { + spc_warn(spe, "Can't supply overall scale along with axis scales."); + error = -1; + } else if (has_matrix && + (has_scale || has_xscale || has_yscale || has_rotate)) { + spc_warn(spe, "Can't supply transform matrix along with scales or rotate. Ignore scales and rotate."); + } + } + + if (!has_matrix) { + make_transmatrix(&(p->matrix), 0.0, 0.0, xscale, yscale, rotate); + } + + if (!(p->flags & INFO_HAS_USER_BBOX)) { + p->flags &= ~INFO_DO_CLIP; /* no clipping needed */ + } + + return error; +} + +int +spc_util_read_dimtrns (struct spc_env *spe, + transform_info *ti, struct spc_arg *args, int syntax) +{ + if (!ti || !spe || !args) + return -1; + + if (syntax) { + return spc_read_dimtrns_dvips(spe, ti, args); + } else { + return spc_read_dimtrns_pdfm (spe, ti, args); + } +} + +int +spc_util_read_blahblah (struct spc_env *spe, + transform_info *p, int *page_no, int *bbox_type, + struct spc_arg *ap) +{ + int has_scale, has_xscale, has_yscale, has_rotate, has_matrix; + const char *_dtkeys[] = { + "width", "height", "depth", + "scale", "xscale", "yscale", "rotate", + "bbox", + "matrix", + "clip", "hide", +#define K__PAGE 11 + "page", #define K__PAGEBOX 12 "pagebox", NULL @@ -647,6 +837,7 @@ spc_read_dimtrns_pdfm (struct spc_env *spe, transform_info *p, struct spc_arg *a RELEASE(vp); } break; + case K__PAGE: { double page; @@ -664,22 +855,27 @@ spc_read_dimtrns_pdfm (struct spc_env *spe, transform_info *p, struct spc_arg *a char *q; q = parse_c_ident (&ap->curptr, ap->endptr); if (q) { - if (strcasecmp(q, "cropbox") == 0) PageBox = 1; - else if (strcasecmp(q, "mediabox") == 0) PageBox = 2; - else if (strcasecmp(q, "artbox") == 0) PageBox = 3; - else if (strcasecmp(q, "trimbox") == 0) PageBox = 4; - else if (strcasecmp(q, "bleedbox") == 0) PageBox = 5; - } else { - PageBox = 0; + if (bbox_type) { + if (strcasecmp(q, "cropbox") == 0) *bbox_type = 1; + else if (strcasecmp(q, "mediabox") == 0) *bbox_type = 2; + else if (strcasecmp(q, "artbox") == 0) *bbox_type = 3; + else if (strcasecmp(q, "trimbox") == 0) *bbox_type = 4; + else if (strcasecmp(q, "bleedbox") == 0) *bbox_type = 5; + } + RELEASE(q); + } else if (bbox_type) { + *bbox_type = 0; } } break; + default: error = -1; break; } if (error) - spc_warn(spe, "Unrecognized key or invalid value for dimension/transformation: %s", kp); + spc_warn(spe, "Unrecognized key or invalid value for " \ + "dimension/transformation: %s", kp); else skip_blank(&ap->curptr, ap->endptr); RELEASE(kp); @@ -715,20 +911,6 @@ spc_read_dimtrns_pdfm (struct spc_env *spe, transform_info *p, struct spc_arg *a return error; } -int -spc_util_read_dimtrns (struct spc_env *spe, transform_info *ti, struct spc_arg *args, int *page_no, int syntax) -{ - ASSERT(ti && spe && args); - - if (syntax) { - ASSERT(!page_no); - return spc_read_dimtrns_dvips(spe, ti, args); - } else { - return spc_read_dimtrns_pdfm (spe, ti, args, page_no); - } -} - - /* Color names */ #ifdef rgb #undef rgb diff --git a/Build/source/texk/dvipdfm-x/spc_util.h b/Build/source/texk/dvipdfm-x/spc_util.h index 5e71aa3508f..fbc4bb77ff4 100644 --- a/Build/source/texk/dvipdfm-x/spc_util.h +++ b/Build/source/texk/dvipdfm-x/spc_util.h @@ -33,10 +33,25 @@ * * This is for reading *single* color specification. */ -extern int spc_util_read_colorspec (struct spc_env *spe, pdf_color *colorspec, struct spc_arg *args, int syntax); -extern int spc_util_read_dimtrns (struct spc_env *spe, transform_info *dimtrns, struct spc_arg *args, int *page, int syntax); - -extern int spc_util_read_numbers (double *values, int num_values, struct spc_arg *args); -extern int spc_util_read_pdfcolor (struct spc_env *spe, pdf_color *colorspec, struct spc_arg *args, pdf_color *defaultcolor); +extern int spc_util_read_colorspec (struct spc_env *spe, + pdf_color *colorspec, + struct spc_arg *args, int syntax); +extern int spc_util_read_dimtrns (struct spc_env *spe, + transform_info *dimtrns, + struct spc_arg *args, int syntax); + +extern int spc_util_read_blahblah (struct spc_env *spe, + transform_info *dimtrns, + int *page_no, + int *bbox_type, + struct spc_arg *args); + + +extern int spc_util_read_numbers (double *values, int num_values, + struct spc_arg *args); +extern int spc_util_read_pdfcolor (struct spc_env *spe, + pdf_color *colorspec, + struct spc_arg *args, + pdf_color *defaultcolor); #endif /* _SPC_UTIL_H_ */ diff --git a/Build/source/texk/dvipdfm-x/xbb.c b/Build/source/texk/dvipdfm-x/xbb.c index 742892d4770..b4e03908913 100644 --- a/Build/source/texk/dvipdfm-x/xbb.c +++ b/Build/source/texk/dvipdfm-x/xbb.c @@ -256,8 +256,8 @@ static void do_pdf (FILE *fp, char *filename) WARN("%s does not look like a PDF file...\n", filename); return; } - - page = pdf_doc_get_page(pf, page_no, &count, &bbox, NULL); + count = pdf_doc_get_page_count(pf); + page = pdf_doc_get_page(pf, page_no, PageBox, &bbox, NULL); pdf_close(pf); -- cgit v1.2.3