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/unowned_ptr.h"
17#include "core/fxcrt/widestring.h"
18#include "core/fxge/dib/fx_dib.h"
19#include "fxjs/gc/heap.h"
20#include "v8/include/cppgc/garbage-collected.h"
21#include "v8/include/cppgc/member.h"
22#include "v8/include/cppgc/visitor.h"
23#include "xfa/fgas/layout/cfgas_char.h"
24#include "xfa/fgas/layout/cfgas_textpiece.h"
25#include "xfa/fxfa/fxfa_basic.h"
26
27class CFGAS_LinkUserData;
28class CFGAS_RTFBreak;
29class CFX_CSSComputedStyle;
31class CFX_XMLNode;
32class CXFA_FFDoc;
33class CXFA_Node;
34class CXFA_TextParser;
37class TextCharPos;
38
39class CXFA_TextLayout final : public cppgc::GarbageCollected<CXFA_TextLayout> {
40 public:
43
44 void Trace(cppgc::Visitor* visitor) const;
45
46 float GetLayoutHeight();
47 float StartLayout(float fWidth);
48 float DoLayout(float fTextHeight);
49 float DoSplitLayout(size_t szBlockIndex,
50 float fCalcHeight,
51 float fTextHeight);
52 float Layout(const CFX_SizeF& size);
53
54 CFX_SizeF CalcSize(const CFX_SizeF& minSize, const CFX_SizeF& maxSize);
55 void ItemBlocks(const CFX_RectF& rtText, size_t szBlockIndex);
56 bool DrawString(CFX_RenderDevice* pFxDevice,
57 const CFX_Matrix& mtDoc2Device,
58 const CFX_RectF& rtClip,
59 size_t szBlockIndex);
60 bool IsLoaded() const { return !m_pieceLines.empty(); }
61 void Unload();
62 bool HasBlock() const { return m_bHasBlock; }
63 void ClearBlocks() { m_Blocks.clear(); }
64 void ResetHasBlock() { m_bHasBlock = false; }
65
66 // Returns empty string when no link is present.
67 WideString GetLinkURLAtPoint(const CFX_PointF& point);
68
69 private:
70 class TextPiece : public CFGAS_TextPiece {
71 public:
72 TextPiece();
73 ~TextPiece();
74
75 int32_t iUnderline = 0;
76 int32_t iLineThrough = 0;
78 FX_ARGB dwColor = 0;
79 RetainPtr<CFGAS_LinkUserData> pLinkData;
80 };
81
82 class PieceLine {
83 public:
84 PieceLine();
85 ~PieceLine();
86
87 std::vector<std::unique_ptr<TextPiece>> m_textPieces;
88 std::vector<size_t> m_charCounts;
89 };
90
91 struct BlockData {
92 size_t szIndex;
93 size_t szLength;
94 };
95
96 struct BlockHeight {
97 size_t szBlockIndex;
98 float fHeight;
99 };
100
101 struct LoaderContext : public cppgc::GarbageCollected<LoaderContext> {
102 LoaderContext();
103 ~LoaderContext();
104
105 void Trace(cppgc::Visitor* visitor) const;
106
107 bool bSaveLineHeight = false;
108 bool bFilterSpace = false;
109 float fWidth = 0;
110 float fHeight = 0;
111 float fLastPos = 0;
112 float fStartLineOffset = 0;
113 size_t nCharIdx = 0;
114 // TODO(thestig): Make this size_t?
115 int32_t iTotalLines = -1;
116 UnownedPtr<const CFX_XMLNode> pXMLNode;
117 RetainPtr<CFX_CSSComputedStyle> pParentStyle;
118 cppgc::Member<CXFA_Node> pNode;
119 std::vector<float> lineHeights;
120 std::vector<BlockHeight> blockHeights;
121 };
122
123 CXFA_TextLayout(CXFA_FFDoc* doc, CXFA_TextProvider* pTextProvider);
124
125 void GetTextDataNode();
126 CFX_XMLNode* GetXMLContainerNode();
127 std::unique_ptr<CFGAS_RTFBreak> CreateBreak(bool bDefault);
128 void InitBreak(float fLineWidth);
129 void InitBreak(CFX_CSSComputedStyle* pStyle,
130 CFX_CSSDisplay eDisplay,
131 float fLineWidth,
132 const CFX_XMLNode* pXMLNode,
133 CFX_CSSComputedStyle* pParentStyle);
134 void Loader(float textWidth, float* pLinePos, bool bSavePieces);
135 void LoadText(CXFA_Node* pNode,
136 float textWidth,
137 float* pLinePos,
138 bool bSavePieces);
139 bool LoadRichText(const CFX_XMLNode* pXMLNode,
140 float textWidth,
141 float* pLinePos,
142 RetainPtr<CFX_CSSComputedStyle> pParentStyle,
143 bool bSavePieces,
144 RetainPtr<CFGAS_LinkUserData> pLinkData,
145 bool bEndBreak,
146 bool bIsOl,
147 int32_t iLiCount);
148 bool AppendChar(const WideString& wsText,
149 float* pLinePos,
150 float fSpaceAbove,
151 bool bSavePieces);
152 void AppendTextLine(CFGAS_Char::BreakType dwStatus,
153 float* pLinePos,
154 bool bSavePieces,
155 bool bEndBreak);
156 void EndBreak(CFGAS_Char::BreakType dwStatus, float* pLinePos, bool bDefault);
157 bool IsEnd(bool bSavePieces);
158 void UpdateAlign(float fHeight, float fBottom);
159 void RenderString(CFX_RenderDevice* pDevice,
160 PieceLine* pPieceLine,
161 size_t szPiece,
162 std::vector<TextCharPos>* pCharPos,
163 const CFX_Matrix& mtDoc2Device);
164 void RenderPath(CFX_RenderDevice* pDevice,
165 const PieceLine* pPieceLine,
166 size_t szPiece,
167 std::vector<TextCharPos>* pCharPos,
168 const CFX_Matrix& mtDoc2Device);
169 size_t GetDisplayPos(const TextPiece* pPiece,
170 std::vector<TextCharPos>* pCharPos);
171 void DoTabstops(CFX_CSSComputedStyle* pStyle, PieceLine* pPieceLine);
172 bool LayoutInternal(size_t szBlockIndex);
173 size_t CountBlocks() const;
174 size_t GetNextIndexFromLastBlockData() const;
175 void UpdateLoaderHeight(float fTextHeight);
176
177 bool m_bHasBlock = false;
178 bool m_bRichText = false;
179 int32_t m_iLines = 0;
180 float m_fMaxWidth = 0;
181 std::vector<BlockData> m_Blocks;
182 cppgc::Member<CXFA_FFDoc> const m_pDoc;
183 cppgc::Member<CXFA_TextProvider> const m_pTextProvider;
184 cppgc::Member<CXFA_Node> m_pTextDataNode;
185 cppgc::Member<CXFA_TextParser> m_pTextParser;
186 cppgc::Member<LoaderContext> m_pLoader;
187 std::unique_ptr<CFGAS_RTFBreak> m_pBreak;
188 std::vector<std::unique_ptr<PieceLine>> m_pieceLines;
189 std::unique_ptr<CXFA_TextTabstopsContext> m_pTabstopContext;
190};
191
192#endif // XFA_FXFA_CXFA_TEXTLAYOUT_H_
CFX_CSSDisplay
Definition cfx_css.h:48
friend class EventParamScope
static bool IsXMLNameChar(wchar_t ch, bool bFirstChar)
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:144
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
void OnProcessEvent(CFWL_Event *pEvent) 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 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 Trace(cppgc::Visitor *visitor) const override
void OnProcessEvent(CFWL_Event *pEvent) 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:162
XFA_EventError ProcessEvent(CXFA_FFDocView *pDocView, XFA_AttributeValue iActivity, CXFA_EventParam *pEventParam)
bool IsWidgetReady() const
Definition cxfa_node.h:327
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:174
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
absl::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 IsEmpty() const
Definition widestring.h:118
bool EqualsASCII(ByteStringView that) const
Definition widestring.h:216
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
static XFA_EventError XFA_ProcessEvent(CXFA_FFDocView *pDocView, CXFA_Node *pNode, CXFA_EventParam *pParam)
const XFA_AttributeValue kXFAEventActivity[]
XFA_FFWidgetType
CXFA_ContentLayoutItem * ToContentLayoutItem(CXFA_LayoutItem *item)
XFA_NodeFlag
Definition cxfa_node.h:77
XFA_FWL_KeyFlag
XFA_FWL_VKEYCODE
FWL_WidgetHit
AlertIcon
Definition fxfa.h:20
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:281
void XFA_EventErrorAccumulate(XFA_EventError *pAcc, XFA_EventError eNew)