X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/f8194b2183dd1edcf5be1da2d2b9d32f1f2a6ce2..a2bd22193636859a63187aec26b389e07163880e:/bk_pdf.c diff --git a/bk_pdf.c b/bk_pdf.c index ba19372..74944f0 100644 --- a/bk_pdf.c +++ b/bk_pdf.c @@ -34,6 +34,7 @@ struct objlist_Tag { static object *new_object(objlist *list); static void objtext(object *o, char const *text); static void objstream(object *o, char const *text); +static void objstream_len(object *o, char const *text, size_t len); static void pdf_string(void (*add)(object *, char const *), object *, char const *); static void pdf_string_len(void (*add)(object *, char const *), @@ -158,14 +159,14 @@ void pdf_backend(paragraph *sourceform, keywordlist *keywords, for (i = 0; i < 256; i++) { char buf[20]; - if (!fe->vector[i]) + if (fe->vector[i] == NOGLYPH) continue; if (i != prev + 1) { sprintf(buf, "\n%d", i); objtext(font, buf); } objtext(font, i % 8 ? "/" : "\n/"); - objtext(font, fe->vector[i]); + objtext(font, glyph_extern(fe->vector[i])); prev = i; } @@ -189,7 +190,7 @@ void pdf_backend(paragraph *sourceform, keywordlist *keywords, font_info const *fi = fe->font->info; int flags; for (i = 0; i < 256; i++) - if (fe->indices[i] >= 0) { + if (fe->vector[i] != NOGLYPH) { if (firstchar < 0) firstchar = i; lastchar = i; } @@ -201,10 +202,10 @@ void pdf_backend(paragraph *sourceform, keywordlist *keywords, objtext(widths, "[\n"); for (i = firstchar; i <= lastchar; i++) { double width; - if (fe->indices[i] < 0) + if (fe->vector[i] == NOGLYPH) width = 0.0; else - width = fi->widths[fe->indices[i]]; + width = find_width(fe->font, fe->vector[i]); sprintf(buf, "%g\n", 1000.0 * width / FUNITS_PER_PT); objtext(widths, buf); } @@ -235,16 +236,22 @@ void pdf_backend(paragraph *sourceform, keywordlist *keywords, objtext(fontdesc, buf); sprintf(buf, "/StemV %g\n", fi->stemv); objtext(fontdesc, buf); - if (fi->fp) { + if (fi->fontfile && fi->filetype == TYPE1) { object *fontfile = new_object(&olist); - char buf[513]; size_t len; - rewind(fi->fp); - do { - len = fread(buf, 1, sizeof(buf)-1, fi->fp); - buf[len] = 0; - objstream(fontfile, buf); - } while (len == sizeof(buf)-1); + char *ffbuf; + + pf_part1((font_info *)fi, &ffbuf, &len); + objstream_len(fontfile, ffbuf, len); + sfree(ffbuf); + sprintf(buf, "<<\n/Length1 %lu\n", (unsigned long)len); + objtext(fontfile, buf); + pf_part2((font_info *)fi, &ffbuf, &len); + objstream_len(fontfile, ffbuf, len); + sfree(ffbuf); + sprintf(buf, "/Length2 %lu\n", (unsigned long)len); + objtext(fontfile, buf); + objtext(fontfile, "/Length3 0\n"); objtext(fontdesc, "/FontFile "); objref(fontdesc, fontfile); } @@ -479,12 +486,21 @@ void pdf_backend(paragraph *sourceform, keywordlist *keywords, sprintf(text, "%d 0 obj\n", o->number); rdaddsc(&rs, text); - if (!o->main.text && o->stream.text) { + if (o->stream.text) { + if (!o->main.text) + rdaddsc(&o->main, "<<\n"); +#ifdef PDF_NOCOMPRESS + zlen = o->stream.pos; + zbuf = snewn(zlen, char); + memcpy(zbuf, o->stream.text, zlen); + sprintf(text, "/Length %d\n>>\n", zlen); +#else zcontext = deflate_compress_new(DEFLATE_TYPE_ZLIB); deflate_compress_data(zcontext, o->stream.text, o->stream.pos, DEFLATE_END_OF_DATA, &zbuf, &zlen); deflate_compress_free(zcontext); - sprintf(text, "<<\n/Filter/FlateDecode\n/Length %d\n>>\n", zlen); + sprintf(text, "/Filter/FlateDecode\n/Length %d\n>>\n", zlen); +#endif rdaddsc(&o->main, text); } @@ -596,6 +612,11 @@ static void objtext(object *o, char const *text) rdaddsc(&o->main, text); } +static void objstream_len(object *o, char const *text, size_t len) +{ + rdaddsn(&o->stream, text, len); +} + static void objstream(object *o, char const *text) { rdaddsc(&o->stream, text);