// Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef CORE_FPDFAPI_FPDF_FONT_FONT_INT_H_ #define CORE_FPDFAPI_FPDF_FONT_FONT_INT_H_ #include #include #include "core/fpdfapi/fpdf_font/cpdf_cidfont.h" #include "core/fxcrt/include/fx_basic.h" class CPDF_CID2UnicodeMap; class CPDF_CMap; class CPDF_Font; class CPDF_Stream; using FXFT_Library = void*; int TT2PDF(int m, FXFT_Face face); bool FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id); CIDSet CharsetFromOrdering(const CFX_ByteStringC& ordering); class CPDF_CMapManager { public: CPDF_CMapManager(); ~CPDF_CMapManager(); void* GetPackage(FX_BOOL bPrompt); CPDF_CMap* GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK); CPDF_CID2UnicodeMap* GetCID2UnicodeMap(CIDSet charset, FX_BOOL bPromptCJK); private: CPDF_CMap* LoadPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK); CPDF_CID2UnicodeMap* LoadCID2UnicodeMap(CIDSet charset, FX_BOOL bPromptCJK); std::map m_CMaps; CPDF_CID2UnicodeMap* m_CID2UnicodeMaps[6]; }; class CFX_StockFontArray { public: CFX_StockFontArray(); ~CFX_StockFontArray(); // Takes ownership of |pFont|. void SetFont(uint32_t index, CPDF_Font* pFont); CPDF_Font* GetFont(uint32_t index) const; private: std::unique_ptr m_StockFonts[14]; }; class CPDF_FontGlobals { public: CPDF_FontGlobals(); ~CPDF_FontGlobals(); void Clear(CPDF_Document* pDoc); CPDF_Font* Find(CPDF_Document* pDoc, uint32_t index); // Takes ownership of |pFont|. void Set(CPDF_Document* key, uint32_t index, CPDF_Font* pFont); CPDF_CMapManager m_CMapManager; struct { const struct FXCMAP_CMap* m_pMapList; uint32_t m_Count; } m_EmbeddedCharsets[CIDSET_NUM_SETS]; struct { const uint16_t* m_pMap; uint32_t m_Count; } m_EmbeddedToUnicodes[CIDSET_NUM_SETS]; private: std::map> m_StockMap; }; struct CMap_CodeRange { int m_CharSize; uint8_t m_Lower[4]; uint8_t m_Upper[4]; }; class CPDF_CMapParser { public: CPDF_CMapParser(); ~CPDF_CMapParser(); FX_BOOL Initialize(CPDF_CMap* pMap); void ParseWord(const CFX_ByteStringC& str); CFX_BinaryBuf m_AddMaps; private: friend class fpdf_font_cid_CMap_GetCode_Test; friend class fpdf_font_cid_CMap_GetCodeRange_Test; static uint32_t CMap_GetCode(const CFX_ByteStringC& word); static bool CMap_GetCodeRange(CMap_CodeRange& range, const CFX_ByteStringC& first, const CFX_ByteStringC& second); CPDF_CMap* m_pCMap; int m_Status; int m_CodeSeq; uint32_t m_CodePoints[4]; CFX_ArrayTemplate m_CodeRanges; CFX_ByteString m_LastWord; }; enum CIDCoding : uint8_t { CIDCODING_UNKNOWN = 0, CIDCODING_GB, CIDCODING_BIG5, CIDCODING_JIS, CIDCODING_KOREA, CIDCODING_UCS2, CIDCODING_CID, CIDCODING_UTF16, }; class CPDF_CMap { public: enum CodingScheme : uint8_t { OneByte, TwoBytes, MixedTwoBytes, MixedFourBytes }; CPDF_CMap(); ~CPDF_CMap(); FX_BOOL LoadPredefined(CPDF_CMapManager* pMgr, const CFX_ByteString& name, FX_BOOL bPromptCJK); FX_BOOL LoadEmbedded(const uint8_t* pData, uint32_t dwSize); FX_BOOL IsLoaded() const; FX_BOOL IsVertWriting() const; uint16_t CIDFromCharCode(uint32_t charcode) const; int GetCharSize(uint32_t charcode) const; uint32_t GetNextChar(const FX_CHAR* pString, int nStrLen, int& offset) const; int CountChar(const FX_CHAR* pString, int size) const; int AppendChar(FX_CHAR* str, uint32_t charcode) const; private: friend class CPDF_CMapParser; friend class CPDF_CIDFont; CFX_ByteString m_PredefinedCMap; FX_BOOL m_bVertical; CIDSet m_Charset; int m_Coding; CodingScheme m_CodingScheme; int m_nCodeRanges; uint8_t* m_pLeadingBytes; uint16_t* m_pMapping; uint8_t* m_pAddMapping; FX_BOOL m_bLoaded; const FXCMAP_CMap* m_pEmbedMap; }; class CPDF_CID2UnicodeMap { public: CPDF_CID2UnicodeMap(); ~CPDF_CID2UnicodeMap(); FX_BOOL Initialize(); FX_BOOL IsLoaded(); void Load(CPDF_CMapManager* pMgr, CIDSet charset, FX_BOOL bPromptCJK); FX_WCHAR UnicodeFromCID(uint16_t CID); private: CIDSet m_Charset; const uint16_t* m_pEmbeddedMap; uint32_t m_EmbeddedCount; }; class CPDF_ToUnicodeMap { public: CPDF_ToUnicodeMap(); ~CPDF_ToUnicodeMap(); void Load(CPDF_Stream* pStream); CFX_WideString Lookup(uint32_t charcode) const; uint32_t ReverseLookup(FX_WCHAR unicode) const; private: friend class fpdf_font_StringToCode_Test; friend class fpdf_font_StringToWideString_Test; static uint32_t StringToCode(const CFX_ByteStringC& str); static CFX_WideString StringToWideString(const CFX_ByteStringC& str); std::map m_Map; CPDF_CID2UnicodeMap* m_pBaseMap; CFX_WideTextBuf m_MultiCharBuf; }; #endif // CORE_FPDFAPI_FPDF_FONT_FONT_INT_H_