diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
commit | 487ca4806cc046076293cf6cc5fbba0db282bac7 (patch) | |
tree | 847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/web2c/window/epsf.c | |
parent | a3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (diff) |
texk 1
git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/window/epsf.c')
-rw-r--r-- | Build/source/texk/web2c/window/epsf.c | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/window/epsf.c b/Build/source/texk/web2c/window/epsf.c new file mode 100644 index 00000000000..05211a59970 --- /dev/null +++ b/Build/source/texk/web2c/window/epsf.c @@ -0,0 +1,176 @@ +/* + * epsf.c -- Encapsulated PostScript window server. + * Copyright (C) 1998 Mathias Herberts <herberts@infini.fr> + * + * These functions generate an Encapsulated PostScript File + * representing the graphics normally shown online. They are + * selected by setting MFTERM to epsf. + * + * The name of the file defaults to metafont.eps but can be + * changed by setting the MFEPSF environment variable. + * + * The file is closed when the program exits. + */ + +/* + * This library 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 library 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 library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + + +#define EXTERN extern + +#include "../mfd.h" + +#ifdef EPSFWIN + +#include <stdio.h> + +static FILE * psout = NULL; + +/* + * Arrays epsf_{left,right,top,bottom} hold the coordinates of + * open windows. + * + * When a new window is opened, i.e. when blankrectangle is + * called, we check the arrays to see if the blank rectangle + * clears an open window. If it is the case a showpage and an %%EOF is + * appended To the PostScript file and a new header is output thus + * making it easy to separate the pages. + * + * The last page of the file is not terminated by a showpage and + * an %%EOF, the user should add them himself. + * + */ + +static screencol epsf_left[16]; +static screencol epsf_right[16]; +static screenrow epsf_top[16]; +static screenrow epsf_bottom[16]; + +static short epsf_window = 0; +static unsigned int epsf_page = 1; + +void +mf_epsf_header () +{ + fprintf (psout, "%%!PS-Adobe-3.0 EPSF-3.0\n"); + fprintf (psout, "%%%%BoundingBox: -1 -1 %d %d\n", screenwidth, screendepth); + fprintf (psout, "%%%%Creator: METAFONT\n"); + fprintf (psout, "%%%%Page: %d %d\n\n", epsf_page, epsf_page); + fprintf (psout, "1 dup scale\n"); + fprintf (psout, "1 setlinewidth\n\n"); + + epsf_page++; +} + +boolean +mf_epsf_initscreen P1H(void) +{ + if (getenv ("MFEPSF") != (char *) NULL) + { + psout = fopen ((char *) getenv ("MFEPSF"), "w"); + } + else + { + psout = fopen ("metafont.eps", "w"); + } + + if (psout == (FILE *) NULL) + { + return 0; + } + else + { + mf_epsf_header (); + epsf_window = 0; + return 1; + } +} + +void +mf_epsf_updatescreen P1H(void) +{ + fflush (psout); +} + +void +mf_epsf_blankrectangle P4C(screencol, left, + screencol, right, + screenrow, top, + screenrow, bottom) +{ + int i; + + for (i = 0; i < epsf_window; i++) + { + if (! ((right - 1 < epsf_left[i]) || (epsf_right[i] < left)) ) /* new window is neither left nor right of window i */ + if ( ! ((top > epsf_bottom[i]) || (epsf_top[i] > bottom - 1))) /* new window is neither below nor above window i */ + { + fprintf (psout, "\nshowpage\n%%%%EOF\n"); + mf_epsf_header (); + epsf_window = 0; + break; + } + } + + epsf_left[epsf_window] = left; + epsf_right[epsf_window] = right - 1; + epsf_top[epsf_window] = top; + epsf_bottom[epsf_window] = bottom - 1; + + epsf_window++; + + fprintf (psout, "1 setgray %d %d %d %d rectfill 0 setgray\n", left, screendepth - 1 - bottom, right - left, bottom - top); + + fflush (psout); +} + + +void +mf_epsf_paintrow P4C(screenrow, row, + pixelcolor, init_color, + transspec, transition_vector, + screencol, vector_size) +{ + int col; + int color; + + color = (init_color == 0) ? 1 : 0; + + do + { + col = *transition_vector++; + + if (!color) + { + fprintf (psout, "newpath %d %d moveto %d %d lineto stroke\n", + col, + screendepth - 1 - row, + *transition_vector, + screendepth - 1 - row); + } + + color = (color == 0) ? 1 : 0; + } + while (--vector_size > 0); +} + + +#else /* !EPSFWIN */ + +int epsf_dummy; + +#endif /* !EPSFWIN */ |