summaryrefslogtreecommitdiff
path: root/xfa/fgas/layout/cfx_rtfbreak.h
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/fgas/layout/cfx_rtfbreak.h')
-rw-r--r--xfa/fgas/layout/cfx_rtfbreak.h98
1 files changed, 98 insertions, 0 deletions
diff --git a/xfa/fgas/layout/cfx_rtfbreak.h b/xfa/fgas/layout/cfx_rtfbreak.h
new file mode 100644
index 0000000000..28adaa5d41
--- /dev/null
+++ b/xfa/fgas/layout/cfx_rtfbreak.h
@@ -0,0 +1,98 @@
+// Copyright 2014 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_FGAS_LAYOUT_CFX_RTFBREAK_H_
+#define XFA_FGAS_LAYOUT_CFX_RTFBREAK_H_
+
+#include <deque>
+#include <vector>
+
+#include "core/fxcrt/cfx_retain_ptr.h"
+#include "core/fxcrt/fx_basic.h"
+#include "core/fxcrt/fx_coordinates.h"
+#include "core/fxcrt/fx_ucd.h"
+#include "core/fxge/cfx_renderdevice.h"
+#include "xfa/fgas/layout/cfx_break.h"
+
+class CFGAS_GEFont;
+
+enum class CFX_RTFLineAlignment {
+ Left = 0,
+ Center,
+ Right,
+ Justified,
+ Distributed
+};
+
+struct FX_RTFTEXTOBJ {
+ FX_RTFTEXTOBJ();
+ ~FX_RTFTEXTOBJ();
+
+ CFX_WideString pStr;
+ std::vector<int32_t> pWidths;
+ CFX_RetainPtr<CFGAS_GEFont> pFont;
+ const CFX_RectF* pRect;
+ wchar_t wLineBreakChar;
+ float fFontSize;
+ int32_t iLength;
+ int32_t iBidiLevel;
+ int32_t iHorizontalScale;
+ int32_t iVerticalScale;
+};
+
+class CFX_RTFBreak : public CFX_Break {
+ public:
+ explicit CFX_RTFBreak(uint32_t dwLayoutStyles);
+ ~CFX_RTFBreak() override;
+
+ void SetLineStartPos(float fLinePos);
+
+ void SetAlignment(CFX_RTFLineAlignment align) { m_iAlignment = align; }
+ void SetUserData(const CFX_RetainPtr<CFX_Retainable>& pUserData);
+
+ void AddPositionedTab(float fTabPos);
+
+ CFX_BreakType EndBreak(CFX_BreakType dwStatus);
+
+ int32_t GetDisplayPos(const FX_RTFTEXTOBJ* pText,
+ FXTEXT_CHARPOS* pCharPos,
+ bool bCharCode) const;
+
+ CFX_BreakType AppendChar(wchar_t wch);
+
+ CFX_BreakLine* GetCurrentLineForTesting() const { return m_pCurLine; }
+
+ private:
+ void AppendChar_Combination(CFX_Char* pCurChar);
+ void AppendChar_Tab(CFX_Char* pCurChar);
+ CFX_BreakType AppendChar_Control(CFX_Char* pCurChar);
+ CFX_BreakType AppendChar_Arabic(CFX_Char* pCurChar);
+ CFX_BreakType AppendChar_Others(CFX_Char* pCurChar);
+ int32_t GetLastPositionedTab() const;
+ bool GetPositionedTab(int32_t* iTabPos) const;
+
+ int32_t GetBreakPos(std::vector<CFX_Char>& tca,
+ int32_t& iEndPos,
+ bool bAllChars,
+ bool bOnlyBrk);
+ void SplitTextLine(CFX_BreakLine* pCurLine,
+ CFX_BreakLine* pNextLine,
+ bool bAllChars);
+ bool EndBreak_SplitLine(CFX_BreakLine* pNextLine,
+ bool bAllChars,
+ CFX_BreakType dwStatus);
+ void EndBreak_BidiLine(std::deque<FX_TPO>* tpos, CFX_BreakType dwStatus);
+ void EndBreak_Alignment(const std::deque<FX_TPO>& tpos,
+ bool bAllChars,
+ CFX_BreakType dwStatus);
+
+ bool m_bPagination;
+ std::vector<int32_t> m_PositionedTabs;
+ CFX_RTFLineAlignment m_iAlignment;
+ CFX_RetainPtr<CFX_Retainable> m_pUserData;
+};
+
+#endif // XFA_FGAS_LAYOUT_CFX_RTFBREAK_H_