diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2024-02-25 06:04:08 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2024-02-25 06:04:08 +0000 |
commit | f379465b466965e0a44e966e910d59b26cd8b731 (patch) | |
tree | 4254f76e19848a9fe3026b0676dcbec382bff252 /Build/source | |
parent | 0c2991984213b7a028822267a22e15e5488a618b (diff) |
dvipdfm-x: apply patches by Max Chernoff
git-svn-id: svn://tug.org/texlive/trunk@70147 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source')
-rw-r--r-- | Build/source/texk/dvipdfm-x/ChangeLog | 6 | ||||
-rwxr-xr-x | Build/source/texk/dvipdfm-x/configure | 22 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/configure.ac | 2 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/epdf.c | 7 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/pdfdoc.c | 385 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/pdfdoc.h | 3 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/pdfximage.c | 5 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/pdfximage.h | 1 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/spc_pdfm.c | 5 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/spc_util.c | 8 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/spc_util.h | 1 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/xbb.c | 2 |
12 files changed, 354 insertions, 93 deletions
diff --git a/Build/source/texk/dvipdfm-x/ChangeLog b/Build/source/texk/dvipdfm-x/ChangeLog index 5d748d72c59..f0e073ceee3 100644 --- a/Build/source/texk/dvipdfm-x/ChangeLog +++ b/Build/source/texk/dvipdfm-x/ChangeLog @@ -1,3 +1,9 @@ +2024-02-25 Max Chernoff <mseven@telus.net> + + * spc_util.{c,h}: Add "named" keyword to "pdf:image" special + * pdfdoc.{c,h}: Allow selecting a page by named destination + * {epdf,pdfximage,spc_pdfm,xbb}.{c,h}: Refactor to support above. + 2024-02-10 Yukimasa Morimi <h20y6m@yahoo.co.jp> * cidtype2.c, sfnt.h, tt_cmap.{c,h}: diff --git a/Build/source/texk/dvipdfm-x/configure b/Build/source/texk/dvipdfm-x/configure index f3ef5bd0111..ffd037865d7 100755 --- a/Build/source/texk/dvipdfm-x/configure +++ b/Build/source/texk/dvipdfm-x/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for dvipdfm-x (TeX Live) 20240210. +# Generated by GNU Autoconf 2.72 for dvipdfm-x (TeX Live) 20240225. # # Report bugs to <dvipdfmx@tug.org>. # @@ -614,8 +614,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='dvipdfm-x (TeX Live)' PACKAGE_TARNAME='dvipdfm-x--tex-live-' -PACKAGE_VERSION='20240210' -PACKAGE_STRING='dvipdfm-x (TeX Live) 20240210' +PACKAGE_VERSION='20240225' +PACKAGE_STRING='dvipdfm-x (TeX Live) 20240225' PACKAGE_BUGREPORT='dvipdfmx@tug.org' PACKAGE_URL='' @@ -1383,7 +1383,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures dvipdfm-x (TeX Live) 20240210 to adapt to many kinds of systems. +'configure' configures dvipdfm-x (TeX Live) 20240225 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1455,7 +1455,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of dvipdfm-x (TeX Live) 20240210:";; + short | recursive ) echo "Configuration of dvipdfm-x (TeX Live) 20240225:";; esac cat <<\_ACEOF @@ -1586,7 +1586,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -dvipdfm-x (TeX Live) configure 20240210 +dvipdfm-x (TeX Live) configure 20240225 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -2367,7 +2367,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by dvipdfm-x (TeX Live) $as_me 20240210, which was +It was created by dvipdfm-x (TeX Live) $as_me 20240225, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -8928,7 +8928,7 @@ fi # Define the identity of the package. PACKAGE='dvipdfm-x--tex-live-' - VERSION='20240210' + VERSION='20240225' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -15995,7 +15995,7 @@ Usage: $0 [OPTIONS] Report bugs to <bug-libtool@gnu.org>." lt_cl_version="\ -dvipdfm-x (TeX Live) config.lt 20240210 +dvipdfm-x (TeX Live) config.lt 20240225 configured by $0, generated by GNU Autoconf 2.72. Copyright (C) 2011 Free Software Foundation, Inc. @@ -17938,7 +17938,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by dvipdfm-x (TeX Live) $as_me 20240210, which was +This file was extended by dvipdfm-x (TeX Live) $as_me 20240225, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -18010,7 +18010,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -dvipdfm-x (TeX Live) config.status 20240210 +dvipdfm-x (TeX Live) config.status 20240225 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" diff --git a/Build/source/texk/dvipdfm-x/configure.ac b/Build/source/texk/dvipdfm-x/configure.ac index 10e084c9c1f..477133bb984 100644 --- a/Build/source/texk/dvipdfm-x/configure.ac +++ b/Build/source/texk/dvipdfm-x/configure.ac @@ -8,7 +8,7 @@ dnl This file is free software; the copyright holder dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl -AC_INIT([dvipdfm-x (TeX Live)], [20240210], [dvipdfmx@tug.org]) +AC_INIT([dvipdfm-x (TeX Live)], [20240225], [dvipdfmx@tug.org]) AC_PREREQ([2.65]) AC_CONFIG_SRCDIR([agl.c]) AC_CONFIG_AUX_DIR([../../build-aux]) diff --git a/Build/source/texk/dvipdfm-x/epdf.c b/Build/source/texk/dvipdfm-x/epdf.c index 95094823c7b..f0651934292 100644 --- a/Build/source/texk/dvipdfm-x/epdf.c +++ b/Build/source/texk/dvipdfm-x/epdf.c @@ -129,8 +129,9 @@ pdf_include_page (pdf_ximage *ximage, if (options.page_no == 0) options.page_no = 1; page = pdf_doc_get_page(pf, - options.page_no, options.bbox_type, - &info.bbox, &info.matrix, &resources); + options.page_no, options.page_name, + options.bbox_type, &info.bbox, &info.matrix, + &resources); if(!page) goto error_silent; @@ -304,7 +305,7 @@ pdf_copy_clip (FILE *image_file, int pageNo, double x_user, double y_user) pdf_invertmatrix(&M); M.e += x_user; M.f += y_user; - page_tree = pdf_doc_get_page(pf, pageNo, 0, &bbox, &mtrx, NULL); + page_tree = pdf_doc_get_page(pf, pageNo, NULL, 0, &bbox, &mtrx, NULL); if (!page_tree) { pdf_close(pf); return -1; diff --git a/Build/source/texk/dvipdfm-x/pdfdoc.c b/Build/source/texk/dvipdfm-x/pdfdoc.c index 75ed8179dde..48a4575b54b 100644 --- a/Build/source/texk/dvipdfm-x/pdfdoc.c +++ b/Build/source/texk/dvipdfm-x/pdfdoc.c @@ -1024,6 +1024,19 @@ set_transform_matrix (pdf_tmatrix *matrix, pdf_rect *bbox, pdf_obj *rotate) return 0; } +/* Stores references to the needed boxes and resources for a page */ +typedef struct pdf_boxes { + pdf_obj *page_tree; + pdf_obj *resources; + pdf_obj *rotate; + pdf_obj *art_box; + pdf_obj *trim_box; + pdf_obj *bleed_box; + pdf_obj *media_box; + pdf_obj *crop_box; +} pdf_boxes; + + /* * From PDFReference15_v6.pdf (p.119 and p.834) * @@ -1046,7 +1059,7 @@ set_transform_matrix (pdf_tmatrix *matrix, pdf_rect *bbox, pdf_obj *rotate) * in the absence of additional information (such as imposition instructions * specified in a JDF or PJTF job ticket), the crop box will determine how * the page's contents are to be positioned on the output medium. The default - * value is the page's media box. + * value is the page's media box. * * BleedBox rectangle (Optional; PDF 1.3) * @@ -1055,14 +1068,14 @@ set_transform_matrix (pdf_tmatrix *matrix, pdf_rect *bbox, pdf_obj *rotate) * include any extra "bleed area" needed to accommodate the physical * limitations of cutting, folding, and trimming equipment. The actual printed * page may include printing marks that fall outside the bleed box. - * The default value is the page's crop box. + * The default value is the page's crop box. * * TrimBox rectangle (Optional; PDF 1.3) * * The trim box (PDF 1.3) defines the intended dimensions of the finished page * after trimming. It may be smaller than the media box, to allow for * production-related content such as printing instructions, cut marks, or - * color bars. The default value is the page's crop box. + * color bars. The default value is the page's crop box. * * ArtBox rectangle (Optional; PDF 1.3) * @@ -1075,28 +1088,241 @@ set_transform_matrix (pdf_tmatrix *matrix, pdf_rect *bbox, pdf_obj *rotate) * The number of degrees by which the page should be rotated clockwise when * displayed or printed. The value must be a multiple of 90. Default value: 0. */ +static void +get_page_properties (pdf_boxes *boxes) { + pdf_obj *tmp; -/* 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, enum pdf_page_boundary opt_bbox, /* load options */ - pdf_rect *bbox, pdf_tmatrix *matrix, /* returned value */ - pdf_obj **resources_p /* returned values */ - ) { - pdf_obj *catalog = NULL, *page_tree = NULL; - pdf_obj *resources = NULL, *rotate = NULL; - pdf_obj *art_box = NULL, *trim_box = NULL, *bleed_box = NULL; - pdf_obj *media_box = NULL, *crop_box = NULL; - int error = 0; + if ((tmp = pdf_deref_obj(pdf_lookup_dict(boxes->page_tree, "MediaBox")))) { + if (boxes->media_box) + pdf_release_obj(boxes->media_box); + boxes->media_box = tmp; + } + if ((tmp = pdf_deref_obj(pdf_lookup_dict(boxes->page_tree, "CropBox")))) { + if (boxes->crop_box) + pdf_release_obj(boxes->crop_box); + boxes->crop_box = tmp; + } + if ((tmp = pdf_deref_obj(pdf_lookup_dict(boxes->page_tree, "ArtBox")))) { + if (boxes->art_box) + pdf_release_obj(boxes->art_box); + boxes->art_box = tmp; + } + if ((tmp = pdf_deref_obj(pdf_lookup_dict(boxes->page_tree, "TrimBox")))) { + if (boxes->trim_box) + pdf_release_obj(boxes->trim_box); + boxes->trim_box = tmp; + } + if ((tmp = pdf_deref_obj(pdf_lookup_dict(boxes->page_tree, "BleedBox")))) { + if (boxes->bleed_box) + pdf_release_obj(boxes->bleed_box); + boxes->bleed_box = tmp; + } + if ((tmp = pdf_deref_obj(pdf_lookup_dict(boxes->page_tree, "Rotate")))) { + if (boxes->rotate) + pdf_release_obj(boxes->rotate); + boxes->rotate = tmp; + } + if ((tmp = pdf_deref_obj(pdf_lookup_dict(boxes->page_tree, "Resources")))) { + if (boxes->resources) + pdf_release_obj(boxes->resources); + boxes->resources = tmp; + } +} - catalog = pdf_file_get_catalog(pf); - page_tree = pdf_deref_obj(pdf_lookup_dict(catalog, "Pages")); +/* + * Gets the page dictionary that a PDF "named destination" points to. + */ +static void +page_by_name (pdf_obj * catalog, char * page_name, pdf_boxes * boxes) { + pdf_obj *page = NULL; + pdf_obj *dests; + pdf_obj *up_dests; + int pos[5] = {0, 0, 0, 0, 0}; + int level = 0; + int i; + int recurse; + pdf_obj *limits; + pdf_obj *start_obj; + pdf_obj *end_obj; + char *start; + char *end; + pdf_obj *kids; + int kids_length; + int names_length; + + /* Get the top-level /Names dict */ + pdf_obj *names = pdf_deref_obj(pdf_lookup_dict(catalog, "Names")); + if (!PDF_OBJ_DICTTYPE(names)) { + if (names) + pdf_release_obj(names); + goto error_exit; + } - if (!PDF_OBJ_DICTTYPE(page_tree)) + /* The /Names dict should have a /Dests child */ + dests = pdf_deref_obj(pdf_lookup_dict(names, "Dests")); + pdf_release_obj(names); + if (!PDF_OBJ_DICTTYPE(dests)) { + if (dests) + pdf_release_obj(dests); goto error_exit; + } + + /* Loop over all the destinations until we find a matching one */ + + for (i = 0; i < 1000; i++) { + if (level < 0 || level >= sizeof(pos) / sizeof(pos[0])) + goto error_exit; + + if (i == 0) { + /* No /Limits for the root */ + recurse = true; + } else { + if (!dests) + goto error_exit; + + limits = pdf_deref_obj(pdf_lookup_dict(dests, "Limits")); + if (!PDF_OBJ_ARRAYTYPE(limits)) { + if (limits) + pdf_release_obj(limits); + goto error_exit; + } + + /* Get the current limits */ + start_obj = pdf_deref_obj(pdf_get_array(limits, 0)); + end_obj = pdf_deref_obj(pdf_get_array(limits, 1)); + pdf_release_obj(limits); + if (!PDF_OBJ_STRINGTYPE(start_obj) || !PDF_OBJ_STRINGTYPE(end_obj)) { + if (start_obj) + pdf_release_obj(start_obj); + if (end_obj) + pdf_release_obj(end_obj); + goto error_exit; + } + start = pdf_string_value(start_obj); + end = pdf_string_value(end_obj); + pdf_release_obj(start_obj); + pdf_release_obj(end_obj); + + recurse = strcmp(page_name, start) >= 0 && strcmp(page_name, end) <= 0; + } + + /* If the name is between the current limits, search the list */ + if (recurse) { + names = pdf_deref_obj(pdf_lookup_dict(dests, "Names")); + if (!PDF_OBJ_ARRAYTYPE(names)) { + if (names) + pdf_release_obj(names); + } else { + goto found; + } + + kids = pdf_deref_obj(pdf_lookup_dict(dests, "Kids")); + if (!PDF_OBJ_ARRAYTYPE(kids)) { + if (kids) + pdf_release_obj(kids); + goto error_exit; + } + + kids_length = pdf_array_length(kids); + for (; pos[level] < kids_length; pos[level]++) { + up_dests = dests; + dests = pdf_deref_obj(pdf_get_array(kids, pos[level])); + level++; + goto continue_outer; + } + } else { + if (--level >= 0) + pos[level]++; + pdf_release_obj(dests); + dests = up_dests; + } + continue_outer: ; + } + goto error_exit; + + /* Loop over the bottom-level Names array */ +found: + names_length = pdf_array_length(names); + for (i = 0; i < names_length; i++) { + char *name; + pdf_obj *dest; + pdf_obj *dest_inner; + pdf_obj *name_obj = pdf_deref_obj(pdf_get_array(names, i)); + if (!PDF_OBJ_STRINGTYPE(name_obj)) { + if (name_obj) + pdf_release_obj(name_obj); + continue; + } + + name = pdf_string_value(name_obj); + pdf_release_obj(name_obj); + + if (strcmp(page_name, name) != 0) + continue; + + dest = pdf_deref_obj(pdf_get_array(names, ++i)); + if (PDF_OBJ_DICTTYPE(dest)) { + dest_inner = pdf_deref_obj(pdf_lookup_dict(dest, "D")); + pdf_release_obj(dest); + if (!PDF_OBJ_ARRAYTYPE(dest_inner)) { + if (dest_inner) + pdf_release_obj(dest_inner); + goto error_exit; + } + } else if (PDF_OBJ_ARRAYTYPE(dest)) { + dest_inner = dest; + } else { + if (dest) + pdf_release_obj(dest); + continue; + } + + page = pdf_deref_obj(pdf_get_array(dest_inner, 0)); + pdf_release_obj(dest_inner); + if (!PDF_OBJ_DICTTYPE(page)) { + if (page) + pdf_release_obj(page); + goto error_exit; + } + + break; + } + + /* Traverse back upwards to get any inherited boxes */ + boxes->page_tree = page; + + while (true) { + get_page_properties(boxes); + + if (boxes->media_box) + break; + + boxes->page_tree = pdf_deref_obj(pdf_lookup_dict(boxes->page_tree, "Parent")); + if (!PDF_OBJ_DICTTYPE(boxes->page_tree)) { + if (boxes->page_tree) + pdf_release_obj(boxes->page_tree); + goto error_exit; + } + }; + + /* Set the page back to the current page (not the parent) */ + boxes->page_tree = page; + return; + +error_exit: + WARN("Bad named destination: %s", page_name); + return; +} + + +/* + * Gets the page dictionary by the page's number. + */ +static void +page_by_number (pdf_obj *page_tree, int page_no, pdf_boxes *boxes) { + pdf_obj *catalog = NULL; + int error = 0; { int count; @@ -1110,7 +1336,7 @@ pdf_doc_get_page (pdf_file *pf, pdf_release_obj(tmp); if (page_no <= 0 || page_no > count) { WARN("Page %ld does not exist.", page_no); - goto error_silent; + goto error_exit; } } @@ -1124,41 +1350,8 @@ pdf_doc_get_page (pdf_file *pf, int page_idx = page_no - 1, kids_length = 1, i = 0; while (--depth && i != kids_length) { - if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "MediaBox")))) { - if (media_box) - pdf_release_obj(media_box); - media_box = tmp; - } - if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "CropBox")))) { - if (crop_box) - pdf_release_obj(crop_box); - crop_box = tmp; - } - if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "ArtBox")))) { - if (art_box) - pdf_release_obj(art_box); - art_box = tmp; - } - if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "TrimBox")))) { - if (trim_box) - pdf_release_obj(trim_box); - trim_box = tmp; - } - if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "BleedBox")))) { - if (bleed_box) - pdf_release_obj(bleed_box); - bleed_box = tmp; - } - if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "Rotate")))) { - if (rotate) - pdf_release_obj(rotate); - rotate = tmp; - } - if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "Resources")))) { - if (resources) - pdf_release_obj(resources); - resources = tmp; - } + boxes->page_tree = page_tree; + get_page_properties(boxes); kids = pdf_deref_obj(pdf_lookup_dict(page_tree, "Kids")); if (!kids) @@ -1199,17 +1392,61 @@ pdf_doc_get_page (pdf_file *pf, goto error_exit; } - if (!PDF_OBJ_DICTTYPE(resources)) + boxes->page_tree = page_tree; + + return; + +error_exit: + WARN("Error found in including PDF image."); + if (page_tree) + pdf_release_obj(page_tree); + + return; +} + + +/* 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, char * page_name, + enum pdf_page_boundary opt_bbox, /* load options */ + pdf_rect *bbox, pdf_tmatrix *matrix, /* returned value */ + pdf_obj **resources_p /* returned values */ + ) { + pdf_obj *catalog = NULL, *page_tree = NULL; + pdf_boxes boxes = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + int error = 0; + + catalog = pdf_file_get_catalog(pf); + + if (page_name) { + page_by_name(catalog, page_name, &boxes); + } else if (page_no > 0) { + page_tree = pdf_deref_obj(pdf_lookup_dict(catalog, "Pages")); + page_by_number(page_tree, page_no, &boxes); + } else { + WARN("Invalid page number: %d", page_no); + goto error_exit; + } + + page_tree = boxes.page_tree; + + if (!PDF_OBJ_DICTTYPE(page_tree)) + goto error_exit; + + if (!PDF_OBJ_DICTTYPE(boxes.resources)) goto error_exit; if (resources_p) - *resources_p = pdf_link_obj(resources); + *resources_p = pdf_link_obj(boxes.resources); /* Select page boundary box */ - error = set_bounding_box(bbox, opt_bbox, media_box, crop_box, art_box, trim_box, bleed_box); + error = set_bounding_box(bbox, opt_bbox, boxes.media_box, boxes.crop_box, boxes.art_box, boxes.trim_box, boxes.bleed_box); if (error) goto error_exit; /* Set transformation matrix */ - error = set_transform_matrix(matrix, bbox, rotate); + error = set_transform_matrix(matrix, bbox, boxes.rotate); if (error) goto error_exit; @@ -1223,20 +1460,20 @@ goto clean_exit; /* Success */ page_tree = NULL; clean_exit: - if (crop_box) - pdf_release_obj(crop_box); - if (bleed_box) - pdf_release_obj(bleed_box); - if (trim_box) - pdf_release_obj(trim_box); - if (art_box) - pdf_release_obj(art_box); - if (media_box) - pdf_release_obj(media_box); - if (rotate) - pdf_release_obj(rotate); - if (resources) - pdf_release_obj(resources); + if (boxes.crop_box) + pdf_release_obj(boxes.crop_box); + if (boxes.bleed_box) + pdf_release_obj(boxes.bleed_box); + if (boxes.trim_box) + pdf_release_obj(boxes.trim_box); + if (boxes.art_box) + pdf_release_obj(boxes.art_box); + if (boxes.media_box) + pdf_release_obj(boxes.media_box); + if (boxes.rotate) + pdf_release_obj(boxes.rotate); + if (boxes.resources) + pdf_release_obj(boxes.resources); return page_tree; } diff --git a/Build/source/texk/dvipdfm-x/pdfdoc.h b/Build/source/texk/dvipdfm-x/pdfdoc.h index bd8bf3bedaa..85e05bf92d9 100644 --- a/Build/source/texk/dvipdfm-x/pdfdoc.h +++ b/Build/source/texk/dvipdfm-x/pdfdoc.h @@ -94,7 +94,8 @@ extern pdf_obj *pdf_doc_get_reference(const char *category); #define pdf_doc_this_page() pdf_doc_get_dictionary("@THISPAGE") extern int pdf_doc_get_page_count(pdf_file *pf); -extern pdf_obj *pdf_doc_get_page(pdf_file *pf, int page_no, enum pdf_page_boundary opt_bbox, +extern pdf_obj *pdf_doc_get_page(pdf_file *pf, int page_no, char * page_name, + enum pdf_page_boundary opt_bbox, pdf_rect *bbox, pdf_tmatrix *matrix, 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 92ee5142d2f..016583fdd56 100644 --- a/Build/source/texk/dvipdfm-x/pdfximage.c +++ b/Build/source/texk/dvipdfm-x/pdfximage.c @@ -79,6 +79,7 @@ struct attr_ int bbox_type; /* Ugh */ pdf_obj *dict; char tempfile; + char *page_name; }; struct pdf_ximage_ @@ -143,6 +144,8 @@ pdf_init_ximage_struct (pdf_ximage *I) I->attr.dict = NULL; I->attr.tempfile = 0; + + I->attr.page_name = NULL; } static void @@ -302,6 +305,7 @@ load_image (const char *ident, const char *filename, const char *fullname, int f } I->attr.page_no = options.page_no; + I->attr.page_name = options.page_name; I->attr.bbox_type = options.bbox_type; I->attr.dict = options.dict; /* unsafe? */ @@ -411,6 +415,7 @@ pdf_ximage_load_image (const char *ident, const char *filename, load_options opt } if (id >= 0) { if (I->attr.page_no == options.page_no && + strcmp(I->attr.page_name, options.page_name) == 0 && !pdf_compare_object(I->attr.dict, options.dict) && /* ????? */ I->attr.bbox_type == options.bbox_type) { return id; diff --git a/Build/source/texk/dvipdfm-x/pdfximage.h b/Build/source/texk/dvipdfm-x/pdfximage.h index 6cd99055dc6..92f9021d4a5 100644 --- a/Build/source/texk/dvipdfm-x/pdfximage.h +++ b/Build/source/texk/dvipdfm-x/pdfximage.h @@ -54,6 +54,7 @@ typedef struct { int page_no; enum pdf_page_boundary bbox_type; pdf_obj *dict; + char *page_name; } load_options; typedef struct pdf_ximage_ pdf_ximage; diff --git a/Build/source/texk/dvipdfm-x/spc_pdfm.c b/Build/source/texk/dvipdfm-x/spc_pdfm.c index f6375cdcec5..fffe27146e9 100644 --- a/Build/source/texk/dvipdfm-x/spc_pdfm.c +++ b/Build/source/texk/dvipdfm-x/spc_pdfm.c @@ -1235,7 +1235,7 @@ spc_handler_pdfm_image (struct spc_env *spe, struct spc_arg *args) char *ident = NULL; pdf_obj *fspec; transform_info ti; - load_options options = {1, 0, NULL}; + load_options options = {1, 0, NULL, NULL}; skip_white(&args->curptr, args->endptr); if (args->curptr[0] == '@') { @@ -1250,7 +1250,8 @@ spc_handler_pdfm_image (struct spc_env *spe, struct spc_arg *args) */ transform_info_clear(&ti); if (spc_util_read_blahblah(spe, &ti, - &options.page_no, &options.bbox_type, args) < 0) { + &options.page_no, &options.bbox_type, + &options.page_name, args) < 0) { spc_warn(spe, "Reading option field in pdf:image failed."); if (ident) RELEASE(ident); diff --git a/Build/source/texk/dvipdfm-x/spc_util.c b/Build/source/texk/dvipdfm-x/spc_util.c index efe44bef6b6..de13c584c6b 100644 --- a/Build/source/texk/dvipdfm-x/spc_util.c +++ b/Build/source/texk/dvipdfm-x/spc_util.c @@ -898,6 +898,7 @@ int spc_util_read_blahblah (struct spc_env *spe, transform_info *p, int *page_no, enum pdf_page_boundary *bbox_type, + char **page_name, struct spc_arg *ap) { int has_scale, has_xscale, has_yscale, has_rotate, has_matrix; @@ -912,6 +913,8 @@ spc_util_read_blahblah (struct spc_env *spe, "page", #define K__PAGEBOX 12 "pagebox", +#define K__NAMED 13 + "named", NULL }; double xscale, yscale, rotate; @@ -1055,6 +1058,11 @@ spc_util_read_blahblah (struct spc_env *spe, } } break; + case K__NAMED: + { + *page_name = parse_c_string (&ap->curptr, ap->endptr); + } + break; default: error = -1; diff --git a/Build/source/texk/dvipdfm-x/spc_util.h b/Build/source/texk/dvipdfm-x/spc_util.h index 63ec8f83c68..6310477ed9b 100644 --- a/Build/source/texk/dvipdfm-x/spc_util.h +++ b/Build/source/texk/dvipdfm-x/spc_util.h @@ -45,6 +45,7 @@ extern int spc_util_read_blahblah (struct spc_env *spe, transform_info *dimtrns, int *page_no, enum pdf_page_boundary *bbox_type, + char **page_name, struct spc_arg *args); diff --git a/Build/source/texk/dvipdfm-x/xbb.c b/Build/source/texk/dvipdfm-x/xbb.c index e3a9c8dae34..1786396ac00 100644 --- a/Build/source/texk/dvipdfm-x/xbb.c +++ b/Build/source/texk/dvipdfm-x/xbb.c @@ -260,7 +260,7 @@ static void do_pdf (FILE *fp, char *filename) return; } count = pdf_doc_get_page_count(pf); - page = pdf_doc_get_page(pf, page_no, PageBox, &bbox, &matrix, NULL); + page = pdf_doc_get_page(pf, page_no, NULL, PageBox, &bbox, &matrix, NULL); pdf_close(pf); |