// 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_FONT_FONT_INT_H_ #define CORE_FPDFAPI_FONT_FONT_INT_H_ #include #include #include #include "core/fpdfapi/font/cpdf_cidfont.h" #include "core/fxcrt/cfx_retain_ptr.h" #include "core/fxcrt/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(); CFX_RetainPtr GetPredefinedCMap(const CFX_ByteString& name, bool bPromptCJK); CPDF_CID2UnicodeMap* GetCID2UnicodeMap(CIDSet charset, bool bPromptCJK); private: CFX_RetainPtr LoadPredefinedCMap(const CFX_ByteString& name, bool bPromptCJK); std::unique_ptr LoadCID2UnicodeMap(CIDSet charset, bool bPromptCJK); std::map> m_CMaps; std::unique_ptr m_CID2UnicodeMaps[6]; }; class CFX_StockFontArray { public: CFX_StockFontArray(); ~CFX_StockFontArray(); // Takes ownership of |pFont|, returns unowned pointer to it. CPDF_Font* SetFont(uint32_t index, std::unique_ptr 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|, returns unowned pointer to it. CPDF_Font* Set(CPDF_Document* key, uint32_t index, std::unique_ptr 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(); void 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]; std::vector 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 CFX_Retainable { public: enum CodingScheme : uint8_t { OneByte, TwoBytes, MixedTwoBytes, MixedFourBytes }; template friend CFX_RetainPtr pdfium::MakeRetain(Args&&... args); void LoadPredefined(CPDF_CMapManager* pMgr, const CFX_ByteString& name, bool bPromptCJK); void LoadEmbedded(const uint8_t* pData, uint32_t dwSize); bool IsLoaded() const; bool IsVertWriting() const; uint16_t CIDFromCharCode(uint32_t charcode) const; int GetCharSize(uint32_t charcode) const; uint32_t GetNextChar(const char* pString, int nStrLen, int& offset) const; int CountChar(const char* pString, int size) const; int AppendChar(char* str, uint32_t charcode) const; private: friend class CPDF_CMapParser; friend class CPDF_CIDFont; CPDF_CMap(); ~CPDF_CMap() override; CFX_ByteString m_PredefinedCMap; 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; bool m_bLoaded; const FXCMAP_CMap* m_pEmbedMap; }; class CPDF_CID2UnicodeMap { public: CPDF_CID2UnicodeMap(); ~CPDF_CID2UnicodeMap(); bool IsLoaded(); void Load(CPDF_CMapManager* pMgr, CIDSet charset, bool bPromptCJK); wchar_t 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(wchar_t 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); uint32_t GetUnicode(); std::map m_Map; CPDF_CID2UnicodeMap* m_pBaseMap; CFX_WideTextBuf m_MultiCharBuf; }; #endif // CORE_FPDFAPI_FONT_FONT_INT_H_