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_FPDFDOC_CPDF_VARIABLETEXT_H_ 8 #define CORE_FPDFDOC_CPDF_VARIABLETEXT_H_ 9 10 #include <memory> 11 #include <vector> 12 13 #include "core/fpdfdoc/cpvt_floatrect.h" 14 #include "core/fpdfdoc/cpvt_line.h" 15 #include "core/fpdfdoc/cpvt_lineinfo.h" 16 #include "core/fpdfdoc/cpvt_wordplace.h" 17 #include "core/fpdfdoc/cpvt_wordrange.h" 18 #include "core/fxcrt/fx_coordinates.h" 19 #include "core/fxcrt/fx_string.h" 20 #include "core/fxcrt/fx_system.h" 21 22 class CPVT_Word; 23 class CSection; 24 class IPVT_FontMap; 25 struct CPVT_WordInfo; 26 27 #define VARIABLETEXT_HALF 0.5f 28 29 class CPDF_VariableText { 30 public: 31 32 class Iterator { 33 public: 34 explicit Iterator(CPDF_VariableText* pVT); 35 ~Iterator(); 36 37 bool NextWord(); 38 bool PrevWord(); 39 bool NextLine(); 40 bool GetWord(CPVT_Word& word) const; 41 bool GetLine(CPVT_Line& line) const; 42 void SetAt(int32_t nWordIndex); 43 void SetAt(const CPVT_WordPlace& place); GetWordPlace()44 const CPVT_WordPlace& GetWordPlace() const { return m_CurPos; } 45 46 private: 47 CPVT_WordPlace m_CurPos; 48 UnownedPtr<CPDF_VariableText> const m_pVT; 49 }; 50 51 class Provider { 52 public: 53 explicit Provider(IPVT_FontMap* pFontMap); 54 virtual ~Provider(); 55 56 virtual int32_t GetCharWidth(int32_t nFontIndex, uint16_t word); 57 virtual int32_t GetTypeAscent(int32_t nFontIndex); 58 virtual int32_t GetTypeDescent(int32_t nFontIndex); 59 virtual int32_t GetWordFontIndex(uint16_t word, 60 int32_t charset, 61 int32_t nFontIndex); 62 virtual bool IsLatinWord(uint16_t word); 63 virtual int32_t GetDefaultFontIndex(); 64 65 private: 66 IPVT_FontMap* const m_pFontMap; 67 }; 68 69 CPDF_VariableText(); 70 ~CPDF_VariableText(); 71 72 void SetProvider(CPDF_VariableText::Provider* pProvider); 73 CPDF_VariableText::Iterator* GetIterator(); 74 75 void SetContentRect(const CPVT_FloatRect& rect); 76 CFX_FloatRect GetContentRect() const; 77 void SetPlateRect(const CFX_FloatRect& rect); 78 const CFX_FloatRect& GetPlateRect() const; 79 SetAlignment(int32_t nFormat)80 void SetAlignment(int32_t nFormat) { m_nAlignment = nFormat; } SetPasswordChar(uint16_t wSubWord)81 void SetPasswordChar(uint16_t wSubWord) { m_wSubWord = wSubWord; } SetLimitChar(int32_t nLimitChar)82 void SetLimitChar(int32_t nLimitChar) { m_nLimitChar = nLimitChar; } SetCharSpace(float fCharSpace)83 void SetCharSpace(float fCharSpace) { m_fCharSpace = fCharSpace; } SetMultiLine(bool bMultiLine)84 void SetMultiLine(bool bMultiLine) { m_bMultiLine = bMultiLine; } SetAutoReturn(bool bAuto)85 void SetAutoReturn(bool bAuto) { m_bLimitWidth = bAuto; } SetFontSize(float fFontSize)86 void SetFontSize(float fFontSize) { m_fFontSize = fFontSize; } SetCharArray(int32_t nCharArray)87 void SetCharArray(int32_t nCharArray) { m_nCharArray = nCharArray; } SetAutoFontSize(bool bAuto)88 void SetAutoFontSize(bool bAuto) { m_bAutoFontSize = bAuto; } 89 void Initialize(); 90 IsValid()91 bool IsValid() const { return m_bInitialized; } 92 93 void RearrangeAll(); 94 void RearrangePart(const CPVT_WordRange& PlaceRange); 95 void SetText(const WideString& text); 96 CPVT_WordPlace InsertWord(const CPVT_WordPlace& place, 97 uint16_t word, 98 int32_t charset); 99 CPVT_WordPlace InsertSection(const CPVT_WordPlace& place); 100 CPVT_WordPlace DeleteWords(const CPVT_WordRange& PlaceRange); 101 CPVT_WordPlace DeleteWord(const CPVT_WordPlace& place); 102 CPVT_WordPlace BackSpaceWord(const CPVT_WordPlace& place); 103 104 int32_t GetTotalWords() const; GetFontSize()105 float GetFontSize() const { return m_fFontSize; } GetAlignment()106 int32_t GetAlignment() const { return m_nAlignment; } GetPasswordChar()107 uint16_t GetPasswordChar() const { return GetSubWord(); } GetCharArray()108 int32_t GetCharArray() const { return m_nCharArray; } GetLimitChar()109 int32_t GetLimitChar() const { return m_nLimitChar; } IsMultiLine()110 bool IsMultiLine() const { return m_bMultiLine; } GetHorzScale()111 int32_t GetHorzScale() const { return m_nHorzScale; } GetCharSpace()112 float GetCharSpace() const { return m_fCharSpace; } IsAutoReturn()113 bool IsAutoReturn() const { return m_bLimitWidth; } 114 115 CPVT_WordPlace GetBeginWordPlace() const; 116 CPVT_WordPlace GetEndWordPlace() const; 117 CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const; 118 CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const; 119 CPVT_WordPlace SearchWordPlace(const CFX_PointF& point) const; 120 CPVT_WordPlace GetUpWordPlace(const CPVT_WordPlace& place, 121 const CFX_PointF& point) const; 122 CPVT_WordPlace GetDownWordPlace(const CPVT_WordPlace& place, 123 const CFX_PointF& point) const; 124 CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace& place) const; 125 CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace& place) const; 126 CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace& place) const; 127 CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace& place) const; 128 void UpdateWordPlace(CPVT_WordPlace& place) const; 129 CPVT_WordPlace AdjustLineHeader(const CPVT_WordPlace& place, 130 bool bPrevOrNext) const; 131 int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const; 132 CPVT_WordPlace WordIndexToWordPlace(int32_t index) const; 133 GetSubWord()134 uint16_t GetSubWord() const { return m_wSubWord; } 135 GetPlateWidth()136 float GetPlateWidth() const { return m_rcPlate.right - m_rcPlate.left; } GetPlateHeight()137 float GetPlateHeight() const { return m_rcPlate.top - m_rcPlate.bottom; } 138 CFX_PointF GetBTPoint() const; 139 CFX_PointF GetETPoint() const; 140 141 CFX_PointF InToOut(const CFX_PointF& point) const; 142 CFX_PointF OutToIn(const CFX_PointF& point) const; 143 CFX_FloatRect InToOut(const CPVT_FloatRect& rect) const; 144 CPVT_FloatRect OutToIn(const CFX_FloatRect& rect) const; 145 146 float GetFontAscent(int32_t nFontIndex, float fFontSize); 147 float GetFontDescent(int32_t nFontIndex, float fFontSize); 148 int32_t GetDefaultFontIndex(); 149 float GetLineLeading(); 150 int32_t GetAlignment(); 151 float GetWordWidth(const CPVT_WordInfo& WordInfo); 152 float GetWordWidth(int32_t nFontIndex, 153 uint16_t Word, 154 uint16_t SubWord, 155 float fCharSpace, 156 int32_t nHorzScale, 157 float fFontSize, 158 float fWordTail); 159 float GetWordAscent(const CPVT_WordInfo& WordInfo); 160 float GetWordDescent(const CPVT_WordInfo& WordInfo); 161 float GetWordAscent(const CPVT_WordInfo& WordInfo, float fFontSize); 162 float GetWordDescent(const CPVT_WordInfo& WordInfo, float fFontSize); 163 float GetLineAscent(); 164 float GetLineDescent(); 165 float GetLineIndent(); 166 167 private: 168 int32_t GetCharWidth(int32_t nFontIndex, uint16_t Word, uint16_t SubWord); 169 int32_t GetTypeAscent(int32_t nFontIndex); 170 int32_t GetTypeDescent(int32_t nFontIndex); 171 int32_t GetWordFontIndex(uint16_t word, int32_t charset, int32_t nFontIndex); 172 bool IsLatinWord(uint16_t word); 173 174 CPVT_WordPlace AddSection(const CPVT_WordPlace& place); 175 CPVT_WordPlace AddLine(const CPVT_WordPlace& place, 176 const CPVT_LineInfo& lineinfo); 177 CPVT_WordPlace AddWord(const CPVT_WordPlace& place, 178 const CPVT_WordInfo& wordinfo); 179 bool GetWordInfo(const CPVT_WordPlace& place, CPVT_WordInfo& wordinfo); 180 bool SetWordInfo(const CPVT_WordPlace& place, const CPVT_WordInfo& wordinfo); 181 bool GetLineInfo(const CPVT_WordPlace& place, CPVT_LineInfo& lineinfo); 182 float GetWordFontSize(); 183 int32_t GetWordFontIndex(const CPVT_WordInfo& WordInfo); 184 185 void ClearSectionRightWords(const CPVT_WordPlace& place); 186 187 bool ClearEmptySection(const CPVT_WordPlace& place); 188 void ClearEmptySections(const CPVT_WordRange& PlaceRange); 189 void LinkLatterSection(const CPVT_WordPlace& place); 190 void ClearWords(const CPVT_WordRange& PlaceRange); 191 CPVT_WordPlace ClearLeftWord(const CPVT_WordPlace& place); 192 CPVT_WordPlace ClearRightWord(const CPVT_WordPlace& place); 193 194 CPVT_FloatRect Rearrange(const CPVT_WordRange& PlaceRange); 195 float GetAutoFontSize(); 196 bool IsBigger(float fFontSize) const; 197 CPVT_FloatRect RearrangeSections(const CPVT_WordRange& PlaceRange); 198 199 std::vector<std::unique_ptr<CSection>> m_SectionArray; 200 int32_t m_nLimitChar; 201 int32_t m_nCharArray; 202 bool m_bMultiLine; 203 bool m_bLimitWidth; 204 bool m_bAutoFontSize; 205 int32_t m_nAlignment; 206 float m_fLineLeading; 207 float m_fCharSpace; 208 int32_t m_nHorzScale; 209 uint16_t m_wSubWord; 210 float m_fFontSize; 211 bool m_bInitialized; 212 CPDF_VariableText::Provider* m_pVTProvider; 213 std::unique_ptr<CPDF_VariableText::Iterator> m_pVTIterator; 214 CFX_FloatRect m_rcPlate; 215 CPVT_FloatRect m_rcContent; 216 }; 217 218 #endif // CORE_FPDFDOC_CPDF_VARIABLETEXT_H_ 219