summaryrefslogtreecommitdiff
path: root/Build/source/texk
diff options
context:
space:
mode:
authorAkira Kakuto <kakuto@fuk.kindai.ac.jp>2024-02-25 06:04:08 +0000
committerAkira Kakuto <kakuto@fuk.kindai.ac.jp>2024-02-25 06:04:08 +0000
commitf379465b466965e0a44e966e910d59b26cd8b731 (patch)
tree4254f76e19848a9fe3026b0676dcbec382bff252 /Build/source/texk
parent0c2991984213b7a028822267a22e15e5488a618b (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/texk')
-rw-r--r--Build/source/texk/dvipdfm-x/ChangeLog6
-rwxr-xr-xBuild/source/texk/dvipdfm-x/configure22
-rw-r--r--Build/source/texk/dvipdfm-x/configure.ac2
-rw-r--r--Build/source/texk/dvipdfm-x/epdf.c7
-rw-r--r--Build/source/texk/dvipdfm-x/pdfdoc.c385
-rw-r--r--Build/source/texk/dvipdfm-x/pdfdoc.h3
-rw-r--r--Build/source/texk/dvipdfm-x/pdfximage.c5
-rw-r--r--Build/source/texk/dvipdfm-x/pdfximage.h1
-rw-r--r--Build/source/texk/dvipdfm-x/spc_pdfm.c5
-rw-r--r--Build/source/texk/dvipdfm-x/spc_util.c8
-rw-r--r--Build/source/texk/dvipdfm-x/spc_util.h1
-rw-r--r--Build/source/texk/dvipdfm-x/xbb.c2
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);