summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Harris <bjh21@bjh21.me.uk>2007-02-10 12:33:56 +0000
committerBen Harris <bjh21@bjh21.me.uk>2007-02-10 12:33:56 +0000
commit7d287800e5a5bcdf0d4d38679ff7980ce8c18250 (patch)
treed9171fa7beb13a40f36ffb192cd7d5bdde55cf92
parenta0a77360d18d8207cbd67bb00297553fe90bc43a (diff)
downloadhalibut-7d287800e5a5bcdf0d4d38679ff7980ce8c18250.zip
halibut-7d287800e5a5bcdf0d4d38679ff7980ce8c18250.tar.gz
halibut-7d287800e5a5bcdf0d4d38679ff7980ce8c18250.tar.bz2
halibut-7d287800e5a5bcdf0d4d38679ff7980ce8c18250.tar.xz
Generate a "W" array for CIDFonts, since acroread seems to do very silly
things without one. [originally from svn r7261]
-rw-r--r--bk_pdf.c11
-rw-r--r--in_sfnt.c9
-rw-r--r--paper.h4
3 files changed, 20 insertions, 4 deletions
diff --git a/bk_pdf.c b/bk_pdf.c
index d75244d..a880872 100644
--- a/bk_pdf.c
+++ b/bk_pdf.c
@@ -209,7 +209,16 @@ void pdf_backend(paragraph *sourceform, keywordlist *keywords,
"/Ordering(Identity)/Supplement 0>>\n");
objtext(cidfont, "/FontDescriptor ");
objref(cidfont, fontdesc);
- objtext(cidfont, ">>\n");
+ objtext(cidfont, "\n/W[0[");
+ for (i = 0; i < sfnt_nglyphs(fe->font->info->fontfile); i++) {
+ char buf[20];
+ double width;
+ width = find_width(fe->font,
+ sfnt_indextoglyph(fe->font->info->fontfile, i));
+ sprintf(buf, "%g ", 1000.0 * width / FUNITS_PER_PT);
+ objtext(cidfont, buf);
+ }
+ objtext(cidfont, "]]>>\n");
} else {
objtext(font, "/Subtype /Type1\n");
objtext(font, "\n/Encoding <<\n/Type /Encoding\n/Differences [");
diff --git a/in_sfnt.c b/in_sfnt.c
index 9e21bf2..9718425 100644
--- a/in_sfnt.c
+++ b/in_sfnt.c
@@ -349,7 +349,6 @@ typedef struct {
unsigned short index;
} glyphmap;
-typedef struct sfnt_Tag sfnt;
struct sfnt_Tag {
void *data;
size_t len;
@@ -497,11 +496,15 @@ static void sfnt_mapglyphs(font_info *fi) {
glyphsbyname_cmp);
}
-static glyph sfnt_indextoglyph(sfnt *sf, unsigned short idx) {
+glyph sfnt_indextoglyph(sfnt *sf, unsigned idx) {
return sf->glyphsbyindex[idx];
}
-static unsigned short sfnt_glyphtoindex(sfnt *sf, glyph g) {
+unsigned sfnt_nglyphs(sfnt *sf) {
+ return sf->nglyphs;
+}
+
+unsigned sfnt_glyphtoindex(sfnt *sf, glyph g) {
cmp_glyphsbyindex = sf->glyphsbyindex;
return *(unsigned short *)bsearch(&g, sf->glyphsbyname, sf->nglyphs,
sizeof(*sf->glyphsbyname),
diff --git a/paper.h b/paper.h
index 3f20fc2..d0c0139 100644
--- a/paper.h
+++ b/paper.h
@@ -418,6 +418,10 @@ void pf_writeps(font_info const *fi, FILE *ofp);
/*
* Backend functions exported by in_sfnt.c
*/
+typedef struct sfnt_Tag sfnt;
+glyph sfnt_indextoglyph(sfnt *sf, unsigned idx);
+unsigned sfnt_glyphtoindex(sfnt *sf, glyph g);
+unsigned sfnt_nglyphs(sfnt *sf);
void sfnt_writeps(font_info const *fi, FILE *ofp);
void sfnt_cmap(font_encoding *fe, object *);
void sfnt_data(font_info *fi, char **bufp, size_t *lenp);