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