aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-06-30 11:45:21 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-06-30 11:45:21 +0000
commit66db27cbc1171f6264ee87392d5a74841a0eae40 (patch)
tree7189d66778cdb5a65293a0cc698ad97e8e2baf30
parent302ff93bdc843162c49bacd6b5b4d5eda4b1363b (diff)
downloadmandoc-66db27cbc1171f6264ee87392d5a74841a0eae40.tar.gz
mandoc-66db27cbc1171f6264ee87392d5a74841a0eae40.tar.zst
mandoc-66db27cbc1171f6264ee87392d5a74841a0eae40.zip
Push paper calculation out of getsubopt() loop. Make all points be AFM
glyph units to make positioning more precise.
-rw-r--r--term.h22
-rw-r--r--term_ps.c43
2 files changed, 33 insertions, 32 deletions
diff --git a/term.h b/term.h
index d12e754f..df175e15 100644
--- a/term.h
+++ b/term.h
@@ -1,4 +1,4 @@
-/* $Id: term.h,v 1.68 2010/06/29 14:18:05 kristaps Exp $ */
+/* $Id: term.h,v 1.69 2010/06/30 11:45:21 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -45,22 +45,22 @@ struct termp_ps {
int psstate; /* state of ps output */
#define PS_INLINE (1 << 0) /* we're in a word */
#define PS_MARGINS (1 << 1) /* we're in the margins */
- size_t pscol; /* visible column (points) */
- size_t psrow; /* visible row (points) */
+ size_t pscol; /* visible column (AFM units) */
+ size_t psrow; /* visible row (AFM units) */
char *psmarg; /* margin buf */
size_t psmargsz; /* margin buf size */
size_t psmargcur; /* cur index in margin buf */
char last; /* character buffer */
enum termfont lastf; /* last set font */
size_t pages; /* number of pages shown */
- size_t lineheight; /* each line's height (points) */
- size_t top; /* body top (points) */
- size_t bottom; /* body bottom (points) */
- size_t height; /* total height (points) */
- size_t width; /* total width (points) */
- size_t left; /* body left (points) */
- size_t header; /* header position (points) */
- size_t footer; /* footer position (points) */
+ size_t lineheight; /* line height (AFM units) */
+ size_t top; /* body top (AFM units) */
+ size_t bottom; /* body bottom (AFM units) */
+ size_t height; /* page height (AFM units */
+ size_t width; /* page width (AFM units) */
+ size_t left; /* body left (AFM units) */
+ size_t header; /* header pos (AFM units) */
+ size_t footer; /* footer pos (AFM units) */
};
struct termp {
diff --git a/term_ps.c b/term_ps.c
index 1f0bc407..9f4dcb90 100644
--- a/term_ps.c
+++ b/term_ps.c
@@ -1,4 +1,4 @@
-/* $Id: term_ps.c,v 1.17 2010/06/29 14:53:14 kristaps Exp $ */
+/* $Id: term_ps.c,v 1.18 2010/06/30 11:45:21 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -377,18 +377,14 @@ void *
ps_alloc(char *outopts)
{
struct termp *p;
- size_t pagex, pagey, margin;
+ size_t pagex, pagey, margin, lineheight;
const char *toks[2];
+ const char *paper;
char *v;
if (NULL == (p = term_alloc(TERMENC_ASCII)))
return(NULL);
- /* Default is USA letter. */
- pagex = 612;
- pagey = 792;
- margin = 72;
-
p->type = TERMTYPE_PS;
p->letter = ps_letter;
p->begin = ps_begin;
@@ -403,18 +399,23 @@ ps_alloc(char *outopts)
while (outopts && *outopts)
switch (getsubopt(&outopts, UNCONST(toks), &v)) {
case (0):
- if (0 == strcasecmp(v, "a4")) {
- pagex = 595;
- pagey = 842;
- } else if (0 == strcasecmp(v, "letter")) {
- pagex = 612;
- pagey = 792;
- }
+ paper = v;
break;
default:
break;
}
+ if (0 == strcasecmp(paper, "a4")) {
+ pagex = 595 * 100;
+ pagey = 842 * 100;
+ } else {
+ pagex = 612 * 100;
+ pagey = 792 * 100;
+ }
+
+ margin = 72 * 100;
+ lineheight = 12 * 100;
+
assert(margin * 2 < pagex);
assert(margin * 2 < pagey);
@@ -425,7 +426,7 @@ ps_alloc(char *outopts)
p->engine.ps.footer = (margin / 2);
p->engine.ps.bottom = margin;
p->engine.ps.left = margin;
- p->engine.ps.lineheight = 12;
+ p->engine.ps.lineheight = lineheight;
p->defrmargin = pagex - (margin * 2);
return(p);
@@ -609,8 +610,8 @@ ps_pletter(struct termp *p, int c)
if ( ! (PS_INLINE & p->engine.ps.psstate)) {
ps_printf(p, "%zu %zu moveto\n(",
- p->engine.ps.pscol,
- p->engine.ps.psrow);
+ (size_t)(p->engine.ps.pscol / 100),
+ (size_t)(p->engine.ps.psrow / 100));
p->engine.ps.psstate |= PS_INLINE;
}
@@ -639,13 +640,13 @@ ps_pletter(struct termp *p, int c)
if (c <= 32 || (c - 32 > MAXCHAR)) {
ps_putchar(p, ' ');
- p->engine.ps.pscol += (fonts[f].gly[0].wx / 100);
+ p->engine.ps.pscol += fonts[f].gly[0].wx;
return;
}
ps_putchar(p, c);
c -= 32;
- p->engine.ps.pscol += (fonts[f].gly[c].wx / 100);
+ p->engine.ps.pscol += fonts[f].gly[c].wx;
}
@@ -815,8 +816,8 @@ ps_width(const struct termp *p, char c)
{
if (c <= 32 || c - 32 >= MAXCHAR)
- return(fonts[(int)TERMFONT_NONE].gly[0].wx / 100);
+ return(fonts[(int)TERMFONT_NONE].gly[0].wx);
c -= 32;
- return(fonts[(int)TERMFONT_NONE].gly[(int)c].wx / 100);
+ return(fonts[(int)TERMFONT_NONE].gly[(int)c].wx);
}