summaryrefslogtreecommitdiff
path: root/Build/source/texk/xdvipdfmx/src/mpost.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/xdvipdfmx/src/mpost.c')
-rw-r--r--Build/source/texk/xdvipdfmx/src/mpost.c84
1 files changed, 52 insertions, 32 deletions
diff --git a/Build/source/texk/xdvipdfmx/src/mpost.c b/Build/source/texk/xdvipdfmx/src/mpost.c
index 3a36080effb..841a357e699 100644
--- a/Build/source/texk/xdvipdfmx/src/mpost.c
+++ b/Build/source/texk/xdvipdfmx/src/mpost.c
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/dvipdfmx/src/mpost.c,v 1.38 2007/11/22 16:57:08 chofchof Exp $
+/* $Header: /home/cvsroot/dvipdfmx/src/mpost.c,v 1.40 2008/05/17 01:17:27 chofchof Exp $
This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
@@ -348,6 +348,10 @@ skip_prolog (char **start, char *end)
#define FSHOW 1001
#define STEXFIG 1002
#define ETEXFIG 1003
+#define HLW 1004
+#define VLW 1005
+#define RD 1006
+#define B 1007
static struct operators
{
@@ -417,9 +421,34 @@ static struct operators
};
static struct operators mps_operators[] = {
- {"fshow", FSHOW},
+ {"fshow", FSHOW}, /* exch findfont exch scalefont setfont show */
{"startTexFig", STEXFIG},
- {"endTexFig", ETEXFIG}
+ {"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]))
@@ -800,19 +829,13 @@ do_show (void)
return 0;
}
-static const char *ps_code_fshow = "exch findfont exch scalefont setfont show";
-/*
- * string tfmname scale fshow -
- *
- * exch findfont exch scalefont setfont show
- */
static int
-do_mpost_fshow (int opcode, double x_user, double y_user)
+do_mpost_bind_def (const char *ps_code, double x_user, double y_user)
{
int error = 0;
char *start, *end;
- start = (char *) ps_code_fshow;
+ start = (char *) ps_code;
end = start + strlen(start);
error = mp_parse_body(&start, end, x_user, y_user);
@@ -1328,13 +1351,24 @@ do_operator (const char *token, double x_user, double y_user)
/* Extensions */
case FSHOW:
- error = do_mpost_fshow(opcode, x_user, y_user);
- /* Treat fshow as a path terminator of sorts */
+ 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();
@@ -1388,33 +1422,19 @@ mp_parse_body (char **start, char *end, double x_user, double y_user)
* This shouldn't use parse_pdf_array().
*/
} else if (**start == '[' &&
- (obj = parse_pdf_array(start, end))) {
+ (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))) {
+ (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))) {
- /* Temporary implementation for mps files generated by mptopdf:
- * Just ignore the following command:
- * /fshow {exch findfont exch scalefont setfont show} bind def
- */
- if (strcmp(pdf_name_value(obj), "fshow") == 0) {
- while (*start < end - 3) {
- if (**start == 'd' && *(*start+1) == 'e' && *(*start+2) == 'f') {
- *start += 3;
- break;
- }
- (*start)++;
- }
- } else {
- PUSH(obj);
- }
+ PUSH(obj);
} else {
token = parse_ident(start, end);
if (!token)
@@ -1548,8 +1568,8 @@ mps_include_page (const char *ident, FILE *fp)
RELEASE(buffer);
if (error) {
- WARN("Errors occured while interpreting PostScript file.");
- WARN("Leaving garbage in output PDF file.");
+ WARN("Errors occured while interpreting MPS file.");
+ /* WARN("Leaving garbage in output PDF file."); */
form_id = -1;
}