shithub: neatpost

ref: 80d35921d39896b247ddcdf15ead5a0b2a028aba
dir: /ps.c/

View raw version
#include "post.h"

void ps_pagebeg(int n)
{
	out("%%%%Page: %d %d\n", n, n);
	out("/saveobj save def\n");
	out("mark\n");
	out("%d pagesetup\n", n);
}

void ps_pageend(int n)
{
	out("cleartomark\n");
	out("showpage\n");
	out("saveobj restore\n");
}

void ps_trailer(int pages, char *fonts)
{
	out("%%%%Trailer\n");
	out("done\n");
	out("%%%%DocumentFonts: %s\n", fonts);
	out("%%%%Pages: %d\n", pages);
	out("%%%%EOF\n");
}

static char *prolog =
	"/setup {\n"
	"	counttomark 2 idiv {def} repeat pop\n"
	"	/scaling 72 resolution div def\n"
	"	linewidth setlinewidth\n"
	"	1 setlinecap\n"
	"	0 pagesize 1 get translate\n"
	"	scaling scaling scale\n"
	"	0 0 moveto\n"
	"} def\n"
	"\n"
	"/pagesetup {\n"
	"	/page exch def\n"
	"	currentdict /pagedict known currentdict page known and {\n"
	"		page load pagedict exch get cvx exec\n"
	"	} if\n"
	"} def\n"
	"\n"
	"/w {neg moveto show} bind def\n"
	"/m {neg moveto} bind def\n"
	"/g {neg moveto {glyphshow} forall} bind def\n"
	"/rgb {255 div 3 1 roll 255 div 3 1 roll 255 div 3 1 roll setrgbcolor} bind def\n"
	"/rot {/y exch def /x exch def x y neg translate rotate x neg y translate} bind def\n"
	"/done {/lastpage where {pop lastpage} if} def\n"
	"\n"
	"% caching fonts, as selectfont is supposed to be doing\n"
	"/fncache 16 dict def\n"
	"/selectfont_append { fncache exch dup findfont put } bind def\n"
	"/selectfont_cached {\n"
	"	exch dup fncache exch known not { dup selectfont_append } if\n"
	"	fncache exch get exch scalefont setfont\n"
	"} bind def\n"
	"/f {\n"
	"	exch dup 3 1 roll scaling div selectfont_cached\n"
	"	linewidth mul scaling 10 mul div setlinewidth\n"
	"} bind def\n"
	"\n"
	"/savedmatrix matrix def\n"
	"/drawl {\n"
	"	neg lineto\n"
	"} bind def\n"
	"/drawe {\n"
	"	savedmatrix currentmatrix pop scale\n"
	"	.5 0 rmoveto currentpoint .5 0 rmoveto .5 0 360 arc\n"
	"	savedmatrix setmatrix\n"
	"} bind def\n"
	"/drawa {\n"
	"	/dy2 exch def\n"
	"	/dx2 exch def\n"
	"	/dy1 exch def\n"
	"	/dx1 exch def\n"
	"	currentpoint dy1 neg add exch dx1 add exch\n"
	"	dx1 dx1 mul dy1 dy1 mul add sqrt\n"
	"	dy1 dx1 neg atan\n"
	"	dy2 neg dx2 atan\n"
	"	arc\n"
	"} bind def\n"
	"/draws {\n"
	"	/y2 exch def\n"
	"	/x2 exch def\n"
	"	/y1 exch def\n"
	"	/x1 exch def\n"
	"	/y0 exch def\n"
	"	/x0 exch def\n"
	"	x0 5 x1 mul add 6 div\n"
	"	y0 5 y1 mul add -6 div\n"
	"	x2 5 x1 mul add 6 div\n"
	"	y2 5 y1 mul add -6 div\n"
	"	x1 x2 add 2 div\n"
	"	y1 y2 add -2 div\n"
	"	curveto\n"
	"} bind def\n"
	"% including EPS files\n"
	"/EPSFBEG {\n"
	"	/epsf_state save def\n"
	"	neg translate\n"
	"	div 3 1 roll div exch scale\n"
	"	neg exch neg exch translate\n"
	"	/dict_count countdictstack def\n"
	"	/op_count count 1 sub def\n"
	"	userdict begin\n"
	"	/showpage { } def\n"
	"	0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin\n"
	"	10 setmiterlimit [ ] 0 setdash newpath\n"
	"} bind def\n"
	"/EPSFEND {\n"
	"	count op_count sub {pop} repeat\n"
	"	countdictstack dict_count sub {end} repeat\n"
	"	epsf_state restore\n"
	"} bind def\n";

/* pagewidth and pageheight are in tenths of a millimetre */
void ps_header(int pagewidth, int pageheight, int linewidth)
{
	out("%%!PS-Adobe-2.0\n");
	out("%%%%Version: 1.0\n");
	out("%%%%Creator: neatroff - http://litcave.rudi.ir/\n");
	out("%%%%DocumentFonts: (atend)\n");
	out("%%%%Pages: (atend)\n");
	out("%%%%EndComments\n");

	out("%%%%BeginProlog\n");
	out("/resolution %d def\n", dev_res);
	out("/pagesize [%d %d] def\n", (pagewidth * 72 + 127) / 254,
					(pageheight * 72 + 127) / 254);
	out("/linewidth %d.%02d def\n\n", linewidth / 100, linewidth % 100);
	out("%s", prolog);
	out("%%%%EndProlog\n");
	out("%%%%BeginSetup\n");
	out("<< /PageSize pagesize /ImagingBBox null >> setpagedevice\n");
	out("mark\n");
	out("setup\n");
	out("%%%%EndSetup\n");
}