1// Copyright 2016 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#ifndef CORE_FXGE_CFX_FONTMAPPER_H_
8#define CORE_FXGE_CFX_FONTMAPPER_H_
9
10#include <memory>
11#include <utility>
12#include <vector>
13
14#include "core/fxge/fx_font.h"
15
16class CFX_FontMgr;
17class CFX_SubstFont;
18class IFX_SystemFontInfo;
19
20class CFX_FontMapper {
21 public:
22  explicit CFX_FontMapper(CFX_FontMgr* mgr);
23  ~CFX_FontMapper();
24
25  void SetSystemFontInfo(std::unique_ptr<IFX_SystemFontInfo> pFontInfo);
26  IFX_SystemFontInfo* GetSystemFontInfo() { return m_pFontInfo.get(); }
27  void AddInstalledFont(const ByteString& name, int charset);
28  void LoadInstalledFonts();
29
30  FXFT_Face FindSubstFont(const ByteString& face_name,
31                          bool bTrueType,
32                          uint32_t flags,
33                          int weight,
34                          int italic_angle,
35                          int CharsetCP,
36                          CFX_SubstFont* pSubstFont);
37#ifdef PDF_ENABLE_XFA
38  FXFT_Face FindSubstFontByUnicode(uint32_t dwUnicode,
39                                   uint32_t flags,
40                                   int weight,
41                                   int italic_angle);
42#endif  // PDF_ENABLE_XFA
43  bool IsBuiltinFace(const FXFT_Face face) const;
44  int GetFaceSize() const;
45  ByteString GetFaceName(int index) const { return m_FaceArray[index].name; }
46
47  std::vector<ByteString> m_InstalledTTFonts;
48  std::vector<std::pair<ByteString, ByteString>> m_LocalizedTTFonts;
49
50 private:
51  static const size_t MM_FACE_COUNT = 2;
52  static const size_t FOXIT_FACE_COUNT = 14;
53
54  ByteString GetPSNameFromTT(void* hFont);
55  ByteString MatchInstalledFonts(const ByteString& norm_name);
56  FXFT_Face UseInternalSubst(CFX_SubstFont* pSubstFont,
57                             int iBaseFont,
58                             int italic_angle,
59                             int weight,
60                             int picthfamily);
61  FXFT_Face GetCachedTTCFace(void* hFont,
62                             const uint32_t tableTTCF,
63                             uint32_t ttc_size,
64                             uint32_t font_size);
65  FXFT_Face GetCachedFace(void* hFont,
66                          ByteString SubstName,
67                          int weight,
68                          bool bItalic,
69                          uint32_t font_size);
70
71  struct FaceData {
72    ByteString name;
73    uint32_t charset;
74  };
75
76  bool m_bListLoaded;
77  FXFT_Face m_MMFaces[MM_FACE_COUNT];
78  ByteString m_LastFamily;
79  std::vector<FaceData> m_FaceArray;
80  std::unique_ptr<IFX_SystemFontInfo> m_pFontInfo;
81  FXFT_Face m_FoxitFaces[FOXIT_FACE_COUNT];
82  UnownedPtr<CFX_FontMgr> const m_pFontMgr;
83};
84
85#endif  // CORE_FXGE_CFX_FONTMAPPER_H_
86