diff options
-rw-r--r-- | include/mupdf/rsrc.h | 1 | ||||
-rw-r--r-- | mupdf/cmap.c | 2 | ||||
-rw-r--r-- | mupdf/font.c | 59 | ||||
-rw-r--r-- | mupdf/fontfilefc.c | 27 |
4 files changed, 65 insertions, 24 deletions
diff --git a/include/mupdf/rsrc.h b/include/mupdf/rsrc.h index 60762ce4..8298a3d2 100644 --- a/include/mupdf/rsrc.h +++ b/include/mupdf/rsrc.h @@ -142,6 +142,7 @@ struct pdf_font_s /* Encoding (CMap) */ fz_cmap *encoding; + fz_cmap *tottfcmap; int ncidtogid; unsigned short *cidtogid; diff --git a/mupdf/cmap.c b/mupdf/cmap.c index b7a261d4..84dd386e 100644 --- a/mupdf/cmap.c +++ b/mupdf/cmap.c @@ -32,7 +32,7 @@ static int tokenfromkeyword(char *key) return PDF_TKEYWORD; } -static int codefromstring(char *buf, int len) +static int codefromstring(unsigned char *buf, int len) { int a = 0; while (len--) diff --git a/mupdf/font.c b/mupdf/font.c index 11218cfd..4cf29b89 100644 --- a/mupdf/font.c +++ b/mupdf/font.c @@ -57,11 +57,26 @@ static int ftkind(FT_Face face) return UNKNOWN; } +static inline int ftcidtogid(pdf_font *font, int cid) +{ + if (font->tottfcmap) + { + cid = fz_lookupcid(font->tottfcmap, cid); + return FT_Get_Char_Index(font->ftface, cid); + } + + if (font->cidtogid) + return font->cidtogid[cid]; + + return cid; +} + static int ftwidth(pdf_font *font, int cid) { int e; - if (font->cidtogid) - cid = font->cidtogid[cid]; + + cid = ftcidtogid(font, cid); + e = FT_Load_Glyph(font->ftface, cid, FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM); if (e) @@ -81,10 +96,7 @@ ftrender(fz_glyph *glyph, fz_font *fzfont, int cid, fz_matrix trm) int gid; int x, y; - if (font->cidtogid) - gid = font->cidtogid[cid]; - else - gid = cid; + gid = ftcidtogid(font, cid); if (font->substitute && fzfont->wmode == 0) { @@ -211,6 +223,8 @@ static void ftdropfont(fz_font *font) pdf_font *pfont = (pdf_font*)font; if (pfont->encoding) fz_dropcmap(pfont->encoding); + if (pfont->tottfcmap) + fz_dropcmap(pfont->tottfcmap); if (pfont->tounicode) fz_dropcmap(pfont->tounicode); fz_free(pfont->cidtogid); @@ -247,6 +261,7 @@ pdf_newfont(char *name) font->missingwidth = 0; font->encoding = nil; + font->tottfcmap = 0; font->ncidtogid = 0; font->cidtogid = nil; @@ -669,11 +684,33 @@ loadcidfont(pdf_font **fontp, pdf_xref *xref, fz_obj *dict, fz_obj *encoding, fz fz_dropbuffer(buf); } - /* TODO: if truetype font is external, cidtogidmap should not be identity */ - /* we should map the cid to another encoding represented by a 'cmap' table */ - /* cids: Adobe-CNS1 Adobe-GB1 Adobe-Japan1 Adobe-Japan2 Adobe-Korea1 */ - /* cmap: Big5 Johab PRC ShiftJIS Unicode Wansung */ - /* win: 3,4 3,6 3,3 3,2 3,1 3,5 */ + /* if truetype font is external, cidtogidmap should not be identity */ + /* so we map from cid to unicode and then map that through the (3 1) */ + /* unicode cmap to get a glyph id */ + else if (font->substitute) + { + int e; + + e = FT_Select_Charmap(face, ft_encoding_unicode); + if (e) + return fz_throw("fonterror: no unicode cmap when emulating CID font"); + + if (!strcmp(collection, "Adobe-CNS1")) + error = pdf_loadsystemcmap(&font->tottfcmap, "Adobe-CNS1-UCS2"); + else if (!strcmp(collection, "Adobe-GB1")) + error = pdf_loadsystemcmap(&font->tottfcmap, "Adobe-GB1-UCS2"); + else if (!strcmp(collection, "Adobe-Japan1")) + error = pdf_loadsystemcmap(&font->tottfcmap, "Adobe-Japan1-UCS2"); + else if (!strcmp(collection, "Adobe-Japan2")) + error = pdf_loadsystemcmap(&font->tottfcmap, "Adobe-Japan2-UCS2"); + else if (!strcmp(collection, "Adobe-Korea1")) + error = pdf_loadsystemcmap(&font->tottfcmap, "Adobe-Korea1-UCS2"); + else + error = nil; + + if (error) + return error; + } } error = pdf_loadtounicode(font, xref, nil, collection, tounicode); diff --git a/mupdf/fontfilefc.c b/mupdf/fontfilefc.c index ddcd4cfb..e47cc759 100644 --- a/mupdf/fontfilefc.c +++ b/mupdf/fontfilefc.c @@ -22,6 +22,7 @@ enum FD_ITALIC = 1 << 6, FD_ALLCAP = 1 << 16, FD_SMALLCAP = 1 << 17, + FD_FORCEBOLD = 1 << 18 }; static char *basenames[14] = @@ -123,7 +124,7 @@ pdf_loadbuiltinfont(pdf_font *font, char *basefont) index = 0; fcerr = FcPatternGetInteger(matchpat, FC_INDEX, 0, &index); -printf(" builtin font %s idx %d\n", file, index); +printf(" builtin %s from %s idx %d\n", basefont, file, index); fterr = FT_New_Face(ftlib, file, index, &face); if (fterr) @@ -158,7 +159,6 @@ pdf_loadsystemfont(pdf_font *font, char *basefont, char *collection) /* parse windows-style font name descriptors Font,Style or Font-Style */ strlcpy(fontname, basefont, sizeof fontname); - style = strchr(fontname, ','); if (style) { *style++ = 0; @@ -175,14 +175,11 @@ pdf_loadsystemfont(pdf_font *font, char *basefont, char *collection) error = fz_outofmem; - /* pattern from name */ if (!FcPatternAddString(searchpat, FC_FAMILY, fontname)) goto cleanup; if (collection) { - if (!FcPatternAddString(searchpat, FC_FAMILY, collection)) - goto cleanup; if (!strcmp(collection, "Adobe-GB1")) if (!FcPatternAddString(searchpat, FC_LANG, "zh")) goto cleanup; @@ -203,15 +200,21 @@ pdf_loadsystemfont(pdf_font *font, char *basefont, char *collection) if (style) if (!FcPatternAddString(searchpat, FC_STYLE, style)) goto cleanup; + + if (font->flags & FD_SERIF) + FcPatternAddString(searchpat, FC_FAMILY, "serif"); + else + FcPatternAddString(searchpat, FC_FAMILY, "sans-serif"); + if (font->flags & FD_ITALIC) + FcPatternAddString(searchpat, FC_STYLE, "Italic"); + if (font->flags & FD_FORCEBOLD) + FcPatternAddString(searchpat, FC_STYLE, "Bold"); + if (!FcPatternAddBool(searchpat, FC_OUTLINE, 1)) goto cleanup; - /* additional pattern from fd flags */ - FcPatternAddString(searchpat, FC_FAMILY, font->flags & FD_SERIF ? "serif" : "sans-serif"); - FcPatternAddString(searchpat, FC_STYLE, font->flags & FD_ITALIC ? "Italic" : "Regular"); - file = FcNameUnparse(searchpat); -printf(" system font pattern %s\n", file); +printf(" fontconfig %s\n", file); free(file); fcerr = FcResultMatch; @@ -230,7 +233,7 @@ free(file); if (file && style && strcmp(style, file)) font->substitute = 1; -printf(" is a substituted font\n"); +printf(" inexact match\n"); fcerr = FcPatternGetString(matchpat, FC_FILE, 0, (FcChar8**)&file); if (fcerr != FcResultMatch) @@ -239,7 +242,7 @@ printf(" is a substituted font\n"); index = 0; fcerr = FcPatternGetInteger(matchpat, FC_INDEX, 0, &index); -printf(" system font file %s idx %d\n", file, index); +printf(" file %s idx %d\n", file, index); fterr = FT_New_Face(ftlib, file, index, &face); if (fterr) { |