Return to term_ps.c CVS log | Up to [cvsweb.bsd.lv] / mandoc |
version 1.25, 2010/07/01 14:23:45 | version 1.28, 2010/07/04 19:24:00 | ||
---|---|---|---|
|
|
||
#include <stdlib.h> | #include <stdlib.h> | ||
#include <string.h> | #include <string.h> | ||
#include <time.h> | #include <time.h> | ||
#include <unistd.h> | |||
#include "out.h" | #include "out.h" | ||
#include "main.h" | #include "main.h" | ||
#include "term.h" | #include "term.h" | ||
#define MINMARGIN_MM 20 /* Minimum 2cm margins. */ | |||
#define MINMARGIN_PNT 56.68 | |||
#define DEFPAGEX_MM 216 /* Default page size is US-letter. */ | |||
#define DEFPAGEY_MM 279 | |||
/* Convert PostScript point "x" to an AFM unit. */ | /* Convert PostScript point "x" to an AFM unit. */ | ||
#define PNT2AFM(p, x) /* LINTED */ \ | #define PNT2AFM(p, x) /* LINTED */ \ | ||
(size_t)((double)(x) * (1000.0 / (double)(p)->engine.ps.scale)) | (size_t)((double)(x) * (1000.0 / (double)(p)->engine.ps.scale)) | ||
|
|
||
ps_alloc(char *outopts) | ps_alloc(char *outopts) | ||
{ | { | ||
struct termp *p; | struct termp *p; | ||
size_t pagex, pagey, margin, lineheight; | size_t pagex, pagey, marginx, marginy, lineheight; | ||
const char *toks[2]; | const char *toks[2]; | ||
const char *pp; | const char *pp; | ||
char *v; | char *v; | ||
|
|
||
p->type = TERMTYPE_PS; | p->type = TERMTYPE_PS; | ||
p->width = ps_width; | p->width = ps_width; | ||
p->engine.ps.scale = 11; | |||
toks[0] = "paper"; | toks[0] = "paper"; | ||
toks[1] = NULL; | toks[1] = NULL; | ||
|
|
||
break; | break; | ||
} | } | ||
margin = PNT2AFM(p, 72); | |||
lineheight = PNT2AFM(p, 12); | |||
/* Default to US letter (millimetres). */ | /* Default to US letter (millimetres). */ | ||
pagex = 216; | pagex = DEFPAGEX_MM; | ||
pagey = 279; | pagey = DEFPAGEY_MM; | ||
/* | /* | ||
* The ISO-269 paper sizes can be calculated automatically, but | * The ISO-269 paper sizes can be calculated automatically, but | ||
|
|
||
pagey = 356; | pagey = 356; | ||
} else if (2 != sscanf(pp, "%zux%zu", &pagex, &pagey)) | } else if (2 != sscanf(pp, "%zux%zu", &pagex, &pagey)) | ||
fprintf(stderr, "%s: Unknown paper\n", pp); | fprintf(stderr, "%s: Unknown paper\n", pp); | ||
} else if (NULL == pp) | |||
pp = "letter"; | |||
/* Enforce minimum page size >= (2 times) min-margin. */ | |||
if ((2 * MINMARGIN_MM) >= pagex) { | |||
fprintf(stderr, "%s: Insufficient page width\n", pp); | |||
pagex = DEFPAGEX_MM; | |||
} else if ((2 * MINMARGIN_MM >= pagey)) { | |||
fprintf(stderr, "%s: Insufficient page length\n", pp); | |||
pagey = DEFPAGEY_MM; | |||
} | } | ||
/* | |||
* This MUST be defined before any PNT2AFM or AFM2PNT | |||
* calculations occur. | |||
*/ | |||
p->engine.ps.scale = 11; | |||
/* Remember millimetres -> AFM units. */ | /* Remember millimetres -> AFM units. */ | ||
pagex = PNT2AFM(p, ((double)pagex * 2.834)); | pagex = PNT2AFM(p, ((double)pagex * 2.834)); | ||
pagey = PNT2AFM(p, ((double)pagey * 2.834)); | pagey = PNT2AFM(p, ((double)pagey * 2.834)); | ||
assert(margin * 2 < pagex); | /* Margins are 1/9 the page x and y. */ | ||
assert(margin * 2 < pagey); | |||
marginx = (size_t)((double)pagex / 9.0); | |||
marginy = (size_t)((double)pagey / 9.0); | |||
lineheight = PNT2AFM(p, 16); | |||
p->engine.ps.width = pagex; | p->engine.ps.width = pagex; | ||
p->engine.ps.height = pagey; | p->engine.ps.height = pagey; | ||
p->engine.ps.header = pagey - (margin / 2); | p->engine.ps.header = pagey - (marginy / 2) - (lineheight / 2); | ||
p->engine.ps.top = pagey - margin; | p->engine.ps.top = pagey - marginy; | ||
p->engine.ps.footer = (margin / 2); | p->engine.ps.footer = (marginy / 2) - (lineheight / 2); | ||
p->engine.ps.bottom = margin; | p->engine.ps.bottom = marginy; | ||
p->engine.ps.left = margin; | p->engine.ps.left = marginx; | ||
p->engine.ps.lineheight = lineheight; | p->engine.ps.lineheight = lineheight; | ||
p->defrmargin = pagex - (margin * 2); | p->defrmargin = pagex - (marginx * 2); | ||
return(p); | return(p); | ||
} | } | ||