summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mupdf/rsrc.h1
-rw-r--r--mupdf/cmap.c2
-rw-r--r--mupdf/font.c59
-rw-r--r--mupdf/fontfilefc.c27
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) {