diff options
Diffstat (limited to 'xfa/fxfa/app/cxfa_textlayout.h')
-rw-r--r-- | xfa/fxfa/app/cxfa_textlayout.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/xfa/fxfa/app/cxfa_textlayout.h b/xfa/fxfa/app/cxfa_textlayout.h new file mode 100644 index 0000000000..e21a5de424 --- /dev/null +++ b/xfa/fxfa/app/cxfa_textlayout.h @@ -0,0 +1,135 @@ +// 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_APP_CXFA_TEXTLAYOUT_H_ +#define XFA_FXFA_APP_CXFA_TEXTLAYOUT_H_ + +#include <memory> + +#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/fgas_rtfbreak.h" +#include "xfa/fxfa/app/cxfa_textparser.h" + +class CFDE_Brush; +class CFDE_Pen; +class CFDE_RenderDevice; +class CFDE_XMLNode; +class CFX_RTFBreak; +class CXFA_LoaderContext; +class CXFA_LinkUserData; +class CXFA_Node; +class CXFA_PieceLine; +class CXFA_TextProvider; +class CXFA_TextTabstopsContext; +class IFDE_CSSComputedStyle; +class IFX_MemoryAllocator; +class XFA_TextPiece; + +class CXFA_TextLayout { + public: + explicit CXFA_TextLayout(CXFA_TextProvider* pTextProvider); + ~CXFA_TextLayout(); + + int32_t GetText(CFX_WideString& wsText); + FX_FLOAT GetLayoutHeight(); + FX_FLOAT StartLayout(FX_FLOAT fWidth = -1); + bool DoLayout(int32_t iBlockIndex, + FX_FLOAT& fCalcHeight, + FX_FLOAT fContentAreaHeight = -1, + FX_FLOAT fTextHeight = -1); + + bool CalcSize(const CFX_SizeF& minSize, + const CFX_SizeF& maxSize, + CFX_SizeF& defaultSize); + bool Layout(const CFX_SizeF& size, FX_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.GetSize() > 0; } + void Unload(); + const CFX_ArrayTemplate<CXFA_PieceLine*>* GetPieceLines(); + + bool m_bHasBlock; + CFX_Int32Array m_Blocks; + + private: + void GetTextDataNode(); + CFDE_XMLNode* GetXMLContainerNode(); + CFX_RTFBreak* CreateBreak(bool bDefault); + void InitBreak(FX_FLOAT fLineWidth); + void InitBreak(IFDE_CSSComputedStyle* pStyle, + FDE_CSSDISPLAY eDisplay, + FX_FLOAT fLineWidth, + CFDE_XMLNode* pXMLNode, + IFDE_CSSComputedStyle* pParentStyle = nullptr); + bool Loader(const CFX_SizeF& szText, + FX_FLOAT& fLinePos, + bool bSavePieces = true); + void LoadText(CXFA_Node* pNode, + const CFX_SizeF& szText, + FX_FLOAT& fLinePos, + bool bSavePieces); + bool LoadRichText(CFDE_XMLNode* pXMLNode, + const CFX_SizeF& szText, + FX_FLOAT& fLinePos, + IFDE_CSSComputedStyle* pParentStyle, + bool bSavePieces, + CXFA_LinkUserData* pLinkData = nullptr, + bool bEndBreak = true, + bool bIsOl = false, + int32_t iLiCount = 0); + bool AppendChar(const CFX_WideString& wsText, + FX_FLOAT& fLinePos, + FX_FLOAT fSpaceAbove, + bool bSavePieces); + void AppendTextLine(uint32_t dwStatus, + FX_FLOAT& fLinePos, + bool bSavePieces, + bool bEndBreak = false); + void EndBreak(uint32_t dwStatus, FX_FLOAT& fLinePos, bool bDefault); + bool IsEnd(bool bSavePieces); + void ProcessText(CFX_WideString& wsText); + void UpdateAlign(FX_FLOAT fHeight, FX_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 XFA_TextPiece* pPiece, + FXTEXT_CHARPOS* pCharPos, + bool bCharCode = false); + bool ToRun(const XFA_TextPiece* pPiece, FX_RTFTEXTOBJ& tr); + void DoTabstops(IFDE_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<IFX_MemoryAllocator> m_pAllocator; + std::unique_ptr<CFX_RTFBreak> m_pBreak; + std::unique_ptr<CXFA_LoaderContext> m_pLoader; + int32_t m_iLines; + FX_FLOAT m_fMaxWidth; + CXFA_TextParser m_textParser; + CFX_ArrayTemplate<CXFA_PieceLine*> m_pieceLines; + std::unique_ptr<CXFA_TextTabstopsContext> m_pTabstopContext; + bool m_bBlockContinue; +}; + +#endif // XFA_FXFA_APP_CXFA_TEXTLAYOUT_H_ |