diff options
Diffstat (limited to 'xfa/fxfa/cxfa_textlayout.h')
-rw-r--r-- | xfa/fxfa/cxfa_textlayout.h | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/xfa/fxfa/cxfa_textlayout.h b/xfa/fxfa/cxfa_textlayout.h new file mode 100644 index 0000000000..079fff8fe2 --- /dev/null +++ b/xfa/fxfa/cxfa_textlayout.h @@ -0,0 +1,136 @@ +// Copyright 2017 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 XFA_FXFA_CXFA_TEXTLAYOUT_H_ +#define XFA_FXFA_CXFA_TEXTLAYOUT_H_ + +#include <memory> +#include <vector> + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "xfa/fde/css/fde_css.h" +#include "xfa/fgas/layout/cfx_rtfbreak.h" +#include "xfa/fxfa/cxfa_textparser.h" + +class CFDE_Brush; +class CFDE_CSSComputedStyle; +class CFDE_Pen; +class CFDE_RenderDevice; +class CFX_XMLNode; +class CFX_RTFBreak; +class CXFA_LoaderContext; +class CXFA_LinkUserData; +class CXFA_Node; +class CXFA_PieceLine; +class CXFA_TextProvider; +class CXFA_TextTabstopsContext; +class CXFA_TextPiece; + +class CXFA_TextLayout { + public: + explicit CXFA_TextLayout(CXFA_TextProvider* pTextProvider); + ~CXFA_TextLayout(); + + int32_t GetText(CFX_WideString& wsText); + float GetLayoutHeight(); + float StartLayout(float fWidth = -1); + bool DoLayout(int32_t iBlockIndex, + float& fCalcHeight, + float fContentAreaHeight = -1, + float fTextHeight = -1); + + bool CalcSize(const CFX_SizeF& minSize, + const CFX_SizeF& maxSize, + CFX_SizeF& defaultSize); + bool Layout(const CFX_SizeF& size, float* fHeight = nullptr); + void ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex); + bool DrawString(CFX_RenderDevice* pFxDevice, + const CFX_Matrix& tmDoc2Device, + const CFX_RectF& rtClip, + int32_t iBlock = 0); + bool IsLoaded() const { return !m_pieceLines.empty(); } + void Unload(); + const std::vector<std::unique_ptr<CXFA_PieceLine>>* GetPieceLines() const { + return &m_pieceLines; + } + + bool m_bHasBlock; + std::vector<int32_t> m_Blocks; + + private: + void GetTextDataNode(); + CFX_XMLNode* GetXMLContainerNode(); + std::unique_ptr<CFX_RTFBreak> CreateBreak(bool bDefault); + void InitBreak(float fLineWidth); + void InitBreak(CFDE_CSSComputedStyle* pStyle, + FDE_CSSDisplay eDisplay, + float fLineWidth, + CFX_XMLNode* pXMLNode, + CFDE_CSSComputedStyle* pParentStyle = nullptr); + bool Loader(const CFX_SizeF& szText, + float& fLinePos, + bool bSavePieces = true); + void LoadText(CXFA_Node* pNode, + const CFX_SizeF& szText, + float& fLinePos, + bool bSavePieces); + bool LoadRichText(CFX_XMLNode* pXMLNode, + const CFX_SizeF& szText, + float& fLinePos, + const CFX_RetainPtr<CFDE_CSSComputedStyle>& pParentStyle, + bool bSavePieces, + CFX_RetainPtr<CXFA_LinkUserData> pLinkData, + bool bEndBreak = true, + bool bIsOl = false, + int32_t iLiCount = 0); + bool AppendChar(const CFX_WideString& wsText, + float& fLinePos, + float fSpaceAbove, + bool bSavePieces); + void AppendTextLine(CFX_BreakType dwStatus, + float& fLinePos, + bool bSavePieces, + bool bEndBreak = false); + void EndBreak(CFX_BreakType dwStatus, float& fLinePos, bool bDefault); + bool IsEnd(bool bSavePieces); + void ProcessText(CFX_WideString& wsText); + void UpdateAlign(float fHeight, float fBottom); + void RenderString(CFDE_RenderDevice* pDevice, + CFDE_Brush* pBrush, + CXFA_PieceLine* pPieceLine, + int32_t iPiece, + FXTEXT_CHARPOS* pCharPos, + const CFX_Matrix& tmDoc2Device); + void RenderPath(CFDE_RenderDevice* pDevice, + CFDE_Pen* pPen, + CXFA_PieceLine* pPieceLine, + int32_t iPiece, + FXTEXT_CHARPOS* pCharPos, + const CFX_Matrix& tmDoc2Device); + int32_t GetDisplayPos(const CXFA_TextPiece* pPiece, + FXTEXT_CHARPOS* pCharPos, + bool bCharCode = false); + bool ToRun(const CXFA_TextPiece* pPiece, FX_RTFTEXTOBJ* tr); + void DoTabstops(CFDE_CSSComputedStyle* pStyle, CXFA_PieceLine* pPieceLine); + bool Layout(int32_t iBlock); + int32_t CountBlocks() const; + + CXFA_TextProvider* m_pTextProvider; + CXFA_Node* m_pTextDataNode; + bool m_bRichText; + std::unique_ptr<CFX_RTFBreak> m_pBreak; + std::unique_ptr<CXFA_LoaderContext> m_pLoader; + int32_t m_iLines; + float m_fMaxWidth; + CXFA_TextParser m_textParser; + std::vector<std::unique_ptr<CXFA_PieceLine>> m_pieceLines; + std::unique_ptr<CXFA_TextTabstopsContext> m_pTabstopContext; + bool m_bBlockContinue; +}; + +#endif // XFA_FXFA_CXFA_TEXTLAYOUT_H_ |