summaryrefslogtreecommitdiff
path: root/xfa/fxfa/cxfa_textlayout.h
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/fxfa/cxfa_textlayout.h')
-rw-r--r--xfa/fxfa/cxfa_textlayout.h136
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_