X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/17c71b41790ba139de121fb3e987532ce3979dff..faaa472f80570868bcc5469be639ea69875f3fac:/bk_ps.c diff --git a/bk_ps.c b/bk_ps.c index 8ae49c4..7c0fbb8 100644 --- a/bk_ps.c +++ b/bk_ps.c @@ -56,8 +56,13 @@ void ps_backend(paragraph *sourceform, keywordlist *keywords, fprintf(fp, "%%%%DocumentNeededResources:\n"); for (fe = doc->fonts->head; fe; fe = fe->next) /* XXX This may request the same font multiple times. */ - fprintf(fp, "%%%%+ font %s\n", fe->font->name); + if (!fe->font->info->fp) + fprintf(fp, "%%%%+ font %s\n", fe->font->info->name); fprintf(fp, "%%%%DocumentSuppliedResources: procset Halibut 0 0\n"); + for (fe = doc->fonts->head; fe; fe = fe->next) + /* XXX This may request the same font multiple times. */ + if (fe->font->info->fp) + fprintf(fp, "%%%%+ font %s\n", fe->font->info->name); fprintf(fp, "%%%%EndComments\n"); fprintf(fp, "%%%%BeginProlog\n"); @@ -80,7 +85,7 @@ void ps_backend(paragraph *sourceform, keywordlist *keywords, " /integertype /realtype load def\n" " /stringtype {show} bind def\n" "end def\n" - "/t { tdict begin {dup type exec} forall end } bind def\n"); + "/t { tdict begin {dup type exec} forall end pop } bind def\n"); fprintf(fp, "%%%%EndResource\n"); fprintf(fp, "%%%%EndProlog\n"); @@ -94,12 +99,38 @@ void ps_backend(paragraph *sourceform, keywordlist *keywords, if (p->type == para_VersionID) ps_comment(fp, "% ", p->words); - for (fe = doc->fonts->head; fe; fe = fe->next) + /* + * Request the correct page size. We might want to bracket this + * with "%%BeginFeature: *PageSize A4" or similar, and "%%EndFeature", + * but that would require us to have a way of getting the name of + * the page size given its dimensions. + */ + fprintf(fp, "/setpagedevice where {\n"); + fprintf(fp, " pop 2 dict dup /PageSize [%g %g] put setpagedevice\n", + doc->paper_width / FUNITS_PER_PT, + doc->paper_height / FUNITS_PER_PT); + fprintf(fp, "} if\n"); + + for (fe = doc->fonts->head; fe; fe = fe->next) { /* XXX This may request the same font multiple times. */ - fprintf(fp, "%%%%IncludeResource: font %s\n", fe->font->name); + if (fe->font->info->fp) { + char buf[512]; + size_t len; + fprintf(fp, "%%%%BeginResource: font %s\n", fe->font->info->name); + rewind(fe->font->info->fp); + do { + len = fread(buf, 1, sizeof(buf), fe->font->info->fp); + fwrite(buf, 1, len, fp); + } while (len == sizeof(buf)); + fprintf(fp, "%%%%EndResource\n"); + } else { + fprintf(fp, "%%%%IncludeResource: font %s\n", + fe->font->info->name); + } + } /* - * Re-encode and re-metric the fonts. + * Re-encode the fonts. */ font_index = 0; for (fe = doc->fonts->head; fe; fe = fe->next) { @@ -109,21 +140,15 @@ void ps_backend(paragraph *sourceform, keywordlist *keywords, sprintf(fname, "f%d", font_index++); fe->name = dupstr(fname); - fprintf(fp, "/%s findfont dup length dict begin\n", fe->font->name); + fprintf(fp, "/%s findfont dup length dict begin\n", + fe->font->info->name); fprintf(fp, "{1 index /FID ne {def} {pop pop} ifelse} forall\n"); fprintf(fp, "/Encoding [\n"); for (i = 0; i < 256; i++) fprintf(fp, "/%s%c", fe->vector[i] ? fe->vector[i] : ".notdef", i % 4 == 3 ? '\n' : ' '); - fprintf(fp, "] def /Metrics 256 dict dup begin\n"); - for (i = 0; i < 256; i++) { - if (fe->indices[i] >= 0) { - double width = fe->font->widths[fe->indices[i]]; - fprintf(fp, "/%s %g def\n", fe->vector[i], - 1000.0 * width / FUNITS_PER_PT); - } - } - fprintf(fp, "end def currentdict end\n"); + fprintf(fp, "] def\n"); + fprintf(fp, "currentdict end\n"); fprintf(fp, "/fontname-%s exch definefont /%s exch def\n\n", fe->name, fe->name); } @@ -136,6 +161,8 @@ void ps_backend(paragraph *sourceform, keywordlist *keywords, for (page = doc->pages; page; page = page->next) { text_fragment *frag, *frag_end; rect *r; + font_encoding *fe; + int fs; pageno++; fprintf(fp, "%%%%Page: %d %d\n", pageno, pageno); @@ -170,9 +197,9 @@ void ps_backend(paragraph *sourceform, keywordlist *keywords, } frag = page->first_text; + fe = NULL; + fs = -1; while (frag) { - font_encoding *fe; - int fs; char *c; /* @@ -185,9 +212,6 @@ void ps_backend(paragraph *sourceform, keywordlist *keywords, fprintf(fp, "%g[", frag->y / FUNITS_PER_PT); - fe = NULL; - fs = -1; - while (frag && frag != frag_end) { if (frag->fe != fe || frag->fontsize != fs)