diff options
author | Peter Breitenlohner <peb@mppmu.mpg.de> | 2013-07-10 15:35:21 +0000 |
---|---|---|
committer | Peter Breitenlohner <peb@mppmu.mpg.de> | 2013-07-10 15:35:21 +0000 |
commit | 5545f2236f9abc704ba6cc442841363b0ac5eb1b (patch) | |
tree | f74b65e87bc2f6be84feb3d5b88915e66ee7b470 /Build/source/texk/dvipdfm-x/xsrc | |
parent | 233c204ecbc43730d329352806a24be175ced0b3 (diff) |
dvipdfm-x: Continue merging dvipdfmx and xdvipdfmx
git-svn-id: svn://tug.org/texlive/trunk@31156 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvipdfm-x/xsrc')
-rw-r--r-- | Build/source/texk/dvipdfm-x/xsrc/cff.c | 1501 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/xsrc/dvi.c | 55 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/xsrc/dvi.h | 105 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/xsrc/dvipdfmx.c | 51 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/xsrc/epdf.c | 3 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/xsrc/mpost.c | 1671 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/xsrc/pdfdev.h | 233 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/xsrc/pdfdoc.h | 137 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/xsrc/pdfdraw.h | 172 | ||||
-rw-r--r-- | Build/source/texk/dvipdfm-x/xsrc/xbb.c | 57 |
10 files changed, 107 insertions, 3878 deletions
diff --git a/Build/source/texk/dvipdfm-x/xsrc/cff.c b/Build/source/texk/dvipdfm-x/xsrc/cff.c deleted file mode 100644 index 082d3d873e9..00000000000 --- a/Build/source/texk/dvipdfm-x/xsrc/cff.c +++ /dev/null @@ -1,1501 +0,0 @@ -/* - - This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - - Copyright (C) 2002-2012 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - 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. -*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <string.h> - -#include "system.h" -#include "mem.h" -#include "error.h" -#include "mfileio.h" - -#include "cff_limits.h" -#include "cff_types.h" -#include "cff_stdstr.h" -#include "cff_dict.h" - -#include "cff.h" - -#define CFF_DEBUG 5 -#define CFF_DEBUG_STR "CFF" - -#ifdef XETEX -#define SFNT_OR_FILE sfnt -#define SFONT_OR_STREAM sfont -#define get_card8(s) sfnt_get_byte((s)) -#define get_card16(s) sfnt_get_ushort((s)) -#else -#define SFNT_OR_FILE FILE -#define SFONT_OR_STREAM stream -#define get_card8(s) get_unsigned_byte((s)) -#define get_card16(s) get_unsigned_pair((s)) -#endif - -static unsigned long get_unsigned (SFNT_OR_FILE *SFONT_OR_STREAM, int n) -{ - unsigned long v = 0; - - while (n-- > 0) - v = v*0x100u + get_card8(SFONT_OR_STREAM); - - return v; -} - -#define get_offset(s, n) get_unsigned((s), (n)) - -/* - * Read Header, Name INDEX, Top DICT INDEX, and String INDEX. - */ -cff_font *cff_open(SFNT_OR_FILE *SFONT_OR_STREAM, long offset, int n) -{ - cff_font *cff; - cff_index *idx; - - cff = NEW(1, cff_font); - - cff->fontname = NULL; - cff->index = n; - cff->SFONT_OR_STREAM = SFONT_OR_STREAM; - cff->offset = offset; - cff->filter = 0; /* not used */ - cff->flag = 0; - - cff->name = NULL; - cff->gsubr = NULL; - cff->encoding = NULL; - cff->charsets = NULL; - cff->fdselect = NULL; - cff->cstrings = NULL; - cff->fdarray = NULL; - cff->private = NULL; - cff->subrs = NULL; - - cff->num_glyphs = 0; - cff->num_fds = 0; - cff->_string = NULL; - - cff_seek_set(cff, 0); - cff->header.major = get_card8(cff->SFONT_OR_STREAM); - cff->header.minor = get_card8(cff->SFONT_OR_STREAM); - cff->header.hdr_size = get_card8(cff->SFONT_OR_STREAM); - cff->header.offsize = get_card8(cff->SFONT_OR_STREAM); - if (cff->header.offsize < 1 || - cff->header.offsize > 4) - ERROR("invalid offsize data"); - - if (cff->header.major > 1 || - cff->header.minor > 0) { - WARN("%s: CFF version %u.%u not supported.", - CFF_DEBUG_STR, cff->header.major, cff->header.minor); - cff_close(cff); - return NULL; - } - - cff_seek_set(cff, (cff->header).hdr_size); - - /* Name INDEX */ - idx = cff_get_index(cff); - if (n > idx->count - 1) { - WARN("%s: Invalid CFF fontset index number.", CFF_DEBUG_STR); - cff_close(cff); - return NULL; - } - - cff->name = idx; - - cff->fontname = cff_get_name(cff); - - /* Top DICT INDEX */ - idx = cff_get_index(cff); - if (n > idx->count - 1) - ERROR("CFF Top DICT not exist..."); - cff->topdict = cff_dict_unpack(idx->data + idx->offset[n] - 1, - idx->data + idx->offset[n + 1] - 1); - if (!cff->topdict) - ERROR("Parsing CFF Top DICT data failed..."); - cff_release_index(idx); - - if (cff_dict_known(cff->topdict, "CharstringType") && - cff_dict_get(cff->topdict, "CharstringType", 0) != 2) { - WARN("Only Type 2 Charstrings supported..."); - cff_close(cff); - return NULL; - } - - if (cff_dict_known(cff->topdict, "SyntheticBase")) { - WARN("CFF Synthetic font not supported."); - cff_close(cff); - return NULL; - } - - /* String INDEX */ - cff->string = cff_get_index(cff); - - /* offset to GSubr */ - cff->gsubr_offset = cff->sfont->loc - offset; - - /* Number of glyphs */ - offset = (long) cff_dict_get(cff->topdict, "CharStrings", 0); - cff_seek_set(cff, offset); - cff->num_glyphs = get_card16(cff->SFONT_OR_STREAM); - - /* Check for font type */ - if (cff_dict_known(cff->topdict, "ROS")) { - cff->flag |= FONTTYPE_CIDFONT; - } else { - cff->flag |= FONTTYPE_FONT; - } - - /* Check for encoding */ - if (cff_dict_known(cff->topdict, "Encoding")) { - offset = (long) cff_dict_get(cff->topdict, "Encoding", 0); - if (offset == 0) { /* predefined */ - cff->flag |= ENCODING_STANDARD; - } else if (offset == 1) { - cff->flag |= ENCODING_EXPERT; - } - } else { - cff->flag |= ENCODING_STANDARD; - } - - /* Check for charset */ - if (cff_dict_known(cff->topdict, "charset")) { - offset = (long) cff_dict_get(cff->topdict, "charset", 0); - if (offset == 0) { /* predefined */ - cff->flag |= CHARSETS_ISOADOBE; - } else if (offset == 1) { - cff->flag |= CHARSETS_EXPERT; - } else if (offset == 2) { - cff->flag |= CHARSETS_EXPSUB; - } - } else { - cff->flag |= CHARSETS_ISOADOBE; - } - - cff_seek_set(cff, cff->gsubr_offset); /* seek back to GSubr */ - -#ifdef XETEX - cff->ft_to_gid = NULL; -#endif - - return cff; -} - -void -cff_close (cff_font *cff) -{ - card16 i; - - if (cff) { - if (cff->fontname) RELEASE(cff->fontname); - if (cff->name) cff_release_index(cff->name); - if (cff->topdict) cff_release_dict(cff->topdict); - if (cff->string) cff_release_index(cff->string); - if (cff->gsubr) cff_release_index(cff->gsubr); - if (cff->encoding) cff_release_encoding(cff->encoding); - if (cff->charsets) cff_release_charsets(cff->charsets); - if (cff->fdselect) cff_release_fdselect(cff->fdselect); - if (cff->cstrings) cff_release_index(cff->cstrings); - if (cff->fdarray) { - for (i=0;i<cff->num_fds;i++) { - if (cff->fdarray[i]) cff_release_dict(cff->fdarray[i]); - } - RELEASE(cff->fdarray); - } - if (cff->private) { - for (i=0;i<cff->num_fds;i++) { - if (cff->private[i]) cff_release_dict(cff->private[i]); - } - RELEASE(cff->private); - } - if (cff->subrs) { - for (i=0;i<cff->num_fds;i++) { - if (cff->subrs[i]) cff_release_index(cff->subrs[i]); - } - RELEASE(cff->subrs); - } - if (cff->_string) - cff_release_index(cff->_string); - -#ifdef XETEX - if (cff->ft_to_gid) - RELEASE(cff->ft_to_gid); -#endif - - RELEASE(cff); - } - - return; -} - -char * -cff_get_name (cff_font *cff) -{ - char *fontname; - l_offset len; - cff_index *idx; - - idx = cff->name; - len = idx->offset[cff->index + 1] - idx->offset[cff->index]; - fontname = NEW(len + 1, char); - memcpy(fontname, idx->data + idx->offset[cff->index] - 1, len); - fontname[len] = '\0'; - - return fontname; -} - -long -cff_set_name (cff_font *cff, char *name) -{ - cff_index *idx; - - if (strlen(name) > 127) - ERROR("FontName string length too large..."); - - if (cff->name) - cff_release_index(cff->name); - - cff->name = idx = NEW(1, cff_index); - idx->count = 1; - idx->offsize = 1; - idx->offset = NEW(2, l_offset); - (idx->offset)[0] = 1; - (idx->offset)[1] = strlen(name) + 1; - idx->data = NEW(strlen(name), card8); - memmove(idx->data, name, strlen(name)); /* no trailing '\0' */ - - return 5 + strlen(name); -} - -long -cff_put_header (cff_font *cff, card8 *dest, long destlen) -{ - if (destlen < 4) - ERROR("Not enough space available..."); - - *(dest++) = cff->header.major; - *(dest++) = cff->header.minor; - *(dest++) = 4; /* Additional data in between header and - * Name INDEX ignored. - */ - /* We will set all offset (0) to four-byte integer. */ - *(dest++) = 4; - cff->header.offsize = 4; - - return 4; -} - -/* Only read header part but not body */ -cff_index * -cff_get_index_header (cff_font *cff) -{ - cff_index *idx; - card16 i, count; - - idx = NEW(1, cff_index); - - idx->count = count = get_card16(cff->SFONT_OR_STREAM); - if (count > 0) { - idx->offsize = get_card8(cff->SFONT_OR_STREAM); - if (idx->offsize < 1 || idx->offsize > 4) - ERROR("invalid offsize data"); - - idx->offset = NEW(count+1, l_offset); - for (i=0;i<count+1;i++) { - (idx->offset)[i] = get_offset(cff->SFONT_OR_STREAM, idx->offsize); - } - - if (idx->offset[0] != 1) - ERROR("cff_get_index(): invalid index data"); - - idx->data = NULL; - } else { - idx->offsize = 0; - idx->offset = NULL; - idx->data = NULL; - } - - return idx; -} - -cff_index * -cff_get_index (cff_font *cff) -{ - cff_index *idx; - card16 i, count; - long length, nb_read, offset; - - idx = NEW(1, cff_index); - - idx->count = count = get_card16(cff->SFONT_OR_STREAM); - if (count > 0) { - idx->offsize = get_card8(cff->SFONT_OR_STREAM); - if (idx->offsize < 1 || idx->offsize > 4) - ERROR("invalid offsize data"); - - idx->offset = NEW(count + 1, l_offset); - for (i = 0 ; i < count + 1; i++) { - idx->offset[i] = get_offset(cff->SFONT_OR_STREAM, idx->offsize); - } - - if (idx->offset[0] != 1) - ERROR("Invalid CFF Index offset data"); - - length = idx->offset[count] - idx->offset[0]; - - idx->data = NEW(length, card8); - offset = 0; - while (length > 0) { - nb_read = sfnt_read(idx->data + offset, length, cff->sfont); - offset += nb_read; - length -= nb_read; - } - } else { - idx->offsize = 0; - idx->offset = NULL; - idx->data = NULL; - } - - return idx; -} - -long -cff_pack_index (cff_index *idx, card8 *dest, long destlen) -{ - long len = 0; - long datalen; - card16 i; - - if (idx->count < 1) { - if (destlen < 2) - ERROR("Not enough space available..."); - memset(dest, 0, 2); - return 2; - } - - len = cff_index_size(idx); - datalen = idx->offset[idx->count] - 1; - - if (destlen < len) - ERROR("Not enough space available..."); - - *(dest++) = (idx->count >> 8) & 0xff; - *(dest++) = idx->count & 0xff; - - if (datalen < 0xffUL) { - idx->offsize = 1; - *(dest++) = 1; - for (i = 0; i <= idx->count; i++) { - *(dest++) = (card8) (idx->offset[i] & 0xff); - } - } else if (datalen < 0xffffUL) { - idx->offsize = 2; - *(dest++) = 2; - for (i = 0; i <= idx->count; i++) { - *(dest++) = (card8) ((idx->offset[i] >> 8) & 0xff); - *(dest++) = (card8) ( idx->offset[i] & 0xff); - } - } else if (datalen < 0xffffffUL) { - idx->offsize = 3; - *(dest++) = 3; - for (i = 0; i <= idx->count; i++) { - *(dest++) = (card8)((idx->offset[i] >> 16) & 0xff); - *(dest++) = (card8)((idx->offset[i] >> 8) & 0xff); - *(dest++) = (card8)(idx->offset[i] & 0xff); - } - } else { - idx->offsize = 4; - *(dest++) = 4; - for (i = 0; i <= idx->count; i++) { - *(dest++) = (card8)((idx->offset[i] >> 24) & 0xff); - *(dest++) = (card8)((idx->offset[i] >> 16) & 0xff); - *(dest++) = (card8)((idx->offset[i] >> 8) & 0xff); - *(dest++) = (card8)(idx->offset[i] & 0xff); - } - } - - memmove(dest, idx->data, idx->offset[idx->count] - 1); - - return len; -} - -long -cff_index_size (cff_index *idx) -{ - if (idx->count > 0) { - l_offset datalen; - - datalen = idx->offset[idx->count] - 1; - if (datalen < 0xffUL) { - idx->offsize = 1; - } else if (datalen < 0xffffUL) { - idx->offsize = 2; - } else if (datalen < 0xffffffUL) { - idx->offsize = 3; - } else { - idx->offsize = 4; - } - return (3 + (idx->offsize)*(idx->count + 1) + datalen); - } else { - return 2; - } -} - - -cff_index *cff_new_index (card16 count) -{ - cff_index *idx; - - idx = NEW(1, cff_index); - idx->count = count; - idx->offsize = 0; - - if (count > 0) { - idx->offset = NEW(count + 1, l_offset); - (idx->offset)[0] = 1; - } else { - idx->offset = NULL; - } - idx->data = NULL; - - return idx; -} - -void cff_release_index (cff_index *idx) -{ - if (idx) { - if (idx->data) { - RELEASE(idx->data); - } - if (idx->offset) { - RELEASE(idx->offset); - } - RELEASE(idx); - } -} - -/* Strings */ -char *cff_get_string (cff_font *cff, s_SID id) -{ - char *result = NULL; - long len; - - if (id < CFF_STDSTR_MAX) { - len = strlen(cff_stdstr[id]); - result = NEW(len+1, char); - memcpy(result, cff_stdstr[id], len); - result[len] = '\0'; - } else if (cff && cff->string) { - cff_index *strings = cff->string; - id -= CFF_STDSTR_MAX; - if (id < strings->count) { - len = (strings->offset)[id+1] - (strings->offset)[id]; - result = NEW(len + 1, char); - memmove(result, strings->data + (strings->offset)[id] - 1, len); - result[len] = '\0'; - } - } - - return result; -} - -long cff_get_sid (cff_font *cff, const char *str) -{ - card16 i; - - if (!cff || !str) - return -1; - - /* I search String INDEX first. */ - if (cff && cff->string) { - cff_index *idx = cff->string; - for (i = 0; i < idx->count; i++) { - if (strlen(str) == (idx->offset)[i+1] - (idx->offset)[i] && - !memcmp(str, (idx->data)+(idx->offset)[i]-1, strlen(str))) - return (i + CFF_STDSTR_MAX); - } - } - - for (i = 0; i < CFF_STDSTR_MAX; i++) { - if (!strcmp(str, cff_stdstr[i])) - return i; - } - - return -1; -} - -long cff_get_seac_sid (cff_font *cff, const char *str) -{ - card16 i; - - if (!cff || !str) - return -1; - - for (i = 0; i < CFF_STDSTR_MAX; i++) { - if (!strcmp(str, cff_stdstr[i])) - return i; - } - - return -1; -} - -int cff_match_string (cff_font *cff, const char *str, s_SID sid) -{ - card16 i; - - if (sid < CFF_STDSTR_MAX) { - return ((!strcmp(str, cff_stdstr[sid])) ? 1 : 0); - } else { - i = sid - CFF_STDSTR_MAX; - if (cff == NULL || cff->string == NULL || i >= cff->string->count) - ERROR("Invalid SID"); - if (strlen(str) == (cff->string->offset)[i+1] - (cff->string->offset)[i]) - return (!memcmp(str, - (cff->string->data)+(cff->string->offset)[i]-1, - strlen(str))) ? 1 : 0; - } - - return 0; -} - -void cff_update_string (cff_font *cff) -{ - if (cff == NULL) - ERROR("CFF font not opened."); - - if (cff->string) - cff_release_index(cff->string); - cff->string = cff->_string; - cff->_string = NULL; -} - -s_SID cff_add_string (cff_font *cff, const char *str, int unique) -/* Setting unique == 1 eliminates redundant or predefined strings. */ -{ - card16 idx; - cff_index *strings; - l_offset offset, size; - long len = strlen(str); - - if (cff == NULL) - ERROR("CFF font not opened."); - - if (cff->_string == NULL) - cff->_string = cff_new_index(0); - strings = cff->_string; - - if (unique) { - /* TODO: do binary search to speed things up */ - for (idx = 0; idx < CFF_STDSTR_MAX; idx++) { - if (cff_stdstr[idx] && !strcmp(cff_stdstr[idx], str)) - return idx; - } - for (idx = 0; idx < strings->count; idx++) { - size = strings->offset[idx+1] - strings->offset[idx]; - offset = strings->offset[idx]; - if (size == len && !memcmp(strings->data+offset-1, str, len)) - return (idx + CFF_STDSTR_MAX); - } - } - - offset = (strings->count > 0) ? strings->offset[strings->count] : 1; - strings->offset = RENEW(strings->offset, strings->count+2, l_offset); - if (strings->count == 0) - strings->offset[0] = 1; - idx = strings->count; - strings->count += 1; - strings->offset[strings->count] = offset + len; - strings->data = RENEW(strings->data, offset+len-1, card8); - memcpy(strings->data+offset-1, str, len); - - return (idx + CFF_STDSTR_MAX); -} - -/* - * Encoding and Charset - * - * Encoding and Charset arrays always begin with GID = 1. - */ -long cff_read_encoding (cff_font *cff) -{ - cff_encoding *encoding; - long offset, length; - card8 i; - - if (cff->topdict == NULL) { - ERROR("Top DICT data not found"); - } - - if (!cff_dict_known(cff->topdict, "Encoding")) { - cff->flag |= ENCODING_STANDARD; - cff->encoding = NULL; - return 0; - } - - offset = (long) cff_dict_get(cff->topdict, "Encoding", 0); - if (offset == 0) { /* predefined */ - cff->flag |= ENCODING_STANDARD; - cff->encoding = NULL; - return 0; - } else if (offset == 1) { - cff->flag |= ENCODING_EXPERT; - cff->encoding = NULL; - return 0; - } - - cff_seek_set(cff, offset); - cff->encoding = encoding = NEW(1, cff_encoding); - encoding->format = get_card8(cff->SFONT_OR_STREAM); - length = 1; - - switch (encoding->format & (~0x80)) { - case 0: - encoding->num_entries = get_card8(cff->SFONT_OR_STREAM); - (encoding->data).codes = NEW(encoding->num_entries, card8); - for (i=0;i<(encoding->num_entries);i++) { - (encoding->data).codes[i] = get_card8(cff->SFONT_OR_STREAM); - } - length += encoding->num_entries + 1; - break; - case 1: - { - cff_range1 *ranges; - encoding->num_entries = get_card8(cff->SFONT_OR_STREAM); - encoding->data.range1 = ranges - = NEW(encoding->num_entries, cff_range1); - for (i=0;i<(encoding->num_entries);i++) { - ranges[i].first = get_card8(cff->SFONT_OR_STREAM); - ranges[i].n_left = get_card8(cff->SFONT_OR_STREAM); - } - length += (encoding->num_entries) * 2 + 1; - } - break; - default: - RELEASE(encoding); - ERROR("Unknown Encoding format"); - break; - } - - /* Supplementary data */ - if ((encoding->format) & 0x80) { - cff_map *map; - encoding->num_supps = get_card8(cff->SFONT_OR_STREAM); - encoding->supp = map = NEW(encoding->num_supps, cff_map); - for (i=0;i<(encoding->num_supps);i++) { - map[i].code = get_card8(cff->SFONT_OR_STREAM); - map[i].glyph = get_card16(cff->SFONT_OR_STREAM); /* SID */ - } - length += (encoding->num_supps) * 3 + 1; - } else { - encoding->num_supps = 0; - encoding->supp = NULL; - } - - return length; -} - -long cff_pack_encoding (cff_font *cff, card8 *dest, long destlen) -{ - long len = 0; - cff_encoding *encoding; - card16 i; - - if (cff->flag & HAVE_STANDARD_ENCODING || cff->encoding == NULL) - return 0; - - if (destlen < 2) - ERROR("in cff_pack_encoding(): Buffer overflow"); - - encoding = cff->encoding; - - dest[len++] = encoding->format; - dest[len++] = encoding->num_entries; - switch (encoding->format & (~0x80)) { - case 0: - if (destlen < len + encoding->num_entries) - ERROR("in cff_pack_encoding(): Buffer overflow"); - for (i=0;i<(encoding->num_entries);i++) { - dest[len++] = (encoding->data).codes[i]; - } - break; - case 1: - { - if (destlen < len + (encoding->num_entries)*2) - ERROR("in cff_pack_encoding(): Buffer overflow"); - for (i=0;i<(encoding->num_entries);i++) { - dest[len++] = (encoding->data).range1[i].first & 0xff; - dest[len++] = (encoding->data).range1[i].n_left; - } - } - break; - default: - ERROR("Unknown Encoding format"); - break; - } - - if ((encoding->format) & 0x80) { - if (destlen < len + (encoding->num_supps)*3 + 1) - ERROR("in cff_pack_encoding(): Buffer overflow"); - dest[len++] = encoding->num_supps; - for (i=0;i<(encoding->num_supps);i++) { - dest[len++] = (encoding->supp)[i].code; - dest[len++] = ((encoding->supp)[i].glyph >> 8) & 0xff; - dest[len++] = (encoding->supp)[i].glyph & 0xff; - } - } - - return len; -} - -/* input: code, output: glyph index */ -card16 cff_encoding_lookup (cff_font *cff, card8 code) -{ - card16 gid = 0; - cff_encoding *encoding; - card16 i; - - if (cff->flag & (ENCODING_STANDARD|ENCODING_EXPERT)) { - ERROR("Predefined CFF encoding not supported yet"); - } else if (cff->encoding == NULL) { - ERROR("Encoding data not available"); - } - - encoding = cff->encoding; - - gid = 0; - switch (encoding->format & (~0x80)) { - case 0: - for (i = 0; i < encoding->num_entries; i++) { - if (code == (encoding->data).codes[i]) { - gid = i + 1; - break; - } - } - break; - case 1: - for (i = 0; i < encoding->num_entries; i++) { - if (code >= (encoding->data).range1[i].first && - code <= (encoding->data).range1[i].first + (encoding->data).range1[i].n_left) { - gid += code - (encoding->data).range1[i].first + 1; - break; - } - gid += (encoding->data).range1[i].n_left + 1; - } - if (i == encoding->num_entries) - gid = 0; - break; - default: - ERROR("Unknown Encoding format."); - } - - /* Supplementary data */ - if (gid == 0 && ((encoding->format) & 0x80)) { - cff_map *map; - if (!encoding->supp) - ERROR("No CFF supplementary encoding data read."); - map = encoding->supp; - for (i=0;i<(encoding->num_supps);i++) { - if (code == map[i].code) { - gid = cff_charsets_lookup(cff, map[i].glyph); - break; - } - } - } - - return gid; -} - -void cff_release_encoding (cff_encoding *encoding) -{ - if (encoding) { - switch (encoding->format & (~0x80)) { - case 0: - if (encoding->data.codes) - RELEASE(encoding->data.codes); - break; - case 1: - if (encoding->data.range1) - RELEASE(encoding->data.range1); - break; - default: - ERROR("Unknown Encoding format."); - } - if (encoding->format & 0x80) { - if (encoding->supp) - RELEASE(encoding->supp); - } - RELEASE(encoding); - } -} - -long cff_read_charsets (cff_font *cff) -{ - cff_charsets *charset; - long offset, length; - card16 count, i; - - if (cff->topdict == NULL) - ERROR("Top DICT not available"); - - if (!cff_dict_known(cff->topdict, "charset")) { - cff->flag |= CHARSETS_ISOADOBE; - cff->charsets = NULL; - return 0; - } - - offset = (long) cff_dict_get(cff->topdict, "charset", 0); - - if (offset == 0) { /* predefined */ - cff->flag |= CHARSETS_ISOADOBE; - cff->charsets = NULL; - return 0; - } else if (offset == 1) { - cff->flag |= CHARSETS_EXPERT; - cff->charsets = NULL; - return 0; - } else if (offset == 2) { - cff->flag |= CHARSETS_EXPSUB; - cff->charsets = NULL; - return 0; - } - - cff_seek_set(cff, offset); - cff->charsets = charset = NEW(1, cff_charsets); - charset->format = get_card8(cff->SFONT_OR_STREAM); - charset->num_entries = 0; - - count = cff->num_glyphs - 1; - length = 1; - - /* Not sure. Not well documented. */ - switch (charset->format) { - case 0: - charset->num_entries = cff->num_glyphs - 1; /* no .notdef */ - charset->data.glyphs = NEW(charset->num_entries, s_SID); - length += (charset->num_entries) * 2; - for (i=0;i<(charset->num_entries);i++) { - charset->data.glyphs[i] = get_card16(cff->SFONT_OR_STREAM); - } - count = 0; - break; - case 1: - { - cff_range1 *ranges = NULL; - while (count > 0 && charset->num_entries < cff->num_glyphs) { - ranges = RENEW(ranges, charset->num_entries + 1, cff_range1); - ranges[charset->num_entries].first = get_card16(cff->SFONT_OR_STREAM); - ranges[charset->num_entries].n_left = get_card8(cff->SFONT_OR_STREAM); - count -= ranges[charset->num_entries].n_left + 1; /* no-overrap */ - charset->num_entries += 1; - charset->data.range1 = ranges; - } - length += (charset->num_entries) * 3; - } - break; - case 2: - { - cff_range2 *ranges = NULL; - while (count > 0 && charset->num_entries < cff->num_glyphs) { - ranges = RENEW(ranges, charset->num_entries + 1, cff_range2); - ranges[charset->num_entries].first = get_card16(cff->SFONT_OR_STREAM); - ranges[charset->num_entries].n_left = get_card16(cff->SFONT_OR_STREAM); - count -= ranges[charset->num_entries].n_left + 1; /* non-overrapping */ - charset->num_entries += 1; - } - charset->data.range2 = ranges; - length += (charset->num_entries) * 4; - } - break; - default: - RELEASE(charset); - ERROR("Unknown Charset format"); - break; - } - - if (count > 0) - ERROR("Charset data possibly broken"); - - return length; -} - -long cff_pack_charsets (cff_font *cff, card8 *dest, long destlen) -{ - long len = 0; - card16 i; - cff_charsets *charset; - - if (cff->flag & HAVE_STANDARD_CHARSETS || cff->charsets == NULL) - return 0; - - if (destlen < 1) - ERROR("in cff_pack_charsets(): Buffer overflow"); - - charset = cff->charsets; - - dest[len++] = charset->format; - switch (charset->format) { - case 0: - if (destlen < len + (charset->num_entries)*2) - ERROR("in cff_pack_charsets(): Buffer overflow"); - for (i=0;i<(charset->num_entries);i++) { - s_SID sid = (charset->data).glyphs[i]; /* or CID */ - dest[len++] = (sid >> 8) & 0xff; - dest[len++] = sid & 0xff; - } - break; - case 1: - { - if (destlen < len + (charset->num_entries)*3) - ERROR("in cff_pack_charsets(): Buffer overflow"); - for (i=0;i<(charset->num_entries);i++) { - dest[len++] = ((charset->data).range1[i].first >> 8) & 0xff; - dest[len++] = (charset->data).range1[i].first & 0xff; - dest[len++] = (charset->data).range1[i].n_left; - } - } - break; - case 2: - { - if (destlen < len + (charset->num_entries)*4) - ERROR("in cff_pack_charsets(): Buffer overflow"); - for (i=0;i<(charset->num_entries);i++) { - dest[len++] = ((charset->data).range2[i].first >> 8) & 0xff; - dest[len++] = (charset->data).range2[i].first & 0xff; - dest[len++] = ((charset->data).range2[i].n_left >> 8) & 0xff; - dest[len++] = (charset->data).range2[i].n_left & 0xff; - } - } - break; - default: - ERROR("Unknown Charset format"); - break; - } - - return len; -} - -card16 cff_glyph_lookup (cff_font *cff, const char *glyph) -{ - card16 gid; - cff_charsets *charset; - card16 i, n; - - if (cff->flag & (CHARSETS_ISOADOBE|CHARSETS_EXPERT|CHARSETS_EXPSUB)) { - ERROR("Predefined CFF charsets not supported yet"); - } else if (cff->charsets == NULL) { - ERROR("Charsets data not available"); - } - - /* .notdef always have glyph index 0 */ - if (!glyph || !strcmp(glyph, ".notdef")) { - return 0; - } - - charset = cff->charsets; - - gid = 0; - switch (charset->format) { - case 0: - for (i = 0; i < charset->num_entries; i++) { - gid++; - if (cff_match_string(cff, glyph, charset->data.glyphs[i])) { - return gid; - } - } - break; - case 1: - for (i = 0; i < charset->num_entries; i++) { - for (n = 0; - n <= charset->data.range1[i].n_left; n++) { - gid++; - if (cff_match_string(cff, glyph, - (s_SID)(charset->data.range1[i].first + n))) { - return gid; - } - } - } - break; - case 2: - for (i = 0; i <charset->num_entries; i++) { - for (n = 0; - n <= charset->data.range2[i].n_left; n++) { - gid++; - if (cff_match_string(cff, glyph, - (s_SID)(charset->data.range2[i].first + n))) { - return gid; - } - } - } - break; - default: - ERROR("Unknown Charset format"); - } - - return 0; /* not found, returns .notdef */ -} - -/* Input : SID or CID (16-bit unsigned int) - * Output: glyph index - */ -card16 -cff_charsets_lookup (cff_font *cff, card16 cid) -{ - card16 gid = 0; - cff_charsets *charset; - card16 i; - - if (cff->flag & (CHARSETS_ISOADOBE|CHARSETS_EXPERT|CHARSETS_EXPSUB)) { - ERROR("Predefined CFF charsets not supported yet"); - } else if (cff->charsets == NULL) { - ERROR("Charsets data not available"); - } - - if (cid == 0) { - return 0; /* GID 0 (.notdef) */ - } - - charset = cff->charsets; - - gid = 0; - switch (charset->format) { - case 0: - for (i = 0; i <charset->num_entries; i++) { - if (cid == charset->data.glyphs[i]) { - gid = i + 1; - return gid; - } - } - break; - case 1: - for (i = 0; i < charset->num_entries; i++) { - if (cid >= charset->data.range1[i].first && - cid <= charset->data.range1[i].first + charset->data.range1[i].n_left) { - gid += cid - charset->data.range1[i].first + 1; - return gid; - } - gid += charset->data.range1[i].n_left + 1; - } - break; - case 2: - for (i = 0; i < charset->num_entries; i++) { - if (cid >= charset->data.range2[i].first && - cid <= charset->data.range2[i].first + charset->data.range2[i].n_left) { - gid += cid - charset->data.range2[i].first + 1; - return gid; - } - gid += charset->data.range2[i].n_left + 1; - } - break; - default: - ERROR("Unknown Charset format"); - } - - return 0; /* not found */ -} - -/* Input : GID - * Output: SID/CID (card16) - */ -card16 -cff_charsets_lookup_inverse (cff_font *cff, card16 gid) -{ - card16 sid = 0; - cff_charsets *charset; - card16 i; - - if (cff->flag & (CHARSETS_ISOADOBE|CHARSETS_EXPERT|CHARSETS_EXPSUB)) { - ERROR("Predefined CFF charsets not supported yet"); - } else if (cff->charsets == NULL) { - ERROR("Charsets data not available"); - } - - if (gid == 0) { - return 0; /* .notdef */ - } - - charset = cff->charsets; - - sid = 0; - switch (charset->format) { - case 0: - if (gid - 1 >= charset->num_entries) - ERROR("Invalid GID."); - sid = charset->data.glyphs[gid - 1]; - break; - case 1: - for (i = 0; i < charset->num_entries; i++) { - if (gid <= charset->data.range1[i].n_left + 1) { - sid = gid + charset->data.range1[i].first - 1; - break; - } - gid -= charset->data.range1[i].n_left + 1; - } - if (i == charset->num_entries) - ERROR("Invalid GID"); - break; - case 2: - for (i = 0; i < charset->num_entries; i++) { - if (gid <= charset->data.range2[i].n_left + 1) { - sid = gid + charset->data.range2[i].first - 1; - break; - } - gid -= charset->data.range2[i].n_left + 1; - } - if (i == charset->num_entries) - ERROR("Invalid GID"); - break; - default: - ERROR("Unknown Charset format"); - } - - return sid; -} - -void -cff_release_charsets (cff_charsets *charset) -{ - if (charset) { - switch (charset->format) { - case 0: - if (charset->data.glyphs) - RELEASE(charset->data.glyphs); - break; - case 1: - if (charset->data.range1) - RELEASE(charset->data.range1); - break; - case 2: - if (charset->data.range2) - RELEASE(charset->data.range2); - break; - default: - break; - } - RELEASE(charset); - } -} - -/* CID-Keyed font specific */ -long cff_read_fdselect (cff_font *cff) -{ - cff_fdselect *fdsel; - long offset, length; - card16 i; - - if (cff->topdict == NULL) - ERROR("Top DICT not available"); - - if (!(cff->flag & FONTTYPE_CIDFONT)) - return 0; - - offset = (long) cff_dict_get(cff->topdict, "FDSelect", 0); - cff_seek_set(cff, offset); - cff->fdselect = fdsel = NEW(1, cff_fdselect); - fdsel->format = get_card8(cff->SFONT_OR_STREAM); - - length = 1; - - switch (fdsel->format) { - case 0: - fdsel->num_entries = cff->num_glyphs; - (fdsel->data).fds = NEW(fdsel->num_entries, card8); - for (i=0;i<(fdsel->num_entries);i++) { - (fdsel->data).fds[i] = get_card8(cff->SFONT_OR_STREAM); - } - length += fdsel->num_entries; - break; - case 3: - { - cff_range3 *ranges; - fdsel->num_entries = get_card16(cff->SFONT_OR_STREAM); - fdsel->data.ranges = ranges = NEW(fdsel->num_entries, cff_range3); - for (i=0;i<(fdsel->num_entries);i++) { - ranges[i].first = get_card16(cff->SFONT_OR_STREAM); - ranges[i].fd = get_card8(cff->SFONT_OR_STREAM); - } - if (ranges[0].first != 0) - ERROR("Range not starting with 0."); - if (cff->num_glyphs != get_card16(cff->SFONT_OR_STREAM)) - ERROR("Sentinel value mismatched with number of glyphs."); - length += (fdsel->num_entries) * 3 + 4; - } - break; - default: - RELEASE(fdsel); - ERROR("Unknown FDSelect format."); - break; - } - - return length; -} - -long cff_pack_fdselect (cff_font *cff, card8 *dest, long destlen) -{ - cff_fdselect *fdsel; - long len = 0; - card16 i; - - if (cff->fdselect == NULL) - return 0; - - if (destlen < 1) - ERROR("in cff_pack_fdselect(): Buffur overflow"); - - fdsel = cff->fdselect; - - dest[len++] = fdsel->format; - switch (fdsel->format) { - case 0: - if (fdsel->num_entries != cff->num_glyphs) - ERROR("in cff_pack_fdselect(): Invalid data"); - if (destlen < len + fdsel->num_entries) - ERROR("in cff_pack_fdselect(): Buffer overflow"); - for (i=0;i<fdsel->num_entries;i++) { - dest[len++] = (fdsel->data).fds[i]; - } - break; - case 3: - { - if (destlen < len + 2) - ERROR("in cff_pack_fdselect(): Buffer overflow"); - len += 2; - for (i=0;i<(fdsel->num_entries);i++) { - if (destlen < len + 3) - ERROR("in cff_pack_fdselect(): Buffer overflow"); - dest[len++] = ((fdsel->data).ranges[i].first >> 8) & 0xff; - dest[len++] = (fdsel->data).ranges[i].first & 0xff; - dest[len++] = (fdsel->data).ranges[i].fd; - } - if (destlen < len + 2) - ERROR("in cff_pack_fdselect(): Buffer overflow"); - dest[len++] = (cff->num_glyphs >> 8) & 0xff; - dest[len++] = cff->num_glyphs & 0xff; - dest[1] = ((len/3 - 1) >> 8) & 0xff; - dest[2] = (len/3 - 1) & 0xff; - } - break; - default: - ERROR("Unknown FDSelect format."); - break; - } - - return len; -} - -void cff_release_fdselect (cff_fdselect *fdselect) -{ - if (fdselect) { - if (fdselect->format == 0) { - if (fdselect->data.fds) RELEASE(fdselect->data.fds); - } else if (fdselect->format == 3) { - if (fdselect->data.ranges) RELEASE(fdselect->data.ranges); - } - RELEASE(fdselect); - } -} - -card8 cff_fdselect_lookup (cff_font *cff, card16 gid) -{ - card8 fd = 0xff; - cff_fdselect *fdsel; - - if (cff->fdselect == NULL) - ERROR("in cff_fdselect_lookup(): FDSelect not available"); - - fdsel = cff->fdselect; - - if (gid >= cff->num_glyphs) - ERROR("in cff_fdselect_lookup(): Invalid glyph index"); - - switch (fdsel->format) { - case 0: - fd = fdsel->data.fds[gid]; - break; - case 3: - { - if (gid == 0) { - fd = (fdsel->data).ranges[0].fd; - } else { - card16 i; - for (i=1;i<(fdsel->num_entries);i++) { - if (gid < (fdsel->data).ranges[i].first) - break; - } - fd = (fdsel->data).ranges[i-1].fd; - } - } - break; - default: - ERROR("in cff_fdselect_lookup(): Invalid FDSelect format"); - break; - } - - if (fd >= cff->num_fds) - ERROR("in cff_fdselect_lookup(): Invalid Font DICT index"); - - return fd; -} - -long cff_read_subrs (cff_font *cff) -{ - long len = 0; - long offset; - int i; - - if ((cff->flag & FONTTYPE_CIDFONT) && cff->fdarray == NULL) { - cff_read_fdarray(cff); - } - - if (cff->private == NULL) - cff_read_private(cff); - - if (cff->gsubr == NULL) { - cff_seek_set(cff, cff->gsubr_offset); - cff->gsubr = cff_get_index(cff); - } - - cff->subrs = NEW(cff->num_fds, cff_index *); - if (cff->flag & FONTTYPE_CIDFONT) { - for (i=0;i<cff->num_fds;i++) { - if (cff->private[i] == NULL || - !cff_dict_known(cff->private[i], "Subrs")) { - (cff->subrs)[i] = NULL; - } else { - offset = (long) cff_dict_get(cff->fdarray[i], "Private", 1); - offset += (long) cff_dict_get(cff->private[i], "Subrs", 0); - cff_seek_set(cff, offset); - (cff->subrs)[i] = cff_get_index(cff); - len += cff_index_size((cff->subrs)[i]); - } - } - } else { - if (cff->private[0] == NULL || - !cff_dict_known(cff->private[0], "Subrs")) { - (cff->subrs)[0] = NULL; - } else { - offset = (long) cff_dict_get(cff->topdict, "Private", 1); - offset += (long) cff_dict_get(cff->private[0], "Subrs", 0); - cff_seek_set(cff, offset); - (cff->subrs)[0] = cff_get_index(cff); - len += cff_index_size((cff->subrs)[0]); - } - } - - return len; -} - -long cff_read_fdarray (cff_font *cff) -{ - long len = 0; - cff_index *idx; - long offset, size; - card16 i; - - if (cff->topdict == NULL) - ERROR("in cff_read_fdarray(): Top DICT not found"); - - if (!(cff->flag & FONTTYPE_CIDFONT)) - return 0; - - /* must exist */ - offset = (long) cff_dict_get(cff->topdict, "FDArray", 0); - cff_seek_set(cff, offset); - idx = cff_get_index(cff); - cff->num_fds = (card8)idx->count; - cff->fdarray = NEW(idx->count, cff_dict *); - for (i=0;i<idx->count;i++) { - card8 *data = idx->data + (idx->offset)[i] - 1; - size = (idx->offset)[i+1] - (idx->offset)[i]; - if (size > 0) { - (cff->fdarray)[i] = cff_dict_unpack(data, data+size); - } else { - (cff->fdarray)[i] = NULL; - } - } - len = cff_index_size(idx); - cff_release_index(idx); - - return len; -} - -long cff_read_private (cff_font *cff) -{ - long len = 0; - card8 *data; - long offset, size; - - if (cff->flag & FONTTYPE_CIDFONT) { - int i; - - if (cff->fdarray == NULL) - cff_read_fdarray(cff); - - cff->private = NEW(cff->num_fds, cff_dict *); - for (i=0;i<cff->num_fds;i++) { - if (cff->fdarray[i] != NULL && - cff_dict_known(cff->fdarray[i], "Private") && - (size = (long) cff_dict_get(cff->fdarray[i], "Private", 0)) - > 0) { - offset = (long) cff_dict_get(cff->fdarray[i], "Private", 1); - cff_seek_set(cff, offset); - data = NEW(size, card8); - if (sfnt_read(data, size, cff->sfont) != size) - ERROR("reading file failed"); - (cff->private)[i] = cff_dict_unpack(data, data+size); - RELEASE(data); - len += size; - } else { - (cff->private)[i] = NULL; - } - } - } else { - cff->num_fds = 1; - cff->private = NEW(1, cff_dict *); - if (cff_dict_known(cff->topdict, "Private") && - (size = (long) cff_dict_get(cff->topdict, "Private", 0)) > 0) { - offset = (long) cff_dict_get(cff->topdict, "Private", 1); - cff_seek_set(cff, offset); - data = NEW(size, card8); - if (sfnt_read(data, size, cff->sfont) != size) - ERROR("reading file failed"); - cff->private[0] = cff_dict_unpack(data, data+size); - RELEASE(data); - len += size; - } else { - (cff->private)[0] = NULL; - len = 0; - } - } - - return len; -} - -#ifdef XETEX -unsigned short* cff_get_ft_to_gid(cff_font *cff) -{ - return cff->ft_to_gid; -} -#endif diff --git a/Build/source/texk/dvipdfm-x/xsrc/dvi.c b/Build/source/texk/dvipdfm-x/xsrc/dvi.c index c540706e6d6..3e7f5e3cdd0 100644 --- a/Build/source/texk/dvipdfm-x/xsrc/dvi.c +++ b/Build/source/texk/dvipdfm-x/xsrc/dvi.c @@ -96,10 +96,12 @@ static struct dvi_header static double dev_origin_x = 72.0, dev_origin_y = 770.0; +#ifdef XETEX double get_origin (int x) { return x ? dev_origin_x : dev_origin_y; } +#endif #define PHYSICAL 1 #define VIRTUAL 2 @@ -170,6 +172,7 @@ static int num_def_fonts = 0, max_def_fonts = 0; static int compute_boxes = 0, link_annot = 1; static int verbose = 0; +#ifdef XETEX #define DVI_PAGE_BUF_CHUNK 0x10000UL /* 64K should be plenty for most pages */ static unsigned char* dvi_page_buffer; @@ -374,8 +377,28 @@ static UNSIGNED_QUAD get_buffered_unsigned_quad(void) } return (UNSIGNED_QUAD) quad; } - - +#else +#define get_and_buffer_unsigned_byte(fp) get_unsigned_byte(fp) +#if 0 +#define get_and_buffer_signed_byte(fp) get_signed_byte(fp) +#endif +#define get_and_buffer_unsigned_pair(fp) get_unsigned_pair(fp) +#define get_and_buffer_signed_pair(fp) get_signed_pair(fp) +#define get_and_buffer_unsigned_triple(fp) get_unsigned_triple(fp) +#define get_and_buffer_signed_triple(fp) get_signed_triple(fp) +#define get_and_buffer_signed_quad(fp) get_unsigned_quad(fp) +#define get_and_buffer_unsigned_quad(fp) get_unsigned_quad(fp) +#define get_and_buffer_bytes(fp, ct) seek_relative(fp, ct) + +#define get_buffered_unsigned_byte() get_unsigned_byte(dvi_file) +#define get_buffered_signed_byte() get_signed_byte(dvi_file) +#define get_buffered_unsigned_pair() get_unsigned_pair(dvi_file) +#define get_buffered_signed_pair() get_signed_pair(dvi_file) +#define get_buffered_unsigned_triple() get_unsigned_triple(dvi_file) +#define get_buffered_signed_triple() get_signed_triple(dvi_file) +#define get_buffered_signed_quad() get_signed_quad(dvi_file) +#define get_buffered_unsigned_quad() get_unsigned_quad(dvi_file) +#endif void dvi_set_verbose (void) @@ -717,14 +740,11 @@ get_dvi_fonts (long post_location) ERROR(invalid_signature); } #ifdef XETEX - if (code != XDV_NATIVE_FONT_DEF) { - read_font_record(tex_id); - } else { + if (code == XDV_NATIVE_FONT_DEF) read_native_font_record(tex_id); - } -#else - read_font_record(tex_id); + else #endif + read_font_record(tex_id); } if (verbose > 2) { unsigned i; @@ -1749,9 +1769,12 @@ do_fnt4 (void) static void do_xxx (UNSIGNED_QUAD size) { -#if 0 +#ifdef XETEX + dvi_do_special(dvi_page_buffer + dvi_page_buf_index, size); + dvi_page_buf_index += size; +#else UNSIGNED_QUAD i; - Ubyte *buffer; /* FIXME - no need for new buffer here */ + Ubyte *buffer; buffer = NEW(size+1, Ubyte); for (i = 0; i < size; i++) { @@ -1759,9 +1782,6 @@ do_xxx (UNSIGNED_QUAD size) } dvi_do_special(buffer, size); RELEASE(buffer); -#else - dvi_do_special(dvi_page_buffer + dvi_page_buf_index, size); - dvi_page_buf_index += size; #endif } @@ -2185,13 +2205,16 @@ dvi_do_page (long n, do_pic_file(); break; #endif + case POST: +#ifdef XETEX if (linear && !processing_page) { /* for linear processing, this means there are no more pages */ num_pages = 0; /* force loop to terminate */ return; } /* else fall through to error case */ +#endif case PRE: case POST_POST: ERROR("Unexpected preamble or postamble in dvi file"); break; @@ -2435,7 +2458,7 @@ scan_special (double *wd, double *ht, double *xo, double *yo, char *lm, const char *buf, UNSIGNED_QUAD size) { char *q; - const char *p = buf, *endptr; + const char *p = buf, *endptr; int ns_pdf = 0, error = 0; double tmp; @@ -2707,17 +2730,19 @@ dvi_scan_specials (long page_no, } break; #endif + case PTEXDIR: get_and_buffer_unsigned_byte(fp); break; case POST: +#ifdef XETEX if (linear && dvi_page_buf_index == 1) { /* this is actually an indication that we've reached the end of the input */ return; } /* else fall through to error case */ - +#endif default: /* case PRE: case POST_POST: and others */ ERROR("Unexpected opcode %d at pos=0x%x", opcode, tell_position(fp)); break; diff --git a/Build/source/texk/dvipdfm-x/xsrc/dvi.h b/Build/source/texk/dvipdfm-x/xsrc/dvi.h deleted file mode 100644 index 8f6f7e07e59..00000000000 --- a/Build/source/texk/dvipdfm-x/xsrc/dvi.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - - This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - - Copyright (C) 2002-2012 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - 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. -*/ - -#ifndef _DVI_H_ -#define _DVI_H_ - -#include "error.h" -#include "numbers.h" -/* spt_t */ -#include "pdfdev.h" - -/* instantiated in dvipdfmx.c */ -extern double paper_width, paper_height; -extern char landscape_mode; - -extern double get_origin (int x); - -extern void dvi_set_verbose (void); - -/* returns scale (dvi2pts) */ -extern double dvi_init (char *dvi_filename, double mag); /* may append .dvi or .xdv to filename */ -extern void dvi_close (void); /* Closes data structures created by dvi_open */ - -extern double dvi_tell_mag (void); -#ifdef XETEX -extern double dvi_unit_size (void); -#endif -extern double dvi_dev_xpos (void); -extern double dvi_dev_ypos (void); -extern unsigned dvi_npages (void); -extern const char *dvi_comment (void); - -extern void dvi_vf_init (int dev_font_id); -extern void dvi_vf_finish (void); - -extern void dvi_set_font (int font_id); -extern void dvi_set (SIGNED_QUAD ch); -extern void dvi_rule (SIGNED_QUAD width, SIGNED_QUAD height); - -extern void dvi_right (SIGNED_QUAD x); -extern void dvi_put (SIGNED_QUAD ch); -extern void dvi_push (void); -extern void dvi_pop (void); -extern void dvi_w0 (void); -extern void dvi_w (SIGNED_QUAD ch); -extern void dvi_x0 (void); -extern void dvi_x (SIGNED_QUAD ch); -extern void dvi_down (SIGNED_QUAD y); -extern void dvi_y (SIGNED_QUAD ch); -extern void dvi_y0 (void); -extern void dvi_z (SIGNED_QUAD ch); -extern void dvi_z0 (void); -extern void dvi_dir (UNSIGNED_BYTE dir); - -extern void dvi_do_page (long page_no, - double paper_width, double paper_height, - double x_offset, double y_offset); -extern void dvi_scan_specials (long page_no, - double *width, double *height, - double *x_offset, double *y_offset, - char *landscape, unsigned *minorversion, - int *do_enc, unsigned *key_bits, unsigned *permission, char *owner_pw, char *user_pw); -extern int dvi_locate_font (const char *name, spt_t ptsize); - -/* link or nolink: - * See dvipdfm (not x) user's manual on pdf:link and pdf:nolink. - * This is workaround for preventing inclusion of pagenation artifact such as - * footnote and page number in link annotation. - */ -extern void dvi_link_annot (int flag); -/* The followings are for calculating bounding box of text for annotation. - * DVI uses push/pop to do line-feed-carriage-return. So line breaking is - * handled by inspecting current depth of DVI register stack. - */ -extern void dvi_tag_depth (void); -extern void dvi_untag_depth (void); -extern void dvi_compute_boxes (int flag); - -extern void dvi_do_special (const void *buffer, UNSIGNED_QUAD size); - -/* allow other modules (pdfdev) to ask whether we're collecting box areas */ -int dvi_is_tracking_boxes(void); - -#endif /* _DVI_H_ */ diff --git a/Build/source/texk/dvipdfm-x/xsrc/dvipdfmx.c b/Build/source/texk/dvipdfm-x/xsrc/dvipdfmx.c index b8656256df1..61a81057cc6 100644 --- a/Build/source/texk/dvipdfm-x/xsrc/dvipdfmx.c +++ b/Build/source/texk/dvipdfm-x/xsrc/dvipdfmx.c @@ -60,11 +60,16 @@ #include "pdfximage.h" #include "cid.h" +#include "dvipdfmx.h" #include "xbb.h" +#include "error.h" + +#ifdef XETEX #include "tt_aux.h" +#endif -#include "error.h" +int compat_mode = 0; /* 0 = dvipdfmx, 1 = dvipdfm */ static int verbose = 0; @@ -114,12 +119,6 @@ char *dvi_filename = NULL, *pdf_filename = NULL; static void read_config_file (const char *config); -#ifdef WIN32 -#define STRN_CMP strncasecmp -#else -#define STRN_CMP strncmp -#endif - static void set_default_pdf_filename(void) { @@ -128,17 +127,16 @@ set_default_pdf_filename(void) dvi_base = xbasename(dvi_filename); if (mp_mode && strlen(dvi_base) > 4 && - !STRN_CMP(".mps", dvi_base + strlen(dvi_base) - 4, 4)) { + FILESTRCASEEQ(".mps", dvi_base + strlen(dvi_base) - 4)) { pdf_filename = NEW(strlen(dvi_base)+1, char); strncpy(pdf_filename, dvi_base, strlen(dvi_base) - 4); pdf_filename[strlen(dvi_base)-4] = '\0'; } else if (strlen(dvi_base) > 4 && + (FILESTRCASEEQ(".dvi", dvi_base+strlen(dvi_base)-4) #ifdef XETEX - (!STRN_CMP(".dvi", dvi_base+strlen(dvi_base)-4, 4) || - !STRN_CMP(".xdv", dvi_base+strlen(dvi_base)-4, 4))) { -#else - !STRN_CMP(".dvi", dvi_base+strlen(dvi_base)-4, 4)) { + || FILESTRCASEEQ(".xdv", dvi_base+strlen(dvi_base)-4) #endif + )) { pdf_filename = NEW(strlen(dvi_base)+1, char); strncpy(pdf_filename, dvi_base, strlen(dvi_base)-4); pdf_filename[strlen(dvi_base)-4] = '\0'; @@ -151,9 +149,10 @@ set_default_pdf_filename(void) } static void -usage (int exit_code) +show_version (void) { - fprintf (stdout, "\nThis is %s-%s by Jonathan Kew and Jin-Hwan Cho,\n", PACKAGE, VERSION); + fprintf (stdout, "\nThis is xdvipdfmx-%s by Jonathan Kew and Jin-Hwan Cho,\n", VERSION); + fprintf (stdout, "modified for TeX Live,\n"); 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-2013 SIL International and Jin-Hwan Cho.\n"); @@ -161,6 +160,11 @@ usage (int exit_code) 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"); fprintf (stdout, "(at your option) any later version.\n"); +} + +static void +show_usage (void) +{ fprintf (stdout, "\nUsage: xdvipdfmx [options] xdvfile\n"); fprintf (stdout, "-c \t\tIgnore color specials (for B&W printing)\n"); fprintf (stdout, "-d number\tSet PDF decimal digits (0-5) [2]\n"); @@ -203,7 +207,13 @@ usage (int exit_code) fprintf (stdout, "\nAll dimensions entered on the command line are \"true\" TeX dimensions.\n"); fprintf (stdout, "Argument of \"-s\" lists physical page ranges separated by commas, e.g., \"-s 1-3,5-6\"\n"); fprintf (stdout, "Papersize is specified by paper format (e.g., \"a4\") or by w<unit>,h<unit> (e.g., \"20cm,30cm\").\n"); +} +static void +usage (int exit_code) +{ + show_version(); + show_usage(); exit(exit_code); } @@ -842,11 +852,14 @@ main (int argc, char *argv[]) { double dvi2pts; - const char *av0 = xbasename(argv[0]); - if (STRN_CMP(av0, "ebb", 3) == 0) - return extractbb(argc, argv, EBB_OUTPUT); - else if (STRN_CMP(av0, "xbb", 3) == 0 || STRN_CMP(av0, "extractbb", 9) == 0) - return extractbb(argc, argv, XBB_OUTPUT); + char *base = kpse_program_basename (argv[0]); + + if (FILESTRCASEEQ (base, "extractbb") || FILESTRCASEEQ (base, "xbb")) + return extractbb (argc, argv, XBB_OUTPUT); + if (FILESTRCASEEQ (base, "ebb")) + return extractbb (argc, argv, EBB_OUTPUT); + + free (base); #ifdef MIKTEX miktex_initialize(); diff --git a/Build/source/texk/dvipdfm-x/xsrc/epdf.c b/Build/source/texk/dvipdfm-x/xsrc/epdf.c index 2984f83df3b..cef72ee0c39 100644 --- a/Build/source/texk/dvipdfm-x/xsrc/epdf.c +++ b/Build/source/texk/dvipdfm-x/xsrc/epdf.c @@ -39,10 +39,7 @@ #include "mem.h" #include "mfileio.h" #include "error.h" - -#ifndef XETEX #include "dvipdfmx.h" -#endif #include "pdfobj.h" #include "pdfdev.h" diff --git a/Build/source/texk/dvipdfm-x/xsrc/mpost.c b/Build/source/texk/dvipdfm-x/xsrc/mpost.c deleted file mode 100644 index ab0f87b91e1..00000000000 --- a/Build/source/texk/dvipdfm-x/xsrc/mpost.c +++ /dev/null @@ -1,1671 +0,0 @@ -/* - - This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - - Copyright (C) 2007-2012 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - 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. -*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <ctype.h> -#include <string.h> -#include <math.h> - -#include "system.h" -#include "mem.h" -#include "error.h" -#include "mfileio.h" -#include "numbers.h" - -#include "tfm.h" - -#include "pdfobj.h" -#include "pdfparse.h" -#include "pdfdev.h" -#include "pdfdoc.h" - -#include "pdfcolor.h" -#include "pdfdraw.h" - -#include "fontmap.h" -#include "subfont.h" - -#include "pdfximage.h" - -#include "mpost.h" - -/* - * In PDF, current path is not a part of graphics state parameter. - * Hence, current path is not saved by the "q" operator and is not - * recovered by the "Q" operator. This means that the following PS - * code - * - * <path construction> gsave <path painting> grestore ... - * - * can't be translated to PDF code - * - * <path construction> q <path painting> Q ... - * - * . Only clipping path (which is graphics state parameter in PDF - * too) is treated in the same way. So, we write clipping path - * immediately and forget about it but remember current path. - */ - -static int mp_parse_body (const char **start, const char *end, double x_user, double y_user); - -static struct mp_font -{ - char *font_name; - int font_id; - int tfm_id; /* Used for text width calculation */ - int subfont_id; - double pt_size; -} font_stack[PDF_GSAVE_MAX] = { - {NULL, -1, -1, -1, 0} -}; -static int currentfont = -1; - -#define CURRENT_FONT() ((currentfont < 0) ? NULL : &font_stack[currentfont]) - -/* Compatibility */ -#define MP_CMODE_MPOST 0 -#define MP_CMODE_DVIPSK 1 -#define MP_CMODE_PTEXVERT 2 -static int mp_cmode = MP_CMODE_MPOST; - -static int -mp_setfont (const char *font_name, double pt_size) -{ - const char *name = font_name; - struct mp_font *font; - int subfont_id = -1; - fontmap_rec *mrec; - - font = CURRENT_FONT(); - - if (font) { - if (!strcmp(font->font_name, font_name) && - font->pt_size == pt_size) - return 0; - } else { /* No currentfont */ -/* ***TODO*** Here some problem exists! */ - font = &font_stack[0]; - font->font_name = NULL; - currentfont = 0; - } - - mrec = pdf_lookup_fontmap_record(font_name); - if (mrec && mrec->charmap.sfd_name && mrec->charmap.subfont_id) { - subfont_id = sfd_load_record(mrec->charmap.sfd_name, mrec->charmap.subfont_id); - } - - /* See comments in dvi_locate_font() in dvi.c. */ - if (mrec && mrec->map_name) { - name = mrec->map_name; - } else { - name = font_name; - } - - if (font->font_name) - RELEASE(font->font_name); - font->font_name = NEW(strlen(font_name) + 1, char); - strcpy(font->font_name, font_name); - font->subfont_id = subfont_id; - font->pt_size = pt_size; - font->tfm_id = tfm_open(font_name, 0); /* Need not exist in MP mode */ - font->font_id = pdf_dev_locate_font(name, - (spt_t) (pt_size * dev_unit_dviunit())); - - if (font->font_id < 0) { - ERROR("MPOST: No physical font assigned for \"%s\".", font_name); - return 1; - } - - return 0; -} - -static void -save_font (void) -{ - struct mp_font *current, *next; - - if (currentfont < 0) { - font_stack[0].font_name = NEW(strlen("Courier") + 1, char); - strcpy(font_stack[0].font_name, "Courier"); - font_stack[0].pt_size = 1; - font_stack[0].tfm_id = 0; - font_stack[0].subfont_id = 0; - currentfont = 0; - } - - current = &font_stack[currentfont++]; - next = &font_stack[currentfont ]; - next->font_name = NEW(strlen(current->font_name)+1, char); - strcpy(next->font_name, current->font_name); - next->pt_size = current->pt_size; - - next->subfont_id = current->subfont_id; - next->tfm_id = current->tfm_id; -} - -static void -restore_font (void) -{ - struct mp_font *current; - - current = CURRENT_FONT(); - if (current) { - if (current->font_name) - RELEASE(current->font_name); - current->font_name = NULL; - } else { - ERROR("No currentfont..."); - } - - currentfont--; -} - -static void -clear_fonts (void) -{ - while (currentfont >= 0) { - if (font_stack[currentfont].font_name) - RELEASE(font_stack[currentfont].font_name); - currentfont--; - } -} - -static int -is_fontname (const char *token) -{ - fontmap_rec *mrec; - - mrec = pdf_lookup_fontmap_record(token); - if (mrec) - return 1; - - return tfm_exists(token); -} - -int -mps_scan_bbox (const char **pp, const char *endptr, pdf_rect *bbox) -{ - char *number; - double values[4]; - int i; - - /* skip_white() skips lines starting '%'... */ - while (*pp < endptr && isspace(**pp)) - (*pp)++; - - /* Scan for bounding box record */ - while (*pp < endptr && **pp == '%') { - if (*pp + 14 < endptr && - !strncmp(*pp, "%%BoundingBox:", 14)) { - - *pp += 14; - - for (i = 0; i < 4; i++) { - skip_white(pp, endptr); - number = parse_number(pp, endptr); - if (!number) { - break; - } - values[i] = atof(number); - RELEASE(number); - } - if (i < 4) { - return -1; - } else { - bbox->llx = values[0]; - bbox->lly = values[1]; - bbox->urx = values[2]; - bbox->ury = values[3]; - - return 0; - } - } - skip_line (pp, endptr); - while (*pp < endptr && isspace(**pp)) - (*pp)++; - } - - return -1; -} - -static void -skip_prolog (const char **start, const char *end) -{ - int found_prolog = 0; - const char *save; - - save = *start; - while (*start < end) { - if (**start != '%') - skip_white(start, end); - if (*start >= end) - break; - if (!strncmp(*start, "%%EndProlog", 11)) { - found_prolog = 1; - skip_line(start, end); - break; - } else if (!strncmp(*start, "%%Page:", 7)) { - skip_line(start, end); - break; - } - skip_line(start, end); - } - if (!found_prolog) { - *start = save; - } - - return; -} - -/* PostScript Operators */ - -#define ADD 1 -#define SUB 2 -#define MUL 3 -#define DIV 4 -#define NEG 5 -#define TRUNCATE 6 - -#define CLEAR 10 -#define EXCH 11 -#define POP 12 - -#define NEWPATH 31 -#define CLOSEPATH 32 -#define MOVETO 33 -#define RMOVETO 34 -#define CURVETO 35 -#define RCURVETO 36 -#define LINETO 37 -#define RLINETO 38 -#define ARC 39 -#define ARCN 40 - -#define FILL 41 -#define STROKE 42 -#define SHOW 43 - -#define CLIP 44 -#define EOCLIP 45 - -#define SHOWPAGE 49 - -#define GSAVE 50 -#define GRESTORE 51 - -#define CONCAT 52 -#define SCALE 53 -#define TRANSLATE 54 -#define ROTATE 55 - -#define SETLINEWIDTH 60 -#define SETDASH 61 -#define SETLINECAP 62 -#define SETLINEJOIN 63 -#define SETMITERLIMIT 64 - -#define SETGRAY 70 -#define SETRGBCOLOR 71 -#define SETCMYKCOLOR 72 - -#define CURRENTPOINT 80 -#define IDTRANSFORM 81 -#define DTRANSFORM 82 - -#define FINDFONT 201 -#define SCALEFONT 202 -#define SETFONT 203 -#define CURRENTFONT 204 - -#define STRINGWIDTH 210 - -#define DEF 999 - -#define FSHOW 1001 -#define STEXFIG 1002 -#define ETEXFIG 1003 -#define HLW 1004 -#define VLW 1005 -#define RD 1006 -#define B 1007 - -static struct operators -{ - const char *token; - int opcode; -} ps_operators[] = { - {"add", ADD}, - {"mul", MUL}, - {"div", DIV}, - {"neg", NEG}, - {"sub", SUB}, - {"truncate", TRUNCATE}, - - {"clear", CLEAR}, - {"exch", EXCH}, - {"pop", POP}, - - {"clip", CLIP}, - {"eoclip", EOCLIP}, - {"closepath", CLOSEPATH}, - {"concat", CONCAT}, - - {"newpath", NEWPATH}, - {"moveto", MOVETO}, - {"rmoveto", RMOVETO}, - {"lineto", LINETO}, - {"rlineto", RLINETO}, - {"curveto", CURVETO}, - {"rcurveto", RCURVETO}, - {"arc", ARC}, - {"arcn", ARCN}, - - {"stroke", STROKE}, - {"fill", FILL}, - {"show", SHOW}, - {"showpage", SHOWPAGE}, - - {"gsave", GSAVE}, - {"grestore", GRESTORE}, - {"translate", TRANSLATE}, - {"rotate", ROTATE}, - {"scale", SCALE}, - - {"setlinecap", SETLINECAP}, - {"setlinejoin", SETLINEJOIN}, - {"setlinewidth", SETLINEWIDTH}, - {"setmiterlimit", SETMITERLIMIT}, - {"setdash", SETDASH}, - - {"setgray", SETGRAY}, - {"setrgbcolor", SETRGBCOLOR}, - {"setcmykcolor", SETCMYKCOLOR}, - - {"currentpoint", CURRENTPOINT}, /* This is here for rotate support - in graphics package-not MP support */ - {"dtransform", DTRANSFORM}, - {"idtransform", IDTRANSFORM}, - - {"findfont", FINDFONT}, - {"scalefont", SCALEFONT}, - {"setfont", SETFONT}, - {"currentfont", CURRENTFONT}, - - {"stringwidth", STRINGWIDTH}, - - {"def", DEF} /* not implemented yet; just work with mptopdf */ -}; - -static struct operators mps_operators[] = { - {"fshow", FSHOW}, /* exch findfont exch scalefont setfont show */ - {"startTexFig", STEXFIG}, - {"endTexFig", ETEXFIG}, - {"hlw", HLW}, /* 0 dtransform exch truncate exch idtransform pop setlinewidth */ - {"vlw", VLW}, /* 0 exch dtransform truncate idtransform pop setlinewidth pop */ - {"l", LINETO}, - {"r", RLINETO}, - {"c", CURVETO}, - {"m", MOVETO}, - {"p", CLOSEPATH}, - {"n", NEWPATH}, - {"C", SETCMYKCOLOR}, - {"G", SETGRAY}, - {"R", SETRGBCOLOR}, - {"lj", SETLINEJOIN}, - {"ml", SETMITERLIMIT}, - {"lc", SETLINECAP}, - {"S", STROKE}, - {"F", FILL}, - {"q", GSAVE}, - {"Q", GRESTORE}, - {"s", SCALE}, - {"t", CONCAT}, - {"sd", SETDASH}, - {"rd", RD}, /* [] 0 setdash */ - {"P", SHOWPAGE}, - {"B", B}, /* gsave fill grestore */ - {"W", CLIP} -}; - -#define NUM_PS_OPERATORS (sizeof(ps_operators)/sizeof(ps_operators[0])) -#define NUM_MPS_OPERATORS (sizeof(mps_operators)/sizeof(mps_operators[0])) -static int -get_opcode (const char *token) -{ - int i; - - for (i = 0; i < NUM_PS_OPERATORS; i++) { - if (!strcmp(token, ps_operators[i].token)) { - return ps_operators[i].opcode; - } - } - - for (i = 0; i < NUM_MPS_OPERATORS; i++) { - if (!strcmp(token, mps_operators[i].token)) { - return mps_operators[i].opcode; - } - } - - return -1; -} - -#define PS_STACK_SIZE 1024 - -static pdf_obj *stack[PS_STACK_SIZE]; -static unsigned top_stack = 0; - -#define POP_STACK() ((top_stack > 0) ? stack[--top_stack] : NULL) -#define PUSH_STACK(o,e) { \ - if (top_stack < PS_STACK_SIZE) { \ - stack[top_stack++] = (o); \ - } else { \ - WARN("PS stack overflow including MetaPost file or inline PS code"); \ - *(e) = 1; \ - } \ -} - -static int -do_exch (void) -{ - pdf_obj *tmp; - - if (top_stack < 2) - return -1; - - tmp = stack[top_stack-1]; - stack[top_stack-1] = stack[top_stack-2]; - stack[top_stack-2] = tmp; - - return 0; -} - -static int -do_clear (void) -{ - pdf_obj *tmp; - - while (top_stack > 0) { - tmp = POP_STACK(); - if (tmp) - pdf_release_obj(tmp); - } - - return 0; -} - -/* This should be set_bottom and clear (or - * have independent stack) to ensure stack - * depth do not go below real stack bottom. - */ -static void -mps_stack_clear_to (int depth) -{ - pdf_obj *tmp; - - while (top_stack > depth) { - tmp = POP_STACK(); - if (tmp) - pdf_release_obj(tmp); - } - - return; -} - -static int -pop_get_numbers (double *values, int count) -{ - pdf_obj *tmp; - - while (count-- > 0) { - tmp = POP_STACK(); - if (!tmp) { - WARN("mpost: Stack underflow."); - break; - } else if (!PDF_OBJ_NUMBERTYPE(tmp)) { - WARN("mpost: Not a number!"); - pdf_release_obj(tmp); - break; - } - values[count] = pdf_number_value(tmp); - pdf_release_obj(tmp); - } - - return (count + 1); -} - -static int -cvr_array (pdf_obj *array, double *values, int count) -{ - if (!PDF_OBJ_ARRAYTYPE(array)) { - WARN("mpost: Not an array!"); - } else { - pdf_obj *tmp; - - while (count-- > 0) { - tmp = pdf_get_array(array, count); - if (!PDF_OBJ_NUMBERTYPE(tmp)) { - WARN("mpost: Not a number!"); - break; - } - values[count] = pdf_number_value(tmp); - } - } - if (array) - pdf_release_obj(array); - - return (count + 1); -} - -static int -is_fontdict (pdf_obj *dict) -{ - pdf_obj *tmp; - - if (!PDF_OBJ_DICTTYPE(dict)) - return 0; - - tmp = pdf_lookup_dict(dict, "Type"); - if (!tmp || !PDF_OBJ_NAMETYPE(tmp) || - strcmp(pdf_name_value(tmp), "Font")) { - return 0; - } - - tmp = pdf_lookup_dict(dict, "FontName"); - if (!tmp || !PDF_OBJ_NAMETYPE(tmp)) { - return 0; - } - - tmp = pdf_lookup_dict(dict, "FontScale"); - if (!tmp || !PDF_OBJ_NUMBERTYPE(tmp)) { - return 0; - } - - return 1; -} - -static int -do_findfont (void) -{ - int error = 0; - pdf_obj *font_dict, *font_name; - - font_name = POP_STACK(); - if (!font_name) - return 1; - else if (PDF_OBJ_STRINGTYPE(font_name) || - PDF_OBJ_NAMETYPE(font_name)) { - /* Do not check the existence... - * The reason for this is that we cannot locate PK font without - * font scale. - */ - font_dict = pdf_new_dict(); - pdf_add_dict(font_dict, - pdf_new_name("Type"), pdf_new_name("Font")); - if (PDF_OBJ_STRINGTYPE(font_name)) { - pdf_add_dict(font_dict, - pdf_new_name("FontName"), - pdf_new_name(pdf_string_value(font_name))); - pdf_release_obj(font_name); - } else { - pdf_add_dict(font_dict, - pdf_new_name("FontName"), font_name); - } - pdf_add_dict(font_dict, - pdf_new_name("FontScale"), pdf_new_number(1.0)); - - if (top_stack < PS_STACK_SIZE) { - stack[top_stack++] = font_dict; - } else { - WARN("PS stack overflow including MetaPost file or inline PS code"); - pdf_release_obj(font_dict); - error = 1; - } - } else { - error = 1; - } - - return error; -} - -static int -do_scalefont (void) -{ - int error = 0; - pdf_obj *font_dict; - pdf_obj *font_scale; - double scale; - - error = pop_get_numbers(&scale, 1); - if (error) - return error; - - font_dict = POP_STACK(); - if (!font_dict) - error = 1; - else if (is_fontdict(font_dict)) { - font_scale = pdf_lookup_dict(font_dict, "FontScale"); - pdf_set_number(font_scale, pdf_number_value(font_scale)*scale); - if (top_stack < PS_STACK_SIZE) { - stack[top_stack++] = font_dict; - } else { - WARN("PS stack overflow including MetaPost file or inline PS code"); - pdf_release_obj(font_dict); - error = 1; - } - } else { - error = 1; - } - - return error; -} - -static int -do_setfont (void) -{ - int error = 0; - char *font_name; - double font_scale; - pdf_obj *font_dict; - - font_dict = POP_STACK(); - if (!is_fontdict(font_dict)) - error = 1; - else { - /* Subfont support prevent us from managing - * font in a single place... - */ - font_name = pdf_name_value (pdf_lookup_dict(font_dict, "FontName")); - font_scale = pdf_number_value(pdf_lookup_dict(font_dict, "FontScale")); - - error = mp_setfont(font_name, font_scale); - } - pdf_release_obj(font_dict); - - return error; -} - -/* Push dummy font dict onto PS stack */ -static int -do_currentfont (void) -{ - int error = 0; - struct mp_font *font; - pdf_obj *font_dict; - - font = CURRENT_FONT(); - if (!font) { - WARN("Currentfont undefined..."); - return 1; - } else { - font_dict = pdf_new_dict(); - pdf_add_dict(font_dict, - pdf_new_name("Type"), - pdf_new_name("Font")); - pdf_add_dict(font_dict, - pdf_new_name("FontName"), - pdf_new_name(font->font_name)); - pdf_add_dict(font_dict, - pdf_new_name("FontScale"), - pdf_new_number(font->pt_size)); - if (top_stack < PS_STACK_SIZE) { - stack[top_stack++] = font_dict; - } else { - WARN("PS stack overflow..."); - pdf_release_obj(font_dict); - error = 1; - } - } - - return error; -} - -static int -do_show (void) -{ - struct mp_font *font; - pdf_coord cp; - pdf_obj *text_str; - int length; - unsigned char *strptr; - double text_width; - - font = CURRENT_FONT(); - if (!font) { - WARN("Currentfont not set."); /* Should not be error... */ - return 1; - } - - pdf_dev_currentpoint(&cp); - - text_str = POP_STACK(); - if (!PDF_OBJ_STRINGTYPE(text_str)) { - if (text_str) - pdf_release_obj(text_str); - return 1; - } - if (font->font_id < 0) { - WARN("mpost: not set."); /* Should not be error... */ - pdf_release_obj(text_str); - return 1; - } - - strptr = pdf_string_value (text_str); - length = pdf_string_length(text_str); - - if (font->tfm_id < 0) { - WARN("mpost: TFM not found for \"%s\".", font->font_name); - WARN("mpost: Text width not calculated..."); - } - - text_width = 0.0; - if (font->subfont_id >= 0) { - unsigned short uch; - unsigned char *ustr; - int i; - - ustr = NEW(length * 2, unsigned char); - for (i = 0; i < length; i++) { - uch = lookup_sfd_record(font->subfont_id, strptr[i]); - ustr[2*i ] = uch >> 8; - ustr[2*i+1] = uch & 0xff; - if (font->tfm_id >= 0) { - text_width += tfm_get_width(font->tfm_id, strptr[i]); - } - } - text_width *= font->pt_size; - - pdf_dev_set_string((spt_t)(cp.x * dev_unit_dviunit()), - (spt_t)(cp.y * dev_unit_dviunit()), - ustr, length * 2, - (spt_t)(text_width*dev_unit_dviunit()), - font->font_id, 0); - RELEASE(ustr); - } else { -#define FWBASE ((double) (1<<20)) - if (font->tfm_id >= 0) { - text_width = (double) tfm_string_width(font->tfm_id, strptr, length)/FWBASE; - text_width *= font->pt_size; - } - pdf_dev_set_string((spt_t)(cp.x * dev_unit_dviunit()), - (spt_t)(cp.y * dev_unit_dviunit()), - strptr, length, - (spt_t)(text_width*dev_unit_dviunit()), - font->font_id, 0); - } - - if (pdf_dev_get_font_wmode(font->font_id)) { - pdf_dev_rmoveto(0.0, -text_width); - } else { - pdf_dev_rmoveto(text_width, 0.0); - } - - graphics_mode(); - pdf_release_obj(text_str); - - return 0; -} - -static int -do_mpost_bind_def (const char *ps_code, double x_user, double y_user) -{ - int error = 0; - const char *start, *end; - - start = ps_code; - end = start + strlen(start); - - error = mp_parse_body(&start, end, x_user, y_user); - - return error; -} - -static int -do_texfig_operator (int opcode, double x_user, double y_user) -{ - static transform_info fig_p; - static int in_tfig = 0; - static int xobj_id = -1; - static int count = 0; - double values[6]; - int error = 0; - - switch (opcode) { - case STEXFIG: - error = pop_get_numbers(values, 6); - if (!error) { - double dvi2pts; - char resname[256]; - - transform_info_clear(&fig_p); - dvi2pts = 1.0/dev_unit_dviunit(); - - fig_p.width = values[0] * dvi2pts; - fig_p.height = values[1] * dvi2pts; - fig_p.bbox.llx = values[2] * dvi2pts; - fig_p.bbox.lly = -values[3] * dvi2pts; - fig_p.bbox.urx = values[4] * dvi2pts; - fig_p.bbox.ury = -values[5] * dvi2pts; - fig_p.flags |= INFO_HAS_USER_BBOX; - - sprintf(resname, "__tf%d__", count); - xobj_id = pdf_doc_begin_grabbing(resname, - fig_p.bbox.llx, fig_p.bbox.ury, &fig_p.bbox); - - in_tfig = 1; - count++; - } - break; - case ETEXFIG: - if (!in_tfig) - ERROR("endTexFig without valid startTexFig!."); - - pdf_doc_end_grabbing(NULL); - pdf_dev_put_image(xobj_id, &fig_p, x_user, y_user); - in_tfig = 0; - break; - default: - error = 1; - } - - return error; -} - -/* - * buggy... - */ - -/* - * CTM(Current Transformation Matrix) means the transformation of User Space - * to Device Space coordinates. Because DVIPDFMx does not know the resolution - * of Device Space, we assume that the resolution is 1/1000. - */ -#define DEVICE_RESOLUTION 1000 -static int -ps_dev_CTM (pdf_tmatrix *M) -{ - pdf_dev_currentmatrix(M); - M->a *= DEVICE_RESOLUTION; M->b *= DEVICE_RESOLUTION; - M->c *= DEVICE_RESOLUTION; M->d *= DEVICE_RESOLUTION; - M->e *= DEVICE_RESOLUTION; M->f *= DEVICE_RESOLUTION; - - return 0; -} - -/* - * Again, the only piece that needs x_user and y_user is - * that piece dealing with texfig. - */ -static int -do_operator (const char *token, double x_user, double y_user) -{ - int error = 0; - int opcode = 0; - double values[12]; - pdf_obj *tmp = NULL; - pdf_tmatrix matrix; - pdf_coord cp; - pdf_color color; - -#define PUSH(o) { \ - if (top_stack < PS_STACK_SIZE) { \ - stack[top_stack++] = (o); \ - } else { \ - WARN("PS stack overflow including MetaPost file or inline PS code"); \ - error=1; \ - break;\ - } \ -} - - opcode = get_opcode(token); - - switch (opcode) { - - /* - * Arithmetic operators - */ - case ADD: - error = pop_get_numbers(values, 2); - if (!error) - PUSH(pdf_new_number(values[0] + values[1])); - break; - case MUL: - error = pop_get_numbers(values, 2); - if (!error) - PUSH(pdf_new_number(values[0]*values[1])); - break; - case NEG: - error = pop_get_numbers(values, 1); - if (!error) - PUSH(pdf_new_number(-values[0])); - break; - case SUB: - error = pop_get_numbers(values, 2); - if (!error) - PUSH(pdf_new_number(values[0] - values[1])); - break; - case DIV: - error = pop_get_numbers(values, 2); - if (!error) - PUSH(pdf_new_number(values[0]/values[1])); - break; - case TRUNCATE: /* Round toward zero. */ - error = pop_get_numbers(values, 1); - if (!error) - PUSH(pdf_new_number(((values[0] > 0) ? floor(values[0]) : ceil(values[0])))); - break; - - /* Stack operation */ - case CLEAR: - error = do_clear(); - break; - case POP: - tmp = POP_STACK(); - if (tmp) - pdf_release_obj(tmp); - break; - case EXCH: - error = do_exch(); - break; - - /* Path construction */ - case MOVETO: - error = pop_get_numbers(values, 2); - if (!error) - error = pdf_dev_moveto(values[0], values[1]); - break; - case RMOVETO: - error = pop_get_numbers(values, 2); - if (!error) - error = pdf_dev_rmoveto(values[0], values[1]); - break; - case LINETO: - error = pop_get_numbers(values, 2); - if (!error) - error = pdf_dev_lineto(values[0], values[1]); - break; - case RLINETO: - error = pop_get_numbers(values, 2); - if (!error) - error = pdf_dev_rlineto(values[0], values[1]); - break; - case CURVETO: - error = pop_get_numbers(values, 6); - if (!error) - error = pdf_dev_curveto(values[0], values[1], - values[2], values[3], - values[4], values[5]); - break; - case RCURVETO: - error = pop_get_numbers(values, 6); - if (!error) - error = pdf_dev_rcurveto(values[0], values[1], - values[2], values[3], - values[4], values[5]); - break; - case CLOSEPATH: - error = pdf_dev_closepath(); - break; - case ARC: - error = pop_get_numbers(values, 5); - if (!error) - error = pdf_dev_arc(values[0], values[1], - values[2], /* rad */ - values[3], values[4]); - break; - case ARCN: - error = pop_get_numbers(values, 5); - if (!error) - error = pdf_dev_arcn(values[0], values[1], - values[2], /* rad */ - values[3], values[4]); - break; - - case NEWPATH: - pdf_dev_newpath(); - break; - case STROKE: - /* fill rule not supported yet */ - pdf_dev_flushpath('S', PDF_FILL_RULE_NONZERO); - break; - case FILL: - pdf_dev_flushpath('f', PDF_FILL_RULE_NONZERO); - break; - - case CLIP: - error = pdf_dev_clip(); - break; - case EOCLIP: - error = pdf_dev_eoclip(); - break; - - /* Graphics state operators: */ - case GSAVE: - error = pdf_dev_gsave(); - save_font(); - break; - case GRESTORE: - error = pdf_dev_grestore(); - restore_font(); - break; - - case CONCAT: - tmp = POP_STACK(); - error = cvr_array(tmp, values, 6); /* This does pdf_release_obj() */ - tmp = NULL; - if (error) - WARN("Missing array before \"concat\"."); - else { - pdf_setmatrix(&matrix, - values[0], values[1], - values[2], values[3], - values[4], values[5]); - error = pdf_dev_concat(&matrix); - } - break; - case SCALE: - error = pop_get_numbers(values, 2); - if (!error) { - switch (mp_cmode) { -#ifndef WITHOUT_ASCII_PTEX - case MP_CMODE_PTEXVERT: - pdf_setmatrix(&matrix, - values[1], 0.0, - 0.0 , values[0], - 0.0 , 0.0); - break; -#endif /* !WITHOUT_ASCII_PTEX */ - default: - pdf_setmatrix(&matrix, - values[0], 0.0, - 0.0 , values[1], - 0.0 , 0.0); - break; - } - - error = pdf_dev_concat(&matrix); - } - break; - /* Positive angle means clock-wise direction in graphicx-dvips??? */ - case ROTATE: - error = pop_get_numbers(values, 1); - if (!error) { - values[0] = values[0] * M_PI / 180; - - switch (mp_cmode) { - case MP_CMODE_DVIPSK: - case MP_CMODE_MPOST: /* Really? */ -#ifndef WITHOUT_ASCII_PTEX - case MP_CMODE_PTEXVERT: -#endif /* !WITHOUT_ASCII_PTEX */ - pdf_setmatrix(&matrix, - cos(values[0]), -sin(values[0]), - sin(values[0]), cos(values[0]), - 0.0, 0.0); - break; - default: - pdf_setmatrix(&matrix, - cos(values[0]) , sin(values[0]), - -sin(values[0]), cos(values[0]), - 0.0, 0.0); - break; - } - error = pdf_dev_concat(&matrix); - } - break; - case TRANSLATE: - error = pop_get_numbers(values, 2); - if (!error) { - pdf_setmatrix(&matrix, - 1.0, 0.0, - 0.0, 1.0, - values[0], values[1]); - error = pdf_dev_concat(&matrix); - } - break; - - case SETDASH: - error = pop_get_numbers(values, 1); - if (!error) { - pdf_obj *pattern, *dash; - int i, num_dashes; - double dash_values[PDF_DASH_SIZE_MAX]; - double offset; - - offset = values[0]; - pattern = POP_STACK(); - if (!PDF_OBJ_ARRAYTYPE(pattern)) { - if (pattern) - pdf_release_obj(pattern); - error = 1; - break; - } - num_dashes = pdf_array_length(pattern); - if (num_dashes > PDF_DASH_SIZE_MAX) { - WARN("Too many dashes..."); - pdf_release_obj(pattern); - error = 1; - break; - } - for (i = 0; - i < num_dashes && !error ; i++) { - dash = pdf_get_array(pattern, i); - if (!PDF_OBJ_NUMBERTYPE(dash)) - error = 1; - else { - dash_values[i] = pdf_number_value(dash); - } - } - pdf_release_obj(pattern); - if (!error) { - error = pdf_dev_setdash(num_dashes, dash_values, offset); - } - } - break; - case SETLINECAP: - error = pop_get_numbers(values, 1); - if (!error) - error = pdf_dev_setlinecap((int)values[0]); - break; - case SETLINEJOIN: - error = pop_get_numbers(values, 1); - if (!error) - error = pdf_dev_setlinejoin((int)values[0]); - break; - case SETLINEWIDTH: - error = pop_get_numbers(values, 1); - if (!error) - error = pdf_dev_setlinewidth(values[0]); - break; - case SETMITERLIMIT: - error = pop_get_numbers(values, 1); - if (!error) - error = pdf_dev_setmiterlimit(values[0]); - break; - - case SETCMYKCOLOR: - error = pop_get_numbers(values, 4); - /* Not handled properly */ - if (!error) { - pdf_color_cmykcolor(&color, - values[0], values[1], - values[2], values[3]); - pdf_dev_set_color(&color); - } - break; - case SETGRAY: - /* Not handled properly */ - error = pop_get_numbers(values, 1); - if (!error) { - pdf_color_graycolor(&color, values[0]); - pdf_dev_set_color(&color); - } - break; - case SETRGBCOLOR: - error = pop_get_numbers(values, 3); - if (!error) { - pdf_color_rgbcolor(&color, - values[0], values[1], values[2]); - pdf_dev_set_color(&color); - } - break; - - case SHOWPAGE: /* Let's ignore this for now */ - break; - - case CURRENTPOINT: - error = pdf_dev_currentpoint(&cp); - if (!error) { - PUSH(pdf_new_number(cp.x)); - PUSH(pdf_new_number(cp.y)); - } - break; - - case DTRANSFORM: - { - int has_matrix = 0; - - tmp = POP_STACK(); - if (PDF_OBJ_ARRAYTYPE(tmp)) { - error = cvr_array(tmp, values, 6); /* This does pdf_release_obj() */ - tmp = NULL; - if (error) - break; - pdf_setmatrix(&matrix, - values[0], values[1], - values[2], values[3], - values[4], values[5]); - tmp = POP_STACK(); - has_matrix = 1; - } - - if (!PDF_OBJ_NUMBERTYPE(tmp)) { - error = 1; - break; - } - cp.y = pdf_number_value(tmp); - pdf_release_obj(tmp); - - tmp = POP_STACK(); - if (!PDF_OBJ_NUMBERTYPE(tmp)) { - error = 1; - break; - } - cp.x = pdf_number_value(tmp); - pdf_release_obj(tmp); - - if (!has_matrix) { - ps_dev_CTM(&matrix); /* Here, we need real PostScript CTM */ - } - pdf_dev_dtransform(&cp, &matrix); - PUSH(pdf_new_number(cp.x)); - PUSH(pdf_new_number(cp.y)); - } - break; - - case IDTRANSFORM: - { - int has_matrix = 0; - - tmp = POP_STACK(); - if (PDF_OBJ_ARRAYTYPE(tmp)) { - error = cvr_array(tmp, values, 6); /* This does pdf_release_obj() */ - tmp = NULL; - if (error) - break; - pdf_setmatrix(&matrix, - values[0], values[1], - values[2], values[3], - values[4], values[5]); - tmp = POP_STACK(); - has_matrix = 1; - } - - if (!PDF_OBJ_NUMBERTYPE(tmp)) { - error = 1; - break; - } - cp.y = pdf_number_value(tmp); - pdf_release_obj(tmp); - - tmp = POP_STACK(); - if (!PDF_OBJ_NUMBERTYPE(tmp)) { - error = 1; - break; - } - cp.x = pdf_number_value(tmp); - pdf_release_obj(tmp); - - if (!has_matrix) { - ps_dev_CTM(&matrix); /* Here, we need real PostScript CTM */ - } - pdf_dev_idtransform(&cp, &matrix); - PUSH(pdf_new_number(cp.x)); - PUSH(pdf_new_number(cp.y)); - break; - } - - case FINDFONT: - error = do_findfont(); - break; - case SCALEFONT: - error = do_scalefont(); - break; - case SETFONT: - error = do_setfont(); - break; - case CURRENTFONT: - error = do_currentfont(); - break; - - case SHOW: - error = do_show(); - break; - - case STRINGWIDTH: - error = 1; - break; - - /* Extensions */ - case FSHOW: - error = do_mpost_bind_def("exch findfont exch scalefont setfont show", x_user, y_user); - break; - case STEXFIG: - case ETEXFIG: - error = do_texfig_operator(opcode, x_user, y_user); - break; - case HLW: - error = do_mpost_bind_def("0 dtransform exch truncate exch idtransform pop setlinewidth", x_user, y_user); - break; - case VLW: - error = do_mpost_bind_def("0 exch dtransform truncate idtransform setlinewidth pop", x_user, y_user); - break; - case RD: - error = do_mpost_bind_def("[] 0 setdash", x_user, y_user); - break; - case B: - error = do_mpost_bind_def("gsave fill grestore", x_user, y_user); - break; - - case DEF: - tmp = POP_STACK(); - tmp = POP_STACK(); - /* do nothing; not implemented yet */ - break; - - default: - if (is_fontname(token)) { - PUSH(pdf_new_name(token)); - } else { - WARN("Unknown token \"%s\"", token); - error = 1; - } - break; - } - - return error; -} - -/* - * The only sections that need to know x_user and y _user are those - * dealing with texfig. - */ -static int -mp_parse_body (const char **start, const char *end, double x_user, double y_user) -{ - char *token; - pdf_obj *obj; - int error = 0; - - skip_white(start, end); - while (*start < end && !error) { - if (isdigit(**start) || - (*start < end - 1 && - (**start == '+' || **start == '-' || **start == '.' ))) { - double value; - char *next; - - value = strtod(*start, &next); - if (next < end && !strchr("<([{/%", *next) && !isspace(*next)) { - WARN("Unkown PostScript operator."); - dump(*start, next); - error = 1; - } else { - PUSH(pdf_new_number(value)); - *start = next; - } - /* - * PDF parser can't handle PS operator inside arrays. - * This shouldn't use parse_pdf_array(). - */ - } else if (**start == '[' && - (obj = parse_pdf_array(start, end, NULL))) { - PUSH(obj); - /* This cannot handle ASCII85 string. */ - } else if (*start < end - 1 && - (**start == '<' && *(*start+1) == '<') && - (obj = parse_pdf_dict(start, end, NULL))) { - PUSH(obj); - } else if ((**start == '(' || **start == '<') && - (obj = parse_pdf_string (start, end))) { - PUSH(obj); - } else if (**start == '/' && - (obj = parse_pdf_name(start, end))) { - PUSH(obj); - } else { - token = parse_ident(start, end); - if (!token) - error = 1; - else { - error = do_operator(token, x_user, y_user); - RELEASE(token); - } - } - skip_white(start, end); - } - - return error; -} - -void -mps_eop_cleanup (void) -{ - clear_fonts(); - do_clear(); -} - -int -mps_stack_depth (void) -{ - return top_stack; -} - -int -mps_exec_inline (const char **p, const char *endptr, - double x_user, double y_user) -{ - int error; - int dirmode, autorotate; - - /* Compatibility for dvipsk. */ - dirmode = pdf_dev_get_dirmode(); - if (dirmode) { - mp_cmode = MP_CMODE_PTEXVERT; - } else { - mp_cmode = MP_CMODE_DVIPSK; - } - - autorotate = pdf_dev_get_param(PDF_DEV_PARAM_AUTOROTATE); - pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, 0); - //pdf_color_push(); /* ... */ - - /* Comment in dvipdfm: - * Remember that x_user and y_user are off by 0.02 % - */ - pdf_dev_moveto(x_user, y_user); - error = mp_parse_body(p, endptr, x_user, y_user); - - //pdf_color_pop(); /* ... */ - pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, autorotate); - pdf_dev_set_dirmode(dirmode); - - return error; -} - -/* mp inclusion is a bit of a hack. The routine - * starts a form at the lower left corner of - * the page and then calls begin_form_xobj telling - * it to record the image drawn there and bundle it - * up in an xojbect. This allows us to use the coordinates - * in the MP file directly. This appears to be the - * easiest way to be able to use the pdf_dev_set_string() - * command (with its scaled and extended fonts) without - * getting all confused about the coordinate system. - * After the xobject is created, the whole thing can - * be scaled any way the user wants - */ - -/* Should implement save and restore. */ -int -mps_include_page (const char *ident, FILE *fp) -{ - int form_id; - xform_info info; - int st_depth, gs_depth; - char *buffer; - const char *p, *endptr; - long length, nb_read; - int dirmode, autorotate, error; - - rewind(fp); - - length = file_size(fp); - if (length < 1) { - WARN("Can't read any byte in the MPS file."); - return -1; - } - - buffer = NEW(length + 1, char); - buffer[length] = '\0'; - p = buffer; - endptr = p + length; - - while (length > 0) { - nb_read = fread(buffer, sizeof(char), length, fp); - if (nb_read < 0) { - RELEASE(buffer); - WARN("Reading file failed..."); - return -1; - } - length -= nb_read; - } - - error = mps_scan_bbox(&p, endptr, &(info.bbox)); - if (error) { - WARN("Error occured while scanning MetaPost file headers: Could not find BoundingBox."); - RELEASE(buffer); - return -1; - } - skip_prolog(&p, endptr); - - 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(); - - form_id = pdf_doc_begin_grabbing(ident, 0.0, 0.0, &(info.bbox)); - - mp_cmode = MP_CMODE_MPOST; - gs_depth = pdf_dev_current_depth(); - st_depth = mps_stack_depth(); - /* At this point the gstate must be initialized, since it starts a new - * XObject. Note that it increase gs_depth by 1. */ - pdf_dev_push_gstate(); - - error = mp_parse_body(&p, endptr, 0.0, 0.0); - RELEASE(buffer); - - if (error) { - WARN("Errors occured while interpreting MPS file."); - /* WARN("Leaving garbage in output PDF file."); */ - form_id = -1; - } - - /* It's time to pop the new gstate above. */ - pdf_dev_pop_gstate(); - mps_stack_clear_to (st_depth); - pdf_dev_grestore_to(gs_depth); - - pdf_doc_end_grabbing(NULL); - - //pdf_color_pop(); - pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, autorotate); - pdf_dev_set_dirmode(dirmode); - - return form_id; -} - -int -mps_do_page (FILE *image_file) -{ - int error = 0; - pdf_rect bbox; - char *buffer; - const char *start, *end; - long size; - int dir_mode; - - rewind(image_file); - if ((size = file_size(image_file)) == 0) { - WARN("Can't read any byte in the MPS file."); - return -1; - } - - buffer = NEW(size+1, char); - fread(buffer, sizeof(char), size, image_file); - buffer[size] = 0; - start = buffer; - end = buffer + size; - - error = mps_scan_bbox(&start, end, &bbox); - if (error) { - WARN("Error occured while scanning MetaPost file headers: Could not find BoundingBox."); - RELEASE(buffer); - return -1; - } - - mp_cmode = MP_CMODE_MPOST; - - pdf_doc_begin_page (1.0, 0.0, 0.0); /* scale, xorig, yorig */ - pdf_doc_set_mediabox(pdf_doc_current_page_number(), &bbox); - - dir_mode = pdf_dev_get_dirmode(); - pdf_dev_set_autorotate(0); - - skip_prolog(&start, end); - - error = mp_parse_body(&start, end, 0.0, 0.0); - - if (error) { - WARN("Errors occured while interpreting MetaPost file."); - } - - pdf_dev_set_autorotate(1); - pdf_dev_set_dirmode(dir_mode); - - pdf_doc_end_page(); - - RELEASE(buffer); - - /* - * The reason why we don't return XObject itself is - * PDF inclusion may not be made so. - */ - return (error ? -1 : 0); -} - -int -check_for_mp (FILE *image_file) -{ - int try_count = 10; - - rewind (image_file); - mfgets(work_buffer, WORK_BUFFER_SIZE, image_file); - if (strncmp(work_buffer, "%!PS", 4)) - return 0; - - while (try_count > 0) { - mfgets(work_buffer, WORK_BUFFER_SIZE, image_file); - if (!strncmp(work_buffer, "%%Creator:", 10)) { - if (strlen(work_buffer+10) >= 8 && - strstr(work_buffer+10, "MetaPost")) - break; - } - try_count--; - } - - return ((try_count > 0) ? 1 : 0); -} diff --git a/Build/source/texk/dvipdfm-x/xsrc/pdfdev.h b/Build/source/texk/dvipdfm-x/xsrc/pdfdev.h deleted file mode 100644 index 6df1e91054d..00000000000 --- a/Build/source/texk/dvipdfm-x/xsrc/pdfdev.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - - This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - - Copyright (C) 2002-2012 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - 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. -*/ - -#ifndef _PDFDEV_H_ -#define _PDFDEV_H_ - -#include "numbers.h" -#include "pdfobj.h" -#include "pdfcolor.h" - -typedef signed long spt_t; - -typedef struct pdf_tmatrix -{ - double a, b, c, d, e, f; -} pdf_tmatrix; - -typedef struct pdf_rect -{ - double llx, lly, urx, ury; -} pdf_rect; - -typedef struct pdf_coord -{ - double x, y; -} pdf_coord; - -/* The name transform_info is misleading. - * I'll put this here for a moment... - */ -typedef struct -{ - /* Physical dimensions - * - * If those values are given, images will be scaled - * and/or shifted to fit within a box described by - * those values. - */ - double width; - double height; - double depth; - - pdf_tmatrix matrix; /* transform matrix */ - pdf_rect bbox; /* user_bbox */ - - int flags; -} transform_info; -#define INFO_HAS_USER_BBOX (1 << 0) -#define INFO_HAS_WIDTH (1 << 1) -#define INFO_HAS_HEIGHT (1 << 2) -#define INFO_DO_CLIP (1 << 3) -#define INFO_DO_HIDE (1 << 4) -extern void transform_info_clear (transform_info *info); - - -extern void pdf_dev_set_verbose (void); - -/* Not in spt_t. */ -extern int pdf_sprint_matrix (char *buf, const pdf_tmatrix *p); -extern int pdf_sprint_rect (char *buf, const pdf_rect *p); -extern int pdf_sprint_coord (char *buf, const pdf_coord *p); -extern int pdf_sprint_length (char *buf, double value); -extern int pdf_sprint_number (char *buf, double value); - -/* unit_conv: multiplier for input unit (spt_t) to bp conversion. - * precision: How many fractional digits preserved in output (not real - * accuracy control). - * is_bw: Ignore color related special instructions. - */ -extern void pdf_init_device (double unit_conv, int precision, int is_bw); -extern void pdf_close_device (void); - -/* returns 1.0/unit_conv */ -extern double dev_unit_dviunit (void); - -#if 0 -/* DVI interpreter knows text positioning in relative motion. - * However, pdf_dev_set_string() recieves text string with placement - * in absolute position in user space, and it convert absolute - * positioning back to relative positioning. It is quite wasteful. - * - * TeX using DVI register stack operation to do CR and then use down - * command for LF. DVI interpreter knows hint for current leading - * and others (raised or lowered), but they are mostly lost in - * pdf_dev_set_string(). - */ - -typedef struct -{ - int argc; - - struct { - int is_kern; /* kern or string */ - - spt_t kern; /* negative kern means space */ - - int offset; /* offset to sbuf */ - int length; /* length of string */ - } args[]; - - unsigned char sbuf[PDF_STRING_LEN_MAX]; - -} pdf_text_string; - -/* Something for handling raise, leading, etc. here. */ - -#endif - -/* Draw texts and rules: - * - * xpos, ypos, width, and height are all fixed-point numbers - * converted to big-points by multiplying unit_conv (dvi2pts). - * They must be position in the user space. - * - * ctype: - * 0 - input string is in multi-byte encoding. - * 1 - input string is in 8-bit encoding. - * 2 - input string is in 16-bit encoding. - */ -extern void pdf_dev_set_string (spt_t xpos, spt_t ypos, - const void *instr_ptr, int instr_len, - spt_t text_width, - int font_id, int ctype); -extern void pdf_dev_set_rule (spt_t xpos, spt_t ypos, - spt_t width, spt_t height); - -/* Place XObject */ -extern int pdf_dev_put_image (int xobj_id, - transform_info *p, double ref_x, double ref_y); - -/* The design_size and ptsize required by PK font support... - */ -extern int pdf_dev_locate_font (const char *font_name, spt_t ptsize); - -extern int pdf_dev_setfont (const char *font_name, spt_t ptsize); - -/* The following two routines are NOT WORKING. - * Dvipdfmx doesn't manage gstate well.. - */ -#ifdef XETEX -/* pdf_dev_translate() or pdf_dev_concat() should be used. */ -extern void pdf_dev_set_origin (double orig_x, double orig_y); -#endif -/* Always returns 1.0, please rename this. */ -extern double pdf_dev_scale (void); - -/* Access text state parameters. */ -#if 0 -extern int pdf_dev_currentfont (void); /* returns font_id */ -extern double pdf_dev_get_font_ptsize (int font_id); -#endif -extern int pdf_dev_get_font_wmode (int font_id); /* ps: special support want this (pTeX). */ - -/* Text composition (direction) mode - * This affects only when auto_rotate is enabled. - */ -extern int pdf_dev_get_dirmode (void); -extern void pdf_dev_set_dirmode (int dir_mode); - -/* Set rect to rectangle in device space. - * Unit conversion spt_t to bp and transformation applied within it. - */ -extern void pdf_dev_set_rect (pdf_rect *rect, - spt_t x_pos, spt_t y_pos, - spt_t width, spt_t height, spt_t depth); - -/* Accessor to various device parameters. - */ -#define PDF_DEV_PARAM_AUTOROTATE 1 -#define PDF_DEV_PARAM_COLORMODE 2 - -extern int pdf_dev_get_param (int param_type); -extern void pdf_dev_set_param (int param_type, int value); - -/* Text composition mode is ignored (always same as font's - * writing mode) and glyph rotation is not enabled if - * auto_rotate is unset. - */ -#define pdf_dev_set_autorotate(v) pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, (v)) -#define pdf_dev_set_colormode(v) pdf_dev_set_param(PDF_DEV_PARAM_COLORMODE, (v)) - -/* - * For pdf_doc, pdf_draw and others. - */ - -/* Force reselecting font and color: - * XFrom (content grabbing) and Metapost support want them. - */ -extern void pdf_dev_reset_fonts (void); -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(). - */ -extern void pdf_dev_bop (const pdf_tmatrix *M); -extern void pdf_dev_eop (void); - -/* Text is normal and line art is not normal in dvipdfmx. So we don't have - * begin_text (BT in PDF) and end_text (ET), but instead we have graphics_mode() - * to terminate text section. pdf_dev_flushpath() and others call this. - */ -extern void graphics_mode (void); - -extern void pdf_dev_get_coord(double *xpos, double *ypos); -extern void pdf_dev_push_coord(double xpos, double ypos); -extern void pdf_dev_pop_coord(void); - -#endif /* _PDFDEV_H_ */ diff --git a/Build/source/texk/dvipdfm-x/xsrc/pdfdoc.h b/Build/source/texk/dvipdfm-x/xsrc/pdfdoc.h deleted file mode 100644 index 5e65da405e3..00000000000 --- a/Build/source/texk/dvipdfm-x/xsrc/pdfdoc.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - - This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - - Copyright (C) 2007-2012 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - 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. -*/ - -#ifndef _PDFDOC_H_ -#define _PDFDOC_H_ - -#include "pdfobj.h" -#include "pdfdev.h" - -#define PDF_DOC_GRABBING_NEST_MAX 4 - -extern void pdf_doc_set_verbose (void); - -extern void pdf_open_document (const char *filename, - int do_encryption, - double media_width, double media_height, - double annot_grow_amount, int bookmark_open_depth); -extern void pdf_close_document (void); - - -/* PDF document metadata */ -extern void pdf_doc_set_creator (const char *creator); - - -/* They just return PDF dictionary object. - * Callers are completely responsible for doing right thing... - */ -extern pdf_obj *pdf_doc_get_dictionary (const char *category); -extern pdf_obj *pdf_doc_get_reference (const char *category); - -#define pdf_doc_page_tree() pdf_doc_get_dictionary("Pages") -#define pdf_doc_catalog() pdf_doc_get_dictionary("Catalog") -#define pdf_doc_docinfo() pdf_doc_get_dictionary("Info") -#define pdf_doc_names() pdf_doc_get_dictionary("Names") -#define pdf_doc_this_page() pdf_doc_get_dictionary("@THISPAGE") - -extern long pdf_doc_current_page_number (void); -extern pdf_obj *pdf_doc_current_page_resources (void); - -extern pdf_obj *pdf_doc_ref_page (unsigned long page_no); -#define pdf_doc_this_page_ref() pdf_doc_get_reference("@THISPAGE") -#define pdf_doc_next_page_ref() pdf_doc_get_reference("@NEXTPAGE") -#define pdf_doc_prev_page_ref() pdf_doc_get_reference("@PREVPAGE") - -/* Not really managing tree... - * There should be something for number tree. - */ -extern int pdf_doc_add_names (const char *category, - const void *key, int keylen, pdf_obj *value); - -extern void pdf_doc_set_bop_content (const char *str, unsigned length); -extern void pdf_doc_set_eop_content (const char *str, unsigned length); - -/* Page */ -extern void pdf_doc_begin_page (double scale, double x_origin, double y_origin); -extern void pdf_doc_end_page (void); - -extern void pdf_doc_set_mediabox (unsigned page_no, const pdf_rect *mediabox); -extern void pdf_doc_get_mediabox (unsigned page_no, pdf_rect *mediabox); - -extern void pdf_doc_add_page_content (const char *buffer, unsigned length); -extern void pdf_doc_add_page_resource (const char *category, - const char *resource_name, pdf_obj *resources); - -/* Article thread */ -extern void pdf_doc_begin_article (const char *article_id, pdf_obj *info); -#if 0 -extern void pdf_doc_end_article (const char *article_id); /* Do nothing... */ -#endif -extern void pdf_doc_make_article (const char *article_id, - const char **bead_order, int num_beads); -extern void pdf_doc_add_bead (const char *article_id, - const char *bead_id, - long page_no, const pdf_rect *rect); - -/* Bookmarks */ -extern int pdf_doc_bookmarks_up (void); -extern int pdf_doc_bookmarks_down (void); -extern void pdf_doc_bookmarks_add (pdf_obj *dict, int is_open); -extern int pdf_doc_bookmarks_depth (void); - - -/* Returns xobj_id of started xform. */ -extern int pdf_doc_begin_grabbing (const char *ident, - double ref_x, double ref_y, - const pdf_rect *cropbox); -extern void pdf_doc_end_grabbing (pdf_obj *attrib); - - -/* Annotation */ -extern void pdf_doc_add_annot (unsigned page_no, - const pdf_rect *rect, pdf_obj *annot_dict); - -/* Annotation with auto- clip and line (or page) break */ -extern void pdf_doc_begin_annot (pdf_obj *dict); -extern void pdf_doc_end_annot (void); - -extern void pdf_doc_break_annot (void); -extern void pdf_doc_expand_box (const pdf_rect *rect); - -/* Manual thumbnail */ -extern void pdf_doc_enable_manual_thumbnails (void); - -#if 0 -/* PageLabels - */ -extern void pdf_doc_set_pagelabel (long page_start, - const char *type, - const void *prefix, int pfrx_len, - long counter_start); -#endif - -/* Similar to bop_content */ -#include "pdfcolor.h" -extern void pdf_doc_set_bgcolor (const pdf_color *color); - -#endif /* _PDFDOC_H_ */ diff --git a/Build/source/texk/dvipdfm-x/xsrc/pdfdraw.h b/Build/source/texk/dvipdfm-x/xsrc/pdfdraw.h deleted file mode 100644 index f24540ef2bf..00000000000 --- a/Build/source/texk/dvipdfm-x/xsrc/pdfdraw.h +++ /dev/null @@ -1,172 +0,0 @@ -/* - - This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - - Copyright (C) 2002-2012 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - 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. -*/ - -#ifndef _PDF_DRAW_H_ -#define _PDF_DRAW_H_ - -#include "pdfcolor.h" -#include "pdfdev.h" - -#define PDF_DASH_SIZE_MAX 16 -#define PDF_GSAVE_MAX 256 - -extern void pdf_dev_init_gstates (void); -extern void pdf_dev_clear_gstates (void); - -#define pdf_copymatrix(m,n) do {\ - (m)->a = (n)->a; (m)->b = (n)->b;\ - (m)->c = (n)->c; (m)->d = (n)->d;\ - (m)->e = (n)->e; (m)->f = (n)->f;\ -} while (0) - -#define pdf_setmatrix(m,p,q,r,s,t,u) do {\ - (m)->a = (p); (m)->b = (q);\ - (m)->c = (r); (m)->d = (s);\ - (m)->e = (t); (m)->f = (u);\ -} while (0) - -/* m -> n x m */ -#define pdf_concatmatrix(m,n) do {\ - double _tmp_a, _tmp_b, _tmp_c, _tmp_d; \ - _tmp_a = (m)->a; _tmp_b = (m)->b; \ - _tmp_c = (m)->c; _tmp_d = (m)->d; \ - (m)->a = ((n)->a) * _tmp_a + ((n)->b) * _tmp_c; \ - (m)->b = ((n)->a) * _tmp_b + ((n)->b) * _tmp_d; \ - (m)->c = ((n)->c) * _tmp_a + ((n)->d) * _tmp_c; \ - (m)->d = ((n)->c) * _tmp_b + ((n)->d) * _tmp_d; \ - (m)->e += ((n)->e) * _tmp_a + ((n)->f) * _tmp_c; \ - (m)->f += ((n)->e) * _tmp_b + ((n)->f) * _tmp_d; \ -} while (0) - -typedef struct pdf_path_ pdf_path; - -extern int pdf_dev_currentmatrix (pdf_tmatrix *M); -extern int pdf_dev_currentpoint (pdf_coord *cp); - -extern int pdf_dev_setlinewidth (double width); -extern int pdf_dev_setmiterlimit (double mlimit); -extern int pdf_dev_setlinecap (int style); -extern int pdf_dev_setlinejoin (int style); -extern int pdf_dev_setdash (int count, - double *pattern, - double offset); -#if 0 -extern int pdf_dev_setflat (int flatness); -#endif /* 0 */ - -/* Path Construction */ -extern int pdf_dev_moveto (double x , double y); -extern int pdf_dev_rmoveto (double x , double y); -extern int pdf_dev_closepath (void); - -extern int pdf_dev_lineto (double x0 , double y0); -extern int pdf_dev_rlineto (double x0 , double y0); -extern int pdf_dev_curveto (double x0 , double y0, - double x1 , double y1, - double x2 , double y2); -extern int pdf_dev_vcurveto (double x0 , double y0, - double x1 , double y1); -extern int pdf_dev_ycurveto (double x0 , double y0, - double x1 , double y1); -extern int pdf_dev_rcurveto (double x0 , double y0, - double x1 , double y1, - double x2 , double y2); -extern int pdf_dev_arc (double c_x, double c_y, double r, - double a_0, double a_1); -extern int pdf_dev_arcn (double c_x, double c_y, double r, - double a_0, double a_1); - -#define PDF_FILL_RULE_NONZERO 0 -#define PDF_FILL_RULE_EVENODD 1 - -extern int pdf_dev_newpath (void); - -/* Path Painting */ -extern int pdf_dev_clip (void); -extern int pdf_dev_eoclip (void); - -#if 0 -extern int pdf_dev_rectstroke (double x, double y, - double w, double h, - const pdf_tmatrix *M /* optional */ - ); -#endif /* 0 */ - -extern int pdf_dev_rectfill (double x, double y, double w, double h); -extern int pdf_dev_rectclip (double x, double y, double w, double h); -extern int pdf_dev_rectadd (double x, double y, double w, double h); - -extern int pdf_dev_flushpath (char p_op, int fill_rule); - -#define pdf_dev_fill() pdf_dev_flushpath('f', PDF_FILL_RULE_NONZERO) -#define pdf_dev_eofill() pdf_dev_flushpath('f', PDF_FILL_RULE_EVENODD) -#define pdf_dev_stroke() pdf_dev_flushpath('S', PDF_FILL_RULE_NONZERO) -#define pdf_dev_fillstroke() pdf_dev_flushpath('B', PDF_FILL_RULE_NONZERO) - -extern int pdf_dev_concat (const pdf_tmatrix *M); -/* NULL pointer of M mean apply current transformation */ -extern void pdf_dev_dtransform (pdf_coord *p, const pdf_tmatrix *M); -extern void pdf_dev_idtransform (pdf_coord *p, const pdf_tmatrix *M); -extern void pdf_dev_transform (pdf_coord *p, const pdf_tmatrix *M); -#if 0 -extern void pdf_dev_itransform (pdf_coord *p, const pdf_tmatrix *M); -#endif /* 0 */ - -extern int pdf_dev_gsave (void); -extern int pdf_dev_grestore (void); - -/* Requires from mpost.c because new MetaPost graphics must initialize - * the current gstate. */ -extern int pdf_dev_push_gstate (void); -extern int pdf_dev_pop_gstate (void); - - -/* extension */ -extern int pdf_dev_arcx (double c_x, double c_y, - double r_x, double r_y, - double a_0, double a_1, - int a_d, /* arc direction */ - double xar /* x-axis-rotation */ - ); -extern int pdf_dev_bspline (double x0, double y0, - double x1, double y1, - double x2, double y2); - - -extern void pdf_invertmatrix (pdf_tmatrix *M); - -/* The depth here is the depth of q/Q nesting. - * We must remember current depth of nesting when starting a page or xform, - * and must recover until that depth at the end of page/xform. - */ -extern int pdf_dev_current_depth (void); -extern void pdf_dev_grestore_to (int depth); -#define pdf_dev_grestoreall() pdf_dev_grestore_to(0); - -extern int pdf_dev_currentcolor (pdf_color *color, int is_fill); -extern int pdf_dev_setcolor (const pdf_color *color, int is_fill); - -extern void pdf_dev_set_fixed_point (double x, double y); -extern void pdf_dev_get_fixed_point (pdf_coord *p); -#endif /* _PDF_DRAW_H_ */ diff --git a/Build/source/texk/dvipdfm-x/xsrc/xbb.c b/Build/source/texk/dvipdfm-x/xsrc/xbb.c index d93840b97ff..6820b3af4c5 100644 --- a/Build/source/texk/dvipdfm-x/xsrc/xbb.c +++ b/Build/source/texk/dvipdfm-x/xsrc/xbb.c @@ -26,11 +26,12 @@ #include <stdio.h> #include <time.h> #include <string.h> + +#include "numbers.h" #include "system.h" #include "mem.h" #include "error.h" #include "mfileio.h" -#include "numbers.h" #include "pdfobj.h" #include "pdfparse.h" @@ -40,32 +41,43 @@ #include <png.h> #endif +#include "dvipdfmx.h" #include "xbb.h" #define XBB_PROGRAM "extractbb" -#define XBB_VERSION "Version 0.2" +#define XBB_VERSION VERSION static int xbb_output_mode = XBB_OUTPUT; -static void usage(void) +static void show_version(void) { - fprintf (stderr, "%s, version %s, Copyright (C) 2008 by Jin-Hwan Cho\n", + fprintf (stdout, "%s, version %s, Copyright (C) 2008 by Jin-Hwan Cho\n", XBB_PROGRAM, XBB_VERSION); - fprintf (stderr, "A bounding box extraction utility from PDF, PNG, and JPG.\n"); + fprintf (stdout, "A bounding box extraction utility from PDF, PNG, and JPEG.\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"); fprintf (stdout, "(at your option) any later version.\n"); - fprintf (stderr, "\nUsage: %s [-v] [-b] [-m|-x] [files]\n", XBB_PROGRAM); - fprintf (stderr, "\t-b\tWrite output file in binary mode\n"); +} + +static void show_usage(void) +{ + fprintf (stdout, "\nUsage: %s [-v] [-b] [-m|-x] [files]\n", XBB_PROGRAM); + fprintf (stdout, "\t-v\tBe verbose\n"); + fprintf (stdout, "\t-b\tWrite output file in binary mode\n"); if(xbb_output_mode == EBB_OUTPUT) { - fprintf (stderr, "\t-m\tOutput .bb file used in DVIPDFM (default)\n"); - fprintf (stderr, "\t-x\tOutput .xbb file used in DVIPDFMx\n"); + fprintf (stdout, "\t-m\tOutput .bb file used in DVIPDFM (default)\n"); + fprintf (stdout, "\t-x\tOutput .xbb file used in DVIPDFMx\n"); } else { - fprintf (stderr, "\t-m\tOutput .bb file used in DVIPDFM\n"); - fprintf (stderr, "\t-x\tOutput .xbb file used in DVIPDFMx (default)\n"); + fprintf (stdout, "\t-m\tOutput .bb file used in DVIPDFM\n"); + fprintf (stdout, "\t-x\tOutput .xbb file used in DVIPDFMx (default)\n"); } - fprintf (stderr, "\t-v\tVerbose\n"); +} + +static void usage(void) +{ + show_version(); + show_usage(); exit(1); } @@ -96,11 +108,11 @@ static char *make_xbb_filename(const char *name) break; } if (i == sizeof(extensions) / sizeof(extensions[0])) { - fprintf(stderr, "Warning: %s: Filename does not end in a recognizeable extension.\n", name); - result = NEW(strlen(name)+3, char); + WARN("%s: Filename does not end in a recognizable extension.\n", name); + result = NEW(strlen(name)+5, char); /* 5 = ".xbb" + trailing 0 */ strcpy(result, name); } else { /* Remove extension */ - result = NEW(strlen(name)+3-strlen(extensions[i])+1, char); + result = NEW(strlen(name)-strlen(extensions[i])+5, char); /* 5 = ".xbb" + trailing 0 */ strncpy(result, name, strlen(name)-strlen(extensions[i])); result[strlen(name)-strlen(extensions[i])] = 0; } @@ -122,12 +134,12 @@ static void write_xbb(char *fname, int bbllx, int bblly, int bburx, int bbury) return; } if (verbose) { - fprintf(stderr, "Writing to %s: ", outname); - fprintf(stderr, "Bounding box: %d %d %d %d\n", bbllx, bblly, bburx, bbury); + MESG("Writing to %s: ", outname); + MESG("Bounding box: %d %d %d %d\n", bbllx, bblly, bburx, bbury); } - fprintf(fp,"%%%%Title: %s\n", fname); - fprintf(fp,"%%%%Creator: %s %s\n", XBB_PROGRAM, XBB_VERSION); - fprintf(fp,"%%%%BoundingBox: %d %d %d %d\n", bbllx, bblly, bburx, bbury); + fprintf(fp, "%%%%Title: %s\n", fname); + fprintf(fp, "%%%%Creator: %s %s\n", XBB_PROGRAM, XBB_VERSION); + fprintf(fp, "%%%%BoundingBox: %d %d %d %d\n", bbllx, bblly, bburx, bbury); do_time(fp); RELEASE(outname); MFCLOSE(fp); @@ -480,12 +492,13 @@ int extractbb (int argc, char *argv[], int mode) usage(); } } + for (; argc > 0; argc--, argv++) { FILE *infile = NULL; char *kpse_file_name; if (!(kpse_file_name = kpse_find_pict(argv[0])) || (infile = MFOPEN(kpse_file_name, FOPEN_RBIN_MODE)) == NULL) { - fprintf(stderr, "Can't find file (%s)...skipping\n", argv[0]); + WARN("Can't find file (%s)...skipping\n", argv[0]); goto cont; } if (check_for_jpeg(infile)) { @@ -502,7 +515,7 @@ int extractbb (int argc, char *argv[], int mode) goto cont; } #endif /* HAVE_LIBPNG */ - fprintf(stderr, "Can't handle file type for file named %s\n", argv[0]); + WARN("Can't handle file type for file named %s\n", argv[0]); cont: if (kpse_file_name) RELEASE(kpse_file_name); |