1// Copyright 2017 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_FONT_H_
8#define CORE_FXGE_CFX_FONT_H_
9
10#include <memory>
11#include <vector>
12
13#include "core/fxcrt/bytestring.h"
14#include "core/fxcrt/fx_coordinates.h"
15#include "core/fxcrt/unowned_ptr.h"
16#include "core/fxge/fx_freetype.h"
17
18#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_
19#include "core/fxge/fx_font.h"
20#endif
21
22class CFX_FaceCache;
23class CFX_GlyphBitmap;
24class CFX_PathData;
25class CFX_SubstFont;
26class IFX_SeekableReadStream;
27
28class CFX_Font {
29 public:
30  CFX_Font();
31  ~CFX_Font();
32
33  void LoadSubst(const ByteString& face_name,
34                 bool bTrueType,
35                 uint32_t flags,
36                 int weight,
37                 int italic_angle,
38                 int CharsetCP,
39                 bool bVertical);
40
41  bool LoadEmbedded(const uint8_t* data, uint32_t size);
42  FXFT_Face GetFace() const { return m_Face; }
43  CFX_SubstFont* GetSubstFont() const { return m_pSubstFont.get(); }
44
45#ifdef PDF_ENABLE_XFA
46  bool LoadFile(const RetainPtr<IFX_SeekableReadStream>& pFile, int nFaceIndex);
47
48  void SetFace(FXFT_Face face);
49  void SetSubstFont(std::unique_ptr<CFX_SubstFont> subst);
50#endif  // PDF_ENABLE_XFA
51
52  const CFX_GlyphBitmap* LoadGlyphBitmap(uint32_t glyph_index,
53                                         bool bFontStyle,
54                                         const CFX_Matrix* pMatrix,
55                                         int dest_width,
56                                         int anti_alias,
57                                         int& text_flags) const;
58  const CFX_PathData* LoadGlyphPath(uint32_t glyph_index, int dest_width) const;
59
60#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_
61  CFX_TypeFace* GetDeviceCache() const;
62#endif
63
64  int GetGlyphWidth(uint32_t glyph_index);
65  int GetAscent() const;
66  int GetDescent() const;
67  bool GetGlyphBBox(uint32_t glyph_index, FX_RECT& bbox);
68  bool IsItalic() const;
69  bool IsBold() const;
70  bool IsFixedWidth() const;
71  bool IsVertical() const { return m_bVertical; }
72  ByteString GetPsName() const;
73  ByteString GetFamilyName() const;
74  ByteString GetFaceName() const;
75  bool IsTTFont() const;
76  bool GetBBox(FX_RECT& bbox);
77  bool IsEmbedded() const { return m_bEmbedded; }
78  uint8_t* GetSubData() const { return m_pGsubData.get(); }
79  void SetSubData(uint8_t* data) { m_pGsubData.reset(data); }
80#if _FX_PLATFORM_ == _FX_PLATFORM_APPLE_
81  void* GetPlatformFont() const { return m_pPlatformFont; }
82  void SetPlatformFont(void* font) { m_pPlatformFont = font; }
83#endif
84  uint8_t* GetFontData() const { return m_pFontData; }
85  uint32_t GetSize() const { return m_dwSize; }
86  void AdjustMMParams(int glyph_index, int width, int weight) const;
87
88  CFX_PathData* LoadGlyphPathImpl(uint32_t glyph_index, int dest_width) const;
89
90  static const size_t kAngleSkewArraySize = 30;
91  static const char s_AngleSkew[kAngleSkewArraySize];
92  static const size_t kWeightPowArraySize = 100;
93  static const uint8_t s_WeightPow[kWeightPowArraySize];
94  static const uint8_t s_WeightPow_11[kWeightPowArraySize];
95  static const uint8_t s_WeightPow_SHIFTJIS[kWeightPowArraySize];
96
97#ifdef PDF_ENABLE_XFA
98 protected:
99  std::unique_ptr<FXFT_StreamRec> m_pOwnedStream;
100#endif  // PDF_ENABLE_XFA
101
102 private:
103  CFX_FaceCache* GetFaceCache() const;
104#if _FX_PLATFORM_ == _FX_PLATFORM_APPLE_
105  void ReleasePlatformResource();
106#endif  // _FX_PLATFORM_ == _FX_PLATFORM_APPLE_
107  void DeleteFace();
108  void ClearFaceCache();
109
110  FXFT_Face m_Face;
111  mutable UnownedPtr<CFX_FaceCache> m_FaceCache;
112  std::unique_ptr<CFX_SubstFont> m_pSubstFont;
113  std::vector<uint8_t> m_pFontDataAllocation;
114  uint8_t* m_pFontData;
115  std::unique_ptr<uint8_t, FxFreeDeleter> m_pGsubData;
116  uint32_t m_dwSize;
117#if _FX_PLATFORM_ == _FX_PLATFORM_APPLE_
118  void* m_pPlatformFont;
119#endif
120  bool m_bEmbedded;
121  bool m_bVertical;
122};
123
124#endif  // CORE_FXGE_CFX_FONT_H_
125