#include "hp2graph.h"
#include "format.h"
#include "output.h"
/*
* Print a string s in width w, escaping characters where necessary.
*/
static void EscapePrint(char* s)
{
for ( ; *s; s++) {
if (*s == '(') { /* escape required */
fputc('\\', outFile);
} else if (*s == ')') {
fputc('\\', outFile);
}
fputc(*s, outFile);
}
}
static void PsScale(double scale)
{
fprintf(outFile, "%f %f scale\n", scale, scale);
}
static void PsLandscape(void)
{
fprintf(outFile, "-90 rotate\n");
fprintf(outFile, "%f %f translate\n", (float)-(borderwidth + START_Y),
(float)START_X);
}
static void PsPortrait(void)
{
fprintf(outFile, "%f %f translate\n", (float) START_X, (float) START_Y);
}
static void StandardSpecialComments(void)
{
fprintf(outFile, "%%!PS-Adobe-2.0\n");
fprintf(outFile, "%%%%Title: %s\n", jobstring);
fprintf(outFile, "%%%%Creator: %s (version %s)\n", programName, VERSION);
fprintf(outFile, "%%%%CreationDate: %s\n", datedata);
fprintf(outFile, "%%%%EndComments\n");
}
static void EPSFSpecialComments(double scale)
{
fprintf(outFile, "%%!PS-Adobe-2.0\n");
fprintf(outFile, "%%%%Title: %s\n", jobstring);
fprintf(outFile, "%%%%Creator: %s (version %s)\n", programName, VERSION);
fprintf(outFile, "%%%%CreationDate: %s\n", datedata);
fprintf(outFile, "%%%%BoundingBox: 0 0 %d %d\n",
(int) (borderwidth * scale + 0.5),
(int) (borderheight * scale + 0.5) );
fprintf(outFile, "%%%%EndComments\n");
}
static void PsPrelude(double scale,int embedded)
{
if (embedded) {
EPSFSpecialComments(scale);
} else {
StandardSpecialComments();
}
}
static void PsFonts(void)
{
fprintf(outFile, "/HE%d /Helvetica findfont %d scalefont def\n",
TITLE_FONT, FontSize(TITLE_FONT));
fprintf(outFile, "/HE%d /Helvetica findfont %d scalefont def\n",
SCALE_FONT, FontSize(SCALE_FONT));
fprintf(outFile, "/HE%d /Helvetica findfont %d scalefont def\n",
KEY_FONT, FontSize(KEY_FONT));
fprintf(outFile, "/HE%d /Helvetica findfont %d scalefont def\n",
SMALLKEY_FONT, FontSize(SMALLKEY_FONT));
}
static void PsText(Justify just,double x,double y,int font,char *str)
{
fprintf(outFile, "HE%d setfont\n", font);
switch(just) {
case JustifyLeft:
fprintf(outFile, "%f %f moveto\n", x, y);
fputc('(', outFile);
EscapePrint(str);
fprintf(outFile, ")\n");
fprintf(outFile, "show\n");
break;
case JustifyCenter:
fputc('(', outFile);
EscapePrint(str);
fprintf(outFile, ")\n");
fprintf(outFile, "dup stringwidth pop\n");
fprintf(outFile, "2 div\n");
fprintf(outFile, "%f\n", x);
fprintf(outFile, "exch sub\n");
fprintf(outFile, "%f moveto\n", y);
fprintf(outFile, "show\n");
break;
case JustifyRight:
fputc('(', outFile);
EscapePrint(str);
fprintf(outFile, ")\n");
fprintf(outFile, "dup stringwidth pop\n");
fprintf(outFile, "%f\n", x);
fprintf(outFile, "exch sub\n");
fprintf(outFile, "%f moveto\n", y);
fprintf(outFile, "show\n");
break;
case JustifyVertical:
fprintf(outFile, "gsave\n");
fputc('(', outFile);
EscapePrint(str);
fprintf(outFile, ")\n");
fprintf(outFile, "dup stringwidth pop\n");
fprintf(outFile, "%f\n", y);
fprintf(outFile, "exch sub\n");
fprintf(outFile, "%f exch\n", x);
fprintf(outFile, "translate\n");
fprintf(outFile, "90 rotate\n");
fprintf(outFile, "0 0 moveto\n");
fprintf(outFile, "show\n");
fprintf(outFile, "grestore\n");
}
}
static void PsPrologue(void)
{
fprintf(outFile, "showpage\n");
}
static int PathColour;
static double PathWidth;
static int PsKind;
static void PsPathNew(Kind kind,int size)
{
size = size; /* Ignore size */
PathColour = -1;
PathWidth = -1;
PsKind = kind;
fprintf(outFile, "newpath\n");
}
static void PsPathMoveTo(double x, double y)
{
fprintf(outFile, "%f %f moveto\n", x, y);
}
static void PsPathLineTo(double x, double y)
{
fprintf(outFile, "%f %f lineto\n", x, y);
}
static void PsPathLine(double x, double y)
{
fprintf(outFile, "%f %f rlineto\n", x, y);
}
static void PsPathFill(int fill)
{
PathColour = fill;
}
static void PsPathWidth(double width)
{
PathWidth = width;
}
static double colours[] =
{ 0.3, 0.6, 0.9, 0.2, 0.5, 0.8, 0.1, 0.4, 0.7, 0.0
, 0.3, 0.6, 0.9, 0.2, 0.5, 0.8, 0.1, 0.4, 0.7, 0.0
, 0.3, 0.6
};
static void PsPathStroke(void)
{
if(PsKind == Closed)
fprintf(outFile, "closepath\n");
if(PathWidth >= 0)
fprintf(outFile, "%f setlinewidth\n",PathWidth);
if(PathColour>=0) {
fprintf(outFile, "gsave\n");
fprintf(outFile, "%f setgray\n", colours[PathColour%22]);
fprintf(outFile, "fill\n");
fprintf(outFile, "grestore\n");
}
fprintf(outFile, "stroke\n");
}
Format PsOutput =
{".ps"
,PsPrelude
,PsPrologue
,PsScale
,PsLandscape
,PsPortrait
,PsFonts
,PsText
,PsPathNew
,PsPathMoveTo
,PsPathLineTo
,PsPathLine
,PsPathFill
,PsPathWidth
,PsPathStroke
};
|