From a95124f73754f00f40705b40ff513e5f21db45fd Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Thu, 27 Mar 2008 11:18:16 +0000 Subject: xdvipdfmx update from xetex svn r.633 git-svn-id: svn://tug.org/texlive/trunk@7186 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/texk/xdvipdfmx/src/cff_dict.c | 25 +- Build/source/texk/xdvipdfmx/src/dvi.c | 35 ++- Build/source/texk/xdvipdfmx/src/dvipdfmx.c | 14 +- Build/source/texk/xdvipdfmx/src/epdf.c | 420 +++++++++++++++------------- Build/source/texk/xdvipdfmx/src/epdf.h | 3 +- Build/source/texk/xdvipdfmx/src/fontmap.c | 39 +-- Build/source/texk/xdvipdfmx/src/fontmap.h | 2 +- Build/source/texk/xdvipdfmx/src/mpost.c | 24 +- Build/source/texk/xdvipdfmx/src/pdfcolor.c | 210 +++----------- Build/source/texk/xdvipdfmx/src/pdfcolor.h | 16 +- Build/source/texk/xdvipdfmx/src/pdfdev.c | 173 ++++++++++-- Build/source/texk/xdvipdfmx/src/pdfdev.h | 9 +- Build/source/texk/xdvipdfmx/src/pdfdoc.c | 33 ++- Build/source/texk/xdvipdfmx/src/pdfdoc.h | 7 +- Build/source/texk/xdvipdfmx/src/pdfdraw.c | 349 +++++++++++------------ Build/source/texk/xdvipdfmx/src/pdfobj.c | 52 ++-- Build/source/texk/xdvipdfmx/src/pdfobj.h | 7 +- Build/source/texk/xdvipdfmx/src/pdfximage.c | 50 ++-- Build/source/texk/xdvipdfmx/src/pdfximage.h | 8 +- Build/source/texk/xdvipdfmx/src/spc_color.c | 28 +- Build/source/texk/xdvipdfmx/src/spc_dvips.c | 12 +- Build/source/texk/xdvipdfmx/src/spc_html.c | 2 +- Build/source/texk/xdvipdfmx/src/spc_misc.c | 2 +- Build/source/texk/xdvipdfmx/src/spc_pdfm.c | 61 ++-- Build/source/texk/xdvipdfmx/src/spc_util.c | 25 +- Build/source/texk/xdvipdfmx/src/spc_util.h | 4 +- 26 files changed, 851 insertions(+), 759 deletions(-) (limited to 'Build/source/texk/xdvipdfmx/src') diff --git a/Build/source/texk/xdvipdfmx/src/cff_dict.c b/Build/source/texk/xdvipdfmx/src/cff_dict.c index e0a6454711d..37a27ef90f9 100644 --- a/Build/source/texk/xdvipdfmx/src/cff_dict.c +++ b/Build/source/texk/xdvipdfmx/src/cff_dict.c @@ -301,9 +301,6 @@ static void add_dict (cff_dict *dict, if (dict_operator[id].opname == NULL || argtype < 0) { *status = CFF_ERROR_PARSE_ERROR; return; - } else if (stack_top < 1) { - *status = CFF_ERROR_STACK_UNDERFLOW; - return; } if (dict->count >= dict->max) { @@ -317,20 +314,30 @@ static void add_dict (cff_dict *dict, argtype == CFF_TYPE_BOOLEAN || argtype == CFF_TYPE_SID || argtype == CFF_TYPE_OFFSET) { + /* check for underflow here, as exactly one operand is expected */ + if (stack_top < 1) { + *status = CFF_ERROR_STACK_UNDERFLOW; + return; + } stack_top--; (dict->entries)[dict->count].count = 1; (dict->entries)[dict->count].values = NEW(1, double); (dict->entries)[dict->count].values[0] = arg_stack[stack_top]; + dict->count += 1; } else { - (dict->entries)[dict->count].count = stack_top; - (dict->entries)[dict->count].values = NEW(stack_top, double); - while (stack_top > 0) { - stack_top--; - (dict->entries)[dict->count].values[stack_top] = arg_stack[stack_top]; + /* just ignore operator if there were no operands provided; + don't treat this as underflow (e.g. StemSnapV in TemporaLGCUni-Italic.otf) */ + if (stack_top > 0) { + (dict->entries)[dict->count].count = stack_top; + (dict->entries)[dict->count].values = NEW(stack_top, double); + while (stack_top > 0) { + stack_top--; + (dict->entries)[dict->count].values[stack_top] = arg_stack[stack_top]; + } + dict->count += 1; } } - dict->count += 1; *data += 1; return; diff --git a/Build/source/texk/xdvipdfmx/src/dvi.c b/Build/source/texk/xdvipdfmx/src/dvi.c index 50ad1687ccd..d56bbf8bbfc 100644 --- a/Build/source/texk/xdvipdfmx/src/dvi.c +++ b/Build/source/texk/xdvipdfmx/src/dvi.c @@ -128,8 +128,9 @@ static struct loaded_font FT_Face ft_face; unsigned short *glyph_widths; int layout_dir; - double extend; - double slant; + float extend; + float slant; + float embolden; #endif } *loaded_fonts = NULL; static int num_loaded_fonts = 0, max_loaded_fonts = 0; @@ -157,6 +158,7 @@ static struct font_def int layout_dir; /* 1 = vertical, 0 = horizontal */ int extend; int slant; + int embolden; #endif } *def_fonts = NULL; @@ -169,6 +171,7 @@ static struct font_def #define XDV_FLAG_VARIATIONS 0x0800 #define XDV_FLAG_EXTEND 0x1000 #define XDV_FLAG_SLANT 0x2000 +#define XDV_FLAG_EMBOLDEN 0x4000 #endif static int num_def_fonts = 0, max_def_fonts = 0; @@ -614,6 +617,7 @@ read_font_record (SIGNED_QUAD tex_id) def_fonts[num_def_fonts].layout_dir = 0; def_fonts[num_def_fonts].extend = 0x00010000; /* 1.0 */ def_fonts[num_def_fonts].slant = 0; + def_fonts[num_def_fonts].embolden = 0; #endif num_def_fonts++; @@ -685,6 +689,10 @@ read_native_font_record (SIGNED_QUAD tex_id) def_fonts[num_def_fonts].slant = get_signed_quad(dvi_file); else def_fonts[num_def_fonts].slant = 0; + if (flags & XDV_FLAG_EMBOLDEN) + def_fonts[num_def_fonts].embolden = get_signed_quad(dvi_file); + else + def_fonts[num_def_fonts].embolden = 0; num_def_fonts++; } else { ERROR("Unknown native_font flags."); @@ -1031,12 +1039,12 @@ dvi_locate_font (const char *tfm_name, spt_t ptsize) #ifdef XETEX static int dvi_locate_native_font (const char *ps_name, const char *fam_name, - const char *sty_name, spt_t ptsize, int layout_dir, int extend, int slant) + const char *sty_name, spt_t ptsize, int layout_dir, int extend, int slant, int embolden) { int cur_id = -1; fontmap_rec *mrec; int i; - char *fontmap_key = malloc(strlen(ps_name) + 30); // CHECK this is enough + char *fontmap_key = malloc(strlen(ps_name) + 40); // CHECK this is enough if (verbose) MESG("<%s(%s:%s)@%.2fpt", ps_name, fam_name, sty_name, ptsize * dvi2pts); @@ -1045,10 +1053,10 @@ dvi_locate_native_font (const char *ps_name, const char *fam_name, cur_id = num_loaded_fonts++; - sprintf(fontmap_key, "%s/%c/%d/%d", ps_name, layout_dir == 0 ? 'H' : 'V', extend, slant); + sprintf(fontmap_key, "%s/%c/%d/%d/%d", ps_name, layout_dir == 0 ? 'H' : 'V', extend, slant, embolden); mrec = pdf_lookup_fontmap_record(fontmap_key); if (mrec == NULL) { - if (pdf_load_native_font(ps_name, fam_name, sty_name, layout_dir, extend, slant) == -1) { + if (pdf_load_native_font(ps_name, fam_name, sty_name, layout_dir, extend, slant, embolden) == -1) { ERROR("Cannot proceed without the \"native\" font: %s (%s %s)...", ps_name, fam_name, sty_name); } @@ -1073,6 +1081,7 @@ dvi_locate_native_font (const char *ps_name, const char *fam_name, loaded_fonts[cur_id].layout_dir = layout_dir; loaded_fonts[cur_id].extend = mrec->opt.extend; loaded_fonts[cur_id].slant = mrec->opt.slant; + loaded_fonts[cur_id].embolden = mrec->opt.bold; if (verbose) MESG(">"); @@ -1710,7 +1719,8 @@ do_fnt (SIGNED_QUAD tex_id) def_fonts[i].point_size, def_fonts[i].layout_dir, def_fonts[i].extend, - def_fonts[i].slant); + def_fonts[i].slant, + def_fonts[i].embolden); } else { font_id = dvi_locate_font(def_fonts[i].font_name, def_fonts[i].point_size); @@ -1929,13 +1939,14 @@ do_glyph_array (int yLocsPresent) if (font->rgba_color != 0xffffffff) { pdf_color color; - pdf_color_push(); +// pdf_color_push(); pdf_color_rgbcolor(&color, (double)((unsigned char)(font->rgba_color >> 24) & 0xff) / 255, (double)((unsigned char)(font->rgba_color >> 16) & 0xff) / 255, (double)((unsigned char)(font->rgba_color >> 8) & 0xff) / 255); - pdf_dev_setcolor(&color, 0); /* stroke color */ - pdf_dev_setcolor(&color, 1); /* fill color */ + pdf_color_push(&color, &color); +// pdf_dev_setcolor(&color, 0); /* stroke color */ +// pdf_dev_setcolor(&color, 1); /* fill color */ } for (i = 0; i < slen; i++) { glyph_id = get_buffered_unsigned_pair(); /* freetype glyph index */ @@ -2037,9 +2048,7 @@ do_pic_file() transform is a 3x2 affine transform matrix expressed in fixed-point values */ - if (page_no > 0) - --page_no; /* convert 1-based page number to 0-based index */ - xobj_id = pdf_ximage_findresource(path, page_no, pdf_box); + xobj_id = pdf_ximage_findresource(path, page_no/*, pdf_box*/); if (xobj_id >= 0) { /* FIXME: this seems to work for 72dpi JPEGs, but isn't right for others; need to take the actual image resolution into account in pdf_dev_put_image, diff --git a/Build/source/texk/xdvipdfmx/src/dvipdfmx.c b/Build/source/texk/xdvipdfmx/src/dvipdfmx.c index 912cab41a4d..2eeb6e10972 100644 --- a/Build/source/texk/xdvipdfmx/src/dvipdfmx.c +++ b/Build/source/texk/xdvipdfmx/src/dvipdfmx.c @@ -72,6 +72,8 @@ static long opt_flags = 0; #define OPT_FONTMAP_FIRST_MATCH (1 << 3) #define OPT_NO_OBJSTM (1 << 4) +static int do_objstm; + static char ignore_colors = 0; static double annot_grow = 0.0; static int bookmark_open = 0; @@ -137,7 +139,7 @@ usage (int exit_code) fprintf (stdout, "\nThis is %s-%s by Jonathan Kew and Jin-Hwan Cho,\n", PACKAGE, VERSION); fprintf (stdout, "an extended version of DVIPDFMx, which in turn was\n"); fprintf (stdout, "an extended version of dvipdfm-0.13.2c developed by Mark A. Wicks.\n"); - fprintf (stdout, "\nCopyright (c) 2006-07 SIL International and Jin-Hwan Cho.\n"); + fprintf (stdout, "\nCopyright (c) 2006-2008 SIL International and Jin-Hwan Cho.\n"); fprintf (stdout, "\nThis is free software; you can redistribute it and/or modify\n"); fprintf (stdout, "it under the terms of the GNU General Public License as published by\n"); fprintf (stdout, "the Free Software Foundation; either version 2 of the License, or\n"); @@ -601,8 +603,10 @@ read_config_file (const char *config) if (!(fp = MFOPEN (fullname, FOPEN_R_MODE))) { WARN("Could not open config file \"%s\".", fullname); + RELEASE(fullname); return; } + RELEASE(fullname); while ((start = mfgets (work_buffer, WORK_BUFFER_SIZE, fp)) != NULL) { char *argv[2]; int argc; @@ -694,7 +698,6 @@ do_dvi_pages (void) mediabox.urx = paper_width; mediabox.ury = paper_height; - pdf_doc_set_creator (dvi_comment()); pdf_doc_set_mediabox(0, &mediabox); /* Root node */ for (i = 0; i < num_page_ranges && dvi_npages() > 0; i++) { @@ -859,8 +862,7 @@ main (int argc, char *argv[]) pdf_set_version(4); } - if (!(opt_flags & OPT_NO_OBJSTM)) - pdf_enable_objstm(); + do_objstm = !(opt_flags & OPT_NO_OBJSTM); if (mp_mode) { x_offset = 0.0; @@ -872,6 +874,8 @@ main (int argc, char *argv[]) if (dvi2pts == 0.0) ERROR("dvi_init() failed!"); + pdf_doc_set_creator(dvi_comment()); + dvi_scan_paper_size(0, &paper_width, &paper_height, &x_offset, &y_offset, &landscape_mode); if (landscape_mode) { SWAP(paper_width, paper_height); @@ -885,7 +889,7 @@ main (int argc, char *argv[]) * annot_grow: Margin of annotation. * bookmark_open: Miximal depth of open bookmarks. */ - pdf_open_document(pdf_filename, do_encryption, + pdf_open_document(pdf_filename, do_encryption, do_objstm, paper_width, paper_height, annot_grow, bookmark_open); /* Ignore_colors placed here since diff --git a/Build/source/texk/xdvipdfmx/src/epdf.c b/Build/source/texk/xdvipdfmx/src/epdf.c index e653a81e972..d01421d7635 100644 --- a/Build/source/texk/xdvipdfmx/src/epdf.c +++ b/Build/source/texk/xdvipdfmx/src/epdf.c @@ -1,28 +1,27 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/epdf.c,v 1.15 2007/02/28 05:06:49 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/epdf.c,v 1.18 2008/02/13 20:22:21 matthias Exp $ - This is dvipdfm, a DVI to PDF translator. - Copyright (C) 1998, 1999 by Mark A. Wicks + This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. + + Copyright (C) 2007 by Jin-Hwan Cho and Shunsaku Hirata, + the dvipdfmx project team + + Copyright (C) 1998, 1999 by Mark A. Wicks This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - The author may be contacted via the e-mail address - - mwicks@kettering.edu + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ - /* * Concatinating content streams are only supported for streams that only uses * single FlateDecode filter, i.e., @@ -145,14 +144,16 @@ print_bbox_info (pdf_obj *rect, const char *type, pdf_obj *crop_box) pdf_number_value(pdf_get_array(crop_box, 3))); } -static pdf_obj** -pdf_get_page_obj (FILE *image_file, int page_index) +static pdf_obj* +pdf_get_page_obj (FILE *image_file, long page_no, pdf_obj **ret_bbox, pdf_obj **ret_resources) { - pdf_obj **page_branch, *climber; - int size = 10, depth = 1; - int page_count; + pdf_obj *page_tree, *resources = NULL, *rotate = NULL, *bbox = NULL; + long page_count, page_idx; - climber = NULL; + /* + * Get Page Tree. + */ + page_tree = NULL; { pdf_obj *trailer, *catalog; pdf_obj *markinfo, *tmp; @@ -160,22 +161,22 @@ pdf_get_page_obj (FILE *image_file, int page_index) trailer = pdf_open(image_file); if (!trailer) { WARN("Trailer not found! Corrupt PDF file?"); - pdf_close(); - return 0; + return NULL; } if (pdf_lookup_dict(trailer, "Encrypt")) { WARN("This PDF document is encrypted."); pdf_release_obj(trailer); - pdf_close(); - return 0; + return NULL; } catalog = pdf_deref_obj(pdf_lookup_dict(trailer, "Root")); - if (!catalog) { - WARN("Catalog isn't where I expect it."); - pdf_close(); - return 0; + 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); @@ -186,84 +187,161 @@ pdf_get_page_obj (FILE *image_file, int page_index) if (tmp && pdf_boolean_value(tmp)) { WARN("Tagged PDF not supported."); pdf_release_obj(catalog); - pdf_close(); - return 0; + return NULL; } } - climber = pdf_deref_obj(pdf_lookup_dict(catalog, "Pages")); + page_tree = pdf_deref_obj(pdf_lookup_dict(catalog, "Pages")); pdf_release_obj(catalog); } - if (!climber) { + if (!page_tree) { WARN("Page tree not found."); - pdf_close(); - return 0; + return NULL; } - page_count = (int)pdf_number_value(pdf_lookup_dict(climber, "Count")); - if (page_index >= page_count) - page_index = page_count - 1; - else if (page_index < 0) { - page_index = page_count + page_index; - if (page_index < 0) - page_index = 0; + /* + * Negative page numbers are counted from the back. + */ + { + long 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); + page_idx = page_idx < 0 ? 0 : count - 1; + } + page_no = page_idx + 1; } /* - * Seek required page. Get Media/Crop Box. + * Seek correct page. Get Media/Crop Box. * Media box and resources can be inherited. */ { - pdf_obj *kids_ref, *kids, *tmp; - page_branch = malloc(size * sizeof(pdf_obj*)); - page_branch[0] = climber; - while ((kids_ref = pdf_lookup_dict(climber, "Kids")) != NULL) { - /* page_tree is a Pages object: figure out which of its Kids we need */ - int kid_index; - if (size < depth) { - size += 10; - page_branch = realloc(page_branch, size * sizeof(pdf_obj*)); + 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) { + long kids_length, i; + + if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "MediaBox")))) { + if (bbox) + pdf_release_obj(bbox); + bbox = tmp; } - kids = pdf_deref_obj(kids_ref); - for (kid_index = 0; ; ++kid_index) { - /* pdf_release_obj(climber); */ - climber = pdf_deref_obj(pdf_get_array(kids, kid_index)); - /* page_tree might be a Page or another Pages node */ - tmp = pdf_lookup_dict(climber, "Count"); - if (tmp) { - /* it's a subtree: check if the required page is within this tree */ - page_count = (int)pdf_number_value(tmp); - if (page_index < page_count) { - page_branch[depth++] = climber; - break; - } else - page_index -= page_count; + 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 { - /* it's a page: break if it's the one we want */ - if (page_index == 0) { - page_branch[depth++] = climber; - break; - } else - --page_index; + } + if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "TrimBox")))) { + if (!rect_equal(tmp, bbox)) { + if (bbox) + pdf_release_obj(bbox); + bbox = 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; + } + } + 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++) { + long 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; } - return page_branch; } -} -static void -pdf_free_page_obj (pdf_obj** page_branch) -{ - int i = 0; - while (!strcmp(pdf_name_value(pdf_lookup_dict(page_branch[i], "Type")),"Pages")) - { - pdf_release_obj(page_branch[i++]); + 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) { + if (pdf_number_value(rotate) != 0.0) + WARN("<< /Rotate %d >> found. (Not supported yet)", (int)pdf_number_value(rotate)); + pdf_release_obj(rotate); + rotate = NULL; } - pdf_release_obj(page_branch[i]); - free(page_branch); + + if (ret_bbox != NULL) + *ret_bbox = bbox; + if (ret_resources != NULL) + *ret_resources = resources; + + return page_tree; } static pdf_obj* @@ -272,15 +350,19 @@ pdf_get_page_content (pdf_obj* page) pdf_obj *contents, *content_new; contents = pdf_deref_obj(pdf_lookup_dict(page, "Contents")); - if (!contents) { - return 0; - } + if (!contents) + return NULL; - /* - * Concatinate all content streams. - */ - if (PDF_OBJ_ARRAYTYPE(contents)) { - pdf_obj *content_seg; + if (pdf_obj_typeof(contents) == PDF_NULL) { + /* empty page */ + pdf_release_obj(contents); + /* TODO: better don't include anything if the page is empty */ + contents = pdf_new_stream(0); + } else if (PDF_OBJ_ARRAYTYPE(contents)) { + /* + * Concatenate all content streams. + */ + pdf_obj *content_seg, *content_new; int idx = 0; content_new = pdf_new_stream(STREAM_COMPRESS); for (;;) { @@ -291,12 +373,16 @@ pdf_get_page_content (pdf_obj* page) /* 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); - return 0; + pdf_release_obj(contents); + return NULL; } else if (concat_stream(content_new, content_seg) < 0) { - WARN("Could not handle content stream with multiple segment."); + WARN("Could not handle content stream with multiple segments."); + pdf_release_obj(content_seg); pdf_release_obj(content_new); - return 0; + pdf_release_obj(contents); + return NULL; } pdf_release_obj(content_seg); idx++; @@ -307,7 +393,7 @@ pdf_get_page_content (pdf_obj* page) if (!PDF_OBJ_STREAMTYPE(contents)) { WARN("Page content not a stream object. Broken PDF file?"); pdf_release_obj(contents); - return 0; + return NULL; } /* Flate the contents if necessary. */ content_new = pdf_new_stream(STREAM_COMPRESS); @@ -315,123 +401,63 @@ pdf_get_page_content (pdf_obj* page) WARN("Could not handle a content stream."); pdf_release_obj(contents); pdf_release_obj(content_new); - return 0; + return NULL; } pdf_release_obj(contents); contents = content_new; } - if (!contents) - return 0; + return contents; } int -pdf_include_page (pdf_ximage *ximage, FILE *image_file, int page_index, int pdf_box) +pdf_include_page (pdf_ximage *ximage, FILE *image_file) { xform_info info; - pdf_obj *contents, *contents_dict; - pdf_obj **page_tree, *tmp; - pdf_obj *bbox, *crop_box, *resources, *rotate, *matrix; - int depth = 0; + pdf_obj *contents, *contents_dict; + pdf_obj *page_tree; + pdf_obj *matrix; + pdf_obj *bbox = NULL, *resources = NULL; + long page_no, page_idx; pdf_ximage_init_form_info(&info); + /* * Get Page Tree. */ - page_tree = pdf_get_page_obj (image_file, page_index); - if (!page_tree) { - pdf_close(); - return -1; - } - - bbox = crop_box = rotate = NULL; - resources = pdf_new_dict(); - do { - tmp = pdf_lookup_dict(page_tree[depth], "MediaBox"); - if (tmp && bbox) - pdf_release_obj(bbox); - bbox = tmp ? pdf_deref_obj(tmp) : bbox; - tmp = pdf_lookup_dict(page_tree[depth], "CropBox"); - if (tmp && crop_box) - pdf_release_obj(crop_box); - crop_box = tmp ? pdf_deref_obj(tmp) : crop_box; - tmp = pdf_lookup_dict(page_tree[depth], "Rotate"); - if (tmp && rotate) - pdf_release_obj(rotate); - rotate = tmp ? pdf_deref_obj(tmp) : rotate; + page_no = pdf_ximage_get_page(ximage); + if (page_no == 0) + page_no = 1; - tmp = pdf_lookup_dict(page_tree[depth], "Resources"); -#if 0 - pdf_merge_dict(tmp, resources); -#else - if (tmp && resources) - pdf_release_obj(resources); - resources = tmp ? pdf_deref_obj(tmp) : resources; -#endif - } while (pdf_lookup_dict(page_tree[depth++], "Count") != 0); - - if (!bbox) { - WARN("No BoundingBox information available."); - pdf_free_page_obj(page_tree); - pdf_release_obj(resources); - if (rotate) - pdf_release_obj(rotate); + page_tree = pdf_get_page_obj(image_file, page_no, &bbox, &resources); + if (page_tree == NULL) { pdf_close(); return -1; } - /* - * BleedBox, TrimBox, and ArtBox are not inheritable. - */ - depth--; - if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree[depth], "TrimBox")))) { - if (!rect_equal(tmp, bbox)) { - print_bbox_info(tmp, "TrimBox", bbox); - if (bbox) - pdf_release_obj(bbox); - bbox = tmp; - } - } - if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree[depth], "BleedBox")))) { - if (!rect_equal(tmp, bbox)) { - print_bbox_info(tmp, "BleedBox", bbox); - if (bbox) - pdf_release_obj(bbox); - bbox = tmp; - } - } - if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree[depth], "ArtBox")))) { - if (!rect_equal(tmp, bbox)) { - print_bbox_info(tmp, "ArtBox", bbox); - if (bbox) - pdf_release_obj(bbox); - bbox = tmp; - } - } - if (rotate) { - if (pdf_number_value(rotate) != 0.0) - WARN("<< /Rotate %d >> found. (Not supported yet)", (int)pdf_number_value(rotate)); - pdf_release_obj(rotate); - rotate = NULL; - } + if (bbox != NULL) { + pdf_obj *tmp; - info.bbox.llx = pdf_number_value(pdf_get_array(bbox, 0)); - info.bbox.lly = pdf_number_value(pdf_get_array(bbox, 1)); - info.bbox.urx = pdf_number_value(pdf_get_array(bbox, 2)); - info.bbox.ury = pdf_number_value(pdf_get_array(bbox, 3)); + tmp = pdf_deref_obj(pdf_get_array(bbox, 0)); + info.bbox.llx = pdf_number_value(tmp); + pdf_release_obj(tmp); + tmp = pdf_deref_obj(pdf_get_array(bbox, 1)); + info.bbox.lly = pdf_number_value(tmp); + pdf_release_obj(tmp); + tmp = pdf_deref_obj(pdf_get_array(bbox, 2)); + info.bbox.urx = pdf_number_value(tmp); + pdf_release_obj(tmp); + tmp = pdf_deref_obj(pdf_get_array(bbox, 3)); + info.bbox.ury = pdf_number_value(tmp); + pdf_release_obj(tmp); + } - /* - * Handle page content stream. - * page_tree is now set to the first page. - */ - contents = pdf_get_page_content(page_tree[depth]); - if (!contents) { - pdf_release_obj(bbox); - pdf_free_page_obj(page_tree); + contents = pdf_get_page_content(page_tree); + pdf_release_obj(page_tree); + if (contents == NULL) { pdf_close(); return -1; } - pdf_free_page_obj(page_tree); { pdf_obj *tmp; @@ -439,6 +465,9 @@ pdf_include_page (pdf_ximage *ximage, FILE *image_file, int page_index, int pdf_ tmp = pdf_import_object(resources); pdf_release_obj(resources); resources = tmp; + tmp = pdf_import_object(bbox); + pdf_release_obj(bbox); + bbox = tmp; } pdf_close(); @@ -505,7 +534,9 @@ static struct operator {"f*", 0}, {"gs", -1}, {"re", OP_RECTANGLE}, + {"rg", -3}, {"RG", -3}, + {"sc", OP_SETCOLOR}, {"SC", OP_SETCOLOR}, {"W*", OP_CLIP}, {"b", OP_CLOSEandCLIP}, @@ -520,6 +551,7 @@ static struct operator {"i", -1}, {"j", -1}, {"J", -1}, + {"k", -4}, {"K", -4}, {"l", OP_LINETO}, {"m", OP_MOVETO}, @@ -535,30 +567,30 @@ static struct operator {"y", OP_CURVETO2} }; + int -pdf_copy_clip (FILE *image_file, int page_index, double x_user, double y_user) +pdf_copy_clip (FILE *image_file, int pageNo, double x_user, double y_user) { - pdf_obj **page_tree, *contents; + pdf_obj *page_tree, *contents; int depth = 0, top = -1; char *clip_path, *temp, *end_path; pdf_tmatrix M; double stack[6]; pdf_coord p0, p1, p2; + pdf_rect bbox; pdf_dev_currentmatrix(&M); pdf_invertmatrix(&M); M.e += x_user; M.f += y_user; - page_tree = pdf_get_page_obj (image_file, page_index); + page_tree = pdf_get_page_obj (image_file, pageNo, NULL, NULL); if (!page_tree) { pdf_close(); return -1; } - while (pdf_lookup_dict(page_tree[depth], "Count") != 0) - depth++; - contents = pdf_get_page_content(page_tree[depth]); + contents = pdf_get_page_content(page_tree); + pdf_release_obj(page_tree); if (!contents) { - pdf_free_page_obj(page_tree); pdf_close(); return -1; } @@ -590,8 +622,9 @@ pdf_copy_clip (FILE *image_file, int page_index, double x_user, double y_user) stack[++top] = strtod(clip_path, &temp); clip_path = temp; } else if (*clip_path == '[') { - /* Ignore! */ + /* Ignore, but put a dummy value on the stack (in case of d operator) */ parse_pdf_array(&clip_path, end_path); + stack[++top] = 0; } else if (*clip_path == '/') { if (strncmp("/DeviceGray", clip_path, 11) == 0 || strncmp("/Indexed", clip_path, 8) == 0 @@ -773,10 +806,11 @@ pdf_copy_clip (FILE *image_file, int page_index, double x_user, double y_user) free(clip_path); pdf_release_obj(contents); - pdf_free_page_obj(page_tree); pdf_close(); + return 0; } + #define WBUF_SIZE 4096 #if HAVE_ZLIB static int diff --git a/Build/source/texk/xdvipdfmx/src/epdf.h b/Build/source/texk/xdvipdfmx/src/epdf.h index 6566e56199f..234eaed5136 100644 --- a/Build/source/texk/xdvipdfmx/src/epdf.h +++ b/Build/source/texk/xdvipdfmx/src/epdf.h @@ -35,6 +35,7 @@ #define pdfbox_art 5 extern int pdf_copy_clip (FILE *image_file, int page_index, double x_user, double y_user); -extern int pdf_include_page (pdf_ximage *ximage, FILE *file, int page_index, int pdf_box); +//extern int pdf_include_page (pdf_ximage *ximage, FILE *file, int page_index, int pdf_box); +extern int pdf_include_page (pdf_ximage *ximage, FILE *file); #endif /* _EPDF_H_ */ diff --git a/Build/source/texk/xdvipdfmx/src/fontmap.c b/Build/source/texk/xdvipdfmx/src/fontmap.c index 267767f5aaa..24d0f366806 100644 --- a/Build/source/texk/xdvipdfmx/src/fontmap.c +++ b/Build/source/texk/xdvipdfmx/src/fontmap.c @@ -981,7 +981,7 @@ pdf_load_fontmap_file (const char *filename, int mode) static int pdf_insert_native_fontmap_record (const char *name, const char *path, int index, FT_Face face, - int layout_dir, int extend, int slant) + int layout_dir, int extend, int slant, int embolden) { char *fontmap_key; fontmap_rec *mrec; @@ -989,8 +989,8 @@ pdf_insert_native_fontmap_record (const char *name, const char *path, int index, ASSERT(name); ASSERT(path || face); - fontmap_key = malloc(strlen(name) + 30); // CHECK - sprintf(fontmap_key, "%s/%c/%d/%d", name, layout_dir == 0 ? 'H' : 'V', extend, slant); + fontmap_key = malloc(strlen(name) + 40); // CHECK + sprintf(fontmap_key, "%s/%c/%d/%d/%d", name, layout_dir == 0 ? 'H' : 'V', extend, slant, embolden); if (verbose) MESG("opt.extend = extend / 65536.0; - mrec->opt.slant = slant / 65536.0; + mrec->opt.extend = extend / 65536.0; + mrec->opt.slant = slant / 65536.0; + mrec->opt.bold = embolden / 65536.0; pdf_insert_fontmap_record(mrec->map_name, mrec); pdf_clear_fontmap_record(mrec); @@ -1025,7 +1026,7 @@ pdf_insert_native_fontmap_record (const char *name, const char *path, int index, static FT_Library ftLib; static int -pdf_load_native_font_from_path(const char *ps_name, int layout_dir, int extend, int slant) +pdf_load_native_font_from_path(const char *ps_name, int layout_dir, int extend, int slant, int embolden) { const char *p; char *filename = NEW(strlen(ps_name), char); @@ -1065,7 +1066,7 @@ pdf_load_native_font_from_path(const char *ps_name, int layout_dir, int extend, if (error == 0) return pdf_insert_native_fontmap_record(ps_name, filename, index, face, - layout_dir, extend, slant); + layout_dir, extend, slant, embolden); else return error; } @@ -1077,7 +1078,7 @@ FT_Int ft_patch; int pdf_load_native_font (const char *ps_name, const char *fam_name, const char *sty_name, - int layout_dir, int extend, int slant) + int layout_dir, int extend, int slant, int embolden) { static int sInitialized = 0; int error = -1; @@ -1094,36 +1095,36 @@ pdf_load_native_font (const char *ps_name, } if (ps_name[0] == '[') { - error = pdf_load_native_font_from_path(ps_name, layout_dir, extend, slant); + error = pdf_load_native_font_from_path(ps_name, layout_dir, extend, slant, embolden); } else { - ATSFontRef fontRef; CFStringRef theName = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, ps_name, kCFStringEncodingASCII, kCFAllocatorNull); - fontRef = ATSFontFindFromPostScriptName(theName, kATSOptionFlagsDefault); + ATSFontRef fontRef = ATSFontFindFromPostScriptName(theName, kATSOptionFlagsDefault); CFRelease(theName); if (fontRef != 0) { CFStringRef atsName = NULL; OSStatus status = ATSFontGetName(fontRef, kATSOptionFlagsDefault, &atsName); if (status == noErr) { - FSSpec pathSpec; - FT_Long index; int bufferSize = CFStringGetLength(atsName) * 4 + 1; char* fontName = NEW(bufferSize, char); if (CFStringGetCString(atsName, fontName, bufferSize, kCFStringEncodingUTF8)) { - FT_Error ftErr = FT_GetFile_From_Mac_ATS_Name(fontName, &pathSpec, &index); + FT_Long index; + UInt8 path[PATH_MAX + 1]; + FT_Error ftErr = FT_GetFilePath_From_Mac_ATS_Name(fontName, path, PATH_MAX, &index); if (ftErr == 0) { FT_Face face; - ftErr = FT_New_Face_From_FSSpec(ftLib, &pathSpec, index, &face); + ftErr = FT_New_Face(ftLib, (char*)path, index, &face); if (ftErr == 0) { error = pdf_insert_native_fontmap_record(ps_name, NULL, 0, face, - layout_dir, extend, slant); + layout_dir, extend, slant, embolden); } } } RELEASE(fontName); } - CFRelease(atsName); + if (atsName != NULL) + CFRelease(atsName); } } @@ -1149,7 +1150,7 @@ pdf_load_native_font (const char *ps_name, } if (ps_name[0] == '[') { - error = pdf_load_native_font_from_path(ps_name, layout_dir, extend, slant); + error = pdf_load_native_font_from_path(ps_name, layout_dir, extend, slant, embolden); } else { os = FcObjectSetBuild(FC_FILE, FC_INDEX, FC_FAMILY, FC_STYLE, NULL); @@ -1173,7 +1174,7 @@ pdf_load_native_font (const char *ps_name, name = (char *)FT_Get_Postscript_Name(face); if (!strcmp(name, ps_name)) { error = pdf_insert_native_fontmap_record(ps_name, (char*)path, index, face, - layout_dir, extend, slant); + layout_dir, extend, slant, embolden); /* don't dispose of the FT_Face, as we'll be using it to retrieve font data */ break; } diff --git a/Build/source/texk/xdvipdfmx/src/fontmap.h b/Build/source/texk/xdvipdfmx/src/fontmap.h index eb63704fa30..b2ce2645397 100644 --- a/Build/source/texk/xdvipdfmx/src/fontmap.h +++ b/Build/source/texk/xdvipdfmx/src/fontmap.h @@ -101,7 +101,7 @@ extern fontmap_rec *pdf_lookup_fontmap_record (const char *kp); #ifdef XETEX extern int pdf_load_native_font (const char *ps_name, const char *fam_name, const char *sty_name, - int layout_dir, int extend, int slant); + int layout_dir, int extend, int slant, int embolden); #endif #endif /* _FONTMAP_H_ */ diff --git a/Build/source/texk/xdvipdfmx/src/mpost.c b/Build/source/texk/xdvipdfmx/src/mpost.c index 6875d5d573e..3a36080effb 100644 --- a/Build/source/texk/xdvipdfmx/src/mpost.c +++ b/Build/source/texk/xdvipdfmx/src/mpost.c @@ -1,8 +1,8 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/mpost.c,v 1.36 2006/12/11 12:46:03 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/mpost.c,v 1.38 2007/11/22 16:57:08 chofchof Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata, + Copyright (C) 2007 by Jin-Hwan Cho and Shunsaku Hirata, the dvipdfmx project team Copyright (C) 1998, 1999 by Mark A. Wicks @@ -260,7 +260,8 @@ skip_prolog (char **start, char *end) save = *start; while (*start < end) { - skip_white(start, end); + if (**start != '%') + skip_white(start, end); if (*start >= end) break; if (!strncmp(*start, "%%EndProlog", 11)) { @@ -1189,8 +1190,7 @@ do_operator (const char *token, double x_user, double y_user) pdf_color_cmykcolor(&color, values[0], values[1], values[2], values[3]); - pdf_dev_setcolor(&color, 0); - pdf_dev_setcolor(&color, 1); + pdf_dev_set_color(&color); } break; case SETGRAY: @@ -1198,8 +1198,7 @@ do_operator (const char *token, double x_user, double y_user) error = pop_get_numbers(values, 1); if (!error) { pdf_color_graycolor(&color, values[0]); - pdf_dev_setcolor(&color, 0); - pdf_dev_setcolor(&color, 1); + pdf_dev_set_color(&color); } break; case SETRGBCOLOR: @@ -1207,8 +1206,7 @@ do_operator (const char *token, double x_user, double y_user) if (!error) { pdf_color_rgbcolor(&color, values[0], values[1], values[2]); - pdf_dev_setcolor(&color, 0); - pdf_dev_setcolor(&color, 1); + pdf_dev_set_color(&color); } break; @@ -1462,7 +1460,7 @@ mps_exec_inline (char **p, char *endptr, autorotate = pdf_dev_get_param(PDF_DEV_PARAM_AUTOROTATE); pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, 0); - pdf_color_push(); /* ... */ + //pdf_color_push(); /* ... */ /* Comment in dvipdfm: * Remember that x_user and y_user are off by 0.02 % @@ -1470,7 +1468,7 @@ mps_exec_inline (char **p, char *endptr, pdf_dev_moveto(x_user, y_user); error = mp_parse_body(p, endptr, x_user, y_user); - pdf_color_pop(); /* ... */ + //pdf_color_pop(); /* ... */ pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, autorotate); pdf_dev_set_dirmode(dirmode); @@ -1535,7 +1533,7 @@ mps_include_page (const char *ident, FILE *fp) dirmode = pdf_dev_get_dirmode(); autorotate = pdf_dev_get_param(PDF_DEV_PARAM_AUTOROTATE); pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, 0); - pdf_color_push(); + //pdf_color_push(); form_id = pdf_doc_begin_grabbing(ident, 0.0, 0.0, &(info.bbox)); @@ -1562,7 +1560,7 @@ mps_include_page (const char *ident, FILE *fp) pdf_doc_end_grabbing(); - pdf_color_pop(); + //pdf_color_pop(); pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, autorotate); pdf_dev_set_dirmode(dirmode); diff --git a/Build/source/texk/xdvipdfmx/src/pdfcolor.c b/Build/source/texk/xdvipdfmx/src/pdfcolor.c index 8d9341302c1..ab908079ec3 100644 --- a/Build/source/texk/xdvipdfmx/src/pdfcolor.c +++ b/Build/source/texk/xdvipdfmx/src/pdfcolor.c @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfcolor.c,v 1.13 2006/12/11 12:46:03 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfcolor.c,v 1.14 2007/11/22 11:45:39 chofchof Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -212,115 +212,28 @@ compare_color (const pdf_color *color1, const pdf_color *color2) } #endif -static int -valid_color_values (pdf_color *validated, const pdf_color *color) +int +pdf_color_is_valid (pdf_color *color) { - int i, num_components = 0; + int i, num_components; num_components = color->num_components; if (num_components != 1 && num_components != 3 && num_components != 4) { ERROR("Only RGB/CMYK/Gray currently supported."); - return -1; + return 0; } for (i = 0; i < num_components; i++) { if (color->values[i] < 0.0 || color->values[i] > 1.0) { WARN("Invalid color value: %g", color->values[i]); - return -1; - } else { - validated->values[i] = color->values[i]; - } - } - validated->num_components = color->num_components; - - return 0; -} - -int -pdf_dev_currentcolor (pdf_color *color, int is_fill) -{ - ASSERT(color); - - if (is_fill) { - memcpy(color, ¤t_fill, sizeof(pdf_color)); - } else { - memcpy(color, ¤t_stroke, sizeof(pdf_color)); - } - - return 0; -} - -int -pdf_dev_setcolor (const pdf_color *color, int is_fill) -{ - int len = 0, colormode; - int i; - char format_buffer[128]; - pdf_color validated; - - if (!color) { - WARN("No color specified."); - return -1; - } - - colormode = pdf_dev_get_param(PDF_DEV_PARAM_COLORMODE); - if (!colormode) { - WARN("setcolor ignored. (Ignore color option set)"); - return 0; - } - - if (valid_color_values(&validated, color) < 0) { - return -1; - } - -#if 0 - /* There are much problems in this :( */ - if (is_fill) { - if (!compare_color(&validated, ¤t_fill)) { - return 0; - } - } else { - if (!compare_color(&validated, ¤t_stroke)) { return 0; } } -#endif - - graphics_mode(); - - for (i = 0; i < validated.num_components; i++) { - len = sprintf(format_buffer, " %g", ROUND(validated.values[i], 0.01)); - pdf_doc_add_page_content(format_buffer, len); - } - - switch (validated.num_components) { - case 3: - pdf_doc_add_page_content((is_fill ? " rg" : " RG"), 3); - break; - case 4: - pdf_doc_add_page_content((is_fill ? " k" : " K" ), 2); - break; - case 1: - pdf_doc_add_page_content((is_fill ? " g" : " G" ), 2); - break; - default: - ERROR("Only RGB/CMYK/Gray currently supported."); - return -1; - break; - } - - if (is_fill) { - memcpy(¤t_fill, &validated, sizeof(pdf_color)); - } else { - memcpy(¤t_stroke, &validated, sizeof(pdf_color)); - } - - return 0; + return 1; } - /* Dvipdfm special */ pdf_color default_color = { 1, @@ -330,116 +243,77 @@ pdf_color default_color = { void pdf_color_set_default (const pdf_color *color) { - ASSERT(color); - - memcpy(&default_color, color, sizeof(pdf_color)); + pdf_color_copycolor(&default_color, color); } - -/* - * Having color stack here is wrong. - * dvi.c or XXX_special should treat this. - */ #define DEV_COLOR_STACK_MAX 128 static struct { - int next; + int current; pdf_color stroke[DEV_COLOR_STACK_MAX]; pdf_color fill[DEV_COLOR_STACK_MAX]; } color_stack = { 0, }; -/* BUG (20060330): color change does not effect on the next page. - * The problem is due to the part of grestore because it restores - * the color values in the state of gsave which are not correct - * if the color values are changed inside of a page. - */ void -pdf_dev_preserve_color (void) +pdf_color_clear_stack (void) { - if (color_stack.next > 0) { - current_stroke = color_stack.stroke[color_stack.next]; - current_fill = color_stack.fill[color_stack.next]; + if (color_stack.current > 0) { + WARN("You've mistakenly made a global color change within nested colors."); } + color_stack.current = 0; + pdf_color_copycolor(&color_stack.stroke[color_stack.current], &default_color); + pdf_color_copycolor(&color_stack.fill[color_stack.current], &default_color); + return; } void -pdf_dev_reset_color (void) +pdf_color_push (pdf_color *sc, pdf_color *fc) { - int colormode; - pdf_color fillcolor, strokecolor; - - /* Shouldn't give a warning */ - colormode = pdf_dev_get_param(PDF_DEV_PARAM_COLORMODE); - if (!colormode) { - return; - } - - if (color_stack.next > 0) { - strokecolor = current_stroke; - fillcolor = current_fill; + if (color_stack.current >= DEV_COLOR_STACK_MAX-1) { + WARN("Color stack overflow. Just ignore."); } else { - strokecolor = default_color; - fillcolor = default_color; + color_stack.current++; + pdf_color_copycolor(&color_stack.stroke[color_stack.current], sc); + pdf_color_copycolor(&color_stack.fill[color_stack.current], fc); + pdf_dev_reset_color(); } - - pdf_dev_setcolor(&strokecolor, 0); - pdf_dev_setcolor(&fillcolor, 1); - return; } - void -pdf_color_clear (void) +pdf_color_pop (void) { - color_stack.next = 0; + if (color_stack.current <= 0) { + WARN("Color stack underflow. Just ignore."); + } else { + color_stack.current--; + pdf_dev_reset_color(); + } + return; } void -pdf_color_push (void) +pdf_color_get_current (pdf_color **sc, pdf_color **fc) { - int current; - - current = color_stack.next; - if (current >= DEV_COLOR_STACK_MAX) { - WARN("Exceeded depth of color stack."); - return; - } - - memcpy(&color_stack.stroke[current], - ¤t_stroke, sizeof(pdf_color)); - memcpy(&color_stack.fill[current], - ¤t_fill , sizeof(pdf_color)); - - color_stack.next++; - + *sc = &color_stack.stroke[color_stack.current]; + *fc = &color_stack.fill[color_stack.current]; return; } +/* BUG (20060330): color change does not effect on the next page. + * The problem is due to the part of grestore because it restores + * the color values in the state of gsave which are not correct + * if the color values are changed inside of a page. + */ void -pdf_color_pop (void) +pdf_dev_preserve_color (void) { - int current; - - current = --(color_stack.next); - - if (current < 0) { - WARN("End color with no corresponding begin color."); - /* - * In the case of mismatched push and pop, color_stack.next must set - * to be the default value, 0. Otherwise causes segmentation fault - * in the next push command. - */ - pdf_color_clear(); - return; + if (color_stack.current > 0) { + current_stroke = color_stack.stroke[color_stack.current]; + current_fill = color_stack.fill[color_stack.current]; } - - pdf_dev_setcolor(&color_stack.stroke[current], 0); - pdf_dev_setcolor(&color_stack.fill[current] , 1); - - return; } /***************************** COLOR SPACE *****************************/ diff --git a/Build/source/texk/xdvipdfmx/src/pdfcolor.h b/Build/source/texk/xdvipdfmx/src/pdfcolor.h index 48e930be1a3..769d7e52a5c 100644 --- a/Build/source/texk/xdvipdfmx/src/pdfcolor.h +++ b/Build/source/texk/xdvipdfmx/src/pdfcolor.h @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfcolor.h,v 1.7 2006/12/11 12:46:03 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfcolor.h,v 1.8 2007/11/22 11:45:39 chofchof Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -51,10 +51,6 @@ typedef struct extern void pdf_color_set_verbose (void); -extern int pdf_dev_setcolor (const pdf_color *color, int is_fill); - -extern int pdf_dev_currentcolor (pdf_color *color, int is_fill); - extern int pdf_color_rgbcolor (pdf_color *color, double r, double g, double b); extern int pdf_color_cmykcolor (pdf_color *color, @@ -63,6 +59,7 @@ extern int pdf_color_graycolor (pdf_color *color, double g); extern void pdf_color_copycolor (pdf_color *color1, const pdf_color *color2); extern int pdf_color_is_white (pdf_color *color); +extern int pdf_color_is_valid (pdf_color *color); /* Not check size */ extern pdf_obj *iccp_get_rendering_intent (const void *profile, long proflen); @@ -88,12 +85,15 @@ extern int pdf_colorspace_load_ICCBased (const char *ident, * See remark in spc_color.c. */ extern void pdf_color_set_default (const pdf_color *color); -extern void pdf_color_push (void); +extern void pdf_color_push (pdf_color *sc, pdf_color *fc); extern void pdf_color_pop (void); -extern void pdf_color_clear (void); + +/* Color stack + */ +extern void pdf_color_clear_stack (void); +extern void pdf_color_get_current (pdf_color **sc, pdf_color **fc); /* Reinstall color */ extern void pdf_dev_preserve_color(void); -extern void pdf_dev_reset_color (void); #endif /* _PDF_COLOR_H_ */ diff --git a/Build/source/texk/xdvipdfmx/src/pdfdev.c b/Build/source/texk/xdvipdfmx/src/pdfdev.c index 1404423ffd8..1d930d6c1cd 100644 --- a/Build/source/texk/xdvipdfmx/src/pdfdev.c +++ b/Build/source/texk/xdvipdfmx/src/pdfdev.c @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfdev.c,v 1.61 2006/12/11 12:46:03 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfdev.c,v 1.64 2007/11/27 02:44:29 chofchof Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -824,7 +824,7 @@ dev_set_font (int font_id) if (font->bold <= 0.0) len = sprintf(format_buffer, " 0 Tr"); else - len = sprintf(format_buffer, " 2 Tr %.2f w", font->bold); /* _FIXME_ */ + len = sprintf(format_buffer, " 2 Tr %.6f w", font->bold); /* _FIXME_ */ pdf_doc_add_page_content(format_buffer, len); } text_state.bold_param = font->bold; @@ -1131,11 +1131,8 @@ pdf_dev_set_string (spt_t xpos, spt_t ypos, * Same issues as earlier. Use floating point for simplicity. * This routine needs to be fast, so we don't call sprintf() or strcpy(). */ -#if 0 - text_state.offset -= + text_state.offset -= (spt_t) (kern * font->extend * (font->sptsize / 1000.0)); -#endif - text_state.offset -= delh; format_buffer[len++] = text_state.is_mb ? '>' : ')'; if (font->wmode) len += p_itoa(-kern, format_buffer + len); @@ -1191,7 +1188,7 @@ pdf_init_device (double dvi2pts, int precision, int black_and_white) dev_param.colormode = (black_and_white ? 0 : 1); graphics_mode(); - pdf_color_clear(); + pdf_color_clear_stack(); pdf_dev_init_gstates(); num_dev_fonts = 0; @@ -1219,7 +1216,7 @@ pdf_close_device (void) num_dev_fonts = 0; max_dev_fonts = 0; - pdf_dev_clean_gstates(); + pdf_dev_clear_gstates(); } /* @@ -1247,6 +1244,148 @@ pdf_dev_reset_fonts (void) text_state.is_mb = 0; } +void +pdf_dev_reset_color(void) +{ + pdf_color *sc, *fc; + + if (pdf_dev_get_param(PDF_DEV_PARAM_COLORMODE)) { + pdf_color_get_current(&sc, &fc); + pdf_dev_set_strokingcolor(sc); + pdf_dev_set_nonstrokingcolor(fc); + } + return; +} + +static int +color_to_string (pdf_color *color, char *buffer) +{ + int i, len = 0; + + for (i = 0; i < color->num_components; i++) { + len += sprintf(format_buffer+len, " %g", ROUND(color->values[i], 0.001)); + } + return len; +} + +void +pdf_dev_set_color (pdf_color *color) +{ + int len; + + if (!pdf_dev_get_param(PDF_DEV_PARAM_COLORMODE)) { + WARN("Ignore color option was set. Just ignore."); + return; + } else if (!(color && pdf_color_is_valid(color))) { + WARN("No valid color is specified. Just ignore."); + return; + } + + graphics_mode(); + len = color_to_string(color, format_buffer); + format_buffer[len++] = ' '; + switch (color->num_components) { + case 3: + format_buffer[len++] = 'R'; + format_buffer[len++] = 'G'; + break; + case 4: + format_buffer[len++] = 'K'; + break; + case 1: + format_buffer[len++] = 'G'; + break; + default: /* already verified the given color */ + break; + } + strncpy(format_buffer+len, format_buffer, len); + len = len << 1; + switch (color->num_components) { + case 3: + format_buffer[len-2] = 'r'; + format_buffer[len-1] = 'g'; + break; + case 4: + format_buffer[len-1] = 'k'; + break; + case 1: + format_buffer[len-1] = 'g'; + break; + default: /* already verified the given color */ + break; + } + pdf_doc_add_page_content(format_buffer, len); + return; +} + +void +pdf_dev_set_strokingcolor (pdf_color *color) +{ + int len; + + if (!pdf_dev_get_param(PDF_DEV_PARAM_COLORMODE)) { + WARN("Ignore color option was set. Just ignore."); + return; + } else if (!(color && pdf_color_is_valid(color))) { + WARN("No valid color is specified. Just ignore."); + return; + } + + graphics_mode(); + len = color_to_string(color, format_buffer); + format_buffer[len++] = ' '; + switch (color->num_components) { + case 3: + format_buffer[len++] = 'R'; + format_buffer[len++] = 'G'; + break; + case 4: + format_buffer[len++] = 'K'; + break; + case 1: + format_buffer[len++] = 'G'; + break; + default: /* already verified the given color */ + break; + } + pdf_doc_add_page_content(format_buffer, len); + return; +} + +void +pdf_dev_set_nonstrokingcolor (pdf_color *color) +{ + int len; + + if (!pdf_dev_get_param(PDF_DEV_PARAM_COLORMODE)) { + WARN("Ignore color option was set. Just ignore."); + return; + } else if (!(color && pdf_color_is_valid(color))) { + WARN("No valid color is specified. Just ignore."); + return; + } + + graphics_mode(); + len = color_to_string(color, format_buffer); + format_buffer[len++] = ' '; + switch (color->num_components) { + case 3: + format_buffer[len++] = 'r'; + format_buffer[len++] = 'g'; + break; + case 4: + format_buffer[len++] = 'k'; + break; + case 1: + format_buffer[len++] = 'g'; + break; + default: /* already verified the given color */ + break; + } + pdf_doc_add_page_content(format_buffer, len); + return; +} + /* Not working */ void pdf_dev_set_origin (double phys_x, double phys_y) @@ -1262,9 +1401,6 @@ pdf_dev_set_origin (double phys_x, double phys_y) pdf_dev_concat(&M1); } -static pdf_color saved_sc, saved_fc; -static int have_saved_color = 0; - void pdf_dev_bop (const pdf_tmatrix *M) { @@ -1276,28 +1412,15 @@ pdf_dev_bop (const pdf_tmatrix *M) pdf_dev_concat(M); pdf_dev_reset_fonts(); - pdf_dev_preserve_color(); /* preserve the last color in the previous page */ pdf_dev_reset_color(); - - if (have_saved_color) { - pdf_dev_setcolor(&saved_sc, 0); - pdf_dev_setcolor(&saved_fc, 1); - } } void pdf_dev_eop (void) { int depth; - - graphics_mode(); - /* preserve the current color for start of next page, so \special{color...} - doesn't cease to have any effect at a page break; - note that printing pages out of order will break the assumptions here */ - pdf_dev_currentcolor(&saved_sc, 0); - pdf_dev_currentcolor(&saved_fc, 1); - have_saved_color = 1; + graphics_mode(); depth = pdf_dev_current_depth(); if (depth != 1) { diff --git a/Build/source/texk/xdvipdfmx/src/pdfdev.h b/Build/source/texk/xdvipdfmx/src/pdfdev.h index f29481266b5..5e5b7a9adfe 100644 --- a/Build/source/texk/xdvipdfmx/src/pdfdev.h +++ b/Build/source/texk/xdvipdfmx/src/pdfdev.h @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfdev.h,v 1.19 2006/12/11 12:46:03 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfdev.h,v 1.20 2007/11/22 11:45:39 chofchof Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -27,6 +27,7 @@ #include "numbers.h" #include "pdfobj.h" +#include "pdfcolor.h" typedef signed long spt_t; @@ -202,7 +203,11 @@ extern void pdf_dev_set_param (int param_type, int value); * XFrom (content grabbing) and Metapost support want them. */ extern void pdf_dev_reset_fonts (void); -extern void pdf_dev_reset_color (void); /* defined in pdfcolor.c */ +extern void pdf_dev_reset_color (void); + +extern void pdf_dev_set_color (pdf_color *color); +extern void pdf_dev_set_strokingcolor (pdf_color *color); +extern void pdf_dev_set_nonstrokingcolor (pdf_color *color); /* Initialization of transformation matrix with M and others. * They are called within pdf_doc_begin_page() and pdf_doc_end_page(). diff --git a/Build/source/texk/xdvipdfmx/src/pdfdoc.c b/Build/source/texk/xdvipdfmx/src/pdfdoc.c index 8367ad65e3a..aeda5c1d8ef 100644 --- a/Build/source/texk/xdvipdfmx/src/pdfdoc.c +++ b/Build/source/texk/xdvipdfmx/src/pdfdoc.c @@ -1,8 +1,8 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfdoc.c,v 1.44 2006/12/20 08:10:13 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfdoc.c,v 1.50 2008/02/13 20:22:21 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata, + Copyright (C) 2007 by Jin-Hwan Cho and Shunsaku Hirata, the dvipdfmx project team Copyright (C) 1998, 1999 by Mark A. Wicks @@ -144,9 +144,9 @@ read_thumbnail (const char *thumb_filename) MFCLOSE(fp); if (found_in_cwd) { - xobj_id = pdf_ximage_findresource(thumb_filename, 0, 0); + xobj_id = pdf_ximage_findresource(thumb_filename, 0/*, 0*/); } else { - xobj_id = pdf_ximage_findresource(guess_filename, 0, 0); + xobj_id = pdf_ximage_findresource(guess_filename, 0/*, 0*/); } if (xobj_id < 0) { @@ -511,7 +511,7 @@ asn_date (char *date_string) # ifdef HAVE_TM_GMTOFF # define timezone (-bd_time->tm_gmtoff) # else -# define timezone (-compute_timezone_offset()) +# define timezone (-compute_timezone_offset()) # endif /* not HAVE_TM_GMTOFF */ #endif /* not HAVE_TIMEZONE */ time_t current_time; @@ -1037,6 +1037,7 @@ flush_bookmarks (pdf_olitem *node, pdf_new_name("Last"), pdf_link_obj(prev_ref)); + pdf_release_obj(prev_ref); pdf_release_obj(node->dict); node->dict = NULL; @@ -1334,10 +1335,10 @@ pdf_doc_add_annot (unsigned page_no, const pdf_rect *rect, pdf_obj *annot_dict) #endif rect_array = pdf_new_array(); - pdf_add_array(rect_array, pdf_new_number(ROUND(rect->llx - annot_grow, 0.01))); - pdf_add_array(rect_array, pdf_new_number(ROUND(rect->lly - annot_grow, 0.01))); - pdf_add_array(rect_array, pdf_new_number(ROUND(rect->urx + annot_grow, 0.01))); - pdf_add_array(rect_array, pdf_new_number(ROUND(rect->ury + annot_grow, 0.01))); + pdf_add_array(rect_array, pdf_new_number(ROUND(rect->llx - annot_grow, 0.001))); + pdf_add_array(rect_array, pdf_new_number(ROUND(rect->lly - annot_grow, 0.001))); + pdf_add_array(rect_array, pdf_new_number(ROUND(rect->urx + annot_grow, 0.001))); + pdf_add_array(rect_array, pdf_new_number(ROUND(rect->ury + annot_grow, 0.001))); pdf_add_dict (annot_dict, pdf_new_name("Rect"), rect_array); pdf_add_array(page->annots, pdf_ref_obj(annot_dict)); @@ -1961,10 +1962,10 @@ doc_fill_page_background (pdf_doc *p) currentpage->contents = currentpage->background; pdf_dev_gsave(); - pdf_color_push(); - pdf_dev_setcolor(&bgcolor, 1); /* is_fill */ + //pdf_color_push(); + pdf_dev_set_nonstrokingcolor(&bgcolor); pdf_dev_rectfill(r.llx, r.lly, r.urx - r.llx, r.ury - r.lly); - pdf_color_pop(); + //pdf_color_pop(); pdf_dev_grestore(); currentpage->contents = saved_content; @@ -2022,7 +2023,8 @@ pdf_doc_add_page_content (const char *buffer, unsigned length) static char *doccreator = NULL; /* Ugh */ void -pdf_open_document (const char *filename, int do_encryption, +pdf_open_document (const char *filename, + int do_encryption, int do_objstm, double media_width, double media_height, double annot_grow_amount, int bookmark_open_depth) { @@ -2060,6 +2062,9 @@ pdf_open_document (const char *filename, int do_encryption, pdf_release_obj(encrypt); } + if (do_objstm) + pdf_objstm_init(); + #ifndef NO_THUMBNAIL /* Create a default name for thumbnail image files */ if (thumb_enabled) { @@ -2122,6 +2127,8 @@ pdf_close_document (void) } #endif /* !NO_THUMBNAIL */ + pdf_objstm_close(); + return; } diff --git a/Build/source/texk/xdvipdfmx/src/pdfdoc.h b/Build/source/texk/xdvipdfmx/src/pdfdoc.h index 4e2cffc6c11..2fd805c6077 100644 --- a/Build/source/texk/xdvipdfmx/src/pdfdoc.h +++ b/Build/source/texk/xdvipdfmx/src/pdfdoc.h @@ -1,8 +1,8 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfdoc.h,v 1.20 2007/04/03 05:26:49 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfdoc.h,v 1.21 2007/11/14 03:36:01 chofchof Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata, + Copyright (C) 2007 by Jin-Hwan Cho and Shunsaku Hirata, the dvipdfmx project team Copyright (C) 1998, 1999 by Mark A. Wicks @@ -32,7 +32,8 @@ extern void pdf_doc_set_verbose (void); -extern void pdf_open_document (const char *filename, int do_encryption, +extern void pdf_open_document (const char *filename, + int do_encryption, int do_objstm, double media_width, double media_height, double annot_grow_amount, int bookmark_open_depth); extern void pdf_close_document (void); diff --git a/Build/source/texk/xdvipdfmx/src/pdfdraw.c b/Build/source/texk/xdvipdfmx/src/pdfdraw.c index 8d761a9e92b..618aae75686 100644 --- a/Build/source/texk/xdvipdfmx/src/pdfdraw.c +++ b/Build/source/texk/xdvipdfmx/src/pdfdraw.c @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfdraw.c,v 1.13 2006/12/11 12:46:03 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfdraw.c,v 1.14 2007/11/22 17:10:12 chofchof Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -268,7 +268,7 @@ static char fmt_buf[1024]; /* FIXME */ #define FORMAT_BUFF_LEN(p) 1024 static void -pdf_path__initpath (pdf_path *p) +init_a_path (pdf_path *p) { ASSERT(p); @@ -302,7 +302,7 @@ pdf_path__growpath (pdf_path *p, int max_pe) } static void -pdf_path__cleanpath (pdf_path *p) +clear_a_path (pdf_path *p) { ASSERT(p); @@ -1001,25 +1001,18 @@ m_stack_top (m_stack *stack) #define m_stack_depth(s) ((s) ? (s)->size : 0) - -static m_stack _gsstck; /* FIXME */ - +static m_stack gs_stack; static void -pdf_dev__init_gstate (pdf_gstate *gs) +init_a_gstate (pdf_gstate *gs) { - pdf_path *pa = &gs->path; - pdf_color *cf = &gs->fillcolor; - pdf_color *cs = &gs->strokecolor; - pdf_tmatrix *M = &gs->matrix; - gs->cp.x = 0.0; gs->cp.y = 0.0; - pdf_setmatrix(M, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0); + pdf_setmatrix(&gs->matrix, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0); - pdf_color_graycolor(cs, 0.0); - pdf_color_graycolor(cf, 0.0); + pdf_color_graycolor(&gs->strokecolor, 0.0); + pdf_color_graycolor(&gs->fillcolor, 0.0); gs->linedash.num_dash = 0; gs->linedash.offset = 0; @@ -1032,7 +1025,7 @@ pdf_dev__init_gstate (pdf_gstate *gs) /* Internal variables */ gs->flags = 0; - pdf_path__initpath(pa); + init_a_path(&gs->path); gs->pt_fixee.x = 0; gs->pt_fixee.y = 0; @@ -1040,16 +1033,16 @@ pdf_dev__init_gstate (pdf_gstate *gs) } static void -pdf_dev__clean_gstate (pdf_gstate *gs) +clear_a_gstate (pdf_gstate *gs) { - pdf_path__cleanpath(&gs->path); + clear_a_path(&gs->path); memset(gs, 0, sizeof(pdf_gstate)); return; } static void -pdf_dev__copy_gstate (pdf_gstate *gs1, pdf_gstate *gs2) +copy_a_gstate (pdf_gstate *gs1, pdf_gstate *gs2) { int i; @@ -1090,159 +1083,89 @@ pdf_dev__copy_gstate (pdf_gstate *gs1, pdf_gstate *gs2) void pdf_dev_init_gstates (void) { - m_stack *gss = &_gsstck; pdf_gstate *gs; - m_stack_init(gss); + m_stack_init(&gs_stack); gs = NEW(1, pdf_gstate); - pdf_dev__init_gstate(gs); + init_a_gstate(gs); - m_stack_push(gss, gs); /* Initial state */ + m_stack_push(&gs_stack, gs); /* Initial state */ return; } void -pdf_dev_clean_gstates (void) +pdf_dev_clear_gstates (void) { - m_stack *gss = &_gsstck; pdf_gstate *gs; - if (m_stack_depth(gss) > 1) /* at least 1 elem. */ - WARN("GS stack depth not 0 at end of document."); + if (m_stack_depth(&gs_stack) > 1) /* at least 1 elem. */ + WARN("GS stack depth is not zero at the end of the document."); - while ((gs = m_stack_pop(gss)) != NULL) { - pdf_dev__clean_gstate(gs); + while ((gs = m_stack_pop(&gs_stack)) != NULL) { + clear_a_gstate(gs); RELEASE(gs); } - return; } - -int -pdf_dev_currentpoint (pdf_coord *p) -{ - m_stack *gss = &_gsstck; - pdf_gstate *gs = m_stack_top(gss); - pdf_coord *cpt = &gs->cp; - - ASSERT(p); - - p->x = cpt->x; p->y = cpt->y; - - return 0; -} - int -pdf_dev_currentmatrix (pdf_tmatrix *M) -{ - m_stack *gss = &_gsstck; - pdf_gstate *gs = m_stack_top(gss); - pdf_tmatrix *CTM = &gs->matrix; - - ASSERT(M); - - pdf_copymatrix(M, CTM); - - return 0; -} - -#if 0 -int -pdf_dev_currentcolor (pdf_color *color, int is_fill) +pdf_dev_gsave (void) { - m_stack *gss = &_gsstck; - pdf_gstate *gs = m_stack_top(gss); - pdf_color *fcl = &gs->fillcolor; - pdf_color *scl = &gs->strokecolor; + pdf_gstate *gs0, *gs1; + pdf_color *sc, *fc; - ASSERT(color); + gs0 = m_stack_top(&gs_stack); + gs1 = NEW(1, pdf_gstate); + init_a_gstate(gs1); + copy_a_gstate(gs1, gs0); + pdf_color_get_current(&sc, &fc); + pdf_color_copycolor(&gs1->strokecolor, sc); + pdf_color_copycolor(&gs1->fillcolor, fc); + m_stack_push(&gs_stack, gs1); - pdf_color_copycolor(color, is_fill ? fcl : scl); + pdf_doc_add_page_content(" q", 2); return 0; } -#endif /* 0 */ int -pdf_dev_concat (const pdf_tmatrix *M) +pdf_dev_grestore (void) { - m_stack *gss = &_gsstck; - pdf_gstate *gs = m_stack_top(gss); - pdf_path *cpa = &gs->path; - pdf_coord *cpt = &gs->cp; - pdf_tmatrix *CTM = &gs->matrix; - pdf_tmatrix W; - char *buf = FORMAT_BUFF_PTR(NULL); - int len = 0; - - ASSERT(M); - - /* Adobe Reader erases page content if there are - * non invertible transformation. - */ - if (fabs(detP(M)) < 1.0e-8) { - WARN("Transformation matrix not invertible."); - WARN("--- M = [%g %g %g %g %g %g]", - M->a, M->b, M->c, M->d, M->e, M->f); - return -1; - } - - if (fabs(M->a - 1.0) > 1.e-8 || fabs(M->b) > 1.e-8 - || fabs(M->c) > 1.e-8 || fabs(M->d - 1.0) > 1.e-8 - || fabs(M->e) > 1.e-8 || fabs(M->f) > 1.e-8) { - buf[len++] = ' '; - len += pdf_sprint_matrix(buf + len, M); - buf[len++] = ' '; - buf[len++] = 'c'; - buf[len++] = 'm'; - pdf_doc_add_page_content(buf, len); + pdf_gstate *gs; + pdf_color sc, fc; - pdf_concatmatrix(CTM, M); + if (m_stack_depth(&gs_stack) <= 1) { /* Initial state at bottom */ + WARN("Too many grestores."); + return -1; } - inversematrix(&W, M); - - pdf_path__transform (cpa, &W); - pdf_coord__transform(cpt, &W); - - return 0; -} - - -int -pdf_dev_gsave (void) -{ - m_stack *gss = &_gsstck; - pdf_gstate *gs0, *gs1; - - gs0 = m_stack_top(gss); - gs1 = NEW(1, pdf_gstate); - pdf_dev__init_gstate(gs1); - pdf_dev__copy_gstate(gs1, gs0); - - pdf_dev_currentcolor(&gs1->strokecolor, 0); - pdf_dev_currentcolor(&gs1->fillcolor, 1); + gs = m_stack_pop(&gs_stack); +// pdf_color_copycolor(&sc, &gs->strokecolor); +// pdf_color_copycolor(&fc, &gs->fillcolor); + clear_a_gstate(gs); + RELEASE(gs); - m_stack_push(gss, gs1); + pdf_doc_add_page_content(" Q", 2); - pdf_doc_add_page_content(" q", 2); + pdf_dev_reset_fonts(); +// pdf_dev_set_strokingcolor(&sc); +// pdf_dev_set_nonstrokingcolor(&fc); - return 0; + return 0; } int pdf_dev_push_gstate (void) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs0; gs0 = NEW(1, pdf_gstate); - pdf_dev__init_gstate(gs0); + init_a_gstate(gs0); m_stack_push(gss, gs0); @@ -1253,7 +1176,7 @@ pdf_dev_push_gstate (void) int pdf_dev_pop_gstate (void) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs; if (m_stack_depth(gss) <= 1) { /* Initial state at bottom */ @@ -1262,7 +1185,7 @@ pdf_dev_pop_gstate (void) } gs = m_stack_pop(gss); - pdf_dev__clean_gstate(gs); + clear_a_gstate(gs); RELEASE(gs); return 0; @@ -1272,16 +1195,15 @@ pdf_dev_pop_gstate (void) int pdf_dev_current_depth (void) { - m_stack *gss = &_gsstck; - - return (m_stack_depth(gss) - 1); /* 0 means initial state */ + return (m_stack_depth(&gs_stack) - 1); /* 0 means initial state */ } void pdf_dev_grestore_to (int depth) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs; + pdf_color sc, fc; ASSERT(depth >= 0); @@ -1292,44 +1214,105 @@ pdf_dev_grestore_to (int depth) while (m_stack_depth(gss) > depth + 1) { pdf_doc_add_page_content(" Q", 2); gs = m_stack_pop(gss); - pdf_dev__clean_gstate(gs); +// pdf_color_copycolor(&sc, &gs->strokecolor); +// pdf_color_copycolor(&fc, &gs->fillcolor); + clear_a_gstate(gs); RELEASE(gs); } pdf_dev_reset_fonts(); - pdf_dev_reset_color(); +// pdf_dev_set_strokingcolor(&sc); +// pdf_dev_set_nonstrokingcolor(&fc); return; } int -pdf_dev_grestore (void) +pdf_dev_currentpoint (pdf_coord *p) { - m_stack *gss = &_gsstck; - pdf_gstate *gs; - pdf_color sc, fc; + m_stack *gss = &gs_stack; + pdf_gstate *gs = m_stack_top(gss); + pdf_coord *cpt = &gs->cp; - if (m_stack_depth(gss) <= 1) { /* Initial state at bottom */ - WARN("Too many grestores."); - return -1; - } + ASSERT(p); - gs = m_stack_pop(gss); + p->x = cpt->x; p->y = cpt->y; - pdf_color_copycolor(&sc, &gs->strokecolor); - pdf_color_copycolor(&fc, &gs->fillcolor); + return 0; +} - pdf_dev__clean_gstate(gs); - RELEASE(gs); +int +pdf_dev_currentmatrix (pdf_tmatrix *M) +{ + m_stack *gss = &gs_stack; + pdf_gstate *gs = m_stack_top(gss); + pdf_tmatrix *CTM = &gs->matrix; - pdf_doc_add_page_content(" Q", 2); + ASSERT(M); - pdf_dev_reset_fonts(); - pdf_dev_reset_color(); + pdf_copymatrix(M, CTM); - pdf_dev_setcolor(&sc, 0); - pdf_dev_setcolor(&fc, 1); + return 0; +} - return 0; +#if 0 +int +pdf_dev_currentcolor (pdf_color *color, int is_fill) +{ + m_stack *gss = &gs_stack; + pdf_gstate *gs = m_stack_top(gss); + pdf_color *fcl = &gs->fillcolor; + pdf_color *scl = &gs->strokecolor; + + ASSERT(color); + + pdf_color_copycolor(color, is_fill ? fcl : scl); + + return 0; +} +#endif /* 0 */ + +int +pdf_dev_concat (const pdf_tmatrix *M) +{ + m_stack *gss = &gs_stack; + pdf_gstate *gs = m_stack_top(gss); + pdf_path *cpa = &gs->path; + pdf_coord *cpt = &gs->cp; + pdf_tmatrix *CTM = &gs->matrix; + pdf_tmatrix W; + char *buf = FORMAT_BUFF_PTR(NULL); + int len = 0; + + ASSERT(M); + + /* Adobe Reader erases page content if there are + * non invertible transformation. + */ + if (fabs(detP(M)) < 1.0e-8) { + WARN("Transformation matrix not invertible."); + WARN("--- M = [%g %g %g %g %g %g]", + M->a, M->b, M->c, M->d, M->e, M->f); + return -1; + } + + if (fabs(M->a - 1.0) > 1.e-8 || fabs(M->b) > 1.e-8 + || fabs(M->c) > 1.e-8 || fabs(M->d - 1.0) > 1.e-8 + || fabs(M->e) > 1.e-8 || fabs(M->f) > 1.e-8) { + buf[len++] = ' '; + len += pdf_sprint_matrix(buf + len, M); + buf[len++] = ' '; + buf[len++] = 'c'; + buf[len++] = 'm'; + pdf_doc_add_page_content(buf, len); + + pdf_concatmatrix(CTM, M); + } + inversematrix(&W, M); + + pdf_path__transform (cpa, &W); + pdf_coord__transform(cpt, &W); + + return 0; } /* @@ -1345,7 +1328,7 @@ pdf_dev_grestore (void) int pdf_dev_setmiterlimit (double mlimit) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); int len = 0; char *buf = FORMAT_BUFF_PTR(NULL); @@ -1365,7 +1348,7 @@ pdf_dev_setmiterlimit (double mlimit) int pdf_dev_setlinecap (int capstyle) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); int len = 0; char *buf = FORMAT_BUFF_PTR(NULL); @@ -1382,7 +1365,7 @@ pdf_dev_setlinecap (int capstyle) int pdf_dev_setlinejoin (int joinstyle) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); int len = 0; char *buf = FORMAT_BUFF_PTR(NULL); @@ -1399,7 +1382,7 @@ pdf_dev_setlinejoin (int joinstyle) int pdf_dev_setlinewidth (double width) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); int len = 0; char *buf = FORMAT_BUFF_PTR(NULL); @@ -1419,7 +1402,7 @@ pdf_dev_setlinewidth (double width) int pdf_dev_setdash (int count, double *pattern, double offset) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); int len = 0; char *buf = FORMAT_BUFF_PTR(NULL); @@ -1445,7 +1428,7 @@ pdf_dev_setdash (int count, double *pattern, double offset) int pdf_dev_setflat (int flatness) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); int len = 0; char *buf = FORMAT_BUFF_PTR(NULL); @@ -1466,7 +1449,7 @@ pdf_dev_setflat (int flatness) int pdf_dev_clip (void) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; @@ -1476,7 +1459,7 @@ pdf_dev_clip (void) int pdf_dev_eoclip (void) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; @@ -1486,7 +1469,7 @@ pdf_dev_eoclip (void) int pdf_dev_flushpath (char p_op, int fill_rule) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; int error = 0; @@ -1506,7 +1489,7 @@ pdf_dev_flushpath (char p_op, int fill_rule) int pdf_dev_newpath (void) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *p = &gs->path; @@ -1522,7 +1505,7 @@ pdf_dev_newpath (void) int pdf_dev_moveto (double x, double y) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1535,7 +1518,7 @@ pdf_dev_moveto (double x, double y) int pdf_dev_rmoveto (double x, double y) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1549,7 +1532,7 @@ pdf_dev_rmoveto (double x, double y) int pdf_dev_lineto (double x, double y) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1563,7 +1546,7 @@ pdf_dev_lineto (double x, double y) int pdf_dev_rlineto (double x, double y) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1579,7 +1562,7 @@ pdf_dev_curveto (double x0, double y0, double x1, double y1, double x2, double y2) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1596,7 +1579,7 @@ int pdf_dev_vcurveto (double x0, double y0, double x1, double y1) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1612,7 +1595,7 @@ int pdf_dev_ycurveto (double x0, double y0, double x1, double y1) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1629,7 +1612,7 @@ pdf_dev_rcurveto (double x0, double y0, double x1, double y1, double x2, double y2) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1646,7 +1629,7 @@ pdf_dev_rcurveto (double x0, double y0, int pdf_dev_closepath (void) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_coord *cpt = &gs->cp; pdf_path *cpa = &gs->path; @@ -1658,7 +1641,7 @@ pdf_dev_closepath (void) void pdf_dev_dtransform (pdf_coord *p, const pdf_tmatrix *M) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_tmatrix *CTM = &gs->matrix; @@ -1672,7 +1655,7 @@ pdf_dev_dtransform (pdf_coord *p, const pdf_tmatrix *M) void pdf_dev_idtransform (pdf_coord *p, const pdf_tmatrix *M) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_tmatrix *CTM = &gs->matrix; @@ -1686,7 +1669,7 @@ pdf_dev_idtransform (pdf_coord *p, const pdf_tmatrix *M) void pdf_dev_transform (pdf_coord *p, const pdf_tmatrix *M) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_tmatrix *CTM = &gs->matrix; @@ -1700,7 +1683,7 @@ pdf_dev_transform (pdf_coord *p, const pdf_tmatrix *M) void pdf_dev_itransform (pdf_coord *p, const pdf_tmatrix *M) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_tmatrix *CTM = &gs->matrix; @@ -1715,7 +1698,7 @@ int pdf_dev_arc (double c_x , double c_y, double r, double a_0 , double a_1) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1731,7 +1714,7 @@ int pdf_dev_arcn (double c_x , double c_y, double r, double a_0 , double a_1) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1749,7 +1732,7 @@ pdf_dev_arcx (double c_x , double c_y, int a_d , double xar) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1765,7 +1748,7 @@ int pdf_dev_bspline (double x0, double y0, double x1, double y1, double x2, double y2) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1844,7 +1827,7 @@ pdf_dev_rectadd (double x, double y, void pdf_dev_set_fixed_point (double x, double y) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); gs->pt_fixee.x = x; gs->pt_fixee.y = y; @@ -1853,7 +1836,7 @@ pdf_dev_set_fixed_point (double x, double y) void pdf_dev_get_fixed_point (pdf_coord *p) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); p->x = gs->pt_fixee.x; p->y = gs->pt_fixee.y; diff --git a/Build/source/texk/xdvipdfmx/src/pdfobj.c b/Build/source/texk/xdvipdfmx/src/pdfobj.c index 0417725e626..1ad7de2a928 100644 --- a/Build/source/texk/xdvipdfmx/src/pdfobj.c +++ b/Build/source/texk/xdvipdfmx/src/pdfobj.c @@ -1,8 +1,8 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfobj.c,v 1.46 2007/05/18 05:19:01 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfobj.c,v 1.49 2008/02/08 19:02:38 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata, + Copyright (C) 2007 by Jin-Hwan Cho and Shunsaku Hirata, the dvipdfmx project team Copyright (C) 1998, 1999 by Mark A. Wicks @@ -265,7 +265,7 @@ pdf_obj_set_verbose(void) static pdf_objstm *current_objstm = NULL; void -pdf_enable_objstm () +pdf_objstm_init () { if (pdf_version >= 5) { current_objstm = NEW(1, pdf_objstm); @@ -273,6 +273,15 @@ pdf_enable_objstm () } } +void +pdf_objstm_close () +{ + if (current_objstm) { + RELEASE(current_objstm); + current_objstm = NULL; + } +} + static void add_xref_entry (unsigned long label, unsigned char type, unsigned long field2, unsigned short field3) { @@ -551,6 +560,16 @@ void pdf_out (FILE *file, const void *buffer, long length) } } +/* returns 1 if a white-space character is necessary to separate + an object of type1 followed by an object of type2 */ +static +int pdf_need_white (int type1, int type2) +{ + return !(type1 == PDF_STRING || type1 == PDF_ARRAY || type1 == PDF_DICT || + type2 == PDF_STRING || type2 == PDF_NAME || + type2 == PDF_ARRAY || type2 == PDF_DICT); +} + static void pdf_out_white (FILE *file) { @@ -1138,13 +1157,17 @@ write_array (pdf_array *array, FILE *file) pdf_out_char(file, '['); if (array->size > 0) { unsigned long i; - + int type1 = PDF_UNDEFINED, type2; + for (i = 0; i < array->size; i++) { - if (i > 0) - pdf_out_white(file); - if (!array->values[i]) + if (array->values[i]) { + type2 = array->values[i]->type; + if (type1 != PDF_UNDEFINED && pdf_need_white(type1, type2)) + pdf_out_white(file); + type1 = type2; + pdf_write_obj(array->values[i], file); + } else WARN("PDF array element #ld undefined.", i); - pdf_write_obj(array->values[i], file); } } pdf_out_char(file, ']'); @@ -1317,10 +1340,7 @@ write_dict (pdf_dict *dict, FILE *file) pdf_out (file, "<<\n", 3); /* dropping \n saves few kb. */ while (dict->key != NULL) { pdf_write_obj(dict->key, file); - if (((dict -> value)->type) == PDF_BOOLEAN || - ((dict -> value)->type) == PDF_NUMBER || - ((dict -> value)->type) == PDF_INDIRECT || - ((dict -> value)->type) == PDF_NULL) { + if (pdf_need_white(PDF_NAME, (dict->value)->type)) { pdf_out_white(file); } pdf_write_obj(dict->value, file); @@ -2214,7 +2234,7 @@ pdf_ref_file_obj (unsigned long obj_num, unsigned short obj_gen) if (!checklabel(obj_num, obj_gen)) { WARN("Can't resolve object: %lu %u", obj_num, obj_gen); - return NULL; + return pdf_new_null(); } ref = xref_table[obj_num].indirect; if (ref != NULL) @@ -2242,10 +2262,6 @@ pdf_new_ref (unsigned long obj_num, unsigned short obj_gen) pdf_obj *result; pdf_indirect *indirect; - if (!checklabel(obj_num, obj_gen)) { - WARN("Invalid object label: %lu %hu", obj_num, obj_gen); - return NULL; - } result = pdf_new_obj(PDF_INDIRECT); indirect = NEW(1, pdf_indirect); result->data = indirect; @@ -2271,7 +2287,7 @@ pdf_read_object (unsigned long obj_num, unsigned short obj_gen) if (!checklabel(obj_num, obj_gen)) { WARN("Trying to read nonexistent object: %lu %u", obj_num, obj_gen); - return NULL; + return pdf_new_null(); } if (labelfreed(obj_num, obj_gen)) { WARN("Trying to read deleted object: %lu %u", diff --git a/Build/source/texk/xdvipdfmx/src/pdfobj.h b/Build/source/texk/xdvipdfmx/src/pdfobj.h index 50fe1f5845f..346e38bd31b 100644 --- a/Build/source/texk/xdvipdfmx/src/pdfobj.h +++ b/Build/source/texk/xdvipdfmx/src/pdfobj.h @@ -1,8 +1,8 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfobj.h,v 1.22 2007/04/03 05:25:50 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfobj.h,v 1.23 2007/11/14 03:36:01 chofchof Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata, + Copyright (C) 2007 by Jin-Hwan Cho and Shunsaku Hirata, the dvipdfmx project team Copyright (C) 1998, 1999 by Mark A. Wicks @@ -55,7 +55,8 @@ extern void pdf_out_init (const char *filename, int do_encryption); extern void pdf_out_flush (void); extern void pdf_set_version (unsigned version); extern unsigned pdf_get_version (void); -extern void pdf_enable_objstm (void); +extern void pdf_objstm_init (void); +extern void pdf_objstm_close (void); extern pdf_obj *pdf_new_obj (int type); extern void pdf_release_obj (pdf_obj *object); diff --git a/Build/source/texk/xdvipdfmx/src/pdfximage.c b/Build/source/texk/xdvipdfmx/src/pdfximage.c index 939ca59bc4b..c67b8047b73 100644 --- a/Build/source/texk/xdvipdfmx/src/pdfximage.c +++ b/Build/source/texk/xdvipdfmx/src/pdfximage.c @@ -1,8 +1,8 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfximage.c,v 1.16 2007/05/18 05:19:01 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfximage.c,v 1.17 2008/02/13 20:22:21 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata, + Copyright (C) 2007 by Jin-Hwan Cho and Shunsaku Hirata, the dvipdfmx project team Copyright (C) 1998, 1999 by Mark A. Wicks @@ -71,6 +71,7 @@ struct pdf_ximage_ { char *ident; char res_name[16]; + long page_no, page_count; int subtype; @@ -79,7 +80,6 @@ struct pdf_ximage_ char *filename; pdf_obj *reference; pdf_obj *resource; - int page_index; int pdf_box; }; @@ -112,12 +112,12 @@ static void pdf_init_ximage_struct (pdf_ximage *I) { I->ident = NULL; + I->page_no = I->page_count = 0; I->filename = NULL; I->subtype = -1; memset(I->res_name, 0, 16); I->reference = NULL; I->resource = NULL; - I->page_index = 0; I->pdf_box = 0; I->attr.width = I->attr.height = 0; @@ -256,8 +256,8 @@ filter_put_form_attr (pdf_obj *kp, pdf_obj *vp, void *dp) static int -load_image (const char *ident, int page_index, int pdf_box, - const char *fullname, int format, FILE *fp) +load_image (const char *ident, + const char *fullname, int format, FILE *fp, long page_no) { struct ic_ *ic = &_ic; int id = -1; /* ret */ @@ -271,6 +271,7 @@ load_image (const char *ident, int page_index, int pdf_box, I = &ic->ximages[id]; pdf_init_ximage_struct(I); + pdf_ximage_set_page(I, page_no, 0); switch (format) { case IMAGE_TYPE_JPEG: @@ -299,11 +300,12 @@ load_image (const char *ident, int page_index, int pdf_box, case IMAGE_TYPE_PDF: if (_opts.verbose) MESG("[PDF]"); - if (pdf_include_page(I, fp, page_index, pdf_box) < 0) +// if (pdf_include_page(I, fp, page_index, pdf_box) < 0) + if (pdf_include_page(I, fp) < 0) return -1; I->subtype = PDF_XOBJECT_TYPE_FORM; - I->page_index = page_index; - I->pdf_box = pdf_box; +// I->page_index = page_index; +// I->pdf_box = pdf_box; break; case IMAGE_TYPE_EPS: if (_opts.verbose) @@ -348,7 +350,7 @@ load_image (const char *ident, int page_index, int pdf_box, #define dpx_fclose(f) (MFCLOSE((f))) int -pdf_ximage_findresource (const char *ident, int page_index, int pdf_box) +pdf_ximage_findresource (const char *ident, long page_no) { struct ic_ *ic = &_ic; int id = -1; @@ -359,9 +361,8 @@ pdf_ximage_findresource (const char *ident, int page_index, int pdf_box) for (id = 0; id < ic->count; id++) { I = &ic->ximages[id]; - if (I->ident && !strcmp(ident, I->ident) - && page_index == I->page_index - && pdf_box == I->pdf_box) { + if (I->ident && !strcmp(ident, I->ident) && + I->page_no == page_no + (page_no < 0 ? I->page_count+1 : 0)) { return id; } } @@ -393,7 +394,7 @@ pdf_ximage_findresource (const char *ident, int page_index, int pdf_box) id = mps_include_page(ident, fp); break; default: - id = load_image(ident, page_index, pdf_box, fullname, format, fp); + id = load_image(ident, fullname, format, fp, page_no); break; } dpx_fclose(fp); @@ -529,6 +530,19 @@ pdf_ximage_set_form (pdf_ximage *I, void *form_info, pdf_obj *resource) I->resource = NULL; } +long +pdf_ximage_get_page (pdf_ximage *I) +{ + return I->page_no; +} + +void +pdf_ximage_set_page (pdf_ximage *I, long page_no, long page_count) +{ + I->page_no = page_no; + I->page_count = page_count; +} + #define CHECK_ID(c,n) do {\ if ((n) < 0 || (n) >= (c)->count) {\ @@ -606,13 +620,14 @@ pdf_ximage_get_resname (int id) return I->res_name; } + /* depth... * Dvipdfm treat "depth" as "yoffset" for pdf:image and pdf:uxobj * not as vertical dimension of scaled image. (And there are bugs.) * This part contains incompatibile behaviour than dvipdfm! */ -#define EBB_DPI 72 /* was 100 in dvipdfmx; changed to 72 to match xetex's ideas - about graphics resolution/scaling */ +#define EBB_DPI 72 + static void scale_to_fit_I (pdf_tmatrix *T, transform_info *p, @@ -865,7 +880,8 @@ ps_include_page (pdf_ximage *ximage, const char *filename) dpx_delete_temp_file(temp); return -1; } - error = pdf_include_page(ximage, fp, 0, pdfbox_crop); +// error = pdf_include_page(ximage, fp, 0, pdfbox_crop); + error = pdf_include_page(ximage, fp); MFCLOSE(fp); if (_opts.verbose > 1) { diff --git a/Build/source/texk/xdvipdfmx/src/pdfximage.h b/Build/source/texk/xdvipdfmx/src/pdfximage.h index 6a943516760..782af5c106c 100644 --- a/Build/source/texk/xdvipdfmx/src/pdfximage.h +++ b/Build/source/texk/xdvipdfmx/src/pdfximage.h @@ -1,8 +1,8 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfximage.h,v 1.10 2007/05/18 05:19:01 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfximage.h,v 1.11 2008/02/13 20:22:21 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata, + Copyright (C) 2007 by Jin-Hwan Cho and Shunsaku Hirata, the dvipdfmx project team Copyright (C) 1998, 1999 by Mark A. Wicks @@ -62,7 +62,7 @@ extern char *pdf_ximage_get_resname (int xobj_id); extern pdf_obj *pdf_ximage_get_reference (int xobj_id); -extern int pdf_ximage_findresource (const char *ident, int page_index, int pdf_box); +extern int pdf_ximage_findresource (const char *ident, long page_no/*, int pdf_box*/); extern int pdf_ximage_defineresource (const char *ident, int subtype, void *cdata, pdf_obj *resource); @@ -71,6 +71,8 @@ extern void pdf_ximage_init_image_info (ximage_info *info); extern void pdf_ximage_init_form_info (xform_info *info); extern void pdf_ximage_set_image (pdf_ximage *ximage, void *info, pdf_obj *resource); extern void pdf_ximage_set_form (pdf_ximage *ximage, void *info, pdf_obj *resource); +extern void pdf_ximage_set_page (pdf_ximage *ximage, long page_no, long page_count); +extern long pdf_ximage_get_page (pdf_ximage *I); /* from psimage.h */ extern void set_distiller_template (char *s); diff --git a/Build/source/texk/xdvipdfmx/src/spc_color.c b/Build/source/texk/xdvipdfmx/src/spc_color.c index a7f4db79d8b..35880193012 100644 --- a/Build/source/texk/xdvipdfmx/src/spc_color.c +++ b/Build/source/texk/xdvipdfmx/src/spc_color.c @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/spc_color.c,v 1.5 2005/07/30 11:44:18 hirata Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/spc_color.c,v 1.6 2007/11/22 11:45:39 chofchof Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -74,18 +74,14 @@ spc_color_at_end_document (void) static int spc_handler_color_push (struct spc_env *spe, struct spc_arg *args) { - int error = 0; + int error; pdf_color colorspec; - pdf_color_push(); /* save currentcolor */ - if (args->curptr < args->endptr) { - error = spc_util_read_colorspec(spe, &colorspec, args, 1); - if (!error) { - pdf_dev_setcolor(&colorspec, 0); - pdf_dev_setcolor(&colorspec, 1); - } + error = spc_util_read_colorspec(spe, &colorspec, args, 1); + if (!error) { + pdf_color_push(&colorspec, &colorspec); } - + return error; } @@ -97,9 +93,8 @@ spc_handler_color_pop (struct spc_env *spe, struct spc_arg *args) return 0; } -/* _FIXME_ ... I don't understand this well. - * Dvips's implementation is to clear color stack and then - * push color? +/* Invoked by the special command "color rgb .625 0 0". + * DVIPS clears the color stack, and then saves and sets the given color. */ static int spc_handler_color_default (struct spc_env *spe, struct spc_arg *args) @@ -109,10 +104,9 @@ spc_handler_color_default (struct spc_env *spe, struct spc_arg *args) error = spc_util_read_colorspec(spe, &colorspec, args, 1); if (!error) { - pdf_color_clear(); - pdf_dev_setcolor(&colorspec, 0); - pdf_dev_setcolor(&colorspec, 1); - pdf_color_set_default(&colorspec); /* save currentcolor */ + pdf_color_set_default(&colorspec); + pdf_color_clear_stack(); /* the default color is saved on color_stack */ + pdf_color_push(&colorspec, &colorspec); } return error; diff --git a/Build/source/texk/xdvipdfmx/src/spc_dvips.c b/Build/source/texk/xdvipdfmx/src/spc_dvips.c index 03c64dc5cc2..2eac7ebcbd1 100644 --- a/Build/source/texk/xdvipdfmx/src/spc_dvips.c +++ b/Build/source/texk/xdvipdfmx/src/spc_dvips.c @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/spc_dvips.c,v 1.9 2005/08/19 12:06:24 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/spc_dvips.c,v 1.10 2008/02/13 20:22:21 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -157,12 +157,12 @@ spc_handler_ps_file (struct spc_env *spe, struct spc_arg *args) } transform_info_clear(&ti); - if (spc_util_read_dimtrns(spe, &ti, args, 1) < 0) { + if (spc_util_read_dimtrns(spe, &ti, args, NULL, 1) < 0) { RELEASE(filename); return -1; } - form_id = pdf_ximage_findresource(filename, 0, 0); + form_id = pdf_ximage_findresource(filename, 1); if (form_id < 0) { spc_warn(spe, "Failed to read image file: %s", filename); RELEASE(filename); @@ -195,7 +195,7 @@ spc_handler_ps_plotfile (struct spc_env *spe, struct spc_arg *args) return -1; } - form_id = pdf_ximage_findresource(filename, 0, 0); + form_id = pdf_ximage_findresource(filename, 1); if (form_id < 0) { spc_warn(spe, "Could not open PS file: %s", filename); error = -1; @@ -547,7 +547,7 @@ spc_handler_ps_tricks_parse_path (struct spc_env *spe, struct spc_arg *args, } fp = fopen(gs_out, "r"); - if (pdf_copy_clip(fp, 0, 0, 0) != 0) { + if (pdf_copy_clip(fp, 1, 0, 0) != 0) { spc_warn(spe, "Failed to parse the clipping path."); RELEASE(gs_in); gs_in = 0; @@ -623,7 +623,7 @@ spc_handler_ps_tricks_render (struct spc_env *spe, struct spc_arg *args) return error; } - form_id = pdf_ximage_findresource(gs_out, 0, 0); + form_id = pdf_ximage_findresource(gs_out, 1/*, 0*/); if (form_id < 0) { spc_warn(spe, "Failed to read converted PSTricks image file."); RELEASE(gs_in); diff --git a/Build/source/texk/xdvipdfmx/src/spc_html.c b/Build/source/texk/xdvipdfmx/src/spc_html.c index ca16046f2cf..322c53475ce 100644 --- a/Build/source/texk/xdvipdfmx/src/spc_html.c +++ b/Build/source/texk/xdvipdfmx/src/spc_html.c @@ -635,7 +635,7 @@ spc_html__img_empty (struct spc_env *spe, pdf_obj *attr, struct spc_html_ *sd) return error; } - id = pdf_ximage_findresource(pdf_string_value(src), 0, 0); + id = pdf_ximage_findresource(pdf_string_value(src), 0/*, 0*/); if (id < 0) { spc_warn(spe, "Could not find/load image: %s", pdf_string_value(src)); error = -1; diff --git a/Build/source/texk/xdvipdfmx/src/spc_misc.c b/Build/source/texk/xdvipdfmx/src/spc_misc.c index a4b908eaac1..51e0ceee7d2 100644 --- a/Build/source/texk/xdvipdfmx/src/spc_misc.c +++ b/Build/source/texk/xdvipdfmx/src/spc_misc.c @@ -134,7 +134,7 @@ spc_handler_postscriptbox (struct spc_env *spe, struct spc_arg *ap) } MFCLOSE(fp); - form_id = pdf_ximage_findresource(filename, 0, 0); + form_id = pdf_ximage_findresource(filename, 0/*, 0*/); if (form_id < 0) { spc_warn(spe, "Failed to load image file: %s", filename); return -1; diff --git a/Build/source/texk/xdvipdfmx/src/spc_pdfm.c b/Build/source/texk/xdvipdfmx/src/spc_pdfm.c index d86a158e53f..6d914149d86 100644 --- a/Build/source/texk/xdvipdfmx/src/spc_pdfm.c +++ b/Build/source/texk/xdvipdfmx/src/spc_pdfm.c @@ -1,8 +1,8 @@ -/* $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.30 2008/02/13 20:22:21 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata, + Copyright (C) 2007 by Jin-Hwan Cho and Shunsaku Hirata, the dvipdfmx project team Copyright (C) 1998, 1999 by Mark A. Wicks @@ -331,7 +331,6 @@ 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); if (!obj2) { spc_warn(spe, "Missing (an) object(s) to put into \"%s\"!", ident); @@ -392,7 +391,7 @@ spc_handler_pdfm_put (struct spc_env *spe, struct spc_arg *ap) break; } pdf_release_obj(obj2); - + RELEASE(ident); return error; } @@ -526,6 +525,7 @@ maybe_reencode_utf8(pdf_obj *instring) } pdf_set_string(instring, wbuf, op - wbuf); + return 0; } @@ -640,7 +640,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; @@ -774,9 +774,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; @@ -802,8 +802,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; @@ -824,7 +824,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; } @@ -958,8 +958,8 @@ spc_handler_pdfm_article (struct spc_env *spe, struct spc_arg *args) info_dict = parse_pdf_dict(&args->curptr, args->endptr); #endif /* ENABLE_TOUNICODE */ if (!info_dict) { - RELEASE(ident); spc_warn(spe, "Ignoring article with invalid info dictionary."); + RELEASE(ident); return -1; } @@ -999,7 +999,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; } @@ -1053,6 +1053,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; } @@ -1064,6 +1065,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] == '@') { @@ -1077,7 +1079,8 @@ 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; @@ -1093,10 +1096,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), 0, 0); + 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); @@ -1329,8 +1334,8 @@ spc_handler_pdfm_object (struct spc_env *spe, struct spc_arg *args) object = parse_pdf_object(&args->curptr, args->endptr); 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); @@ -1469,16 +1474,16 @@ spc_handler_pdfm_fstream (struct spc_env *spe, struct spc_arg *args) pdf_release_obj(tmp); if (!fullname) { spc_warn(spe, "Could not find file."); - RELEASE(ident); pdf_release_obj(fstream); + RELEASE(ident); return -1; } fp = MFOPEN(fullname, FOPEN_RBIN_MODE); if (!fp) { spc_warn(spe, "Could not open file: %s", fullname); - RELEASE(ident); pdf_release_obj(fstream); + RELEASE(ident); return -1; } @@ -1506,8 +1511,8 @@ spc_handler_pdfm_fstream (struct spc_env *spe, struct spc_arg *args) tmp = parse_pdf_dict(&args->curptr, args->endptr); if (!tmp) { spc_warn(spe, "Parsing dictionary failed."); - RELEASE(ident); pdf_release_obj(fstream); + RELEASE(ident); return -1; } if (pdf_lookup_dict(tmp, "Length")) { @@ -1559,7 +1564,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; } @@ -1672,7 +1677,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; } @@ -1684,7 +1689,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, 0, 0); + xobj_id = pdf_ximage_findresource(ident, 0); if (xobj_id < 0) { spc_warn(spe, "Specified (image) object doesn't exist: %s", ident); RELEASE(ident); @@ -1832,6 +1837,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; } @@ -1843,7 +1849,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; @@ -1863,19 +1868,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") || @@ -1883,8 +1889,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 */ diff --git a/Build/source/texk/xdvipdfmx/src/spc_util.c b/Build/source/texk/xdvipdfmx/src/spc_util.c index 2e56cbc92c4..fd143e8b0a7 100644 --- a/Build/source/texk/xdvipdfmx/src/spc_util.c +++ b/Build/source/texk/xdvipdfmx/src/spc_util.c @@ -1,8 +1,8 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/spc_util.c,v 1.8 2007/04/24 09:29:39 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/spc_util.c,v 1.10 2008/02/13 20:22:21 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata, + Copyright (C) 2007 by Jin-Hwan Cho and Shunsaku Hirata, the dvipdfmx project team Copyright (C) 1998, 1999 by Mark A. Wicks @@ -411,9 +411,8 @@ spc_read_dimtrns_dvips (struct spc_env *spe, transform_info *t, struct spc_arg * spc_warn(spe, "Missing value for dimension/transformation: %s", kp); error = -1; } - + RELEASE(kp); if (!vp || error) { - RELEASE(kp); break; } @@ -476,7 +475,7 @@ spc_read_dimtrns_dvips (struct spc_env *spe, transform_info *t, struct spc_arg * static int -spc_read_dimtrns_pdfm (struct spc_env *spe, transform_info *p, struct spc_arg *ap) +spc_read_dimtrns_pdfm (struct spc_env *spe, transform_info *p, struct spc_arg *ap, long *page_no) { int has_scale, has_xscale, has_yscale, has_rotate, has_matrix; const char *_dtkeys[] = { @@ -493,6 +492,8 @@ spc_read_dimtrns_pdfm (struct spc_env *spe, transform_info *p, struct spc_arg *a "bbox", /* See "Dvipdfmx User's Manual", p.5 */ #define K_TRN__MATRIX 8 "matrix", +#define K_TRN__PAGE 9 + "page", NULL }; double xscale, yscale, rotate; @@ -592,6 +593,15 @@ spc_read_dimtrns_pdfm (struct spc_env *spe, transform_info *p, struct spc_arg *a } } break; + case K_TRN__PAGE: + { + double page; + if (page_no && spc_util_read_numbers(&page, 1, spe, ap) == 1) + *page_no = (long) page; + else + error = -1; + } + break; default: error = -1; break; @@ -630,14 +640,15 @@ spc_read_dimtrns_pdfm (struct spc_env *spe, transform_info *p, struct spc_arg *a } int -spc_util_read_dimtrns (struct spc_env *spe, transform_info *ti, struct spc_arg *args, int syntax) +spc_util_read_dimtrns (struct spc_env *spe, transform_info *ti, struct spc_arg *args, long *page_no, int syntax) { ASSERT(ti && spe && args); if (syntax) { + ASSERT(!page_no); return spc_read_dimtrns_dvips(spe, ti, args); } else { - return spc_read_dimtrns_pdfm (spe, ti, args); + return spc_read_dimtrns_pdfm (spe, ti, args, page_no); } return -1; diff --git a/Build/source/texk/xdvipdfmx/src/spc_util.h b/Build/source/texk/xdvipdfmx/src/spc_util.h index 1c0bbc01119..a10becda1fa 100644 --- a/Build/source/texk/xdvipdfmx/src/spc_util.h +++ b/Build/source/texk/xdvipdfmx/src/spc_util.h @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/spc_util.h,v 1.4 2005/07/30 11:44:18 hirata Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/spc_util.h,v 1.5 2008/02/13 20:22:21 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -36,7 +36,7 @@ * This is for reading *single* color specification. */ extern int spc_util_read_colorspec (struct spc_env *spe, pdf_color *colorspec, struct spc_arg *args, int syntax); -extern int spc_util_read_dimtrns (struct spc_env *spe, transform_info *dimtrns, struct spc_arg *args, int syntax); +extern int spc_util_read_dimtrns (struct spc_env *spe, transform_info *dimtrns, struct spc_arg *args, long *page, int syntax); extern int spc_util_read_length (struct spc_env *spe, double *length, struct spc_arg *ap); extern int spc_util_read_numbers (double *values, int num_values, struct spc_env *spe, struct spc_arg *args); -- cgit v1.2.3