//======================================================================== // // CairoFontEngine.h // // Copyright 2003 Glyph & Cog, LLC // Copyright 2004 Red Hat, Inc // //======================================================================== //======================================================================== // // 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) 2005, 2006 Kristian Høgsberg // Copyright (C) 2005, 2018, 2019 Albert Astals Cid // Copyright (C) 2006, 2007 Jeff Muizelaar // Copyright (C) 2006, 2010 Carlos Garcia Campos // Copyright (C) 2008, 2017 Adrian Johnson // Copyright (C) 2013 Thomas Freitag // Copyright (C) 2018 Adam Reichold // // 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 // //======================================================================== #ifndef CAIROFONTENGINE_H #define CAIROFONTENGINE_H #include #include "poppler-config.h" #include #include "GfxFont.h" #include "PDFDoc.h" class CairoFontEngine; class CairoFont { public: CairoFont(Ref refA, cairo_font_face_t *cairo_font_faceA, int *codeToGIDA, unsigned int codeToGIDLenA, bool substituteA, bool printingA); virtual ~CairoFont(); CairoFont(const CairoFont &) = delete; CairoFont &operator=(const CairoFont &other) = delete; virtual bool matches(Ref &other, bool printing); cairo_font_face_t *getFontFace(); unsigned long getGlyph(CharCode code, const Unicode *u, int uLen); double getSubstitutionCorrection(GfxFont *gfxFont); bool isSubstitute() { return substitute; } protected: Ref ref; cairo_font_face_t *cairo_font_face; int *codeToGID; unsigned int codeToGIDLen; bool substitute; bool printing; }; //------------------------------------------------------------------------ class CairoFreeTypeFont : public CairoFont { public: static CairoFreeTypeFont *create(GfxFont *gfxFont, XRef *xref, FT_Library lib, bool useCIDs); ~CairoFreeTypeFont() override; private: CairoFreeTypeFont(Ref ref, cairo_font_face_t *cairo_font_face, int *codeToGID, unsigned int codeToGIDLen, bool substitute); }; //------------------------------------------------------------------------ class CairoType3Font : public CairoFont { public: static CairoType3Font *create(GfxFont *gfxFont, PDFDoc *doc, CairoFontEngine *fontEngine, bool printing, XRef *xref); ~CairoType3Font() override; bool matches(Ref &other, bool printing) override; private: CairoType3Font(Ref ref, cairo_font_face_t *cairo_font_face, int *codeToGID, unsigned int codeToGIDLen, bool printing, XRef *xref); }; //------------------------------------------------------------------------ #define cairoFontCacheSize 64 //------------------------------------------------------------------------ // CairoFontEngine //------------------------------------------------------------------------ class CairoFontEngine { public: // Create a font engine. CairoFontEngine(FT_Library libA); ~CairoFontEngine(); CairoFontEngine(const CairoFontEngine &) = delete; CairoFontEngine &operator=(const CairoFontEngine &other) = delete; CairoFont *getFont(GfxFont *gfxFont, PDFDoc *doc, bool printing, XRef *xref); private: CairoFont *fontCache[cairoFontCacheSize]; FT_Library lib; bool useCIDs; mutable std::recursive_mutex mutex; }; #endif