From a834b02d43bca971ae91062f3b9c70759525b5d4 Mon Sep 17 00:00:00 2001 From: Peter Breitenlohner Date: Tue, 24 Sep 2013 12:22:00 +0000 Subject: dvipdfm-x: Bug fix for (x)dvipdfm-res.test (tikz-bug) git-svn-id: svn://tug.org/texlive/trunk@31739 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/texk/dvipdfm-x/ChangeLog | 13 +++ Build/source/texk/dvipdfm-x/Makefile.am | 5 +- Build/source/texk/dvipdfm-x/Makefile.in | 11 +- Build/source/texk/dvipdfm-x/dpxcrypt.c | 8 +- Build/source/texk/dvipdfm-x/dpxcrypt.h | 8 +- Build/source/texk/dvipdfm-x/dvipdfm-ann.test | 4 +- Build/source/texk/dvipdfm-x/dvipdfm-bkm.test | 4 +- Build/source/texk/dvipdfm-x/dvipdfm-res.test | 25 +++++ Build/source/texk/dvipdfm-x/pdfdoc.c | 13 ++- Build/source/texk/dvipdfm-x/pdfdoc.h | 3 +- Build/source/texk/dvipdfm-x/pdfnames.c | 151 +++----------------------- Build/source/texk/dvipdfm-x/pdfnames.h | 2 - Build/source/texk/dvipdfm-x/pdfobj.c | 48 +++++--- Build/source/texk/dvipdfm-x/spc_pdfm.c | 2 +- Build/source/texk/dvipdfm-x/specials.c | 24 +--- Build/source/texk/dvipdfm-x/tests/annot.dvi | Bin 552 -> 680 bytes Build/source/texk/dvipdfm-x/tests/annot.tex | 5 +- Build/source/texk/dvipdfm-x/tests/bookm.tex | 2 +- Build/source/texk/dvipdfm-x/tests/resrc.dvi | Bin 0 -> 1144 bytes Build/source/texk/dvipdfm-x/tests/resrc.tex | 6 + Build/source/texk/dvipdfm-x/xdvipdfm-ann.test | 4 +- Build/source/texk/dvipdfm-x/xdvipdfm-bkm.test | 4 +- Build/source/texk/dvipdfm-x/xdvipdfm-res.test | 25 +++++ 23 files changed, 161 insertions(+), 206 deletions(-) create mode 100755 Build/source/texk/dvipdfm-x/dvipdfm-res.test create mode 100644 Build/source/texk/dvipdfm-x/tests/resrc.dvi create mode 100644 Build/source/texk/dvipdfm-x/tests/resrc.tex create mode 100755 Build/source/texk/dvipdfm-x/xdvipdfm-res.test diff --git a/Build/source/texk/dvipdfm-x/ChangeLog b/Build/source/texk/dvipdfm-x/ChangeLog index 96df73f722b..06a4e428123 100644 --- a/Build/source/texk/dvipdfm-x/ChangeLog +++ b/Build/source/texk/dvipdfm-x/ChangeLog @@ -1,3 +1,16 @@ +2013-09-24 Peter Breitenlohner + + * pdfnames.[ch], pdfobj.c, specials.c: Fix (x)dvipdfm-res.test + (tikz-bug). + + * tests/annot.{dvi,tex}: Test a broken link annotation. + +2013-09-20 Akira Kakuto + + * dpxcrypt.h, dpxcrypt.c: Use uint32_t instead of unsigned long to + calculate MD5, because it leads to an error if compiled with clang + on 64bit OS X, reported by T. Yamamoto. + 2013-09-12 Peter Breitenlohner * (x)dvipdfm-bkm.test: Additional tests with bookmarks. diff --git a/Build/source/texk/dvipdfm-x/Makefile.am b/Build/source/texk/dvipdfm-x/Makefile.am index 7bd1ce8f42c..1ef5bb8cdd9 100644 --- a/Build/source/texk/dvipdfm-x/Makefile.am +++ b/Build/source/texk/dvipdfm-x/Makefile.am @@ -269,10 +269,12 @@ DISTCLEANFILES = config.force ## TESTS = dvipdfmx_tests = dvipdfmx.test dvipdfm-ann.test dvipdfm-bb.test dvipdfm-bkm.test dvipdfm-psz.test +dvipdfmx_tests += dvipdfm-res.test if DVIPDFMX TESTS += $(dvipdfmx_tests) endif DVIPDFMX xdvipdfmx_tests = xdvipdfmx.test xdvipdfm-ann.test xdvipdfm-bb.test xdvipdfm-bkm.test xdvipdfm-psz.test +xdvipdfmx_tests += xdvipdfm-res.test if XDVIPDFMX TESTS += $(xdvipdfmx_tests) endif XDVIPDFMX @@ -285,5 +287,6 @@ EXTRA_DIST += tests/image.png tests/imgpng.bb tests/imgpng.xbb tests/picpng.bb t EXTRA_DIST += tests/image.dvi tests/image.tex EXTRA_DIST += tests/cmr10.pfb tests/cmr10.tfm tests/annot.dvi tests/annot.tex EXTRA_DIST += tests/bookm.dvi tests/bookm.tex tests/paper.dvi tests/paper.tex -DISTCLEANFILES += img*.* pic*.* image*.pdf annot*.pdf bookm*.pdf paper*.pdf +EXTRA_DIST += tests/resrc.dvi tests/resrc.tex +DISTCLEANFILES += img*.* pic*.* image*.pdf annot*.pdf bookm*.pdf paper*.pdf resrc*.pdf diff --git a/Build/source/texk/dvipdfm-x/Makefile.in b/Build/source/texk/dvipdfm-x/Makefile.in index d932c3d116c..6f4df171086 100644 --- a/Build/source/texk/dvipdfm-x/Makefile.in +++ b/Build/source/texk/dvipdfm-x/Makefile.in @@ -817,10 +817,12 @@ dist_mapdata_DATA = data/cid-x.map cmapdatadir = $(datarootdir)/texmf-dist/fonts/cmap/dvipdfmx dist_cmapdata_DATA = data/EUC-UCS2 DISTCLEANFILES = config.force img*.* pic*.* image*.pdf annot*.pdf \ - bookm*.pdf paper*.pdf + bookm*.pdf paper*.pdf resrc*.pdf TESTS = $(am__append_5) $(am__append_6) -dvipdfmx_tests = dvipdfmx.test dvipdfm-ann.test dvipdfm-bb.test dvipdfm-bkm.test dvipdfm-psz.test -xdvipdfmx_tests = xdvipdfmx.test xdvipdfm-ann.test xdvipdfm-bb.test xdvipdfm-bkm.test xdvipdfm-psz.test +dvipdfmx_tests = dvipdfmx.test dvipdfm-ann.test dvipdfm-bb.test \ + dvipdfm-bkm.test dvipdfm-psz.test dvipdfm-res.test +xdvipdfmx_tests = xdvipdfmx.test xdvipdfm-ann.test xdvipdfm-bb.test \ + xdvipdfm-bkm.test xdvipdfm-psz.test xdvipdfm-res.test EXTRA_DIST = $(dvipdfmx_tests) $(xdvipdfmx_tests) tests/dvipdfmx.cfg \ tests/psfonts.map tests/image.jpeg tests/imgjpeg.bb \ tests/imgjpeg.xbb tests/picjpeg.bb tests/picjpeg.xbb \ @@ -830,7 +832,8 @@ EXTRA_DIST = $(dvipdfmx_tests) $(xdvipdfmx_tests) tests/dvipdfmx.cfg \ tests/picpng.xbb tests/image.dvi tests/image.tex \ tests/cmr10.pfb tests/cmr10.tfm tests/annot.dvi \ tests/annot.tex tests/bookm.dvi tests/bookm.tex \ - tests/paper.dvi tests/paper.tex + tests/paper.dvi tests/paper.tex tests/resrc.dvi \ + tests/resrc.tex all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am diff --git a/Build/source/texk/dvipdfm-x/dpxcrypt.c b/Build/source/texk/dvipdfm-x/dpxcrypt.c index 235e9b9726b..379ebe5ead2 100644 --- a/Build/source/texk/dvipdfm-x/dpxcrypt.c +++ b/Build/source/texk/dvipdfm-x/dpxcrypt.c @@ -28,12 +28,6 @@ # include #endif #include -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif #include "dpxcrypt.h" @@ -289,7 +283,7 @@ void MD5_final (unsigned char *outbuf, MD5_CONTEXT *hd) #define X(a) do { *p++ = hd->a; *p++ = hd->a >> 8; \ *p++ = hd->a >> 16; *p++ = hd->a >> 24; } while (0) #else /* little endian */ -#define X(a) do { *(unsigned long *)p = (*hd).a ; p += 4; } while (0) +#define X(a) do { *(uint32_t *)p = (*hd).a ; p += sizeof(uint32_t); } while (0) #endif X(A); X(B); diff --git a/Build/source/texk/dvipdfm-x/dpxcrypt.h b/Build/source/texk/dvipdfm-x/dpxcrypt.h index d2613043cf8..4470bfd4095 100644 --- a/Build/source/texk/dvipdfm-x/dpxcrypt.h +++ b/Build/source/texk/dvipdfm-x/dpxcrypt.h @@ -24,10 +24,16 @@ #define _DPXCRYPT_H_ #include +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif /* libgcrypt md5 */ typedef struct { - unsigned long A,B,C,D; /* chaining variables */ + uint32_t A,B,C,D; /* chaining variables */ unsigned long nblocks; unsigned char buf[64]; int count; diff --git a/Build/source/texk/dvipdfm-x/dvipdfm-ann.test b/Build/source/texk/dvipdfm-x/dvipdfm-ann.test index 09b145d5a24..a59bab11732 100755 --- a/Build/source/texk/dvipdfm-x/dvipdfm-ann.test +++ b/Build/source/texk/dvipdfm-x/dvipdfm-ann.test @@ -13,8 +13,8 @@ export TEXMFCNF TFMFONTS T1FONTS TEXFONTMAPS DVIPDFMXINPUTS TEXPICTS failed= -echo "*** dvipdfmx -v -o annot1.pdf annot" && echo \ - && ./dvipdfmx -v -o annot1.pdf $srcdir/tests/annot \ +echo "*** dvipdfmx -v -z0 -o annot1.pdf annot" && echo \ + && ./dvipdfmx -v -z0 -o annot1.pdf $srcdir/tests/annot \ && echo && echo "dvipdfmx-ann tests OK" && echo \ || failed="$failed dvipdfmx-ann" diff --git a/Build/source/texk/dvipdfm-x/dvipdfm-bkm.test b/Build/source/texk/dvipdfm-x/dvipdfm-bkm.test index 3ccdaba7fd2..563a29f0651 100755 --- a/Build/source/texk/dvipdfm-x/dvipdfm-bkm.test +++ b/Build/source/texk/dvipdfm-x/dvipdfm-bkm.test @@ -13,8 +13,8 @@ export TEXMFCNF TFMFONTS T1FONTS TEXFONTMAPS DVIPDFMXINPUTS TEXPICTS failed= -echo "*** dvipdfmx -v -o bookm1.pdf bookm" && echo \ - && ./dvipdfmx -v -o bookm1.pdf $srcdir/tests/bookm \ +echo "*** dvipdfmx -v -z0 -o bookm1.pdf bookm" && echo \ + && ./dvipdfmx -v -z0 -o bookm1.pdf $srcdir/tests/bookm \ && echo && echo "dvipdfmx-bkm tests OK" && echo \ || failed="$failed dvipdfmx-bkm" diff --git a/Build/source/texk/dvipdfm-x/dvipdfm-res.test b/Build/source/texk/dvipdfm-x/dvipdfm-res.test new file mode 100755 index 00000000000..dfb622da211 --- /dev/null +++ b/Build/source/texk/dvipdfm-x/dvipdfm-res.test @@ -0,0 +1,25 @@ +#! /bin/sh + +# Copyright (C) 2013 Peter Breitenlohner +# You may freely use, modify and/or distribute this file. + +TEXMFCNF=$srcdir/../kpathsea +TFMFONTS="$srcdir/tests;$srcdir/data" +T1FONTS="$srcdir/tests;$srcdir/data" +TEXFONTMAPS="$srcdir/tests;$srcdir/data" +DVIPDFMXINPUTS="$srcdir/tests;$srcdir/data" +TEXPICTS=$srcdir/tests +export TEXMFCNF TFMFONTS T1FONTS TEXFONTMAPS DVIPDFMXINPUTS TEXPICTS + +failed= + +echo "*** dvipdfmx -v -z0 -o resrc1.pdf resrc" && echo \ + && ./dvipdfmx -v -z0 -o resrc1.pdf $srcdir/tests/resrc \ + && echo && echo "dvipdfmx-res tests OK" && echo \ + || failed="$failed dvipdfmx-res" + +test -z "$failed" && exit 0 +echo +echo "failed tests:$failed" +exit 1 + diff --git a/Build/source/texk/dvipdfm-x/pdfdoc.c b/Build/source/texk/dvipdfm-x/pdfdoc.c index 48b2ad0b4e7..6b69c1202dc 100644 --- a/Build/source/texk/dvipdfm-x/pdfdoc.c +++ b/Build/source/texk/dvipdfm-x/pdfdoc.c @@ -1648,7 +1648,7 @@ pdf_doc_close_names (pdf_doc *p) void pdf_doc_add_annot (unsigned page_no, const pdf_rect *rect, - pdf_obj *annot_dict) + pdf_obj *annot_dict, int new_annot) { pdf_doc *p = &pdoc; pdf_page *page; @@ -1693,6 +1693,9 @@ pdf_doc_add_annot (unsigned page_no, const pdf_rect *rect, pdf_add_array(page->annots, pdf_ref_obj(annot_dict)); + if (new_annot) + pdf_doc_add_goto(annot_dict); + return; } @@ -2649,9 +2652,10 @@ pdf_doc_end_grabbing (pdf_obj *attrib) static struct { int dirty; + int broken; pdf_obj *annot_dict; pdf_rect rect; -} breaking_state = {0, NULL, {0.0, 0.0, 0.0, 0.0}}; +} breaking_state = {0, 0, NULL, {0.0, 0.0, 0.0, 0.0}}; static void reset_box (void) @@ -2665,6 +2669,7 @@ void pdf_doc_begin_annot (pdf_obj *dict) { breaking_state.annot_dict = dict; + breaking_state.broken = 0; reset_box(); } @@ -2685,8 +2690,10 @@ pdf_doc_break_annot (void) annot_dict = pdf_new_dict(); pdf_merge_dict(annot_dict, breaking_state.annot_dict); pdf_doc_add_annot(pdf_doc_current_page_number(), &(breaking_state.rect), - annot_dict); + annot_dict, !breaking_state.broken); pdf_release_obj(annot_dict); + + breaking_state.broken = 1; } reset_box(); } diff --git a/Build/source/texk/dvipdfm-x/pdfdoc.h b/Build/source/texk/dvipdfm-x/pdfdoc.h index 0b9b27553e9..5772758af93 100644 --- a/Build/source/texk/dvipdfm-x/pdfdoc.h +++ b/Build/source/texk/dvipdfm-x/pdfdoc.h @@ -115,7 +115,8 @@ extern void pdf_doc_end_grabbing (pdf_obj *attrib); /* Annotation */ extern void pdf_doc_add_annot (unsigned page_no, const pdf_rect *rect, - pdf_obj *annot_dict); + pdf_obj *annot_dict, + int new_annot); /* Annotation with auto- clip and line (or page) break */ extern void pdf_doc_begin_annot (pdf_obj *dict); diff --git a/Build/source/texk/dvipdfm-x/pdfnames.c b/Build/source/texk/dvipdfm-x/pdfnames.c index 323b7d38a75..c22446d86e8 100644 --- a/Build/source/texk/dvipdfm-x/pdfnames.c +++ b/Build/source/texk/dvipdfm-x/pdfnames.c @@ -47,8 +47,6 @@ struct obj_data { pdf_obj *object; - pdf_obj *object_ref; - int reserve; /* 1 if object is not actually defined. */ int closed; /* 1 if object is closed */ }; @@ -88,12 +86,6 @@ hval_free (void *hval) pdf_release_obj(value->object); value->object = NULL; } - if (value->object_ref) { - pdf_release_obj(value->object_ref); - value->object_ref = NULL; - } - value->reserve = 0; - value->closed = 0; RELEASE(value); @@ -112,7 +104,7 @@ pdf_new_name_tree (void) } static void -flush_objects (struct ht_table *ht_tab) +check_objects_defined (struct ht_table *ht_tab) { struct ht_iter iter; @@ -124,19 +116,12 @@ flush_objects (struct ht_table *ht_tab) key = ht_iter_getkey(&iter, &keylen); value = ht_iter_getval(&iter); - if (value->reserve) { - WARN("Unresolved object reference \"%s\" found!!!", + ASSERT(value->object); + if (PDF_OBJ_UNDEFINED(value->object)) { + pdf_names_add_object(ht_tab, key, keylen, pdf_new_null()); + WARN("Object @%s used, but not defined. Replaced by null.", printable_key(key, keylen)); } - if (value->object) { - pdf_release_obj(value->object); - } - if (value->object_ref) { - pdf_release_obj(value->object_ref); - } - value->object = NULL; - value->object_ref = NULL; - value->reserve = 0; } while (ht_iter_next(&iter) >= 0); ht_clear_iter(&iter); } @@ -147,7 +132,7 @@ pdf_delete_name_tree (struct ht_table **names) { ASSERT(names && *names); - flush_objects (*names); + check_objects_defined (*names); ht_clear_table(*names); RELEASE(*names); @@ -171,85 +156,24 @@ pdf_names_add_object (struct ht_table *names, if (!value) { value = NEW(1, struct obj_data); value->object = object; - value->object_ref = NULL; - value->reserve = 0; value->closed = 0; ht_append_table(names, key, keylen, value); } else { -#ifdef XETEX - if (value->reserve) { - /* null object is used for undefined objects */ - pdf_copy_object(value->object, object); - pdf_release_obj(object); /* PLEASE FIX THIS!!! */ -#else ASSERT(value->object); if (PDF_OBJ_UNDEFINED(value->object)) { pdf_transfer_label(object, value->object); pdf_release_obj(value->object); value->object = object; -#endif } else { -#ifdef XETEX - if (value->object || value->object_ref) { - if (pdf_obj_get_verbose()) { - WARN("Object reference with key \"%s\" is in use.", printable_key(key, keylen)); - } - pdf_release_obj(object); - return -1; - } else { - value->object = object; - } -#else WARN("Object @%s already defined.", printable_key(key, keylen)); pdf_release_obj(object); return -1; -#endif } - value->reserve = 0; } return 0; } -#ifdef XETEX -int -pdf_names_add_reference (struct ht_table *names, - const void *key, int keylen, pdf_obj *object_ref) -{ - struct obj_data *value; - - ASSERT(names); - - if (!PDF_OBJ_INDIRECTTYPE(object_ref)) { - WARN("Invalid type: @%s is not reference...", - printable_key(key, keylen)); - return -1; - } - - value = ht_lookup_table(names, key, keylen); - if (!value) { - value = NEW(1, struct obj_data); - value->object = NULL; - value->object_ref = object_ref; - value->reserve = 0; - ht_append_table(names, key, keylen, value); - } else { - if (value->object || value->object_ref) { - WARN("Object reference \"%s\" is in use.", - printable_key(key, keylen)); - WARN("Please close it before redefining."); - return -1; - } else { - value->object = NULL; - value->object_ref = object_ref; - } - value->reserve = 0; - } - - return 0; -} -#endif - /* * The following routine returns copies, not the original object. */ @@ -258,37 +182,15 @@ pdf_names_lookup_reference (struct ht_table *names, const void *key, int keylen) { struct obj_data *value; -#ifndef XETEX pdf_obj *object; -#endif ASSERT(names); value = ht_lookup_table(names, key, keylen); -#ifdef XETEX - if (!value) { - /* Reserve object label */ - value = NEW(1, struct obj_data); - value->object = pdf_new_null(); /* dummy */ - value->object_ref = NULL; - value->reserve = 1; - ht_append_table(names, key, keylen, value); - } - - if (!value->object_ref) { - if (value->object) - value->object_ref = pdf_ref_obj(value->object); - else { - WARN("Object @%s not defined or already closed.", - printable_key(key, keylen)); - } - } - - return pdf_link_obj(value->object_ref); -#else if (value) { object = value->object; + ASSERT(object); } else { /* A null object as dummy would create problems because as value * of a dictionary entry, a null object is be equivalent to no entry @@ -299,7 +201,6 @@ pdf_names_lookup_reference (struct ht_table *names, } return pdf_ref_obj(object); -#endif } pdf_obj * @@ -313,9 +214,7 @@ pdf_names_lookup_object (struct ht_table *names, value = ht_lookup_table(names, key, keylen); if (!value || PDF_OBJ_UNDEFINED(value->object)) return NULL; - if (!value->object) - ERROR("Object @%s not defined or already closed.", - printable_key(key, keylen)); + ASSERT(value->object); return value->object; } @@ -329,22 +228,17 @@ pdf_names_close_object (struct ht_table *names, ASSERT(names); value = ht_lookup_table(names, key, keylen); - if (!value) { - WARN("Tried to release nonexistent reference: %s", - printable_key(key, keylen)); - return -1; - } - if (PDF_OBJ_UNDEFINED(value->object) ) { + if (!value ||PDF_OBJ_UNDEFINED(value->object) ) { WARN("Cannot close undefined object @%s.", printable_key(key, keylen)); return -1; } - if (!value->object || value->closed) { + ASSERT(value->object); + + if (value->closed) { WARN("Object @%s already closed.", printable_key(key, keylen)); return -1; } - pdf_release_obj(value->object); - value->object = NULL; value->closed = 1; return 0; @@ -489,36 +383,17 @@ flat_table (struct ht_table *ht_tab, long *num_entries, } value = ht_iter_getval(&iter); -#ifdef XETEX - if (value->reserve) { - WARN("Named object \"%s\" not defined!!!", -#else ASSERT(value->object); if (PDF_OBJ_UNDEFINED(value->object)) { - WARN("Object @%s\" not defined!!!", -#endif + WARN("Object @%s\" not defined. Replaced by null.", printable_key(key, keylen)); - WARN("Replacing with null."); objects[count].key = (char *) key; objects[count].keylen = keylen; objects[count].value = pdf_new_null(); - } else if (value->object_ref) { - objects[count].key = (char *) key; - objects[count].keylen = keylen; - objects[count].value = pdf_link_obj(value->object_ref); } else if (value->object) { objects[count].key = (char *) key; objects[count].keylen = keylen; objects[count].value = pdf_link_obj(value->object); -#ifdef XETEX - } else { - WARN("Named object \"%s\" not defined!!!", - printable_key(key, keylen)); - WARN("Replacing with null."); - objects[count].key = (char *) key; - objects[count].keylen = keylen; - objects[count].value = pdf_new_null(); -#endif } } while (ht_iter_next(&iter) >= 0); ht_clear_iter(&iter); diff --git a/Build/source/texk/dvipdfm-x/pdfnames.h b/Build/source/texk/dvipdfm-x/pdfnames.h index 38ec277ef92..bcf3aec9d98 100644 --- a/Build/source/texk/dvipdfm-x/pdfnames.h +++ b/Build/source/texk/dvipdfm-x/pdfnames.h @@ -35,8 +35,6 @@ extern void pdf_delete_name_tree (struct ht_table **names); extern int pdf_names_add_object (struct ht_table *names, const void *key, int keylen, pdf_obj *object); -extern int pdf_names_add_reference (struct ht_table *names, - const void *key, int keylen, pdf_obj *object_ref); extern pdf_obj *pdf_names_lookup_reference (struct ht_table *names, const void *key, int keylen); extern pdf_obj *pdf_names_lookup_object (struct ht_table *names, diff --git a/Build/source/texk/dvipdfm-x/pdfobj.c b/Build/source/texk/dvipdfm-x/pdfobj.c index cbad9b8014d..207a48d2a67 100644 --- a/Build/source/texk/dvipdfm-x/pdfobj.c +++ b/Build/source/texk/dvipdfm-x/pdfobj.c @@ -117,6 +117,7 @@ struct pdf_stream struct pdf_indirect { pdf_file *pf; + pdf_obj *obj; /* used when PF == NULL */ unsigned long label; unsigned short generation; }; @@ -193,6 +194,7 @@ static void release_objstm (pdf_obj *objstm); static void pdf_out_char (FILE *file, char c); static void pdf_out (FILE *file, const void *buffer, long length); +static pdf_obj *pdf_new_ref (pdf_obj *object); static void release_indirect (pdf_indirect *data); static void write_indirect (pdf_indirect *indirect, FILE *file); @@ -603,7 +605,7 @@ pdf_new_obj(int type) { pdf_obj *result; - if (type >= PDF_UNDEFINED || type < 0) + if (type > PDF_UNDEFINED || type < 0) ERROR("Invalid object type: %d", type); result = NEW(1, pdf_obj); @@ -641,7 +643,6 @@ pdf_label_obj (pdf_obj *object) } } -#ifndef XETEX /* * Transfer the label assigned to the object src to the object dst. * The object dst must not yet have been labeled. @@ -656,7 +657,6 @@ pdf_transfer_label (pdf_obj *dst, pdf_obj *src) src->label = 0; src->generation = 0; } -#endif /* * This doesn't really copy the object, but allows it to be used without @@ -689,10 +689,7 @@ pdf_ref_obj (pdf_obj *object) if (PDF_OBJ_INDIRECTTYPE(object)) { return pdf_link_obj(object); } else { - if (object->label == 0) { - pdf_label_obj(object); - } - return pdf_new_indirect(NULL, object->label, object->generation); + return pdf_new_ref(object); } } @@ -713,7 +710,6 @@ write_indirect (pdf_indirect *indirect, FILE *file) pdf_out(file, format_buffer, length); } -#ifndef XETEX /* The undefined object is used as a placeholder in pdfnames.c * for objects which are referenced before they are defined. */ @@ -727,7 +723,6 @@ pdf_new_undefined (void) return result; } -#endif pdf_obj * pdf_new_null (void) @@ -2242,6 +2237,7 @@ pdf_copy_object (pdf_obj *dst, pdf_obj *src) dst->data = data = NEW(1, pdf_indirect); data->pf = ((pdf_indirect *) (src->data))->pf; + data->obj = ((pdf_indirect *) (src->data))->obj; data->label = ((pdf_indirect *) (src->data))->label; data->generation = ((pdf_indirect *) (src->data))->generation; } @@ -2382,6 +2378,7 @@ pdf_new_indirect (pdf_file *pf, unsigned long obj_num, unsigned short obj_gen) indirect = NEW(1, pdf_indirect); indirect->pf = pf; + indirect->obj = NULL; indirect->label = obj_num; indirect->generation = obj_gen; @@ -2616,9 +2613,23 @@ pdf_get_object (pdf_file *pf, unsigned long obj_num, unsigned short obj_gen) } #define OBJ_FILE(o) (((pdf_indirect *)((o)->data))->pf) +#define OBJ_OBJ(o) (((pdf_indirect *)((o)->data))->obj) #define OBJ_NUM(o) (((pdf_indirect *)((o)->data))->label) #define OBJ_GEN(o) (((pdf_indirect *)((o)->data))->generation) +static pdf_obj * +pdf_new_ref (pdf_obj *object) +{ + pdf_obj *result; + + if (object->label == 0) { + pdf_label_obj(object); + } + result = pdf_new_indirect(NULL, object->label, object->generation); + OBJ_OBJ(result) = object; + return result; +} + /* pdf_deref_obj always returns a link instead of the original */ /* It never return the null object, but the NULL pointer instead */ pdf_obj * @@ -2631,12 +2642,19 @@ pdf_deref_obj (pdf_obj *obj) while (PDF_OBJ_INDIRECTTYPE(obj) && --count) { pdf_file *pf = OBJ_FILE(obj); - unsigned long obj_num = OBJ_NUM(obj); - unsigned short obj_gen = OBJ_GEN(obj); - if (!pf) - ERROR("Tried to deref a non-file object"); - pdf_release_obj(obj); - obj = pdf_get_object(pf, obj_num, obj_gen); + if (pf) { + unsigned long obj_num = OBJ_NUM(obj); + unsigned short obj_gen = OBJ_GEN(obj); + pdf_release_obj(obj); + obj = pdf_get_object(pf, obj_num, obj_gen); + } else { + pdf_obj *next_obj = OBJ_OBJ(obj); + if (!next_obj) { + ERROR("Undefined object reference"); + } + pdf_release_obj(obj); + obj = pdf_link_obj(next_obj); + } } if (!count) diff --git a/Build/source/texk/dvipdfm-x/spc_pdfm.c b/Build/source/texk/dvipdfm-x/spc_pdfm.c index c27e6dc2808..560ab15117c 100644 --- a/Build/source/texk/dvipdfm-x/spc_pdfm.c +++ b/Build/source/texk/dvipdfm-x/spc_pdfm.c @@ -685,7 +685,7 @@ spc_handler_pdfm_annot (struct spc_env *spe, struct spc_arg *args) if (ident) spc_push_object(ident, pdf_link_obj(annot_dict)); /* Add this reference. */ - pdf_doc_add_annot(pdf_doc_current_page_number(), &rect, annot_dict); + pdf_doc_add_annot(pdf_doc_current_page_number(), &rect, annot_dict, 1); if (ident) { spc_flush_object(ident); diff --git a/Build/source/texk/dvipdfm-x/specials.c b/Build/source/texk/dvipdfm-x/specials.c index d65cbbb67f4..0c0f2fd5f67 100644 --- a/Build/source/texk/dvipdfm-x/specials.c +++ b/Build/source/texk/dvipdfm-x/specials.c @@ -291,29 +291,7 @@ spc_push_object (const char *key, pdf_obj *value) if (!key || !value) return; -#ifdef XETEX - if (PDF_OBJ_INDIRECTTYPE(value)) { - pdf_names_add_reference(named_objects, - key, strlen(key), value); - } else -#endif - { - int error = pdf_names_add_object(named_objects, - key, strlen(key), value); - if (!error) { -#ifdef XETEX - /* _FIXME_: - * Objects created by pdf:obj must always - * be written to output regardless of if - * they are actually used in document. - */ - pdf_obj *obj_ref = pdf_names_lookup_reference(named_objects, - key, strlen(key)); - if (obj_ref) - pdf_release_obj(obj_ref); -#endif - } - } + pdf_names_add_object(named_objects, key, strlen(key), value); } void diff --git a/Build/source/texk/dvipdfm-x/tests/annot.dvi b/Build/source/texk/dvipdfm-x/tests/annot.dvi index 7ea86daa1f5..0cea9bacc12 100644 Binary files a/Build/source/texk/dvipdfm-x/tests/annot.dvi and b/Build/source/texk/dvipdfm-x/tests/annot.dvi differ diff --git a/Build/source/texk/dvipdfm-x/tests/annot.tex b/Build/source/texk/dvipdfm-x/tests/annot.tex index c57f2ca5786..dd10e9fd223 100644 --- a/Build/source/texk/dvipdfm-x/tests/annot.tex +++ b/Build/source/texk/dvipdfm-x/tests/annot.tex @@ -1,9 +1,12 @@ % \special{pdf:obj @tug <>} +Add some text and more text and still more text in order to get a link annotation +extending \special{pdf:bann <>}% TUG on the web -\special{pdf:eann}% +\special{pdf:eann} +over two lines. \vskip 20 bp diff --git a/Build/source/texk/dvipdfm-x/tests/bookm.tex b/Build/source/texk/dvipdfm-x/tests/bookm.tex index 72745154473..d42e12a51f4 100644 --- a/Build/source/texk/dvipdfm-x/tests/bookm.tex +++ b/Build/source/texk/dvipdfm-x/tests/bookm.tex @@ -57,4 +57,4 @@ \noindent The second section -\bye \ No newline at end of file +\bye diff --git a/Build/source/texk/dvipdfm-x/tests/resrc.dvi b/Build/source/texk/dvipdfm-x/tests/resrc.dvi new file mode 100644 index 00000000000..8e16467e097 Binary files /dev/null and b/Build/source/texk/dvipdfm-x/tests/resrc.dvi differ diff --git a/Build/source/texk/dvipdfm-x/tests/resrc.tex b/Build/source/texk/dvipdfm-x/tests/resrc.tex new file mode 100644 index 00000000000..5c95c930e51 --- /dev/null +++ b/Build/source/texk/dvipdfm-x/tests/resrc.tex @@ -0,0 +1,6 @@ +\documentclass[dvipdfmx]{article} +\usepackage{tikz} +\usetikzlibrary{patterns} +\begin{document} +\tikz \path[pattern=crosshatch] (0,0) -- (1,0) -- (0,1) -- cycle; +\end{document} diff --git a/Build/source/texk/dvipdfm-x/xdvipdfm-ann.test b/Build/source/texk/dvipdfm-x/xdvipdfm-ann.test index 9a0ae4b8193..24d6e6c1025 100755 --- a/Build/source/texk/dvipdfm-x/xdvipdfm-ann.test +++ b/Build/source/texk/dvipdfm-x/xdvipdfm-ann.test @@ -13,8 +13,8 @@ export TEXMFCNF TFMFONTS T1FONTS TEXFONTMAPS DVIPDFMXINPUTS TEXPICTS failed= -echo "*** xdvipdfmx -v -o annot2.pdf annot" && echo \ - && ./xdvipdfmx -v -o annot2.pdf $srcdir/tests/annot \ +echo "*** xdvipdfmx -v -z0 -o annot2.pdf annot" && echo \ + && ./xdvipdfmx -v -z0 -o annot2.pdf $srcdir/tests/annot \ && echo && echo "xdvipdfmx-ann tests OK" && echo \ || failed="$failed xdvipdfmx-ann" diff --git a/Build/source/texk/dvipdfm-x/xdvipdfm-bkm.test b/Build/source/texk/dvipdfm-x/xdvipdfm-bkm.test index 92e4460b2c1..dd8cb51edf4 100755 --- a/Build/source/texk/dvipdfm-x/xdvipdfm-bkm.test +++ b/Build/source/texk/dvipdfm-x/xdvipdfm-bkm.test @@ -13,8 +13,8 @@ export TEXMFCNF TFMFONTS T1FONTS TEXFONTMAPS DVIPDFMXINPUTS TEXPICTS failed= -echo "*** xdvipdfmx -v -o bookm2.pdf bookm" && echo \ - && ./xdvipdfmx -v -o bookm2.pdf $srcdir/tests/bookm \ +echo "*** xdvipdfmx -v -z0 -o bookm2.pdf bookm" && echo \ + && ./xdvipdfmx -v -z0 -o bookm2.pdf $srcdir/tests/bookm \ && echo && echo "xdvipdfmx-bkm tests OK" && echo \ || failed="$failed xdvipdfmx-bkm" diff --git a/Build/source/texk/dvipdfm-x/xdvipdfm-res.test b/Build/source/texk/dvipdfm-x/xdvipdfm-res.test new file mode 100755 index 00000000000..ab3b87755cd --- /dev/null +++ b/Build/source/texk/dvipdfm-x/xdvipdfm-res.test @@ -0,0 +1,25 @@ +#! /bin/sh + +# Copyright (C) 2013 Peter Breitenlohner +# You may freely use, modify and/or distribute this file. + +TEXMFCNF=$srcdir/../kpathsea +TFMFONTS="$srcdir/tests;$srcdir/data" +T1FONTS="$srcdir/tests;$srcdir/data" +TEXFONTMAPS="$srcdir/tests;$srcdir/data" +DVIPDFMXINPUTS="$srcdir/tests;$srcdir/data" +TEXPICTS=$srcdir/tests +export TEXMFCNF TFMFONTS T1FONTS TEXFONTMAPS DVIPDFMXINPUTS TEXPICTS + +failed= + +echo "*** xdvipdfmx -v -z0 -o resrc2.pdf resrc" && echo \ + && ./xdvipdfmx -v -z0 -o resrc2.pdf $srcdir/tests/resrc \ + && echo && echo "xdvipdfmx-res tests OK" && echo \ + || failed="$failed xdvipdfmx-res" + +test -z "$failed" && exit 0 +echo +echo "failed tests:$failed" +exit 1 + -- cgit v1.2.3