diff options
Diffstat (limited to 'core/fpdfapi/font/font_int.h')
-rw-r--r-- | core/fpdfapi/font/font_int.h | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/core/fpdfapi/font/font_int.h b/core/fpdfapi/font/font_int.h new file mode 100644 index 0000000000..10c2dcada4 --- /dev/null +++ b/core/fpdfapi/font/font_int.h @@ -0,0 +1,204 @@ +// 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 <map> +#include <memory> + +#include "core/fpdfapi/font/cpdf_cidfont.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(); + + CPDF_CMap* GetPredefinedCMap(const CFX_ByteString& name, bool bPromptCJK); + CPDF_CID2UnicodeMap* GetCID2UnicodeMap(CIDSet charset, bool bPromptCJK); + + private: + CPDF_CMap* LoadPredefinedCMap(const CFX_ByteString& name, bool bPromptCJK); + CPDF_CID2UnicodeMap* LoadCID2UnicodeMap(CIDSet charset, bool bPromptCJK); + + std::map<CFX_ByteString, CPDF_CMap*> m_CMaps; + CPDF_CID2UnicodeMap* 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<CPDF_Font> pFont); + CPDF_Font* GetFont(uint32_t index) const; + + private: + std::unique_ptr<CPDF_Font> 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<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<CPDF_Document*, std::unique_ptr<CFX_StockFontArray>> 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]; + CFX_ArrayTemplate<CMap_CodeRange> 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(); + + 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 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; + 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); + 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<uint32_t, uint32_t> m_Map; + CPDF_CID2UnicodeMap* m_pBaseMap; + CFX_WideTextBuf m_MultiCharBuf; +}; + +#endif // CORE_FPDFAPI_FONT_FONT_INT_H_ |