texlive[70147] Build/source/texk/dvipdfm-x: dvipdfm-x: apply patches

commits+kakuto at tug.org commits+kakuto at tug.org
Sun Feb 25 07:04:09 CET 2024


Revision: 70147
          https://tug.org/svn/texlive?view=revision&revision=70147
Author:   kakuto
Date:     2024-02-25 07:04:08 +0100 (Sun, 25 Feb 2024)
Log Message:
-----------
dvipdfm-x: apply patches by Max Chernoff

Modified Paths:
--------------
    trunk/Build/source/texk/dvipdfm-x/ChangeLog
    trunk/Build/source/texk/dvipdfm-x/configure
    trunk/Build/source/texk/dvipdfm-x/configure.ac
    trunk/Build/source/texk/dvipdfm-x/epdf.c
    trunk/Build/source/texk/dvipdfm-x/pdfdoc.c
    trunk/Build/source/texk/dvipdfm-x/pdfdoc.h
    trunk/Build/source/texk/dvipdfm-x/pdfximage.c
    trunk/Build/source/texk/dvipdfm-x/pdfximage.h
    trunk/Build/source/texk/dvipdfm-x/spc_pdfm.c
    trunk/Build/source/texk/dvipdfm-x/spc_util.c
    trunk/Build/source/texk/dvipdfm-x/spc_util.h
    trunk/Build/source/texk/dvipdfm-x/xbb.c

Modified: trunk/Build/source/texk/dvipdfm-x/ChangeLog
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/ChangeLog	2024-02-25 02:31:44 UTC (rev 70146)
+++ trunk/Build/source/texk/dvipdfm-x/ChangeLog	2024-02-25 06:04:08 UTC (rev 70147)
@@ -1,3 +1,9 @@
+2024-02-25  Max Chernoff  <mseven at 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 at yahoo.co.jp>
 
 	* cidtype2.c, sfnt.h, tt_cmap.{c,h}:

Modified: trunk/Build/source/texk/dvipdfm-x/configure
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/configure	2024-02-25 02:31:44 UTC (rev 70146)
+++ trunk/Build/source/texk/dvipdfm-x/configure	2024-02-25 06:04:08 UTC (rev 70147)
@@ -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 at tug.org>.
 #
@@ -614,8 +614,8 @@
 # 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 at tug.org'
 PACKAGE_URL=''
 
@@ -1383,7 +1383,7 @@
   # 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 @@
 
 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 @@
 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 @@
 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 @@
 
 # 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 @@
 Report bugs to <bug-libtool at 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 @@
 # 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 @@
 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\\"
 

Modified: trunk/Build/source/texk/dvipdfm-x/configure.ac
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/configure.ac	2024-02-25 02:31:44 UTC (rev 70146)
+++ trunk/Build/source/texk/dvipdfm-x/configure.ac	2024-02-25 06:04:08 UTC (rev 70147)
@@ -8,7 +8,7 @@
 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 at tug.org])
+AC_INIT([dvipdfm-x (TeX Live)], [20240225], [dvipdfmx at tug.org])
 AC_PREREQ([2.65])
 AC_CONFIG_SRCDIR([agl.c])
 AC_CONFIG_AUX_DIR([../../build-aux])

Modified: trunk/Build/source/texk/dvipdfm-x/epdf.c
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/epdf.c	2024-02-25 02:31:44 UTC (rev 70146)
+++ trunk/Build/source/texk/dvipdfm-x/epdf.c	2024-02-25 06:04:08 UTC (rev 70147)
@@ -129,8 +129,9 @@
   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_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;

Modified: trunk/Build/source/texk/dvipdfm-x/pdfdoc.c
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/pdfdoc.c	2024-02-25 02:31:44 UTC (rev 70146)
+++ trunk/Build/source/texk/dvipdfm-x/pdfdoc.c	2024-02-25 06:04:08 UTC (rev 70147)
@@ -1024,6 +1024,19 @@
   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 @@
  * 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,7 +1068,7 @@
  * 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)
  *
@@ -1062,7 +1075,7 @@
  * 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,29 +1088,242 @@
  * 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;
 
-  if (!PDF_OBJ_DICTTYPE(page_tree))
+  /* 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;
+  }
 
+  /* 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;
     pdf_obj *tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "Count"));
@@ -1110,7 +1336,7 @@
     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 @@
     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 @@
       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 @@
   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;
 }

Modified: trunk/Build/source/texk/dvipdfm-x/pdfdoc.h
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/pdfdoc.h	2024-02-25 02:31:44 UTC (rev 70146)
+++ trunk/Build/source/texk/dvipdfm-x/pdfdoc.h	2024-02-25 06:04:08 UTC (rev 70147)
@@ -94,7 +94,8 @@
 #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);

Modified: trunk/Build/source/texk/dvipdfm-x/pdfximage.c
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/pdfximage.c	2024-02-25 02:31:44 UTC (rev 70146)
+++ trunk/Build/source/texk/dvipdfm-x/pdfximage.c	2024-02-25 06:04:08 UTC (rev 70147)
@@ -79,6 +79,7 @@
   int      bbox_type;  /* Ugh */
   pdf_obj *dict;
   char     tempfile;
+  char    *page_name;
 };
 
 struct pdf_ximage_
@@ -143,6 +144,8 @@
 
   I->attr.dict     = NULL;
   I->attr.tempfile = 0;
+
+  I->attr.page_name = NULL;
 }
 
 static void
@@ -302,6 +305,7 @@
   }
 
   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 @@
   }
   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;

Modified: trunk/Build/source/texk/dvipdfm-x/pdfximage.h
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/pdfximage.h	2024-02-25 02:31:44 UTC (rev 70146)
+++ trunk/Build/source/texk/dvipdfm-x/pdfximage.h	2024-02-25 06:04:08 UTC (rev 70147)
@@ -54,6 +54,7 @@
   int  page_no;
   enum pdf_page_boundary bbox_type;
   pdf_obj *dict;
+  char *page_name;
 } load_options;
 
 typedef struct pdf_ximage_ pdf_ximage;

Modified: trunk/Build/source/texk/dvipdfm-x/spc_pdfm.c
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/spc_pdfm.c	2024-02-25 02:31:44 UTC (rev 70146)
+++ trunk/Build/source/texk/dvipdfm-x/spc_pdfm.c	2024-02-25 06:04:08 UTC (rev 70147)
@@ -1235,7 +1235,7 @@
   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 @@
    */
   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);

Modified: trunk/Build/source/texk/dvipdfm-x/spc_util.c
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/spc_util.c	2024-02-25 02:31:44 UTC (rev 70146)
+++ trunk/Build/source/texk/dvipdfm-x/spc_util.c	2024-02-25 06:04:08 UTC (rev 70147)
@@ -898,6 +898,7 @@
 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 @@
     "page",
 #define  K__PAGEBOX    12
     "pagebox",
+#define  K__NAMED      13
+    "named",
      NULL
   };
   double xscale, yscale, rotate;
@@ -1055,6 +1058,11 @@
         }
       }
       break;
+    case  K__NAMED:
+      {
+        *page_name = parse_c_string (&ap->curptr, ap->endptr);
+      }
+      break;
 
     default:
       error = -1;

Modified: trunk/Build/source/texk/dvipdfm-x/spc_util.h
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/spc_util.h	2024-02-25 02:31:44 UTC (rev 70146)
+++ trunk/Build/source/texk/dvipdfm-x/spc_util.h	2024-02-25 06:04:08 UTC (rev 70147)
@@ -45,6 +45,7 @@
                                      transform_info         *dimtrns,
                                      int                    *page_no,
                                      enum pdf_page_boundary *bbox_type,
+                                     char                  **page_name,
                                      struct spc_arg *args);
 
 

Modified: trunk/Build/source/texk/dvipdfm-x/xbb.c
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/xbb.c	2024-02-25 02:31:44 UTC (rev 70146)
+++ trunk/Build/source/texk/dvipdfm-x/xbb.c	2024-02-25 06:04:08 UTC (rev 70147)
@@ -260,7 +260,7 @@
     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);
 



More information about the tex-live-commits mailing list.