blob: 2b203e476642687e35708769842ed7b90f4cccec [file] [log] [blame]
/* This file is part of hp2ps, a graph drawer for memory profiles.
Copyright (C) 2002 The University Court of the University of Glasgow.
This program is governed by the license contained in the file LICENSE. */
#include <stdio.h>
#include <string.h>
#include "Main.h"
#include "Defines.h"
#include "Dimensions.h"
#include "Curves.h"
#include "HpFile.h"
#include "Axes.h"
#include "Key.h"
#include "Marks.h"
#include "Utilities.h"
/* own stuff */
#include "PsFile.h"
static void Prologue PROTO((void)); /* forward */
static void Variables PROTO((void)); /* forward */
static void BorderOutlineBox PROTO((void)); /* forward */
static void BigTitleOutlineBox PROTO((void)); /* forward */
static void TitleOutlineBox PROTO((void)); /* forward */
static void BigTitleText PROTO((void)); /* forward */
static void TitleText PROTO((void)); /* forward */
void
PutPsFile()
{
Prologue();
Variables();
BorderOutlineBox();
if (bflag) {
BigTitleOutlineBox();
BigTitleText();
} else {
TitleOutlineBox();
TitleText();
}
CurvesInit();
Axes();
if (TWENTY) Key();
Curves();
if (!yflag) Marks();
fprintf(psfp, "showpage\n");
}
static void StandardSpecialComments PROTO((void)); /* forward */
static void EPSFSpecialComments PROTO((floatish)); /* forward */
static void Landscape PROTO((void)); /* forward */
static void Portrait PROTO((void)); /* forward */
static void Scaling PROTO((floatish)); /* forward */
static void
Prologue()
{
if (eflag) {
floatish epsfscale = epsfwidth / (floatish) borderwidth;
EPSFSpecialComments(epsfscale);
Scaling(epsfscale);
} else {
StandardSpecialComments();
if (gflag) Portrait(); else Landscape();
}
}
extern char *jobstring;
extern char *datestring;
static void
StandardSpecialComments()
{
fprintf(psfp, "%%!PS-Adobe-2.0\n");
fprintf(psfp, "%%%%Title: %s\n", jobstring);
fprintf(psfp, "%%%%Creator: %s (version %s)\n", programname, VERSION);
fprintf(psfp, "%%%%CreationDate: %s\n", datestring);
fprintf(psfp, "%%%%EndComments\n");
}
static void
EPSFSpecialComments(epsfscale)
floatish epsfscale;
{
fprintf(psfp, "%%!PS-Adobe-2.0\n");
fprintf(psfp, "%%%%Title: %s\n", jobstring);
fprintf(psfp, "%%%%Creator: %s (version %s)\n", programname, VERSION);
fprintf(psfp, "%%%%CreationDate: %s\n", datestring);
fprintf(psfp, "%%%%BoundingBox: 0 0 %d %d\n",
(int) (borderwidth * epsfscale + 0.5),
(int) (borderheight * epsfscale + 0.5) );
fprintf(psfp, "%%%%EndComments\n");
}
static void
Landscape()
{
fprintf(psfp, "-90 rotate\n");
fprintf(psfp, "%f %f translate\n", -(borderwidth + (floatish) START_Y),
(floatish) START_X);
}
static void
Portrait()
{
fprintf(psfp, "%f %f translate\n", (floatish) START_X, (floatish) START_Y);
}
static void
Scaling(epsfscale)
floatish epsfscale;
{
fprintf(psfp, "%f %f scale\n", epsfscale, epsfscale);
}
static void
Variables()
{
fprintf(psfp, "/HE%d /Helvetica findfont %d scalefont def\n",
NORMAL_FONT, NORMAL_FONT);
fprintf(psfp, "/HE%d /Helvetica findfont %d scalefont def\n",
LARGE_FONT, LARGE_FONT);
}
static void
BorderOutlineBox()
{
fprintf(psfp, "newpath\n");
fprintf(psfp, "0 0 moveto\n");
fprintf(psfp, "0 %f rlineto\n", borderheight);
fprintf(psfp, "%f 0 rlineto\n", borderwidth);
fprintf(psfp, "0 %f rlineto\n", -borderheight);
fprintf(psfp, "closepath\n");
fprintf(psfp, "%f setlinewidth\n", borderthick);
fprintf(psfp, "stroke\n");
}
static void
BigTitleOutlineBox()
{
fprintf(psfp, "newpath\n");
fprintf(psfp, "%f %f moveto\n", borderspace,
borderheight - titleheight - borderspace);
fprintf(psfp, "0 %f rlineto\n", titleheight);
fprintf(psfp, "%f 0 rlineto\n", titlewidth);
fprintf(psfp, "0 %f rlineto\n", -titleheight);
fprintf(psfp, "closepath\n");
fprintf(psfp, "%f setlinewidth\n", borderthick);
fprintf(psfp, "stroke\n");
fprintf(psfp, "%f %f moveto\n", borderspace,
borderheight - titleheight / 2 - borderspace);
fprintf(psfp, "%f 0 rlineto\n", titlewidth);
fprintf(psfp, "stroke\n");
}
static void
TitleOutlineBox()
{
fprintf(psfp, "newpath\n");
fprintf(psfp, "%f %f moveto\n", borderspace,
borderheight - titleheight - borderspace);
fprintf(psfp, "0 %f rlineto\n", titleheight);
fprintf(psfp, "%f 0 rlineto\n", titlewidth);
fprintf(psfp, "0 %f rlineto\n", -titleheight);
fprintf(psfp, "closepath\n");
fprintf(psfp, "%f setlinewidth\n", borderthick);
fprintf(psfp, "stroke\n");
}
static void EscapePrint PROTO((char *, int)); /* forward */
static void
BigTitleText()
{
floatish x, y;
x = borderspace + titletextspace;
y = borderheight - titleheight / 2 - borderspace + titletextspace;
/* job identifier goes on top at the far left */
fprintf(psfp, "HE%d setfont\n", TITLE_TEXT_FONT);
fprintf(psfp, "%f %f moveto\n", x, y);
fputc('(', psfp);
EscapePrint(jobstring, BIG_JOB_STRING_WIDTH);
fprintf(psfp, ") show\n");
y = borderheight - titleheight - borderspace + titletextspace;
/* area below curve gows at the botton, far left */
fprintf(psfp, "HE%d setfont\n", TITLE_TEXT_FONT);
fprintf(psfp, "%f %f moveto\n", x, y);
fputc('(', psfp);
CommaPrint(psfp, (intish)areabelow);
fprintf(psfp, " %s x %s)\n", valueunitstring, sampleunitstring);
fprintf(psfp, "show\n");
/* date goes at far right */
fprintf(psfp, "HE%d setfont\n", TITLE_TEXT_FONT);
fprintf(psfp, "(%s)\n", datestring);
fprintf(psfp, "dup stringwidth pop\n");
fprintf(psfp, "%f\n", (titlewidth + borderspace) - titletextspace);
fprintf(psfp, "exch sub\n");
fprintf(psfp, "%f moveto\n", y);
fprintf(psfp, "show\n");
}
static void
TitleText()
{
floatish x, y;
x = borderspace + titletextspace;
y = borderheight - titleheight - borderspace + titletextspace;
/* job identifier goes at far left */
fprintf(psfp, "HE%d setfont\n", TITLE_TEXT_FONT);
fprintf(psfp, "%f %f moveto\n", x, y);
fputc('(', psfp);
EscapePrint(jobstring, SMALL_JOB_STRING_WIDTH);
fprintf(psfp, ") show\n");
/* area below curve is centered */
fprintf(psfp, "HE%d setfont\n", TITLE_TEXT_FONT);
fputc('(', psfp);
CommaPrint(psfp, (intish) areabelow);
fprintf(psfp, " %s x %s)\n", valueunitstring, sampleunitstring);
fprintf(psfp, "dup stringwidth pop\n");
fprintf(psfp, "2 div\n");
fprintf(psfp, "%f\n", titlewidth / 2);
fprintf(psfp, "exch sub\n");
fprintf(psfp, "%f moveto\n", y);
fprintf(psfp, "show\n");
/* date goes at far right */
fprintf(psfp, "HE%d setfont\n", TITLE_TEXT_FONT);
fprintf(psfp, "(%s)\n", datestring);
fprintf(psfp, "dup stringwidth pop\n");
fprintf(psfp, "%f\n", (titlewidth + borderspace) - titletextspace);
fprintf(psfp, "exch sub\n");
fprintf(psfp, "%f moveto\n", y);
fprintf(psfp, "show\n");
}
/*
* Print a string s in width w, escaping characters where necessary.
*/
static void
EscapePrint(s,w)
char* s; int w;
{
for ( ; *s && w > 0; s++, w--) {
if (*s == '(') { /* escape required */
fputc('\\', psfp);
} else if (*s == ')') {
fputc('\\', psfp);
}
fputc(*s, psfp);
}
}