diff options
-rw-r--r-- | Build/source/texk/web2c/pdftexdir/pdftex-common.h | 2 | ||||
-rw-r--r-- | Build/source/texk/web2c/pdftexdir/pdftex.web | 16 | ||||
-rw-r--r-- | Build/source/texk/web2c/pdftexdir/pdftoepdf.cc | 45 | ||||
-rw-r--r-- | Build/source/texk/web2c/pdftexdir/writeimg.c | 2 | ||||
-rw-r--r-- | Build/source/texk/web2c/pdftexdir/writepng.c | 8 |
5 files changed, 57 insertions, 16 deletions
diff --git a/Build/source/texk/web2c/pdftexdir/pdftex-common.h b/Build/source/texk/web2c/pdftexdir/pdftex-common.h index 58625d0b20e..4b942899f58 100644 --- a/Build/source/texk/web2c/pdftexdir/pdftex-common.h +++ b/Build/source/texk/web2c/pdftexdir/pdftex-common.h @@ -48,6 +48,7 @@ extern integer pdfbufsize; extern boolean pdfosmode; extern eightbits pdflastbyte; extern integer fixedinclusioncopyfont; +extern integer pdfpagegroupval; /* pdftexcoerce.h - generated from pdftex.web */ extern integer pdfnewobjnum(void); @@ -114,5 +115,6 @@ extern int epdf_selected_page; extern int epdf_num_pages; extern int epdf_page_box; extern void *epdf_doc; +extern int epdf_has_page_group; #endif /* PDFTEX_COMMON_H */ diff --git a/Build/source/texk/web2c/pdftexdir/pdftex.web b/Build/source/texk/web2c/pdftexdir/pdftex.web index d96a1ff0750..776aa446212 100644 --- a/Build/source/texk/web2c/pdftexdir/pdftex.web +++ b/Build/source/texk/web2c/pdftexdir/pdftex.web @@ -15224,7 +15224,6 @@ zip_write_state := no_zip; pdf_minor_version_written := false; fixed_pdfoutput_set := false; fixed_pdf_draftmode_set := false; -pdf_page_group_val := -1; @ @p @@ -18743,6 +18742,7 @@ fix_pdfoutput; temp_ptr:=p; prepare_mag; pdf_last_resources := pdf_new_objnum; +pdf_page_group_val := 0; @<Reset resource lists@>; if not shipping_page then begin pdf_xform_width := width(p); @@ -18969,7 +18969,6 @@ if pdf_page_group_val > 0 then begin pdf_print("/Group "); pdf_print_int(pdf_page_group_val); pdf_print_ln(" 0 R"); - pdf_page_group_val := -1; end; @<Generate array of annotations or beads in page@>; pdf_end_dict @@ -36027,9 +36026,9 @@ begin pdf_append_list(pdf_ximage_objnum(p))(pdf_ximage_list); if not is_pdf_image(image) then begin if is_png_image(image) then begin - groupref := image_group_ref (image); - if (groupref>0) and (pdf_page_group_val<1) then - pdf_page_group_val := groupref; + groupref := image_group_ref(image); + if (groupref > 0) and (pdf_page_group_val = 0) then + pdf_page_group_val := groupref; end; pdf_print_real(ext_xn_over_d(pdf_width(p), ten_pow[6], one_hundred_bp), 4); @@ -36041,7 +36040,11 @@ begin pdf_print_bp(pdf_y(cur_v)); end else begin - if pdf_page_group_val<1 then pdf_page_group_val := image_group_ref (image); + {for pdf images we generate the page group object number here} + groupref := image_group_ref(image); {this is only a flag whether page group is present} + if (groupref > 0) and (pdf_page_group_val = 0) then begin + pdf_page_group_val := pdf_new_objnum; + end; pdf_print_real(ext_xn_over_d(pdf_width(p), ten_pow[6], img_w), 6); pdf_print(" 0 0 "); @@ -36064,7 +36067,6 @@ begin pdf_print_ln("Q"); end; - function gap_amount(p: pointer; cur_pos: scaled): scaled; {find the gap between the position of the current snap node |p| and the nearest point on the grid} var snap_unit, stretch_amount, shrink_amount: scaled; diff --git a/Build/source/texk/web2c/pdftexdir/pdftoepdf.cc b/Build/source/texk/web2c/pdftexdir/pdftoepdf.cc index 22f01978ab3..0f8261b878b 100644 --- a/Build/source/texk/web2c/pdftexdir/pdftoepdf.cc +++ b/Build/source/texk/web2c/pdftexdir/pdftoepdf.cc @@ -141,8 +141,6 @@ struct UsedEncoding { static InObj *inObjList; static UsedEncoding *encodingList; static GBool isInit = gFalse; -static bool groupIsIndirect; -static PdfObject lastGroup; // -------------------------------------------------------------------- // Maintain list of open embedded PDF files @@ -809,6 +807,12 @@ read_pdf_info(char *image_name, char *page_name, int page_num, if (epdf_rotate < 0) epdf_rotate += 360; + // page group + if (page->getGroup() != NULL) + epdf_has_page_group = 1; // only flag that page group is present; + // the actual object number will be + // generated in pdftex.web + pdf_doc->xref = pdf_doc->doc->getXRef(); return page_num; } @@ -823,6 +827,8 @@ void write_epdf(void) Ref *pageRef; Dict *pageDict; PdfObject contents, obj1, obj2, pageObj, dictObj; + PdfObject groupDict; + bool writeSepGroup = false; Object info; char *key; char s[256]; @@ -830,12 +836,12 @@ void write_epdf(void) int rotate; double scale[6] = { 0, 0, 0, 0, 0, 0 }; bool writematrix = false; - static char *pageDictKeys[] = { - "Group", + static char *pageDictKeys[] = { "LastModified", "Metadata", "PieceInfo", "SeparationInfo", +// "Group", // "Resources", NULL }; @@ -920,7 +926,7 @@ void write_epdf(void) if (!dictObj->isNull() && !dictObj->isRef()) pdftex_warn("PDF inclusion: /Metadata must be indirect object"); - // copy selected items in Page dictionary except Resources + // copy selected items in Page dictionary except Resources & Group for (i = 0; pageDictKeys[i] != NULL; i++) { pageDict->lookupNF(pageDictKeys[i], &dictObj); if (!dictObj->isNull()) { @@ -928,6 +934,23 @@ void write_epdf(void) pdf_printf("/%s ", pageDictKeys[i]); copyObject(&dictObj); // preserves indirection } + } + + // handle page group + pageDict->lookupNF("Group", &dictObj); + if (!dictObj->isNull()) { + if (pdfpagegroupval == 0) { + // another pdf with page group was included earlier on the same page; + // copy the Group entry as is + pdf_newline(); + pdf_puts("/Group "); + copyObject(&dictObj); + } else { + // write Group dict as a separate object, since the Page dict also refers to it + writeSepGroup = true; + initDictFromDict(groupDict, page->getGroup()); + pdf_printf("/Group %d 0 R\n", pdfpagegroupval); + } } // write the Resources dictionary @@ -1008,10 +1031,22 @@ void write_epdf(void) pdfbeginstream(); pdfendstream(); } + // write out all indirect objects writeRefs(); + // write out all used encodings (and delete list) writeEncodings(); + + // write the Group dict if needed + if (writeSepGroup) { + pdfbeginobj(pdfpagegroupval, 2); + copyObject(&groupDict); + pdfendobj(); + pdfpagegroupval = 0; // only the 1st included pdf on a page gets its + // Group included in the Page dict + } + // save object list, xref pdf_doc->inObjList = inObjList; pdf_doc->xref = xref; diff --git a/Build/source/texk/web2c/pdftexdir/writeimg.c b/Build/source/texk/web2c/pdftexdir/writeimg.c index 4a1e5d65ac1..3f5b4b1b32e 100644 --- a/Build/source/texk/web2c/pdftexdir/writeimg.c +++ b/Build/source/texk/web2c/pdftexdir/writeimg.c @@ -41,6 +41,7 @@ int epdf_selected_page; int epdf_num_pages; int epdf_page_box; void *epdf_doc; +int epdf_has_page_group; static integer new_image_entry(void) { @@ -322,6 +323,7 @@ integer readimage(strnumber s, integer page_num, strnumber page_name, pdf_ptr(img)->orig_y = bp2int(epdf_orig_y); pdf_ptr(img)->selected_page = page_num; pdf_ptr(img)->doc = epdf_doc; + img_group_ref(img) = epdf_has_page_group; break; case IMAGE_TYPE_PNG: img_pages(img) = 1; diff --git a/Build/source/texk/web2c/pdftexdir/writepng.c b/Build/source/texk/web2c/pdftexdir/writepng.c index 481d4bb6461..523396f0160 100644 --- a/Build/source/texk/web2c/pdftexdir/writepng.c +++ b/Build/source/texk/web2c/pdftexdir/writepng.c @@ -34,7 +34,7 @@ Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #define png_rowbytes(N) png_get_rowbytes(png_ptr(N), png_info(N)) #define png_width(N) png_get_image_width(png_ptr(N), png_info(N)) -static int transparent_page_group = -1; +static int transparent_page_group = 0; void read_png_info(integer img) { @@ -106,10 +106,10 @@ void read_png_info(integer img) /* png with alpha channel in device colours; we have to add a Page * Group to make Adobe happy, so we have to create a dummy group object */ - if (transparent_page_group < 1) { + if (transparent_page_group == 0) { transparent_page_group = pdfnewobjnum(); } - if (pdfpagegroupval < 1) { + if (pdfpagegroupval == 0) { pdfpagegroupval = transparent_page_group; } img_group_ref(img) = pdfpagegroupval; @@ -510,7 +510,7 @@ static boolean transparent_page_group_was_written = false; static void write_additional_png_objects(void) { if (last_png_needs_page_group) { - if (!transparent_page_group_was_written && transparent_page_group > 1) { + if (!transparent_page_group_was_written && transparent_page_group > 0) { // create new group object transparent_page_group_was_written = true; pdfbeginobj(transparent_page_group, 2); |