//======================================================================== // // SplashFTFontFile.cc // //======================================================================== //======================================================================== // // Modified under the Poppler project - http://poppler.freedesktop.org // // All changes made under the Poppler project to this file are licensed // under GPL version 2 or later // // Copyright (C) 2006 Takashi Iwai // Copyright (C) 2014, 2017, 2022 Adrian Johnson // Copyright (C) 2017, 2018, 2022 Oliver Sander // Copyright (C) 2018, 2024 Albert Astals Cid // Copyright (C) 2024 g10 Code GmbH, Author: Sune Stolborg Vuorela // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git // //======================================================================== #include #include "goo/ft_utils.h" #include "goo/gmem.h" #include "goo/GooString.h" #include "poppler/GfxFont.h" #include "SplashFTFontEngine.h" #include "SplashFTFont.h" #include "SplashFTFontFile.h" #include "SplashFontFileID.h" //------------------------------------------------------------------------ // SplashFTFontFile //------------------------------------------------------------------------ SplashFontFile *SplashFTFontFile::loadType1Font(SplashFTFontEngine *engineA, std::unique_ptr idA, SplashFontSrc *src, const char **encA, int faceIndexA) { FT_Face faceA; int *codeToGIDA; const char *name; int i; if (src->isFile) { if (ft_new_face_from_file(engineA->lib, src->fileName.c_str(), faceIndexA, &faceA)) { return nullptr; } } else { if (FT_New_Memory_Face(engineA->lib, (const FT_Byte *)src->buf.data(), src->buf.size(), faceIndexA, &faceA)) { return nullptr; } } codeToGIDA = (int *)gmallocn(256, sizeof(int)); for (i = 0; i < 256; ++i) { codeToGIDA[i] = 0; if ((name = encA[i])) { codeToGIDA[i] = (int)FT_Get_Name_Index(faceA, (char *)name); if (codeToGIDA[i] == 0) { name = GfxFont::getAlternateName(name); if (name) { codeToGIDA[i] = FT_Get_Name_Index(faceA, (char *)name); } } } } return new SplashFTFontFile(engineA, std::move(idA), src, faceA, codeToGIDA, 256, false, true); } SplashFontFile *SplashFTFontFile::loadCIDFont(SplashFTFontEngine *engineA, std::unique_ptr idA, SplashFontSrc *src, int *codeToGIDA, int codeToGIDLenA, int faceIndexA) { FT_Face faceA; if (src->isFile) { if (ft_new_face_from_file(engineA->lib, src->fileName.c_str(), faceIndexA, &faceA)) { return nullptr; } } else { if (FT_New_Memory_Face(engineA->lib, (const FT_Byte *)src->buf.data(), src->buf.size(), faceIndexA, &faceA)) { return nullptr; } } return new SplashFTFontFile(engineA, std::move(idA), src, faceA, codeToGIDA, codeToGIDLenA, false, false); } SplashFontFile *SplashFTFontFile::loadTrueTypeFont(SplashFTFontEngine *engineA, std::unique_ptr idA, SplashFontSrc *src, int *codeToGIDA, int codeToGIDLenA, int faceIndexA) { FT_Face faceA; if (src->isFile) { if (ft_new_face_from_file(engineA->lib, src->fileName.c_str(), faceIndexA, &faceA)) { return nullptr; } } else { if (FT_New_Memory_Face(engineA->lib, (const FT_Byte *)src->buf.data(), src->buf.size(), faceIndexA, &faceA)) { return nullptr; } } return new SplashFTFontFile(engineA, std::move(idA), src, faceA, codeToGIDA, codeToGIDLenA, true, false); } SplashFTFontFile::SplashFTFontFile(SplashFTFontEngine *engineA, std::unique_ptr idA, SplashFontSrc *srcA, FT_Face faceA, int *codeToGIDA, int codeToGIDLenA, bool trueTypeA, bool type1A) : SplashFontFile(std::move(idA), srcA) { engine = engineA; face = faceA; codeToGID = codeToGIDA; codeToGIDLen = codeToGIDLenA; trueType = trueTypeA; type1 = type1A; } SplashFTFontFile::~SplashFTFontFile() { if (face) { FT_Done_Face(face); } if (codeToGID) { gfree(codeToGID); } } SplashFont *SplashFTFontFile::makeFont(SplashCoord *mat, const SplashCoord *textMat) { SplashFont *font; font = new SplashFTFont(this, mat, textMat); font->initCache(); return font; }