Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
cxfa_textlayout.h
Go to the documentation of this file.
1// Copyright 2017 The PDFium Authors
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 XFA_FXFA_CXFA_TEXTLAYOUT_H_
8#define XFA_FXFA_CXFA_TEXTLAYOUT_H_
9
10#include <memory>
11#include <vector>
12
13#include "core/fxcrt/css/cfx_css.h"
14#include "core/fxcrt/fx_coordinates.h"
15#include "core/fxcrt/retain_ptr.h"
16#include "core/fxcrt/span.h"
17#include "core/fxcrt/unowned_ptr.h"
18#include "core/fxcrt/widestring.h"
19#include "core/fxge/dib/fx_dib.h"
20#include "fxjs/gc/heap.h"
21#include "v8/include/cppgc/garbage-collected.h"
22#include "v8/include/cppgc/member.h"
23#include "v8/include/cppgc/visitor.h"
24#include "xfa/fgas/layout/cfgas_char.h"
25#include "xfa/fgas/layout/cfgas_textpiece.h"
26#include "xfa/fxfa/fxfa_basic.h"
27
28class CFGAS_LinkUserData;
29class CFGAS_RTFBreak;
30class CFX_CSSComputedStyle;
32class CFX_XMLNode;
33class CXFA_FFDoc;
34class CXFA_Node;
35class CXFA_TextParser;
38class TextCharPos;
39
40class CXFA_TextLayout final : public cppgc::GarbageCollected<CXFA_TextLayout> {
41 public:
44
45 void Trace(cppgc::Visitor* visitor) const;
46
47 float GetLayoutHeight();
48 float StartLayout(float fWidth);
49 float DoLayout(float fTextHeight);
50 float DoSplitLayout(size_t szBlockIndex,
51 float fCalcHeight,
52 float fTextHeight);
53 float Layout(const CFX_SizeF& size);
54
55 CFX_SizeF CalcSize(const CFX_SizeF& minSize, const CFX_SizeF& maxSize);
56 void ItemBlocks(const CFX_RectF& rtText, size_t szBlockIndex);
57 bool DrawString(CFX_RenderDevice* pFxDevice,
58 const CFX_Matrix& mtDoc2Device,
59 const CFX_RectF& rtClip,
60 size_t szBlockIndex);
61 bool IsLoaded() const { return !m_pieceLines.empty(); }
62 void Unload();
63 bool HasBlock() const { return m_bHasBlock; }
64 void ClearBlocks() { m_Blocks.clear(); }
65 void ResetHasBlock() { m_bHasBlock = false; }
66
67 // Returns empty string when no link is present.
69
70 private:
71 class TextPiece : public CFGAS_TextPiece {
72 public:
73 TextPiece();
74 ~TextPiece();
75
76 int32_t iUnderline = 0;
77 int32_t iLineThrough = 0;
79 FX_ARGB dwColor = 0;
80 RetainPtr<CFGAS_LinkUserData> pLinkData;
81 };
82
83 class PieceLine {
84 public:
85 PieceLine();
86 ~PieceLine();
87
88 std::vector<std::unique_ptr<TextPiece>> m_textPieces;
89 std::vector<size_t> m_charCounts;
90 };
91
92 struct BlockData {
93 size_t szIndex;
94 size_t szLength;
95 };
96
97 struct BlockHeight {
98 size_t szBlockIndex;
99 float fHeight;
100 };
101
102 struct LoaderContext : public cppgc::GarbageCollected<LoaderContext> {
103 LoaderContext();
104 ~LoaderContext();
105
106 void Trace(cppgc::Visitor* visitor) const;
107
108 bool bSaveLineHeight = false;
109 bool bFilterSpace = false;
110 float fWidth = 0;
111 float fHeight = 0;
112 float fLastPos = 0;
113 float fStartLineOffset = 0;
114 size_t nCharIdx = 0;
115 // TODO(thestig): Make this size_t?
116 int32_t iTotalLines = -1;
117 UnownedPtr<const CFX_XMLNode> pXMLNode;
118 RetainPtr<CFX_CSSComputedStyle> pParentStyle;
119 cppgc::Member<CXFA_Node> pNode;
120 std::vector<float> lineHeights;
121 std::vector<BlockHeight> blockHeights;
122 };
123
124 CXFA_TextLayout(CXFA_FFDoc* doc, CXFA_TextProvider* pTextProvider);
125
126 void GetTextDataNode();
127 CFX_XMLNode* GetXMLContainerNode();
128 std::unique_ptr<CFGAS_RTFBreak> CreateBreak(bool bDefault);
129 void InitBreak(float fLineWidth);
130 void InitBreak(CFX_CSSComputedStyle* pStyle,
131 CFX_CSSDisplay eDisplay,
132 float fLineWidth,
133 const CFX_XMLNode* pXMLNode,
134 CFX_CSSComputedStyle* pParentStyle);
135 void Loader(float textWidth, float* pLinePos, bool bSavePieces);
136 void LoadText(CXFA_Node* pNode,
137 float textWidth,
138 float* pLinePos,
139 bool bSavePieces);
140 bool LoadRichText(const CFX_XMLNode* pXMLNode,
141 float textWidth,
142 float* pLinePos,
143 RetainPtr<CFX_CSSComputedStyle> pParentStyle,
144 bool bSavePieces,
145 RetainPtr<CFGAS_LinkUserData> pLinkData,
146 bool bEndBreak,
147 bool bIsOl,
148 int32_t iLiCount);
149 bool AppendChar(const WideString& wsText,
150 float* pLinePos,
151 float fSpaceAbove,
152 bool bSavePieces);
153 void AppendTextLine(CFGAS_Char::BreakType dwStatus,
154 float* pLinePos,
155 bool bSavePieces,
156 bool bEndBreak);
157 void EndBreak(CFGAS_Char::BreakType dwStatus, float* pLinePos, bool bDefault);
158 bool IsEnd(bool bSavePieces);
159 void UpdateAlign(float fHeight, float fBottom);
160 void RenderString(CFX_RenderDevice* pDevice,
161 PieceLine* pPieceLine,
162 size_t szPiece,
163 pdfium::span<TextCharPos> pCharPos,
164 const CFX_Matrix& mtDoc2Device);
165 void RenderPath(CFX_RenderDevice* pDevice,
166 const PieceLine* pPieceLine,
167 size_t szPiece,
168 pdfium::span<TextCharPos> pCharPos,
169 const CFX_Matrix& mtDoc2Device);
170 size_t GetDisplayPos(const TextPiece* pPiece,
171 pdfium::span<TextCharPos> pCharPos);
172 void DoTabstops(CFX_CSSComputedStyle* pStyle, PieceLine* pPieceLine);
173 bool LayoutInternal(size_t szBlockIndex);
174 size_t CountBlocks() const;
175 size_t GetNextIndexFromLastBlockData() const;
176 void UpdateLoaderHeight(float fTextHeight);
177
178 bool m_bHasBlock = false;
179 bool m_bRichText = false;
180 int32_t m_iLines = 0;
181 float m_fMaxWidth = 0;
182 std::vector<BlockData> m_Blocks;
183 cppgc::Member<CXFA_FFDoc> const m_pDoc;
184 cppgc::Member<CXFA_TextProvider> const m_pTextProvider;
185 cppgc::Member<CXFA_Node> m_pTextDataNode;
186 cppgc::Member<CXFA_TextParser> m_pTextParser;
187 cppgc::Member<LoaderContext> m_pLoader;
188 std::unique_ptr<CFGAS_RTFBreak> m_pBreak;
189 std::vector<std::unique_ptr<PieceLine>> m_pieceLines;
190 std::unique_ptr<CXFA_TextTabstopsContext> m_pTabstopContext;
191};
192
193#endif // XFA_FXFA_CXFA_TEXTLAYOUT_H_
CFX_CSSDisplay
Definition cfx_css.h:48
friend class EventParamScope
WideString GetRef()
WideString GetLabelRef()
WideString GetValueRef()
CXFA_Script * GetScriptIfExists()
bool TestStatusBits(Mask< XFA_WidgetStatus > val) const
XFA_EVENTTYPE m_eType
CXFA_EventParam(XFA_EVENTTYPE type)
virtual WideString GetAppTitle() const =0
virtual int32_t MsgBox(const WideString &wsMessage, const WideString &wsTitle, uint32_t dwIconType, uint32_t dwButtonType)=0
CallbackIface * GetAppProvider() const
Definition cxfa_ffapp.h:146
UpdateScope(CXFA_FFDocView *pDocView)
void InvalidateRect(CXFA_FFPageView *pPageView, const CFX_RectF &rtInvalidate)
CXFA_FFWidgetHandler * GetWidgetHandler()
void AddValidateNode(CXFA_Node *node)
void ResetNode(CXFA_Node *pNode)
void AddCalculateNodeNotify(CXFA_Node *pNodeChange)
CXFA_FFDoc * GetDoc() const
bool SetFocus(CXFA_FFWidget *pNewFocus)
void DeleteLayoutItem(CXFA_FFWidget *pWidget)
void AddNewFormNode(CXFA_Node *pNode)
void OnPageViewEvent(CXFA_ViewLayoutItem *pSender, CXFA_FFDoc::PageViewEvent eEvent)
CXFA_FFWidget * GetWidgetByName(const WideString &wsName, CXFA_FFWidget *pRefWidget)
CXFA_FFPageView * GetPageView(int32_t nIndex) const
void SetFocusNode(CXFA_Node *pNode)
void AddCalculateNode(CXFA_Node *node)
CXFA_LayoutProcessor * GetLayoutProcessor() const
int32_t CountPageViews() const
XFA_EventError ExecEventActivityByDeepFirst(CXFA_Node *pFormNode, XFA_EVENTTYPE eEventType, bool bIsFormReady, bool bRecursive)
CXFA_Node * GetRootSubform()
void AddNullTestMsg(const WideString &msg)
void ProcessValueChanged(CXFA_Node *node)
void UpdateUIDisplay(CXFA_Node *pNode, CXFA_FFWidget *pExcept)
CXFA_FFWidget * GetWidgetForNode(CXFA_Node *node)
void AddIndexChangedSubform(CXFA_Subform *pNode)
bool IsValidationsEnabled() const
bool CommitData() override
void OnDrawWidget(CFGAS_GEGraphics *pGraphics, const CFX_Matrix &matrix) override
bool AcceptsFocusOnButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point, CFWL_MessageMouse::MouseCommand command) override
void Trace(cppgc::Visitor *visitor) const override
~CXFA_FFImageEdit() override
bool OnLButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool LoadWidget() override
void RenderWidget(CFGAS_GEGraphics *pGS, const CFX_Matrix &matrix, HighlightOption highlight) override
FormFieldType GetFormFieldType() override
void SetFWLRect() override
bool UpdateFWLData() override
void OnProcessEvent(pdfium::CFWL_Event *pEvent) override
void OnProcessMessage(CFWL_Message *pMessage) override
bool IsLoaded() override
void RenderWidget(CFGAS_GEGraphics *pGS, const CFX_Matrix &matrix, HighlightOption highlight) override
bool LoadWidget() override
~CXFA_FFImage() override
void OnProcessMessage(CFWL_Message *pMessage) override
void OnProcessEvent(pdfium::CFWL_Event *pEvent) override
void Trace(cppgc::Visitor *visitor) const override
void OnDrawWidget(CFGAS_GEGraphics *pGraphics, const CFX_Matrix &matrix) override
bool PerformLayout() override
~CXFA_FFPushButton() override
void UpdateWidgetProperty() override
bool LoadWidget() override
FormFieldType GetFormFieldType() override
void RenderWidget(CFGAS_GEGraphics *pGS, const CFX_Matrix &matrix, HighlightOption highlight) override
~CXFA_FFSignature() override
bool OnMouseWheel(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point, const CFX_Vector &delta) override
bool OnMouseExit() override
void RenderWidget(CFGAS_GEGraphics *pGS, const CFX_Matrix &matrix, HighlightOption highlight) override
bool OnLButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
FWL_WidgetHit HitTest(const CFX_PointF &point) override
bool OnKeyDown(XFA_FWL_VKEYCODE dwKeyCode, Mask< XFA_FWL_KeyFlag > dwFlags) override
bool OnRButtonDblClk(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool OnRButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool OnRButtonUp(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool OnChar(uint32_t dwChar, Mask< XFA_FWL_KeyFlag > dwFlags) override
bool OnMouseEnter() override
bool AcceptsFocusOnButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point, CFWL_MessageMouse::MouseCommand command) override
FormFieldType GetFormFieldType() override
bool LoadWidget() override
bool OnMouseMove(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool OnLButtonDblClk(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool OnLButtonUp(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool IsLoaded() override
bool OnMouseMove(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
FWL_WidgetHit HitTest(const CFX_PointF &point) override
bool OnLButtonUp(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
~CXFA_FFText() override
void RenderWidget(CFGAS_GEGraphics *pGS, const CFX_Matrix &matrix, HighlightOption highlight) override
bool PerformLayout() override
bool AcceptsFocusOnButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point, CFWL_MessageMouse::MouseCommand command) override
bool OnLButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
CXFA_FFWidget * GetNextFFWidget() const
virtual bool UpdateFWLData()
bool IsFocused() const
virtual bool IsLoaded()
CXFA_Node * GetNode() const
virtual bool LoadWidget()
CXFA_ContentLayoutItem * GetLayoutItem() const
CXFA_LayoutItem * GetLayoutItem(CXFA_Node *pFormItem)
CXFA_ViewLayoutItem * GetPage(int32_t index) const
CXFA_Node * GetFirstContainerChild() const
CXFA_Node * GetNextContainerSibling() const
CXFA_Validate * GetValidateIfExists() const
CXFA_Calculate * GetCalculateIfExists() const
bool DeleteItem(int32_t nIndex, bool bNotify, bool bScriptModify)
void SetFlag(XFA_NodeFlag dwFlag)
XFA_EventError ExecuteScript(CXFA_FFDocView *pDocView, CXFA_Script *script, CXFA_EventParam *pEventParam)
bool IsUserInteractive() const
Definition cxfa_node.h:163
XFA_EventError ProcessEvent(CXFA_FFDocView *pDocView, XFA_AttributeValue iActivity, CXFA_EventParam *pEventParam)
bool IsWidgetReady() const
Definition cxfa_node.h:328
void ResetData()
XFA_FFWidgetType GetFFWidgetType()
XFA_EventError ProcessValidate(CXFA_FFDocView *pDocView, int32_t iFlags)
XFA_EventError ProcessCalculate(CXFA_FFDocView *pDocView)
bool HasRemovedChildren() const
Definition cxfa_node.h:175
XFA_Element GetElementType() const
Definition cxfa_object.h:91
CXFA_Document * GetDocument() const
Definition cxfa_object.h:48
CXFA_ReadyNodeIterator(CXFA_Node *pTravelRoot)
float StartLayout(float fWidth)
WideString GetLinkURLAtPoint(const CFX_PointF &point)
CFX_SizeF CalcSize(const CFX_SizeF &minSize, const CFX_SizeF &maxSize)
bool DrawString(CFX_RenderDevice *pFxDevice, const CFX_Matrix &mtDoc2Device, const CFX_RectF &rtClip, size_t szBlockIndex)
bool HasBlock() const
float DoLayout(float fTextHeight)
bool IsLoaded() const
float DoSplitLayout(size_t szBlockIndex, float fCalcHeight, float fTextHeight)
float Layout(const CFX_SizeF &size)
void ItemBlocks(const CFX_RectF &rtText, size_t szBlockIndex)
CXFA_Node * GetTextNode(bool *bRichText)
CXFA_Para * GetParaIfExists()
bool IsCheckButtonAndAutoWidth() const
CXFA_Font * GetFontIfExists()
void Trace(cppgc::Visitor *visitor) const
std::optional< WideString > GetEmbeddedObj(const WideString &wsAttr) const
CXFA_FFPageView * GetPageView() const
WideString & operator+=(const WideString &str)
bool operator==(const WideString &other) const
static WideString Format(const wchar_t *pFormat,...)
bool EqualsASCII(ByteStringView that) const
Definition widestring.h:111
FormFieldType
CXFA_FFWidget * GetFFWidget(CXFA_ContentLayoutItem *item)
XFA_EVENTTYPE
@ XFA_EVENT_InitCalculate
@ XFA_EVENT_Initialize
@ XFA_EVENT_DocReady
@ XFA_EVENT_Unknown
@ XFA_EVENT_Calculate
@ XFA_EVENT_Validate
@ XFA_EVENT_Ready
@ XFA_EVENT_IndexChange
@ XFA_EVENT_DocClose
const pdfium::span< const XFA_AttributeValue > kXFAEventActivity
static XFA_EventError XFA_ProcessEvent(CXFA_FFDocView *pDocView, CXFA_Node *pNode, CXFA_EventParam *pParam)
XFA_FFWidgetType
CXFA_ContentLayoutItem * ToContentLayoutItem(CXFA_LayoutItem *item)
XFA_NodeFlag
Definition cxfa_node.h:78
CFX_VTemplate< int32_t > CFX_Vector
CFX_PTemplate< float > CFX_PointF
CFX_STemplate< float > CFX_SizeF
uint32_t FX_ARGB
Definition fx_dib.h:36
AlertIcon
Definition fxfa.h:20
@ kStatus
Definition fxfa.h:25
AlertButton
Definition fxfa.h:11
XFA_EventError
Definition fxfa.h:54
XFA_WidgetStatus
Definition fxfa.h:61
XFA_Element
Definition fxfa_basic.h:75
XFA_AttributeValue
Definition fxfa_basic.h:60
#define CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED
Definition heap.h:32
Definition heap.h:12
WideString operator+(const wchar_t *str1, const WideString &str2)
Definition widestring.h:168
fxcrt::WideString WideString
Definition widestring.h:207
void XFA_EventErrorAccumulate(XFA_EventError *pAcc, XFA_EventError eNew)