summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfm-x/src/pdfobj.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvipdfm-x/src/pdfobj.c')
-rw-r--r--Build/source/texk/dvipdfm-x/src/pdfobj.c107
1 files changed, 104 insertions, 3 deletions
diff --git a/Build/source/texk/dvipdfm-x/src/pdfobj.c b/Build/source/texk/dvipdfm-x/src/pdfobj.c
index 779baf18497..a5ec7c3bd03 100644
--- a/Build/source/texk/dvipdfm-x/src/pdfobj.c
+++ b/Build/source/texk/dvipdfm-x/src/pdfobj.c
@@ -634,6 +634,7 @@ 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.
@@ -648,9 +649,10 @@ 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
+ * This doesn't really copy the object, but allows it to be used without
* fear that somebody else will free it.
*/
pdf_obj *
@@ -704,6 +706,7 @@ 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.
*/
@@ -717,6 +720,7 @@ pdf_new_undefined (void)
return result;
}
+#endif
pdf_obj *
pdf_new_null (void)
@@ -2140,6 +2144,104 @@ pdf_release_obj (pdf_obj *object)
}
}
+#ifdef XETEX
+/* Copy object data without changing object label. */
+void
+pdf_copy_object (pdf_obj *dst, pdf_obj *src)
+{
+ if (!dst || !src)
+ return;
+
+ switch (dst->type) {
+ case PDF_BOOLEAN: release_boolean(dst->data); break;
+ case PDF_NULL: release_null(dst->data); break;
+ case PDF_NUMBER: release_number(dst->data); break;
+ case PDF_STRING: release_string(dst->data); break;
+ case PDF_NAME: release_name(dst->data); break;
+ case PDF_ARRAY: release_array(dst->data); break;
+ case PDF_DICT: release_dict(dst->data); break;
+ case PDF_STREAM: release_stream(dst->data); break;
+ case PDF_INDIRECT: release_indirect(dst->data); break;
+ }
+
+ dst->type = src->type;
+ switch (src->type) {
+ case PDF_BOOLEAN:
+ dst->data = NEW(1, pdf_boolean);
+ pdf_set_boolean(dst, pdf_boolean_value(src));
+ break;
+ case PDF_NULL:
+ dst->data = NULL;
+ break;
+ case PDF_NUMBER:
+ dst->data = NEW(1, pdf_number);
+ pdf_set_number(dst, pdf_number_value(src));
+ break;
+ case PDF_STRING:
+ dst->data = NEW(1, pdf_string);
+ pdf_set_string(dst,
+ pdf_string_value(src),
+ pdf_string_length(src));
+ break;
+ case PDF_NAME:
+ dst->data = NEW(1, pdf_name);
+ pdf_set_name(dst, pdf_name_value(src));
+ break;
+ case PDF_ARRAY:
+ {
+ pdf_array *data;
+ unsigned long i;
+
+ dst->data = data = NEW(1, pdf_array);
+ data->size = 0;
+ data->max = 0;
+ data->values = NULL;
+ for (i = 0; i < pdf_array_length(src); i++) {
+ pdf_add_array(dst, pdf_link_obj(pdf_get_array(src, i)));
+ }
+ }
+ break;
+ case PDF_DICT:
+ {
+ pdf_dict *data;
+
+ dst->data = data = NEW(1, pdf_dict);
+ data->key = NULL;
+ data->value = NULL;
+ data->next = NULL;
+ pdf_merge_dict(dst, src);
+ }
+ break;
+ case PDF_STREAM:
+ {
+ pdf_stream *data;
+
+ dst->data = data = NEW(1, pdf_stream);
+ data->dict = pdf_new_dict();
+ data->_flags = ((pdf_stream *)src->data)->_flags;
+ data->stream_length = 0;
+ data->max_length = 0;
+
+ pdf_add_stream(dst, pdf_stream_dataptr(src), pdf_stream_length(src));
+ pdf_merge_dict(data->dict, pdf_stream_dict(src));
+ }
+ break;
+ case PDF_INDIRECT:
+ {
+ pdf_indirect *data;
+
+ dst->data = data = NEW(1, pdf_indirect);
+ data->pf = ((pdf_indirect *) (src->data))->pf;
+ data->label = ((pdf_indirect *) (src->data))->label;
+ data->generation = ((pdf_indirect *) (src->data))->generation;
+ }
+ break;
+ }
+
+ return;
+}
+#endif
+
static int
backup_line (FILE *pdf_input_file)
{
@@ -2931,10 +3033,9 @@ pdf_open (const char *ident, FILE *file)
if (pf) {
pf->file = file;
} else {
- int version;
pdf_obj *new_version;
+ int version = check_for_pdf_version(file);
- version = check_for_pdf_version(file);
if (version < 0) {
WARN("Not a PDF file.");
return NULL;