summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfmx/src/spc_pdfm.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvipdfmx/src/spc_pdfm.c')
-rw-r--r--Build/source/texk/dvipdfmx/src/spc_pdfm.c132
1 files changed, 61 insertions, 71 deletions
diff --git a/Build/source/texk/dvipdfmx/src/spc_pdfm.c b/Build/source/texk/dvipdfmx/src/spc_pdfm.c
index 67a66dba7c5..a18addfd7d0 100644
--- a/Build/source/texk/dvipdfmx/src/spc_pdfm.c
+++ b/Build/source/texk/dvipdfmx/src/spc_pdfm.c
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/dvipdfmx/src/spc_pdfm.c,v 1.26 2007/04/25 09:44:49 chofchof Exp $
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_pdfm.c,v 1.34 2008/05/18 12:05:22 chofchof Exp $
This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
@@ -36,6 +36,7 @@
#include "numbers.h"
#include "fontmap.h"
+#include "dpxfile.h"
#include "dpxutil.h"
#include "pdfobj.h"
@@ -331,8 +332,7 @@ spc_handler_pdfm_put (struct spc_env *spe, struct spc_arg *ap)
}
skip_white(&ap->curptr, ap->endptr);
-
- obj2 = parse_pdf_object(&ap->curptr, ap->endptr);
+ obj2 = parse_pdf_object(&ap->curptr, ap->endptr, NULL);
if (!obj2) {
spc_warn(spe, "Missing (an) object(s) to put into \"%s\"!", ident);
RELEASE(ident);
@@ -378,7 +378,7 @@ spc_handler_pdfm_put (struct spc_env *spe, struct spc_arg *ap)
/* dvipdfm */
pdf_add_array(obj1, pdf_link_obj(obj2));
while (ap->curptr < ap->endptr) {
- pdf_obj *obj3 = parse_pdf_object(&ap->curptr, ap->endptr);
+ pdf_obj *obj3 = parse_pdf_object(&ap->curptr, ap->endptr, NULL);
if (!obj3)
break;
pdf_add_array(obj1, obj3);
@@ -392,7 +392,7 @@ spc_handler_pdfm_put (struct spc_env *spe, struct spc_arg *ap)
break;
}
pdf_release_obj(obj2);
-
+ RELEASE(ident);
return error;
}
@@ -507,13 +507,13 @@ my_parse_pdf_dict (char **pp, char *endptr, struct tounicode *cd)
pdf_obj *dict;
if (cd->cmap_id < 0)
- return parse_pdf_dict(pp, endptr);
+ return parse_pdf_dict(pp, endptr, NULL);
/* :( */
if (cd->unescape_backslash)
dict = parse_pdf_tainted_dict(pp, endptr);
else {
- dict = parse_pdf_dict(pp, endptr);
+ dict = parse_pdf_dict(pp, endptr, NULL);
}
if (dict)
pdf_foreach_dict(dict, modstrings, cd);
@@ -543,7 +543,7 @@ spc_handler_pdfm_annot (struct spc_env *spe, struct spc_arg *args)
}
transform_info_clear(&ti);
- if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) {
+ if (spc_util_read_dimtrns(spe, &ti, args, NULL, 0) < 0) {
if (ident)
RELEASE(ident);
return -1;
@@ -560,7 +560,7 @@ spc_handler_pdfm_annot (struct spc_env *spe, struct spc_arg *args)
#ifdef ENABLE_TOUNICODE
annot_dict = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
#else
- annot_dict = parse_pdf_dict(&args->curptr, args->endptr);
+ annot_dict = parse_pdf_dict(&args->curptr, args->endptr, NULL);
#endif /* ENABLE_TOUNICODE */
if (!annot_dict) {
spc_warn(spe, "Could not find dictionary object.");
@@ -621,7 +621,7 @@ spc_handler_pdfm_bann (struct spc_env *spe, struct spc_arg *args)
#ifdef ENABLE_TOUNICODE
sd->annot_dict = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
#else
- sd->annot_dict = parse_pdf_dict(&args->curptr, args->endptr);
+ sd->annot_dict = parse_pdf_dict(&args->curptr, args->endptr, NULL);
#endif /* ENABLE_TOUNICODE */
if (!sd->annot_dict) {
spc_warn(spe, "Ignoring annotation with invalid dictionary.");
@@ -677,9 +677,9 @@ spc_handler_pdfm_bcolor (struct spc_env *spe, struct spc_arg *ap)
if (error)
spc_warn(spe, "Invalid color specification?");
else {
- pdf_color_push(); /* save currentcolor */
- pdf_dev_setcolor(&fc, 1);
- pdf_dev_setcolor(&sc, 0);
+ pdf_color_push(&sc, &fc); /* save currentcolor */
+ pdf_dev_set_strokingcolor(&sc);
+ pdf_dev_set_nonstrokingcolor(&fc);
}
return error;
@@ -705,8 +705,8 @@ spc_handler_pdfm_scolor (struct spc_env *spe, struct spc_arg *ap)
spc_warn(spe, "Invalid color specification?");
else {
pdf_color_set_default(&fc); /* ????? */
- pdf_dev_setcolor(&fc, 1);
- pdf_dev_setcolor(&sc, 0);
+ pdf_dev_set_strokingcolor(&sc);
+ pdf_dev_set_nonstrokingcolor(&fc);
}
return error;
@@ -727,7 +727,7 @@ spc_handler_pdfm_btrans (struct spc_env *spe, struct spc_arg *args)
transform_info ti;
transform_info_clear(&ti);
- if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) {
+ if (spc_util_read_dimtrns(spe, &ti, args, NULL, 0) < 0) {
return -1;
}
@@ -788,7 +788,7 @@ spc_handler_pdfm_outline (struct spc_env *spe, struct spc_arg *args)
}
skip_white(&args->curptr, args->endptr);
- tmp = parse_pdf_object(&args->curptr, args->endptr);
+ tmp = parse_pdf_object(&args->curptr, args->endptr, NULL);
if (!tmp) {
spc_warn(spe, "Missing number for outline item depth.");
return -1;
@@ -818,7 +818,7 @@ spc_handler_pdfm_outline (struct spc_env *spe, struct spc_arg *args)
#ifdef ENABLE_TOUNICODE
item_dict = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
#else
- item_dict = parse_pdf_dict(&args->curptr, args->endptr);
+ item_dict = parse_pdf_dict(&args->curptr, args->endptr, NULL);
#endif /* ENABLE_TOUNICODE */
if (!item_dict) {
spc_warn(spe, "Ignoring invalid dictionary.");
@@ -858,11 +858,11 @@ spc_handler_pdfm_article (struct spc_env *spe, struct spc_arg *args)
#ifdef ENABLE_TOUNICODE
info_dict = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
#else
- info_dict = parse_pdf_dict(&args->curptr, args->endptr);
+ info_dict = parse_pdf_dict(&args->curptr, args->endptr, NULL);
#endif /* ENABLE_TOUNICODE */
if (!info_dict) {
- RELEASE(ident);
spc_warn(spe, "Ignoring article with invalid info dictionary.");
+ RELEASE(ident);
return -1;
}
@@ -902,7 +902,7 @@ spc_handler_pdfm_bead (struct spc_env *spe, struct spc_arg *args)
/* If okay so far, try to get a bounding box */
transform_info_clear(&ti);
- if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) {
+ if (spc_util_read_dimtrns(spe, &ti, args, NULL, 0) < 0) {
RELEASE(article_name);
return -1;
}
@@ -935,7 +935,7 @@ spc_handler_pdfm_bead (struct spc_env *spe, struct spc_arg *args)
#ifdef ENABLE_TOUNICODE
article_info = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
#else
- article_info = parse_pdf_dict(&args->curptr, args->endptr);
+ article_info = parse_pdf_dict(&args->curptr, args->endptr, NULL);
#endif /* ENABLE_TOUNICODE */
if (!article_info) {
spc_warn(spe, "Error in reading dictionary.");
@@ -956,6 +956,7 @@ spc_handler_pdfm_bead (struct spc_env *spe, struct spc_arg *args)
page_no = pdf_doc_current_page_number();
pdf_doc_add_bead(article_name, NULL, page_no, &rect);
+ RELEASE(article_name);
return 0;
}
@@ -967,6 +968,7 @@ spc_handler_pdfm_image (struct spc_env *spe, struct spc_arg *args)
char *ident = NULL;
pdf_obj *fspec;
transform_info ti;
+ long page_no;
skip_white(&args->curptr, args->endptr);
if (args->curptr[0] == '@') {
@@ -980,14 +982,15 @@ spc_handler_pdfm_image (struct spc_env *spe, struct spc_arg *args)
}
transform_info_clear(&ti);
- if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) {
+ page_no = 1;
+ if (spc_util_read_dimtrns(spe, &ti, args, &page_no, 0) < 0) {
if (ident)
RELEASE(ident);
return -1;
}
skip_white(&args->curptr, args->endptr);
- fspec = parse_pdf_object(&args->curptr, args->endptr);
+ fspec = parse_pdf_object(&args->curptr, args->endptr, NULL);
if (!fspec) {
spc_warn(spe, "Missing filename string for pdf:image.");
if (ident)
@@ -996,10 +999,12 @@ spc_handler_pdfm_image (struct spc_env *spe, struct spc_arg *args)
} else if (!PDF_OBJ_STRINGTYPE(fspec)) {
spc_warn(spe, "Missing filename string for pdf:image.");
pdf_release_obj(fspec);
+ if (ident)
+ RELEASE(ident);
return -1;
}
- xobj_id = pdf_ximage_findresource(pdf_string_value(fspec));
+ xobj_id = pdf_ximage_findresource(pdf_string_value(fspec), page_no);
if (xobj_id < 0) {
spc_warn(spe, "Could not find image resource...");
pdf_release_obj(fspec);
@@ -1029,7 +1034,7 @@ spc_handler_pdfm_dest (struct spc_env *spe, struct spc_arg *args)
skip_white(&args->curptr, args->endptr);
- name = parse_pdf_object(&args->curptr, args->endptr);
+ name = parse_pdf_object(&args->curptr, args->endptr, NULL);
if (!name) {
spc_warn(spe, "PDF string expected for destination name but not found.");
return -1;
@@ -1039,7 +1044,7 @@ spc_handler_pdfm_dest (struct spc_env *spe, struct spc_arg *args)
return -1;
}
- array = parse_pdf_object(&args->curptr, args->endptr);
+ array = parse_pdf_object(&args->curptr, args->endptr, NULL);
if (!array) {
spc_warn(spe, "No destination not specified for pdf:dest.");
pdf_release_obj(name);
@@ -1069,7 +1074,7 @@ spc_handler_pdfm_names (struct spc_env *spe, struct spc_arg *args)
pdf_obj *category, *key, *value, *tmp;
int i, size;
- category = parse_pdf_object(&args->curptr, args->endptr);
+ category = parse_pdf_object(&args->curptr, args->endptr, NULL);
if (!category) {
spc_warn(spe, "PDF name expected but not found.");
return -1;
@@ -1079,7 +1084,7 @@ spc_handler_pdfm_names (struct spc_env *spe, struct spc_arg *args)
return -1;
}
- tmp = parse_pdf_object(&args->curptr, args->endptr);
+ tmp = parse_pdf_object(&args->curptr, args->endptr, NULL);
if (!tmp) {
spc_warn(spe, "PDF object expected but not found.");
pdf_release_obj(category);
@@ -1114,7 +1119,7 @@ spc_handler_pdfm_names (struct spc_env *spe, struct spc_arg *args)
pdf_release_obj(tmp);
} else if (PDF_OBJ_STRINGTYPE(tmp)) {
key = tmp;
- value = parse_pdf_object(&args->curptr, args->endptr);
+ value = parse_pdf_object(&args->curptr, args->endptr, NULL);
if (!value) {
pdf_release_obj(category);
pdf_release_obj(key);
@@ -1153,7 +1158,7 @@ spc_handler_pdfm_docinfo (struct spc_env *spe, struct spc_arg *args)
#ifdef ENABLE_TOUNICODE
dict = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
#else
- dict = parse_pdf_dict(&args->curptr, args->endptr);
+ dict = parse_pdf_dict(&args->curptr, args->endptr, NULL);
#endif /* ENABLE_TOUNICODE */
if (!dict) {
spc_warn(spe, "Dictionary object expected but not found.");
@@ -1179,7 +1184,7 @@ spc_handler_pdfm_docview (struct spc_env *spe, struct spc_arg *args)
#ifdef ENABLE_TOUNICODE
dict = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
#else
- dict = parse_pdf_dict(&args->curptr, args->endptr);
+ dict = parse_pdf_dict(&args->curptr, args->endptr, NULL);
#endif /* ENABLE_TOUNICODE */
if (!dict) {
spc_warn(spe, "Dictionary object expected but not found.");
@@ -1230,10 +1235,10 @@ spc_handler_pdfm_object (struct spc_env *spe, struct spc_arg *args)
return -1;
}
- object = parse_pdf_object(&args->curptr, args->endptr);
+ object = parse_pdf_object(&args->curptr, args->endptr, NULL);
if (!object) {
- RELEASE(ident);
spc_warn(spe, "Could not find an object definition for \"%s\".", ident);
+ RELEASE(ident);
return -1;
} else {
spc_push_object(ident, object);
@@ -1324,7 +1329,7 @@ spc_handler_pdfm_fstream (struct spc_env *spe, struct spc_arg *args)
{
pdf_obj *fstream;
long stream_len, nb_read;
- char *ident, *filename, *fullname;
+ char *ident, *filename;
pdf_obj *tmp;
FILE *fp;
@@ -1338,7 +1343,7 @@ spc_handler_pdfm_fstream (struct spc_env *spe, struct spc_arg *args)
skip_white(&args->curptr, args->endptr);
- tmp = parse_pdf_object(&args->curptr, args->endptr);
+ tmp = parse_pdf_object(&args->curptr, args->endptr, NULL);
if (!tmp) {
spc_warn(spe, "Missing filename string for pdf:fstream.");
RELEASE(ident);
@@ -1358,32 +1363,17 @@ spc_handler_pdfm_fstream (struct spc_env *spe, struct spc_arg *args)
return -1;
}
- fstream = pdf_new_stream(STREAM_COMPRESS);
+ fstream = pdf_new_stream(STREAM_COMPRESS);
-#ifdef MIKTEX
- if (!miktex_find_app_input_file("dvipdfm", filename, work_buffer))
- fullname = NULL;
- else {
- fullname = work_buffer;
- }
-#else /* !MIKTEX */
- fullname = kpse_find_file(filename, kpse_program_binary_format, 0);
-#endif
- pdf_release_obj(tmp);
- if (!fullname) {
- spc_warn(spe, "Could not find file.");
- RELEASE(ident);
- pdf_release_obj(fstream);
- return -1;
- }
-
- fp = MFOPEN(fullname, FOPEN_RBIN_MODE);
+ fp = DPXFOPEN(filename, DPX_RES_TYPE_BINARY);
if (!fp) {
- spc_warn(spe, "Could not open file: %s", fullname);
- RELEASE(ident);
+ spc_warn(spe, "Could not open file: %s", filename);
pdf_release_obj(fstream);
+ pdf_release_obj(tmp);
+ RELEASE(ident);
return -1;
}
+ pdf_release_obj(tmp);
stream_len = 0;
while ((nb_read =
@@ -1406,11 +1396,11 @@ spc_handler_pdfm_fstream (struct spc_env *spe, struct spc_arg *args)
stream_dict = pdf_stream_dict(fstream);
- tmp = parse_pdf_dict(&args->curptr, args->endptr);
+ tmp = parse_pdf_dict(&args->curptr, args->endptr, NULL);
if (!tmp) {
spc_warn(spe, "Parsing dictionary failed.");
- RELEASE(ident);
pdf_release_obj(fstream);
+ RELEASE(ident);
return -1;
}
if (pdf_lookup_dict(tmp, "Length")) {
@@ -1462,7 +1452,7 @@ spc_handler_pdfm_bform (struct spc_env *spe, struct spc_arg *args)
}
transform_info_clear(&ti);
- if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) {
+ if (spc_util_read_dimtrns(spe, &ti, args, NULL, 0) < 0) {
RELEASE(ident);
return -1;
}
@@ -1522,7 +1512,7 @@ spc_handler_pdfm_eform (struct spc_env *spe, struct spc_arg *args)
/* An extra dictionary after exobj must be merged to /Resources.
* Please use pdf:put @resources (before pdf:exobj) instead.
*/
- garbage = parse_pdf_dict(&args->curptr, args->endptr);
+ garbage = parse_pdf_dict(&args->curptr, args->endptr, NULL);
if (garbage) {
resource = pdf_doc_current_page_resources();
pdf_merge_dict(resource, garbage);
@@ -1575,7 +1565,7 @@ spc_handler_pdfm_uxobj (struct spc_env *spe, struct spc_arg *args)
transform_info_clear(&ti);
if (args->curptr < args->endptr) {
- if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) {
+ if (spc_util_read_dimtrns(spe, &ti, args, NULL, 0) < 0) {
RELEASE(ident);
return -1;
}
@@ -1587,7 +1577,7 @@ spc_handler_pdfm_uxobj (struct spc_env *spe, struct spc_arg *args)
*/
xobj_id = findresource(sd, ident);
if (xobj_id < 0) {
- xobj_id = pdf_ximage_findresource(ident);
+ xobj_id = pdf_ximage_findresource(ident, 0);
if (xobj_id < 0) {
spc_warn(spe, "Specified (image) object doesn't exist: %s", ident);
RELEASE(ident);
@@ -1676,7 +1666,7 @@ spc_handler_pdfm_mapline (struct spc_env *spe, struct spc_arg *ap)
case '+':
mrec = NEW(1, fontmap_rec);
pdf_init_fontmap_record(mrec);
- error = pdf_read_fontmap_line(mrec, ap->curptr, (long) (ap->endptr - ap->curptr));
+ error = pdf_read_fontmap_line(mrec, ap->curptr, (long) (ap->endptr - ap->curptr), is_pdfm_mapline(ap->curptr));
if (error)
spc_warn(spe, "Invalid fontmap line.");
else {
@@ -1688,7 +1678,7 @@ spc_handler_pdfm_mapline (struct spc_env *spe, struct spc_arg *ap)
default:
mrec = NEW(1, fontmap_rec);
pdf_init_fontmap_record(mrec);
- error = pdf_read_fontmap_line(mrec, ap->curptr, (long) (ap->endptr - ap->curptr));
+ error = pdf_read_fontmap_line(mrec, ap->curptr, (long) (ap->endptr - ap->curptr), is_pdfm_mapline(ap->curptr));
if (error)
spc_warn(spe, "Invalid fontmap line.");
else {
@@ -1735,6 +1725,7 @@ spc_handler_pdfm_mapfile (struct spc_env *spe, struct spc_arg *args)
} else {
error = pdf_load_fontmap_file(mapfile, mode);
}
+ RELEASE(mapfile);
return error;
}
@@ -1746,7 +1737,6 @@ spc_handler_pdfm_tounicode (struct spc_env *spe, struct spc_arg *args)
{
struct spc_pdf_ *sd = &_pdf_stat;
char *cmap_name;
- int error = 0;
/* First clear */
sd->cd.cmap_id = -1;
@@ -1766,19 +1756,20 @@ spc_handler_pdfm_tounicode (struct spc_env *spe, struct spc_arg *args)
cmap_name = parse_ident(&args->curptr, args->endptr);
if (!cmap_name) {
spc_warn(spe, "Missing ToUnicode mapping name...");
- return -1;
+ return -1;
}
sd->cd.cmap_id = CMap_cache_find(cmap_name);
if (sd->cd.cmap_id < 0) {
spc_warn(spe, "Failed to load ToUnicode mapping: %s", cmap_name);
- error = -1;
+ RELEASE(cmap_name);
+ return -1;
}
/* Shift-JIS like encoding may contain backslash in 2nd byte.
* WARNING: This will add nasty extension to PDF parser.
*/
- if (!error && sd->cd.cmap_id >= 0) {
+ if (sd->cd.cmap_id >= 0) {
if (strstr(cmap_name, "RKSJ") ||
strstr(cmap_name, "B5") ||
strstr(cmap_name, "GBK") ||
@@ -1786,8 +1777,7 @@ spc_handler_pdfm_tounicode (struct spc_env *spe, struct spc_arg *args)
sd->cd.unescape_backslash = 1;
}
RELEASE(cmap_name);
-
- return error;
+ return 0;
}
#endif /* ENABLE_TOUNICODE */