summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfm-x/epdf.c
diff options
context:
space:
mode:
authorAkira Kakuto <kakuto@fuk.kindai.ac.jp>2018-09-14 03:34:50 +0000
committerAkira Kakuto <kakuto@fuk.kindai.ac.jp>2018-09-14 03:34:50 +0000
commit00653d612add044de9f941c7b2c562bebe60d1e8 (patch)
tree46f2e9aa6440270f015d3e9d3d17f4d4ed709691 /Build/source/texk/dvipdfm-x/epdf.c
parentfb833e57545c4b4d76e01406904fdfd83f057447 (diff)
Cleanup. Remove duplicated code. Reorganize global variables. (S. Hirata)
git-svn-id: svn://tug.org/texlive/trunk@48663 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvipdfm-x/epdf.c')
-rw-r--r--Build/source/texk/dvipdfm-x/epdf.c386
1 files changed, 35 insertions, 351 deletions
diff --git a/Build/source/texk/dvipdfm-x/epdf.c b/Build/source/texk/dvipdfm-x/epdf.c
index 0bc7d4593f4..c7ae614be8d 100644
--- a/Build/source/texk/dvipdfm-x/epdf.c
+++ b/Build/source/texk/dvipdfm-x/epdf.c
@@ -50,278 +50,8 @@
#include "epdf.h"
-static int rect_equal (pdf_obj *rect1, pdf_obj *rect2);
-
-/*
- * From PDFReference15_v6.pdf (p.119 and p.834)
- *
- * MediaBox rectangle (Required; inheritable)
- *
- * The media box defines the boundaries of the physical medium on which the
- * page is to be printed. It may include any extended area surrounding the
- * finished page for bleed, printing marks, or other such purposes. It may
- * also include areas close to the edges of the medium that cannot be marked
- * because of physical limitations of the output device. Content falling
- * outside this boundary can safely be discarded without affecting the
- * meaning of the PDF file.
- *
- * CropBox rectangle (Optional; inheritable)
- *
- * The crop box defines the region to which the contents of the page are to be
- * clipped (cropped) when displayed or printed. Unlike the other boxes, the
- * crop box has no defined meaning in terms of physical page geometry or
- * intended use; it merely imposes clipping on the page contents. However,
- * 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.
- *
- * BleedBox rectangle (Optional; PDF 1.3)
- *
- * The bleed box (PDF 1.3) defines the region to which the contents of the
- * page should be clipped when output in a production environment. This may
- * 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.
- *
- * 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.
- *
- * ArtBox rectangle (Optional; PDF 1.3)
- *
- * The art box (PDF 1.3) defines the extent of the page's meaningful content
- * (including potential white space) as intended by the page's creator.
- * The default value is the page's crop box.
- *
- * Rotate integer (Optional; inheritable)
- *
- * 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 int
-rect_equal (pdf_obj *rect1, pdf_obj *rect2)
-{
- int i;
-
- if (!rect1 || !rect2)
- return 0;
- for (i = 0; i < 4; i++) {
- if (pdf_number_value(pdf_get_array(rect1, i)) !=
- pdf_number_value(pdf_get_array(rect2, i)))
- return 0;
- }
-
- return 1;
-}
-
-static pdf_obj*
-pdf_get_page_obj (pdf_file *pf, int page_no,
- pdf_obj **ret_bbox, pdf_obj **ret_resources)
-{
- pdf_obj *page_tree;
- pdf_obj *bbox = NULL, *resources = NULL, *rotate = NULL;
- int page_idx;
-
- /*
- * Get Page Tree.
- */
- page_tree = NULL;
- {
- pdf_obj *trailer, *catalog;
- pdf_obj *markinfo, *tmp;
-
- trailer = pdf_file_get_trailer(pf);
-
- if (pdf_lookup_dict(trailer, "Encrypt")) {
- WARN("This PDF document is encrypted.");
- pdf_release_obj(trailer);
- return NULL;
- }
-
- catalog = pdf_deref_obj(pdf_lookup_dict(trailer, "Root"));
- if (!PDF_OBJ_DICTTYPE(catalog)) {
- WARN("Can't read document catalog.");
- pdf_release_obj(trailer);
- if (catalog)
- pdf_release_obj(catalog);
- return NULL;
- }
- pdf_release_obj(trailer);
-
- markinfo = pdf_deref_obj(pdf_lookup_dict(catalog, "MarkInfo"));
- if (markinfo) {
- tmp = pdf_lookup_dict(markinfo, "Marked");
- if (PDF_OBJ_BOOLEANTYPE(tmp) && pdf_boolean_value(tmp))
- WARN("PDF file is tagged... Ignoring tags.");
- pdf_release_obj(markinfo);
- }
-
- page_tree = pdf_deref_obj(pdf_lookup_dict(catalog, "Pages"));
- pdf_release_obj(catalog);
- }
- if (!page_tree) {
- WARN("Page tree not found.");
- return NULL;
- }
-
- /*
- * Negative page numbers are counted from the back.
- */
- {
- int count = pdf_number_value(pdf_lookup_dict(page_tree, "Count"));
- page_idx = page_no + (page_no >= 0 ? -1 : count);
- if (page_idx < 0 || page_idx >= count) {
- WARN("Page %ld does not exist.", page_no);
- pdf_release_obj(page_tree);
- return NULL;
- }
- page_no = page_idx+1;
- }
-
- /*
- * Seek correct page. Get Media/Crop Box.
- * Media box and resources can be inherited.
- */
- {
- pdf_obj *kids_ref, *kids;
- pdf_obj *crop_box = NULL;
- pdf_obj *tmp;
-
- tmp = pdf_lookup_dict(page_tree, "Resources");
- resources = tmp ? pdf_deref_obj(tmp) : pdf_new_dict();
-
- while (1) {
- int kids_length, i;
-
- if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "MediaBox")))) {
- if (bbox)
- pdf_release_obj(bbox);
- bbox = tmp;
- }
- if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "BleedBox")))) {
- if (!rect_equal(tmp, bbox)) {
- if (bbox)
- pdf_release_obj(bbox);
- bbox = tmp;
- } else {
- pdf_release_obj(tmp);
- }
- }
- if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "TrimBox")))) {
- if (!rect_equal(tmp, bbox)) {
- if (bbox)
- pdf_release_obj(bbox);
- bbox = tmp;
- } else {
- pdf_release_obj(tmp);
- }
- }
- if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "ArtBox")))) {
- if (!rect_equal(tmp, bbox)) {
- if (bbox)
- pdf_release_obj(bbox);
- bbox = tmp;
- } else {
- pdf_release_obj(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, "Rotate")))) {
- if (rotate)
- pdf_release_obj(rotate);
- rotate = tmp;
- }
- if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "Resources")))) {
-#if 0
- pdf_merge_dict(tmp, resources);
-#endif
- if (resources)
- pdf_release_obj(resources);
- resources = tmp;
- }
-
- kids_ref = pdf_lookup_dict(page_tree, "Kids");
- if (!kids_ref)
- break;
- kids = pdf_deref_obj(kids_ref);
- kids_length = pdf_array_length(kids);
-
- for (i = 0; i < kids_length; i++) {
- int count;
-
- pdf_release_obj(page_tree);
- page_tree = pdf_deref_obj(pdf_get_array(kids, i));
-
- tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "Count"));
- if (tmp) {
- /* Pages object */
- count = pdf_number_value(tmp);
- pdf_release_obj(tmp);
- } else {
- /* Page object */
- count = 1;
- }
- if (page_idx < count)
- break;
-
- page_idx -= count;
- }
-
- pdf_release_obj(kids);
-
- if (i == kids_length) {
- WARN("Page %ld not found! Broken PDF file?", page_no);
- if (bbox)
- pdf_release_obj(bbox);
- if (crop_box)
- pdf_release_obj(crop_box);
- if (rotate)
- pdf_release_obj(rotate);
- pdf_release_obj(resources);
- pdf_release_obj(page_tree);
- return NULL;
- }
- }
- if (crop_box) {
- pdf_release_obj(bbox);
- bbox = crop_box;
- }
- }
-
- if (!bbox) {
- WARN("No BoundingBox information available.");
- pdf_release_obj(page_tree);
- pdf_release_obj(resources);
- if (rotate)
- pdf_release_obj(rotate);
- return NULL;
- }
-
- if (rotate) {
- pdf_release_obj(rotate);
- rotate = NULL;
- }
-
- if (ret_bbox != NULL)
- *ret_bbox = bbox;
- if (ret_resources != NULL)
- *ret_resources = resources;
-
- return page_tree;
-}
-
static pdf_obj*
-pdf_get_page_content (pdf_obj* page)
+get_page_content (pdf_file *pf, pdf_obj* page)
{
pdf_obj *contents, *content_new;
@@ -329,7 +59,7 @@ pdf_get_page_content (pdf_obj* page)
if (!contents)
return NULL;
- if (pdf_obj_typeof(contents) == PDF_NULL) {
+ if (PDF_OBJ_NULLTYPE(contents)) {
/* empty page */
pdf_release_obj(contents);
/* TODO: better don't include anything if the page is empty */
@@ -339,29 +69,26 @@ pdf_get_page_content (pdf_obj* page)
* Concatenate all content streams.
*/
pdf_obj *content_seg;
- int idx = 0;
+ int i;
content_new = pdf_new_stream(STREAM_COMPRESS);
- for (;;) {
- content_seg = pdf_deref_obj(pdf_get_array(contents, idx));
- if (!content_seg)
- break;
- else if (PDF_OBJ_NULLTYPE(content_seg)) {
- /* Silently ignore. */
- } else if (!PDF_OBJ_STREAMTYPE(content_seg)) {
- WARN("Page content not a stream object. Broken PDF file?");
- pdf_release_obj(content_seg);
- pdf_release_obj(content_new);
+ for (i = 0; i < pdf_array_length(contents); i++) {
+ content_seg = pdf_deref_obj(pdf_get_array(contents, i));
+ if (!content_seg) {
+ WARN("Could not read page content stream.");
+ pdf_release_obj(content_new);
pdf_release_obj(contents);
- return NULL;
- } else if (pdf_concat_stream(content_new, content_seg) < 0) {
- WARN("Could not handle content stream with multiple segments.");
+ return NULL;
+ }
+ if (PDF_OBJ_STREAMTYPE(content_seg)) {
+ pdf_concat_stream(content_new, content_seg);
+ } else if (!PDF_OBJ_NULLTYPE(content_seg)) {
+ WARN("Page content not a stream object. Broken PDF file?");
pdf_release_obj(content_seg);
- pdf_release_obj(content_new);
+ pdf_release_obj(content_new);
pdf_release_obj(contents);
- return NULL;
+ return NULL;
}
pdf_release_obj(content_seg);
- idx++;
}
pdf_release_obj(contents);
contents = content_new;
@@ -373,12 +100,7 @@ pdf_get_page_content (pdf_obj* page)
}
/* Flate the contents if necessary. */
content_new = pdf_new_stream(STREAM_COMPRESS);
- if (pdf_concat_stream(content_new, contents) < 0) {
- WARN("Could not handle a content stream.");
- pdf_release_obj(contents);
- pdf_release_obj(content_new);
- return NULL;
- }
+ pdf_concat_stream(content_new, contents);
pdf_release_obj(contents);
contents = content_new;
}
@@ -420,7 +142,7 @@ pdf_include_page (pdf_ximage *ximage,
pdf_release_obj(markinfo);
if (!PDF_OBJ_BOOLEANTYPE(tmp)) {
if (tmp)
- pdf_release_obj(tmp);
+ pdf_release_obj(tmp);
goto error;
} else if (pdf_boolean_value(tmp)) {
WARN("PDF file is tagged... Ignoring tags.");
@@ -428,52 +150,12 @@ pdf_include_page (pdf_ximage *ximage,
pdf_release_obj(tmp);
}
- contents = pdf_deref_obj(pdf_lookup_dict(page, "Contents"));
- pdf_release_obj(page);
- page = NULL;
-
/*
* Handle page content stream.
*/
- {
- pdf_obj *content_new;
-
- if (!contents) {
- /*
- * Empty page
- */
- content_new = pdf_new_stream(0);
- /* TODO: better don't include anything if the page is empty */
- } else if (PDF_OBJ_STREAMTYPE(contents)) {
- /*
- * We must import the stream because its dictionary
- * may contain indirect references.
- */
- content_new = pdf_import_object(contents);
- } else if (PDF_OBJ_ARRAYTYPE(contents)) {
- /*
- * Concatenate all content streams.
- */
- int idx, len = pdf_array_length(contents);
- content_new = pdf_new_stream(STREAM_COMPRESS);
- for (idx = 0; idx < len; idx++) {
- pdf_obj *content_seg = pdf_deref_obj(pdf_get_array(contents, idx));
- if (!PDF_OBJ_STREAMTYPE(content_seg) ||
- pdf_concat_stream(content_new, content_seg) < 0) {
- pdf_release_obj(content_seg);
- pdf_release_obj(content_new);
- goto error;
- }
- pdf_release_obj(content_seg);
- }
- } else {
- goto error;
- }
-
- if (contents)
- pdf_release_obj(contents);
- contents = content_new;
- }
+ contents = get_page_content(pf, page);
+ pdf_release_obj(page);
+ page = NULL;
/*
* Add entries to contents stream dictionary.
@@ -604,13 +286,15 @@ static struct operator
int
pdf_copy_clip (FILE *image_file, int pageNo, double x_user, double y_user)
{
- pdf_obj *page_tree, *contents;
- int depth = 0, top = -1;
- const char *clip_path, *end_path;
- char *save_path, *temp;
- pdf_tmatrix M;
- double stack[6];
- pdf_file *pf;
+ pdf_obj *page_tree, *contents;
+ int depth = 0, top = -1;
+ const char *clip_path, *end_path;
+ char *save_path, *temp;
+ pdf_tmatrix M;
+ double stack[6];
+ pdf_rect bbox;
+ pdf_tmatrix mtrx;
+ pdf_file *pf;
pf = pdf_open(NULL, image_file);
if (!pf)
@@ -619,13 +303,13 @@ pdf_copy_clip (FILE *image_file, int pageNo, double x_user, double y_user)
pdf_dev_currentmatrix(&M);
pdf_invertmatrix(&M);
M.e += x_user; M.f += y_user;
- page_tree = pdf_get_page_obj (pf, pageNo, NULL, NULL);
+
+ page_tree = pdf_doc_get_page(pf, pageNo, 0, &bbox, &mtrx, NULL);
if (!page_tree) {
pdf_close(pf);
return -1;
}
-
- contents = pdf_get_page_content(page_tree);
+ contents = get_page_content(pf, page_tree);
pdf_release_obj(page_tree);
if (!contents) {
pdf_close(pf);
@@ -634,7 +318,7 @@ pdf_copy_clip (FILE *image_file, int pageNo, double x_user, double y_user)
pdf_doc_add_page_content(" ", 1);
- save_path = malloc(pdf_stream_length(contents) + 1);
+ save_path = NEW(pdf_stream_length(contents) + 1, char);
strncpy(save_path, (const char *) pdf_stream_dataptr(contents), pdf_stream_length(contents));
clip_path = save_path;
end_path = clip_path + pdf_stream_length(contents);
@@ -839,7 +523,7 @@ pdf_copy_clip (FILE *image_file, int pageNo, double x_user, double y_user)
}
}
}
- free(save_path);
+ RELEASE(save_path);
pdf_release_obj(contents);
pdf_close(pf);