📄 xoutputdev.cc
字号:
double m11, double m12, double m21, double m22, GBool subst) { XOutputFont *font; font = NULL; // create the new font switch (dfp->kind) { case displayFontX: font = tryGetServerFont(dfp->x.xlfd, dfp->x.encoding, gfxFont, m11Orig, m12Orig, m21Orig, m22Orig, m11, m12, m21, m22); break; case displayFontT1:#if HAVE_T1LIB_H if (t1libControl != fontRastNone && !gfxFont->isCIDFont()) { font = tryGetT1FontFromFile(xref, dfp->t1.fileName, gFalse, gfxFont, m11Orig, m12Orig, m21Orig, m22Orig, m11, m12, m21, m22, subst); }#endif#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H) if (!font) { if (freetypeControl != fontRastNone) { font = tryGetFTFontFromFile(xref, dfp->t1.fileName, gFalse, gfxFont, m11Orig, m12Orig, m21Orig, m22Orig, m11, m12, m21, m22, subst); } }#endif#if !((FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)) || defined(HAVE_T1LIB_H)) error(-1, "Config file specifies a Type 1 font,"); error(-1, "but xpdf was not built with t1lib or FreeType2 support");#endif break; case displayFontTT:#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H) if (freetypeControl != fontRastNone) { font = tryGetFTFontFromFile(xref, dfp->tt.fileName, gFalse, gfxFont, m11Orig, m12Orig, m21Orig, m22Orig, m11, m12, m21, m22, subst); }#endif#if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H) if (freetypeControl != fontRastNone) { font = tryGetTTFontFromFile(xref, dfp->tt.fileName, gFalse, gfxFont, m11Orig, m12Orig, m21Orig, m22Orig, m11, m12, m21, m22, subst); }#endif#if !(HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H) error(-1, "Config file specifies a TrueType font,"); error(-1, "but xpdf was not built with FreeType support"); dfp = NULL;#endif break; } return font;}#if HAVE_T1LIB_HXOutputFont *XOutputFontCache::tryGetT1Font(XRef *xref, GfxFont *gfxFont, double m11, double m12, double m21, double m22) { Ref *id; XOutputT1FontFile *xFontFile; XOutputFont *font; Ref embRef; GString *fileName; FILE *f; char *fontBuf; int fontLen; Type1CFontFile *ff; Object refObj, strObj; int c; int i; // check the already available font files id = gfxFont->getID(); for (i = 0; i < t1FontFiles->getLength(); ++i) { xFontFile = (XOutputT1FontFile *)t1FontFiles->get(i); if (xFontFile->num == id->num && xFontFile->gen == id->gen && !xFontFile->subst) { font = new XOutputT1Font(id, xFontFile->fontFile, m11, m12, m21, m22, m11, m12, m21, m22, display, xOut); if (!font->isOk()) { delete font; return NULL; } return font; } } // check for an embedded font if (gfxFont->getEmbeddedFontID(&embRef)) { // create the font file fileName = NULL; if (!openTempFile(&fileName, &f, "wb", NULL)) { error(-1, "Couldn't create temporary Type 1 font file"); return NULL; } if (gfxFont->getType() == fontType1C) { if (!(fontBuf = gfxFont->readEmbFontFile(xref, &fontLen))) { fclose(f); return NULL; } ff = new Type1CFontFile(fontBuf, fontLen); ff->convertToType1(outputToFile, f); delete ff; gfree(fontBuf); } else { // fontType1 refObj.initRef(embRef.num, embRef.gen); refObj.fetch(xref, &strObj); refObj.free(); strObj.streamReset(); while ((c = strObj.streamGetChar()) != EOF) { fputc(c, f); } strObj.streamClose(); strObj.free(); } fclose(f); // create the Font font = tryGetT1FontFromFile(xref, fileName, gTrue, gfxFont, m11, m12, m21, m22, m11, m12, m21, m22, gFalse); // on systems with Unix hard link semantics, this will remove the // last link to the temp file unlink(fileName->getCString()); delete fileName; // check for an external font file } else if ((fileName = gfxFont->getExtFontFile())) { font = tryGetT1FontFromFile(xref, fileName, gFalse, gfxFont, m11, m12, m21, m22, m11, m12, m21, m22, gFalse); } else { font = NULL; } return font;}XOutputFont *XOutputFontCache::tryGetT1FontFromFile(XRef *xref, GString *fileName, GBool deleteFile, GfxFont *gfxFont, double m11Orig, double m12Orig, double m21Orig, double m22Orig, double m11, double m12, double m21, double m22, GBool subst) { Ref *id; T1FontFile *fontFile; XOutputFont *font; // create the t1lib font file fontFile = new T1FontFile(t1Engine, fileName->getCString(), ((Gfx8BitFont *)gfxFont)->getEncoding(), gfxFont->getFontBBox()); if (!fontFile->isOk()) { error(-1, "Couldn't create t1lib font from '%s'", fileName->getCString()); delete fontFile; if (deleteFile) { unlink(fileName->getCString()); } return NULL; } // add to list id = gfxFont->getID(); t1FontFiles->append(new XOutputT1FontFile(id->num, id->gen, subst, fontFile, deleteFile ? fileName->copy() : (GString *)NULL)); // create the Font font = new XOutputT1Font(gfxFont->getID(), fontFile, m11Orig, m12Orig, m21Orig, m22Orig, m11, m12, m21, m22, display, xOut); if (!font->isOk()) { delete font; return NULL; } return font;}#endif // HAVE_T1LIB_H#if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)XOutputFont *XOutputFontCache::tryGetFTFont(XRef *xref, GfxFont *gfxFont, double m11, double m12, double m21, double m22) { Ref *id; XOutputFTFontFile *xFontFile; XOutputFont *font; Ref embRef; GString *fileName; FILE *f;#if 1 //~ need this until FT can handle fonts with missing tables char *fontBuf; int fontLen; TrueTypeFontFile *ff;#endif Object refObj, strObj; int c; int i; // check the already available font files id = gfxFont->getID(); for (i = 0; i < ftFontFiles->getLength(); ++i) { xFontFile = (XOutputFTFontFile *)ftFontFiles->get(i); if (xFontFile->num == id->num && xFontFile->gen == id->gen && !xFontFile->subst) { font = new XOutputFTFont(id, xFontFile->fontFile, m11, m12, m21, m22, m11, m12, m21, m22, display, xOut); if (!font->isOk()) { delete font; return NULL; } return font; } } // check for an embedded font if (gfxFont->getEmbeddedFontID(&embRef)) { // create the font file fileName = NULL; if (!openTempFile(&fileName, &f, "wb", NULL)) { error(-1, "Couldn't create temporary TrueType font file"); return NULL; }#if 1 //~ need this until FT can handle fonts with missing tables if (gfxFont->getType() == fontTrueType || gfxFont->getType() == fontCIDType2) { if (!(fontBuf = gfxFont->readEmbFontFile(xref, &fontLen))) { fclose(f); return NULL; } ff = new TrueTypeFontFile(fontBuf, fontLen); ff->writeTTF(f); delete ff; gfree(fontBuf); } else { refObj.initRef(embRef.num, embRef.gen); refObj.fetch(xref, &strObj); refObj.free(); strObj.streamReset(); while ((c = strObj.streamGetChar()) != EOF) { fputc(c, f); } strObj.streamClose(); strObj.free(); }#else refObj.initRef(embRef.num, embRef.gen); refObj.fetch(xref, &strObj); refObj.free(); strObj.streamReset(); while ((c = strObj.streamGetChar()) != EOF) { fputc(c, f); } strObj.streamClose(); strObj.free();#endif fclose(f); // create the Font font = tryGetFTFontFromFile(xref, fileName, gTrue, gfxFont, m11, m12, m21, m22, m11, m12, m21, m22, gFalse); // on systems with Unix hard link semantics, this will remove the // last link to the temp file unlink(fileName->getCString()); delete fileName; // check for an external font file } else if ((fileName = gfxFont->getExtFontFile())) { font = tryGetFTFontFromFile(xref, fileName, gFalse, gfxFont, m11, m12, m21, m22, m11, m12, m21, m22, gFalse); } else { font = NULL; } return font;}XOutputFont *XOutputFontCache::tryGetFTFontFromFile(XRef *xref, GString *fileName, GBool deleteFile, GfxFont *gfxFont, double m11Orig, double m12Orig, double m21Orig, double m22Orig, double m11, double m12, double m21, double m22, GBool subst) { Ref *id; FTFontFile *fontFile; XOutputFont *font; // create the FreeType font file if (gfxFont->isCIDFont()) { if (gfxFont->getType() == fontCIDType2) { fontFile = new FTFontFile(ftEngine, fileName->getCString(), ((GfxCIDFont *)gfxFont)->getCIDToGID(), ((GfxCIDFont *)gfxFont)->getCIDToGIDLen()); } else { // fontCIDType0, fontCIDType0C fontFile = new FTFontFile(ftEngine, fileName->getCString()); } } else { fontFile = new FTFontFile(ftEngine, fileName->getCString(), ((Gfx8BitFont *)gfxFont)->getEncoding(), ((Gfx8BitFont *)gfxFont)->getHasEncoding()); } if (!fontFile->isOk()) { error(-1, "Couldn't create FreeType font from '%s'", fileName->getCString()); delete fontFile; if (deleteFile) { unlink(fileName->getCString()); } return NULL; } // add to list id = gfxFont->getID(); ftFontFiles->append(new XOutputFTFontFile(id->num, id->gen, subst, fontFile, deleteFile ? fileName->copy() : (GString *)NULL)); // create the Font font = new XOutputFTFont(gfxFont->getID(), fontFile, m11Orig, m12Orig, m21Orig, m22Orig, m11, m12, m21, m22, display, xOut); if (!font->isOk()) { delete font; return NULL; } return font;}#endif // FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)#if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)XOutputFont *XOutputFontCache::tryGetTTFont(XRef *xref, GfxFont *gfxFont, double m11, double m12, double m21, double m22) { Ref *id; XOutputTTFontFile *xFontFile; XOutputFont *font; Ref embRef; GString *fileName; FILE *f; Object refObj, strObj; int c; int i; // check the already available font files id = gfxFont->getID(); xFontFile = NULL; for (i = 0; i < ttFontFiles->getLength(); ++i) { xFontFile = (XOutputTTFontFile *)ttFontFiles->get(i); if (xFontFile->num == id->num && xFontFile->gen == id->gen && !xFontFile->subst) { font = new XOutputTTFont(id, xFontFile->fontFile, m11, m12, m21, m22, m11, m12, m21, m22, display, xOut); if (!font->isOk()) { delete font; return NULL; } return font; } } // check for an embedded font if (gfxFont->getEmbeddedFontID(&embRef)) { // create the font file fileName = NULL; if (!openTempFile(&fileName, &f, "wb", NULL)) { error(-1, "Couldn't create temporary TrueType font file"); return NULL; } refObj.initRef(embRef.num, embRef.gen); refObj.fetch(xref, &strObj); refObj.free(); strObj.streamReset(); while ((c = strObj.streamGetChar()) != EOF) { fputc(c, f); } strObj.streamClose(); strObj.free(); fclose(f); // create the Font font = tryGetTTFontFromFile(xref, fileName, gTrue, gfxFont, m11, m12, m21, m22, m11, m12, m21, m22, gFalse); // on systems with Unix hard link semantics, this will remove the // last link to the temp file unlink(fileName->getCString()); delete fileName; } else if ((fileName = gfxFont->getExtFontFile())) { font = tryGetTTFontFromFile(xref, fileName, gFalse, gfxFont, m11, m12, m21, m22, m11, m12, m21, m22, gFalse); } else { font = NULL; } return font;}XOutputFont *XOutputFontCache::tryGetTTFontFromFile(XRef *xref, GString *fileName, GBool deleteFile, GfxFont *gfxFont, double m11Orig, double m12Orig, double m21Orig, double m22Orig, double m11, double m12, double m21, double m22, GBool subst) { Ref *id; TTFontFile *fontFile; XOutputFont *font; // create the FreeType font file if (gfxFont->isCIDFont()) { // fontCIDType2 fontFile = new TTFontFile(ttEngine, fileName->getCString(), ((GfxCIDFont *)gfxFont)->getCIDToGID(), ((GfxCIDFont *)gfxFont)->getCIDToGIDLen()); } else { fontFile = new TTFontFile(ttEngine, fileName->getCString(), ((Gfx8BitFont *)gfxFont)->getEncoding(), ((Gfx8BitFont *)gfxFont)->getHasEncoding()); } if (!fontFile->isOk()) { error(-1, "Couldn't create FreeType font from '%s'", fileName->getCString()); delete fontFile; if (deleteFile) { unlink(fileName->getCString()); } return NULL; } // add to list id = gfxFont->getID(); ttFontFiles->append(new XOutputTTFontFile(id->num, id->gen, subst, fontFile, deleteFile ? fileName->copy() : (GString *)NULL)); // create the Font font = new XOutputTTFont(gfxFont->getID(), fontFile, m11Orig, m12Orig, m21Orig, m22Orig, m11, m12, m21, m22, display, xOut);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -