summaryrefslogtreecommitdiff
path: root/Build/source/texk/xdvipdfmx/src
diff options
context:
space:
mode:
authorJonathan Kew <jfkthame@googlemail.com>2008-03-27 11:18:16 +0000
committerJonathan Kew <jfkthame@googlemail.com>2008-03-27 11:18:16 +0000
commita95124f73754f00f40705b40ff513e5f21db45fd (patch)
treed288b3ce80bc10e37bc7bca19ae6698cddd9a5ea /Build/source/texk/xdvipdfmx/src
parent194899d8a5ee8f12d82f140c728e1f9dad6c1d04 (diff)
xdvipdfmx update from xetex svn r.633
git-svn-id: svn://tug.org/texlive/trunk@7186 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/xdvipdfmx/src')
-rw-r--r--Build/source/texk/xdvipdfmx/src/cff_dict.c25
-rw-r--r--Build/source/texk/xdvipdfmx/src/dvi.c35
-rw-r--r--Build/source/texk/xdvipdfmx/src/dvipdfmx.c14
-rw-r--r--Build/source/texk/xdvipdfmx/src/epdf.c420
-rw-r--r--Build/source/texk/xdvipdfmx/src/epdf.h3
-rw-r--r--Build/source/texk/xdvipdfmx/src/fontmap.c39
-rw-r--r--Build/source/texk/xdvipdfmx/src/fontmap.h2
-rw-r--r--Build/source/texk/xdvipdfmx/src/mpost.c24
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfcolor.c210
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfcolor.h16
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfdev.c173
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfdev.h9
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfdoc.c33
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfdoc.h7
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfdraw.c349
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfobj.c52
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfobj.h7
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfximage.c50
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfximage.h8
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_color.c28
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_dvips.c12
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_html.c2
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_misc.c2
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_pdfm.c61
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_util.c25
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_util.h4
26 files changed, 851 insertions, 759 deletions
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 <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
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("<NATIVE-FONTMAP:%s", fontmap_key);
@@ -1009,8 +1009,9 @@ pdf_insert_native_fontmap_record (const char *name, const char *path, int index,
fill_in_defaults(mrec, fontmap_key);
- mrec->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 <dvipdfmx@project.ktug.or.kr>
Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
@@ -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, &current_fill, sizeof(pdf_color));
- } else {
- memcpy(color, &current_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, &current_fill)) {
- return 0;
- }
- } else {
- if (!compare_color(&validated, &current_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(&current_fill, &validated, sizeof(pdf_color));
- } else {
- memcpy(&current_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],
- &current_stroke, sizeof(pdf_color));
- memcpy(&color_stack.fill[current],
- &current_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 <dvipdfmx@project.ktug.or.kr>
Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
@@ -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 <dvipdfmx@project.ktug.or.kr>
Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
@@ -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 <dvipdfmx@project.ktug.or.kr>
Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
@@ -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 <dvipdfmx@project.ktug.or.kr>
Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
@@ -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 <dvipdfmx@project.ktug.or.kr>
Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
@@ -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 <dvipdfmx@project.ktug.or.kr>
Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
@@ -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 <dvipdfmx@project.ktug.or.kr>
Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
@@ -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 <dvipdfmx@project.ktug.or.kr>
Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
@@ -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);