diff options
Diffstat (limited to 'Build/source/texk/dvipdfmx/src/spc_pdfm.c')
-rw-r--r-- | Build/source/texk/dvipdfmx/src/spc_pdfm.c | 132 |
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 */ |