// Copyright 2016 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_FPDFDOC_INCLUDE_CPDF_VARIABLETEXT_H_ #define CORE_FPDFDOC_INCLUDE_CPDF_VARIABLETEXT_H_ #include "core/fpdfdoc/cpvt_floatrect.h" #include "core/fpdfdoc/cpvt_lineinfo.h" #include "core/fpdfdoc/include/cpvt_line.h" #include "core/fpdfdoc/include/cpvt_wordplace.h" #include "core/fpdfdoc/include/cpvt_wordrange.h" #include "core/fpdfdoc/pdf_vt.h" #include "core/fxcrt/include/fx_coordinates.h" #include "core/fxcrt/include/fx_string.h" #include "core/fxcrt/include/fx_system.h" class CSection; class IPVT_FontMap; struct CPVT_SecProps; struct CPVT_Section; struct CPVT_SectionInfo; struct CPVT_Word; struct CPVT_WordInfo; struct CPVT_WordProps; #define VARIABLETEXT_HALF 0.5f class CPDF_VariableText : private CPDF_EditContainer { public: enum class ScriptType { Normal, Super, Sub }; class Iterator { public: explicit Iterator(CPDF_VariableText* pVT); ~Iterator(); FX_BOOL NextWord(); FX_BOOL PrevWord(); FX_BOOL NextLine(); FX_BOOL PrevLine(); FX_BOOL NextSection(); FX_BOOL PrevSection(); FX_BOOL SetWord(const CPVT_Word& word); FX_BOOL GetWord(CPVT_Word& word) const; FX_BOOL GetLine(CPVT_Line& line) const; FX_BOOL GetSection(CPVT_Section& section) const; FX_BOOL SetSection(const CPVT_Section& section); void SetAt(int32_t nWordIndex); void SetAt(const CPVT_WordPlace& place); const CPVT_WordPlace& GetAt() const { return m_CurPos; } private: CPVT_WordPlace m_CurPos; CPDF_VariableText* const m_pVT; }; class Provider { public: explicit Provider(IPVT_FontMap* pFontMap); virtual ~Provider(); virtual int32_t GetCharWidth(int32_t nFontIndex, uint16_t word, int32_t nWordStyle); virtual int32_t GetTypeAscent(int32_t nFontIndex); virtual int32_t GetTypeDescent(int32_t nFontIndex); virtual int32_t GetWordFontIndex(uint16_t word, int32_t charset, int32_t nFontIndex); virtual FX_BOOL IsLatinWord(uint16_t word); virtual int32_t GetDefaultFontIndex(); private: IPVT_FontMap* m_pFontMap; }; CPDF_VariableText(); ~CPDF_VariableText() override; void SetProvider(CPDF_VariableText::Provider* pProvider); CPDF_VariableText::Iterator* GetIterator(); // CPDF_EditContainer. void SetPlateRect(const CFX_FloatRect& rect) override { CPDF_EditContainer::SetPlateRect(rect); } CFX_FloatRect GetContentRect() const override; const CFX_FloatRect& GetPlateRect() const override { return CPDF_EditContainer::GetPlateRect(); } void SetAlignment(int32_t nFormat = 0) { m_nAlignment = nFormat; } void SetPasswordChar(uint16_t wSubWord = '*') { m_wSubWord = wSubWord; } void SetLimitChar(int32_t nLimitChar = 0) { m_nLimitChar = nLimitChar; } void SetCharSpace(FX_FLOAT fCharSpace = 0.0f) { m_fCharSpace = fCharSpace; } void SetHorzScale(int32_t nHorzScale = 100) { m_nHorzScale = nHorzScale; } void SetMultiLine(FX_BOOL bMultiLine = TRUE) { m_bMultiLine = bMultiLine; } void SetAutoReturn(FX_BOOL bAuto = TRUE) { m_bLimitWidth = bAuto; } void SetFontSize(FX_FLOAT fFontSize) { m_fFontSize = fFontSize; } void SetCharArray(int32_t nCharArray = 0) { m_nCharArray = nCharArray; } void SetAutoFontSize(FX_BOOL bAuto = TRUE) { m_bAutoFontSize = bAuto; } void SetRichText(FX_BOOL bRichText) { m_bRichText = bRichText; } void SetLineLeading(FX_FLOAT fLineLeading) { m_fLineLeading = fLineLeading; } void Initialize(); FX_BOOL IsValid() const { return m_bInitial; } FX_BOOL IsRichText() const { return m_bRichText; } void RearrangeAll(); void RearrangePart(const CPVT_WordRange& PlaceRange); void ResetAll(); void SetText(const FX_WCHAR* text, int32_t charset = 1, const CPVT_SecProps* pSecProps = NULL, const CPVT_WordProps* pWordProps = NULL); CPVT_WordPlace InsertWord(const CPVT_WordPlace& place, uint16_t word, int32_t charset = 1, const CPVT_WordProps* pWordProps = NULL); CPVT_WordPlace InsertSection(const CPVT_WordPlace& place, const CPVT_SecProps* pSecProps = NULL, const CPVT_WordProps* pWordProps = NULL); CPVT_WordPlace InsertText(const CPVT_WordPlace& place, const FX_WCHAR* text, int32_t charset = 1, const CPVT_SecProps* pSecProps = NULL, const CPVT_WordProps* pWordProps = NULL); CPVT_WordPlace DeleteWords(const CPVT_WordRange& PlaceRange); CPVT_WordPlace DeleteWord(const CPVT_WordPlace& place); CPVT_WordPlace BackSpaceWord(const CPVT_WordPlace& place); int32_t GetTotalWords() const; FX_FLOAT GetFontSize() const { return m_fFontSize; } int32_t GetAlignment() const { return m_nAlignment; } uint16_t GetPasswordChar() const { return GetSubWord(); } int32_t GetCharArray() const { return m_nCharArray; } int32_t GetLimitChar() const { return m_nLimitChar; } FX_BOOL IsMultiLine() const { return m_bMultiLine; } int32_t GetHorzScale() const { return m_nHorzScale; } FX_FLOAT GetCharSpace() const { return m_fCharSpace; } CPVT_WordPlace GetBeginWordPlace() const; CPVT_WordPlace GetEndWordPlace() const; CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const; CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const; CPVT_WordPlace SearchWordPlace(const CFX_FloatPoint& point) const; CPVT_WordPlace GetUpWordPlace(const CPVT_WordPlace& place, const CFX_FloatPoint& point) const; CPVT_WordPlace GetDownWordPlace(const CPVT_WordPlace& place, const CFX_FloatPoint& point) const; CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace& place) const; CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace& place) const; CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace& place) const; CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace& place) const; void UpdateWordPlace(CPVT_WordPlace& place) const; CPVT_WordPlace AdjustLineHeader(const CPVT_WordPlace& place, FX_BOOL bPrevOrNext) const; int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const; CPVT_WordPlace WordIndexToWordPlace(int32_t index) const; uint16_t GetSubWord() const { return m_wSubWord; } private: friend class CTypeset; friend class CSection; int32_t GetCharWidth(int32_t nFontIndex, uint16_t Word, uint16_t SubWord, int32_t nWordStyle); int32_t GetTypeAscent(int32_t nFontIndex); int32_t GetTypeDescent(int32_t nFontIndex); int32_t GetWordFontIndex(uint16_t word, int32_t charset, int32_t nFontIndex); int32_t GetDefaultFontIndex(); FX_BOOL IsLatinWord(uint16_t word); CPVT_WordPlace AddSection(const CPVT_WordPlace& place, const CPVT_SectionInfo& secinfo); CPVT_WordPlace AddLine(const CPVT_WordPlace& place, const CPVT_LineInfo& lineinfo); CPVT_WordPlace AddWord(const CPVT_WordPlace& place, const CPVT_WordInfo& wordinfo); FX_BOOL GetWordInfo(const CPVT_WordPlace& place, CPVT_WordInfo& wordinfo); FX_BOOL SetWordInfo(const CPVT_WordPlace& place, const CPVT_WordInfo& wordinfo); FX_BOOL GetLineInfo(const CPVT_WordPlace& place, CPVT_LineInfo& lineinfo); FX_BOOL GetSectionInfo(const CPVT_WordPlace& place, CPVT_SectionInfo& secinfo); FX_FLOAT GetWordFontSize(const CPVT_WordInfo& WordInfo, FX_BOOL bFactFontSize = FALSE); FX_FLOAT GetWordWidth(int32_t nFontIndex, uint16_t Word, uint16_t SubWord, FX_FLOAT fCharSpace, int32_t nHorzScale, FX_FLOAT fFontSize, FX_FLOAT fWordTail, int32_t nWordStyle); FX_FLOAT GetWordWidth(const CPVT_WordInfo& WordInfo); FX_FLOAT GetWordAscent(const CPVT_WordInfo& WordInfo, FX_FLOAT fFontSize); FX_FLOAT GetWordDescent(const CPVT_WordInfo& WordInfo, FX_FLOAT fFontSize); FX_FLOAT GetWordAscent(const CPVT_WordInfo& WordInfo, FX_BOOL bFactFontSize = FALSE); FX_FLOAT GetWordDescent(const CPVT_WordInfo& WordInfo, FX_BOOL bFactFontSize = FALSE); FX_FLOAT GetLineAscent(const CPVT_SectionInfo& SecInfo); FX_FLOAT GetLineDescent(const CPVT_SectionInfo& SecInfo); FX_FLOAT GetFontAscent(int32_t nFontIndex, FX_FLOAT fFontSize); FX_FLOAT GetFontDescent(int32_t nFontIndex, FX_FLOAT fFontSize); int32_t GetWordFontIndex(const CPVT_WordInfo& WordInfo); FX_FLOAT GetCharSpace(const CPVT_WordInfo& WordInfo); int32_t GetHorzScale(const CPVT_WordInfo& WordInfo); FX_FLOAT GetLineLeading(const CPVT_SectionInfo& SecInfo); FX_FLOAT GetLineIndent(const CPVT_SectionInfo& SecInfo); int32_t GetAlignment(const CPVT_SectionInfo& SecInfo); void ClearSectionRightWords(const CPVT_WordPlace& place); FX_BOOL ClearEmptySection(const CPVT_WordPlace& place); void ClearEmptySections(const CPVT_WordRange& PlaceRange); void LinkLatterSection(const CPVT_WordPlace& place); void ClearWords(const CPVT_WordRange& PlaceRange); CPVT_WordPlace ClearLeftWord(const CPVT_WordPlace& place); CPVT_WordPlace ClearRightWord(const CPVT_WordPlace& place); CPVT_FloatRect Rearrange(const CPVT_WordRange& PlaceRange); FX_FLOAT GetAutoFontSize(); FX_BOOL IsBigger(FX_FLOAT fFontSize); CPVT_FloatRect RearrangeSections(const CPVT_WordRange& PlaceRange); void ResetSectionArray(); CPVT_ArrayTemplate m_SectionArray; int32_t m_nLimitChar; int32_t m_nCharArray; FX_BOOL m_bMultiLine; FX_BOOL m_bLimitWidth; FX_BOOL m_bAutoFontSize; int32_t m_nAlignment; FX_FLOAT m_fLineLeading; FX_FLOAT m_fCharSpace; int32_t m_nHorzScale; uint16_t m_wSubWord; FX_FLOAT m_fFontSize; FX_BOOL m_bInitial; FX_BOOL m_bRichText; CPDF_VariableText::Provider* m_pVTProvider; CPDF_VariableText::Iterator* m_pVTIterator; }; #endif // CORE_FPDFDOC_INCLUDE_CPDF_VARIABLETEXT_H_