fz_error pdf_loadfont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict) { fz_error error; char *subtype; fz_obj *dfonts; fz_obj *charprocs; if ((*fontdescp = pdf_finditem(xref->store, pdf_dropfont, dict))) { pdf_keepfont(*fontdescp); return fz_okay; } subtype = fz_toname(fz_dictgets(dict, "Subtype")); dfonts = fz_dictgets(dict, "DescendantFonts"); charprocs = fz_dictgets(dict, "CharProcs"); if (subtype && !strcmp(subtype, "Type0")) error = loadtype0(fontdescp, xref, dict); else if (subtype && !strcmp(subtype, "Type1")) error = loadsimplefont(fontdescp, xref, dict); else if (subtype && !strcmp(subtype, "MMType1")) error = loadsimplefont(fontdescp, xref, dict); else if (subtype && !strcmp(subtype, "TrueType")) error = loadsimplefont(fontdescp, xref, dict); else if (subtype && !strcmp(subtype, "Type3")) error = pdf_loadtype3font(fontdescp, xref, rdb, dict); else if (charprocs) { fz_warn("unknown font format, guessing type3."); error = pdf_loadtype3font(fontdescp, xref, rdb, dict); } else if (dfonts) { fz_warn("unknown font format, guessing type0."); error = loadtype0(fontdescp, xref, dict); } else { fz_warn("unknown font format, guessing type1 or truetype."); error = loadsimplefont(fontdescp, xref, dict); } if (error) return fz_rethrow(error, "cannot load font (%d %d R)", fz_tonum(dict), fz_togen(dict)); /* Save the widths to stretch non-CJK substitute fonts */ if ((*fontdescp)->font->ftsubstitute && !(*fontdescp)->tottfcmap) pdf_makewidthtable(*fontdescp); /* SumatraPDF: this font renders wrong without hinting */ if (strstr((*fontdescp)->font->name, "MingLiU")) (*fontdescp)->font->fthint = 1; pdf_storeitem(xref->store, pdf_keepfont, pdf_dropfont, dict, *fontdescp); return fz_okay; }
fz_error pdf_loadfont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict) { fz_error error; char *subtype; fz_obj *dfonts; fz_obj *charprocs; if ((*fontdescp = pdf_finditem(xref->store, PDF_KFONT, dict))) { pdf_keepfont(*fontdescp); return fz_okay; } subtype = fz_toname(fz_dictgets(dict, "Subtype")); dfonts = fz_dictgets(dict, "DescendantFonts"); charprocs = fz_dictgets(dict, "CharProcs"); if (subtype && !strcmp(subtype, "Type0")) error = loadtype0(fontdescp, xref, dict); else if (subtype && !strcmp(subtype, "Type1")) error = loadsimplefont(fontdescp, xref, dict); else if (subtype && !strcmp(subtype, "MMType1")) error = loadsimplefont(fontdescp, xref, dict); else if (subtype && !strcmp(subtype, "TrueType")) error = loadsimplefont(fontdescp, xref, dict); else if (subtype && !strcmp(subtype, "Type3")) error = pdf_loadtype3font(fontdescp, xref, rdb, dict); else if (charprocs) { fz_warn("unknown font format, guessing type3."); error = pdf_loadtype3font(fontdescp, xref, rdb, dict); } else if (dfonts) { fz_warn("unknown font format, guessing type0."); error = loadtype0(fontdescp, xref, dict); } else { fz_warn("unknown font format, guessing type1 or truetype."); error = loadsimplefont(fontdescp, xref, dict); } if (error) return fz_rethrow(error, "cannot load font"); error = pdf_storeitem(xref->store, PDF_KFONT, dict, *fontdescp); if (error) return fz_rethrow(error, "cannot store font resource"); return fz_okay; }
static void keepitem(pdf_itemkind kind, void *val) { switch (kind) { case PDF_KCOLORSPACE: fz_keepcolorspace(val); break; case PDF_KFUNCTION: pdf_keepfunction(val); break; case PDF_KXOBJECT: pdf_keepxobject(val); break; case PDF_KIMAGE: fz_keepimage(val); break; case PDF_KPATTERN: pdf_keeppattern(val); break; case PDF_KSHADE: fz_keepshade(val); break; case PDF_KCMAP: pdf_keepcmap(val); break; case PDF_KFONT: pdf_keepfont(val); break; } }