version 1.83, 2017/02/17 14:31:52 |
version 1.89, 2017/10/29 19:25:31 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2014, 2015, 2016 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2014, 2015, 2016, 2017 Ingo Schwarze <schwarze@openbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
Line 77 struct termp_ps { |
|
Line 77 struct termp_ps { |
|
size_t lineheight; /* line height (AFM units) */ |
size_t lineheight; /* line height (AFM units) */ |
size_t top; /* body top (AFM units) */ |
size_t top; /* body top (AFM units) */ |
size_t bottom; /* body bottom (AFM units) */ |
size_t bottom; /* body bottom (AFM units) */ |
|
const char *medianame; /* for DocumentMedia and PageSize */ |
size_t height; /* page height (AFM units */ |
size_t height; /* page height (AFM units */ |
size_t width; /* page width (AFM units) */ |
size_t width; /* page width (AFM units) */ |
size_t lastwidth; /* page width before last ll */ |
size_t lastwidth; /* page width before last ll */ |
Line 538 pspdf_alloc(const struct manoutput *outopts) |
|
Line 539 pspdf_alloc(const struct manoutput *outopts) |
|
size_t marginx, marginy, lineheight; |
size_t marginx, marginy, lineheight; |
const char *pp; |
const char *pp; |
|
|
p = mandoc_calloc(1, sizeof(struct termp)); |
p = mandoc_calloc(1, sizeof(*p)); |
|
p->tcol = p->tcols = mandoc_calloc(1, sizeof(*p->tcol)); |
|
p->maxtcol = 1; |
|
|
p->enc = TERMENC_ASCII; |
p->enc = TERMENC_ASCII; |
p->fontq = mandoc_reallocarray(NULL, |
p->fontq = mandoc_reallocarray(NULL, |
(p->fontsz = 8), sizeof(enum termfont)); |
(p->fontsz = 8), sizeof(*p->fontq)); |
p->fontq[0] = p->fontl = TERMFONT_NONE; |
p->fontq[0] = p->fontl = TERMFONT_NONE; |
p->ps = mandoc_calloc(1, sizeof(struct termp_ps)); |
p->ps = mandoc_calloc(1, sizeof(*p->ps)); |
|
|
p->advance = ps_advance; |
p->advance = ps_advance; |
p->begin = ps_begin; |
p->begin = ps_begin; |
Line 556 pspdf_alloc(const struct manoutput *outopts) |
|
Line 560 pspdf_alloc(const struct manoutput *outopts) |
|
|
|
/* Default to US letter (millimetres). */ |
/* Default to US letter (millimetres). */ |
|
|
|
p->ps->medianame = "Letter"; |
pagex = 216; |
pagex = 216; |
pagey = 279; |
pagey = 279; |
|
|
Line 567 pspdf_alloc(const struct manoutput *outopts) |
|
Line 572 pspdf_alloc(const struct manoutput *outopts) |
|
*/ |
*/ |
|
|
pp = outopts->paper; |
pp = outopts->paper; |
if (pp && strcasecmp(pp, "letter")) { |
if (pp != NULL && strcasecmp(pp, "letter") != 0) { |
if (0 == strcasecmp(pp, "a3")) { |
if (strcasecmp(pp, "a3") == 0) { |
|
p->ps->medianame = "A3"; |
pagex = 297; |
pagex = 297; |
pagey = 420; |
pagey = 420; |
} else if (0 == strcasecmp(pp, "a4")) { |
} else if (strcasecmp(pp, "a4") == 0) { |
|
p->ps->medianame = "A4"; |
pagex = 210; |
pagex = 210; |
pagey = 297; |
pagey = 297; |
} else if (0 == strcasecmp(pp, "a5")) { |
} else if (strcasecmp(pp, "a5") == 0) { |
|
p->ps->medianame = "A5"; |
pagex = 148; |
pagex = 148; |
pagey = 210; |
pagey = 210; |
} else if (0 == strcasecmp(pp, "legal")) { |
} else if (strcasecmp(pp, "legal") == 0) { |
|
p->ps->medianame = "Legal"; |
pagex = 216; |
pagex = 216; |
pagey = 356; |
pagey = 356; |
} else if (2 != sscanf(pp, "%ux%u", &pagex, &pagey)) |
} else if (sscanf(pp, "%ux%u", &pagex, &pagey) == 2) |
|
p->ps->medianame = "CustomSize"; |
|
else |
warnx("%s: Unknown paper", pp); |
warnx("%s: Unknown paper", pp); |
} |
} |
|
|
Line 593 pspdf_alloc(const struct manoutput *outopts) |
|
Line 604 pspdf_alloc(const struct manoutput *outopts) |
|
|
|
/* Remember millimetres -> AFM units. */ |
/* Remember millimetres -> AFM units. */ |
|
|
pagex = PNT2AFM(p, ((double)pagex * 2.834)); |
pagex = PNT2AFM(p, ((double)pagex * 72.0 / 25.4)); |
pagey = PNT2AFM(p, ((double)pagey * 2.834)); |
pagey = PNT2AFM(p, ((double)pagey * 72.0 / 25.4)); |
|
|
/* Margins are 1/9 the page x and y. */ |
/* Margins are 1/9 the page x and y. */ |
|
|
Line 739 ps_closepage(struct termp *p) |
|
Line 750 ps_closepage(struct termp *p) |
|
ps_printf(p, "%s", p->ps->psmarg); |
ps_printf(p, "%s", p->ps->psmarg); |
|
|
if (TERMTYPE_PS != p->type) { |
if (TERMTYPE_PS != p->type) { |
ps_printf(p, "ET\n"); |
|
|
|
len = p->ps->pdfbytes - p->ps->pdflastpg; |
len = p->ps->pdfbytes - p->ps->pdflastpg; |
base = p->ps->pages * 4 + p->ps->pdfbody; |
base = p->ps->pages * 4 + p->ps->pdfbody; |
|
|
Line 756 ps_closepage(struct termp *p) |
|
Line 765 ps_closepage(struct termp *p) |
|
ps_printf(p, "/Font <<\n"); |
ps_printf(p, "/Font <<\n"); |
for (i = 0; i < (int)TERMFONT__MAX; i++) |
for (i = 0; i < (int)TERMFONT__MAX; i++) |
ps_printf(p, "/F%d %d 0 R\n", i, 3 + i); |
ps_printf(p, "/F%d %d 0 R\n", i, 3 + i); |
ps_printf(p, ">>\n>>\n"); |
ps_printf(p, ">>\n>>\nendobj\n"); |
|
|
/* Page node. */ |
/* Page node. */ |
pdf_obj(p, base + 3); |
pdf_obj(p, base + 3); |
Line 821 ps_end(struct termp *p) |
|
Line 830 ps_end(struct termp *p) |
|
ps_printf(p, "<<\n"); |
ps_printf(p, "<<\n"); |
ps_printf(p, "/Type /Catalog\n"); |
ps_printf(p, "/Type /Catalog\n"); |
ps_printf(p, "/Pages 2 0 R\n"); |
ps_printf(p, "/Pages 2 0 R\n"); |
ps_printf(p, ">>\n"); |
ps_printf(p, ">>\nendobj\n"); |
xref = p->ps->pdfbytes; |
xref = p->ps->pdfbytes; |
ps_printf(p, "xref\n"); |
ps_printf(p, "xref\n"); |
ps_printf(p, "0 %zu\n", base + 1); |
ps_printf(p, "0 %zu\n", base + 1); |
Line 845 ps_end(struct termp *p) |
|
Line 854 ps_end(struct termp *p) |
|
static void |
static void |
ps_begin(struct termp *p) |
ps_begin(struct termp *p) |
{ |
{ |
|
size_t width, height; |
int i; |
int i; |
|
|
/* |
/* |
Line 886 ps_begin(struct termp *p) |
|
Line 896 ps_begin(struct termp *p) |
|
*/ |
*/ |
|
|
if (TERMTYPE_PS == p->type) { |
if (TERMTYPE_PS == p->type) { |
|
width = AFM2PNT(p, p->ps->width); |
|
height = AFM2PNT(p, p->ps->height); |
|
|
ps_printf(p, "%%!PS-Adobe-3.0\n"); |
ps_printf(p, "%%!PS-Adobe-3.0\n"); |
ps_printf(p, "%%%%DocumentData: Clean7Bit\n"); |
ps_printf(p, "%%%%DocumentData: Clean7Bit\n"); |
ps_printf(p, "%%%%Orientation: Portrait\n"); |
ps_printf(p, "%%%%Orientation: Portrait\n"); |
ps_printf(p, "%%%%Pages: (atend)\n"); |
ps_printf(p, "%%%%Pages: (atend)\n"); |
ps_printf(p, "%%%%PageOrder: Ascend\n"); |
ps_printf(p, "%%%%PageOrder: Ascend\n"); |
ps_printf(p, "%%%%DocumentMedia: " |
ps_printf(p, "%%%%DocumentMedia: man-%s %zu %zu 0 () ()\n", |
"Default %zu %zu 0 () ()\n", |
p->ps->medianame, width, height); |
(size_t)AFM2PNT(p, p->ps->width), |
|
(size_t)AFM2PNT(p, p->ps->height)); |
|
ps_printf(p, "%%%%DocumentNeededResources: font"); |
ps_printf(p, "%%%%DocumentNeededResources: font"); |
|
|
for (i = 0; i < (int)TERMFONT__MAX; i++) |
for (i = 0; i < (int)TERMFONT__MAX; i++) |
ps_printf(p, " %s", fonts[i].name); |
ps_printf(p, " %s", fonts[i].name); |
|
|
ps_printf(p, "\n%%%%EndComments\n"); |
ps_printf(p, "\n%%%%EndComments\n"); |
|
ps_printf(p, "%%%%BeginSetup\n"); |
|
ps_printf(p, "%%%%BeginFeature: *PageSize %s\n", |
|
p->ps->medianame); |
|
ps_printf(p, "<</PageSize [%zu %zu]>>setpagedevice\n", |
|
width, height); |
|
ps_printf(p, "%%%%EndFeature\n"); |
|
ps_printf(p, "%%%%EndSetup\n"); |
} else { |
} else { |
ps_printf(p, "%%PDF-1.1\n"); |
ps_printf(p, "%%PDF-1.1\n"); |
pdf_obj(p, 1); |
pdf_obj(p, 1); |
Line 915 ps_begin(struct termp *p) |
|
Line 933 ps_begin(struct termp *p) |
|
ps_printf(p, "/Subtype /Type1\n"); |
ps_printf(p, "/Subtype /Type1\n"); |
ps_printf(p, "/Name /F%d\n", i); |
ps_printf(p, "/Name /F%d\n", i); |
ps_printf(p, "/BaseFont /%s\n", fonts[i].name); |
ps_printf(p, "/BaseFont /%s\n", fonts[i].name); |
ps_printf(p, ">>\n"); |
ps_printf(p, ">>\nendobj\n"); |
} |
} |
} |
} |
|
|
Line 1219 ps_endline(struct termp *p) |
|
Line 1237 ps_endline(struct termp *p) |
|
} |
} |
|
|
ps_closepage(p); |
ps_closepage(p); |
|
|
|
p->tcol->offset -= p->ti; |
|
p->ti = 0; |
} |
} |
|
|
static void |
static void |