blob: 31715c619160d95aead3851950e2cbd93edf0026 [file] [log] [blame] [edit]
//========================================================================
//
// GlobalParams.h
//
// Copyright 2001-2003 Glyph & Cog, LLC
//
//========================================================================
//========================================================================
//
// 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, 2007-2010, 2012, 2015, 2017-2024 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2005 Jonathan Blandford <jrb@redhat.com>
// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com>
// Copyright (C) 2007 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
// Copyright (C) 2009 Jonathan Kew <jonathan_kew@sil.org>
// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com>
// Copyright (C) 2009, 2011, 2012, 2014, 2015 William Bader <williambader@hotmail.com>
// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
// Copyright (C) 2011 Pino Toscano <pino@kde.org>
// Copyright (C) 2012, 2017 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2013 Jason Crain <jason@aquaticape.us>
// Copyright (C) 2018, 2020 Adam Reichold <adam.reichold@t-online.de>
// Copyright (C) 2019 Oliver Sander <oliver.sander@tu-dresden.de>
// Copyright (C) 2023 Shivodit Gill <shivodit.gill@gmail.com>
// Copyright (C) 2024 g10 Code GmbH, Author: Sune Stolborg Vuorela <sune@vuorela.dk>
//
// 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 GLOBALPARAMS_H
#define GLOBALPARAMS_H
#include <cassert>
#include "poppler-config.h"
#include "poppler_private_export.h"
#include <cstdio>
#include "CharTypes.h"
#include "UnicodeMap.h"
#include "Error.h"
#include <unordered_map>
#include <string>
#include <memory>
#include <mutex>
#include <optional>
#include <vector>
class GooString;
class NameToCharCode;
class CharCodeToUnicode;
class CharCodeToUnicodeCache;
class UnicodeMapCache;
class CMap;
class CMapCache;
class GlobalParams;
class GfxFont;
class Stream;
class SysFontList;
//------------------------------------------------------------------------
// The global parameters object.
extern std::unique_ptr<GlobalParams> POPPLER_PRIVATE_EXPORT globalParams;
//------------------------------------------------------------------------
enum SysFontType
{
sysFontPFA,
sysFontPFB,
sysFontTTF,
sysFontTTC
};
//------------------------------------------------------------------------
struct FamilyStyleFontSearchResult
{
FamilyStyleFontSearchResult() = default;
FamilyStyleFontSearchResult(const std::string &filepathA, int faceIndexA) : filepath(filepathA), faceIndex(faceIndexA) { }
std::string filepath;
int faceIndex = 0;
};
//------------------------------------------------------------------------
struct UCharFontSearchResult
{
UCharFontSearchResult() = default;
UCharFontSearchResult(const std::string &filepathA, int faceIndexA, const std::string &familyA, const std::string &styleA) : filepath(filepathA), faceIndex(faceIndexA), family(familyA), style(styleA) { }
const std::string filepath;
const int faceIndex = 0;
const std::string family;
const std::string style;
};
//------------------------------------------------------------------------
class POPPLER_PRIVATE_EXPORT GlobalParams
{
public:
// Initialize the global parameters
explicit GlobalParams(const char *customPopplerDataDir = nullptr);
~GlobalParams();
GlobalParams(const GlobalParams &) = delete;
GlobalParams &operator=(const GlobalParams &) = delete;
void setupBaseFonts(const char *dir);
//----- accessors
CharCode getMacRomanCharCode(const char *charName);
// Return Unicode values for character names. Used for general text
// extraction.
Unicode mapNameToUnicodeText(const char *charName);
// Return Unicode values for character names. Used for glyph
// lookups or text extraction with ZapfDingbats fonts.
Unicode mapNameToUnicodeAll(const char *charName);
UnicodeMap *getResidentUnicodeMap(const std::string &encodingName);
FILE *getUnicodeMapFile(const std::string &encodingName);
FILE *findCMapFile(const GooString *collection, const GooString *cMapName);
FILE *findToUnicodeFile(const GooString *name);
std::optional<std::string> findFontFile(const std::string &fontName);
std::optional<std::string> findBase14FontFile(const GooString *base14Name, const GfxFont *font, GooString *substituteFontName = nullptr);
std::optional<std::string> findSystemFontFile(const GfxFont *font, SysFontType *type, int *fontNum, GooString *substituteFontName = nullptr, const GooString *base14Name = nullptr);
FamilyStyleFontSearchResult findSystemFontFileForFamilyAndStyle(const std::string &fontFamily, const std::string &fontStyle, const std::vector<std::string> &filesToIgnore = {});
UCharFontSearchResult findSystemFontFileForUChar(Unicode uChar, const GfxFont &fontToEmulate);
std::string getTextEncodingName() const;
bool getPrintCommands();
bool getProfileCommands();
bool getErrQuiet();
std::shared_ptr<CharCodeToUnicode> getCIDToUnicode(const GooString *collection);
const UnicodeMap *getUnicodeMap(const std::string &encodingName);
std::shared_ptr<CMap> getCMap(const GooString *collection, const GooString *cMapName);
const UnicodeMap *getTextEncoding();
const UnicodeMap *getUtf8Map();
std::vector<std::string> getEncodingNames();
//----- functions to set parameters
void addFontFile(const std::string &fontName, const std::string &path);
void setTextEncoding(const char *encodingName);
void setPrintCommands(bool printCommandsA);
void setProfileCommands(bool profileCommandsA);
void setErrQuiet(bool errQuietA);
#ifdef ANDROID
static void setFontDir(const std::string &fontDir);
#endif
static bool parseYesNo2(const char *token, bool *flag);
private:
void parseNameToUnicode(const GooString *name);
void scanEncodingDirs();
void addCIDToUnicode(const GooString *collection, const GooString *fileName);
void addUnicodeMap(const GooString *encodingName, const GooString *fileName);
void addCMapDir(const GooString *collection, const GooString *dir);
//----- static tables
NameToCharCode * // mapping from char name to
macRomanReverseMap; // MacRomanEncoding index
//----- user-modifiable settings
NameToCharCode * // mapping from char name to Unicode for ZapfDingbats
nameToUnicodeZapfDingbats;
NameToCharCode * // mapping from char name to Unicode for text
nameToUnicodeText; // extraction
// files for mappings from char collections
// to Unicode, indexed by collection name
std::unordered_map<std::string, std::string> cidToUnicodes;
// mappings from Unicode to char codes,
// indexed by encoding name
std::unordered_map<std::string, UnicodeMap> residentUnicodeMaps;
// files for mappings from Unicode to char
// codes, indexed by encoding name
std::unordered_map<std::string, std::string> unicodeMaps;
// list of CMap dirs, indexed by collection
std::unordered_multimap<std::string, std::string> cMapDirs;
std::vector<GooString *> toUnicodeDirs; // list of ToUnicode CMap dirs
bool baseFontsInitialized;
#ifdef _WIN32
// windows font substitutes (for CID fonts)
std::unordered_map<std::string, std::string> substFiles;
#endif
// font files: font name mapped to path
std::unordered_map<std::string, std::string> fontFiles;
SysFontList *sysFonts; // system fonts
GooString *textEncoding; // encoding (unicodeMap) to use for text
// output
bool printCommands; // print the drawing commands
bool profileCommands; // profile the drawing commands
bool errQuiet; // suppress error messages?
std::unique_ptr<CharCodeToUnicodeCache> cidToUnicodeCache;
std::unique_ptr<CharCodeToUnicodeCache> unicodeToUnicodeCache;
UnicodeMapCache *unicodeMapCache;
CMapCache *cMapCache;
const UnicodeMap *utf8Map;
mutable std::recursive_mutex mutex;
mutable std::recursive_mutex unicodeMapCacheMutex;
mutable std::recursive_mutex cMapCacheMutex;
const char *popplerDataDir;
};
class POPPLER_PRIVATE_EXPORT GlobalParamsIniter
{
public:
explicit GlobalParamsIniter(ErrorCallback errorCallback);
~GlobalParamsIniter();
GlobalParamsIniter(const GlobalParamsIniter &) = delete;
GlobalParamsIniter &operator=(const GlobalParamsIniter &) = delete;
static bool setCustomDataDir(const std::string &dir);
private:
static std::mutex mutex;
static int count;
static std::string customDataDir;
};
#endif