fz_error * pdf_loadembeddedfont(pdf_font *font, pdf_xref *xref, fz_obj *stmref) { fz_error *error; int fterr; FT_Face face; fz_buffer *buf; error = initfontlibs(); if (error) return error; pdf_logfont("load embedded font\n"); error = pdf_loadstream(&buf, xref, fz_tonum(stmref), fz_togen(stmref)); if (error) return error; fterr = FT_New_Memory_Face(ftlib, buf->rp, buf->wp - buf->rp, 0, &face); if (fterr) { fz_free(buf); return fz_throw("freetype could not load embedded font: %s", pdf_fterrorstring(fterr)); } font->ftface = face; font->fontdata = buf; return nil; }
fz_error * pdf_loadembeddedfont(pdf_font *font, pdf_xref *xref, fz_obj *stmref) { fz_error *error; int fterr; FT_Face face; fz_buffer *buf; error = initfontlibs(); if (error) return fz_rethrow(error, "cannot init font libraries"); pdf_logfont("load embedded font\n"); error = pdf_loadstream(&buf, xref, fz_tonum(stmref), fz_togen(stmref)); if (error) return fz_rethrow(error, "cannot load font stream"); fterr = FT_New_Memory_Face(ftlib, buf->rp, buf->wp - buf->rp, 0, &face); if (fterr) { fz_dropbuffer(buf); return fz_throw("freetype: cannot load embedded font: %s", ft_errstr(fterr)); } font->ftface = face; font->fontdata = buf; return fz_okay; }
fz_error * pdf_loadbuiltinfont(pdf_font *font, char *fontname) { fz_error *error; unsigned char *data; unsigned int len; int fterr; int i; error = initfontlibs(); if (error) return fz_rethrow(error, "cannot init font libraries"); for (i = 0; i < 15; i++) if (!strcmp(fontname, basefonts[i].name)) goto found; return fz_throw("cannot find font: %s", fontname); found: pdf_logfont("load builtin font %s\n", fontname); data = (unsigned char *) basefonts[i].cff; len = *basefonts[i].len; fterr = FT_New_Memory_Face(ftlib, data, len, 0, (FT_Face*)&font->ftface); if (fterr) return fz_throw("freetype: cannot load font: %s", ft_errstr(fterr)); return fz_okay; }
fz_error * pdf_loadsystemfont(pdf_font *font, char *basefont, char *collection) { fz_error *error; int fterr; FT_Face face; char *file; int index; error = initfontlibs(); if (error) return error; error = pdf_lookupfontMS(basefont,&file,&index); if(error) goto cleanup; fterr = FT_New_Face(ftlib, file, index, &face); if (fterr) { return fz_throw("freetype could not load font file '%s': 0x%x", file, fterr); } font->ftface = face; return nil; cleanup: return error; }
fz_error * pdf_loadbuiltinfont(pdf_font *font, char *basefont) { fz_error *error; int fterr; FT_Face face; char *file; int index; error = initfontlibs(); if (error) return error; error = pdf_lookupfontMS(basefont,&file,&index); if(error) return error; fterr = FT_New_Face(ftlib, file, index, &face); if (fterr) return fz_throw("freetype could not load font file '%s': 0x%x", file, fterr); font->ftface = face; return nil; }
fz_error * pdf_loadbuiltinfont(pdf_font *font, char *basefont) { fz_error *error; FcResult fcerr; int fterr; FcPattern *searchpat; FcPattern *matchpat; FT_Face face; char *pattern; char *file; int index; int i; error = initfontlibs(); if (error) return error; pattern = basefont; for (i = 0; i < 14; i++) if (!strcmp(basefont, basenames[i])) pattern = basepatterns[i]; pdf_logfont("load builtin %s\n", pattern); fcerr = FcResultMatch; searchpat = FcNameParse(pattern); FcDefaultSubstitute(searchpat); FcConfigSubstitute(fclib, searchpat, FcMatchPattern); matchpat = FcFontMatch(fclib, searchpat, &fcerr); if (fcerr != FcResultMatch) return fz_throw("fontconfig could not find font %s", pattern); fcerr = FcPatternGetString(matchpat, FC_FILE, 0, (FcChar8**)&file); if (fcerr != FcResultMatch) return fz_throw("fontconfig could not find font %s", pattern); index = 0; fcerr = FcPatternGetInteger(matchpat, FC_INDEX, 0, &index); pdf_logfont("load font file %s %d\n", file, index); fterr = FT_New_Face(ftlib, file, index, &face); if (fterr) return fz_throw("freetype could not load font file '%s': %s", file, pdf_fterrorstring(fterr)); FcPatternDestroy(matchpat); FcPatternDestroy(searchpat); font->ftface = face; return nil; }
fz_error * pdf_loadsystemfont(pdf_font *font, char *basefont, char *collection) { fz_error *error; FcResult fcerr; int fterr; char fontname[200]; FcPattern *searchpat; FcPattern *matchpat; FT_Face face; char *style; char *file; int index; error = initfontlibs(); if (error) return error; /* parse windows-style font name descriptors Font,Style */ /* TODO: reliable way to split style from Font-Style type names */ strlcpy(fontname, basefont, sizeof fontname); style = strchr(fontname, ','); if (style) *style++ = 0; searchpat = FcPatternCreate(); if (!searchpat) return fz_outofmem; error = fz_outofmem; if (!FcPatternAddString(searchpat, FC_FAMILY, fontname)) goto cleanup; if (collection) { if (!strcmp(collection, "Adobe-GB1")) if (!FcPatternAddString(searchpat, FC_LANG, "zh-TW")) goto cleanup; if (!strcmp(collection, "Adobe-CNS1")) if (!FcPatternAddString(searchpat, FC_LANG, "zh-CN")) goto cleanup; if (!strcmp(collection, "Adobe-Japan1")) if (!FcPatternAddString(searchpat, FC_LANG, "ja")) goto cleanup; if (!strcmp(collection, "Adobe-Japan2")) if (!FcPatternAddString(searchpat, FC_LANG, "ja")) goto cleanup; if (!strcmp(collection, "Adobe-Korea1")) if (!FcPatternAddString(searchpat, FC_LANG, "ko")) goto cleanup; } 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; file = FcNameUnparse(searchpat); pdf_logfont("fontconfig0 %s\n", file); free(file); fcerr = FcResultMatch; /* FcDefaultSubstitute(searchpat); */ FcConfigSubstitute(fclib, searchpat, FcMatchPattern); file = FcNameUnparse(searchpat); pdf_logfont("fontconfig1 %s\n", file); free(file); matchpat = FcFontMatch(fclib, searchpat, &fcerr); if (fcerr != FcResultMatch) return fz_throw("fontconfig could not find font %s", basefont); fcerr = FcPatternGetString(matchpat, FC_FAMILY, 0, (FcChar8**)&file); if (file && strcmp(fontname, file)) font->substitute = 1; fcerr = FcPatternGetString(matchpat, FC_STYLE, 0, (FcChar8**)&file); if (file && style && strcmp(style, file)) font->substitute = 1; fcerr = FcPatternGetString(matchpat, FC_FILE, 0, (FcChar8**)&file); if (fcerr != FcResultMatch) return fz_throw("fontconfig could not find font %s", basefont); index = 0; fcerr = FcPatternGetInteger(matchpat, FC_INDEX, 0, &index); pdf_logfont("load font file %s %d\n", file, index); fterr = FT_New_Face(ftlib, file, index, &face); if (fterr) { FcPatternDestroy(matchpat); FcPatternDestroy(searchpat); return fz_throw("freetype could not load font file '%s': %s", file, pdf_fterrorstring(fterr)); } FcPatternDestroy(matchpat); FcPatternDestroy(searchpat); font->ftface = face; return nil; cleanup: FcPatternDestroy(searchpat); return error; }
fz_error * pdf_loadsystemfont(pdf_font *font, char *fontname, char *collection) { fz_error *error; char *name; int isbold = 0; int isitalic = 0; int isserif = 0; int isscript = 0; int isfixed = 0; error = initfontlibs(); if (error) return fz_rethrow(error, "cannot init font libraries"); font->substitute = 1; if (strstr(fontname, "Bold")) isbold = 1; if (strstr(fontname, "Italic")) isitalic = 1; if (strstr(fontname, "Oblique")) isitalic = 1; if (font->flags & FD_FIXED) isfixed = 1; if (font->flags & FD_SERIF) isserif = 1; if (font->flags & FD_ITALIC) isitalic = 1; if (font->flags & FD_SCRIPT) isscript = 1; if (font->flags & FD_FORCEBOLD) isbold = 1; pdf_logfont("fixed-%d serif-%d italic-%d script-%d bold-%d\n", isfixed, isserif, isitalic, isscript, isbold); if (collection) { int kind; if (isserif) kind = MINCHO; else kind = GOTHIC; if (!strcmp(collection, "Adobe-CNS1")) return loadcidfont(font, CNS, kind); else if (!strcmp(collection, "Adobe-GB1")) return loadcidfont(font, GB, kind); else if (!strcmp(collection, "Adobe-Japan1")) return loadcidfont(font, Japan, kind); else if (!strcmp(collection, "Adobe-Japan2")) return loadcidfont(font, Japan, kind); else if (!strcmp(collection, "Adobe-Korea1")) return loadcidfont(font, Korea, kind); fz_warn("unknown cid collection: %s", collection); } if (isscript) name = "Chancery"; else if (isfixed) { if (isitalic) { if (isbold) name = "Courier-BoldOblique"; else name = "Courier-Oblique"; } else { if (isbold) name = "Courier-Bold"; else name = "Courier"; } } else if (isserif) { if (isitalic) { if (isbold) name = "Times-BoldItalic"; else name = "Times-Italic"; } else { if (isbold) name = "Times-Bold"; else name = "Times-Roman"; } } else { if (isitalic) { if (isbold) name = "Helvetica-BoldOblique"; else name = "Helvetica-Oblique"; } else { if (isbold) name = "Helvetica-Bold"; else name = "Helvetica"; } } error = pdf_loadbuiltinfont(font, name); if (error) return fz_throw("cannot load builtin substitute font: %s", name); return fz_okay; }
fz_error *initfontlibs_ms(void) { return initfontlibs(); }