Home | History | Annotate | Download | only in layout
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      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_FGAS_LAYOUT_FGAS_RTFBREAK_H_
      8 #define XFA_FGAS_LAYOUT_FGAS_RTFBREAK_H_
      9 
     10 #include <deque>
     11 #include <vector>
     12 
     13 #include "core/fxcrt/cfx_retain_ptr.h"
     14 #include "core/fxcrt/fx_basic.h"
     15 #include "core/fxcrt/fx_ucd.h"
     16 #include "xfa/fgas/crt/fgas_utils.h"
     17 #include "xfa/fgas/layout/fgas_textbreak.h"
     18 
     19 class CFGAS_GEFont;
     20 
     21 #define FX_RTFLAYOUTSTYLE_Pagination 0x01
     22 #define FX_RTFLAYOUTSTYLE_ExpandTab 0x10
     23 
     24 enum class CFX_RTFLineAlignment {
     25   Left = 0,
     26   Center,
     27   Right,
     28   Justified,
     29   Distributed
     30 };
     31 
     32 struct FX_RTFTEXTOBJ {
     33   FX_RTFTEXTOBJ();
     34   ~FX_RTFTEXTOBJ();
     35 
     36   CFX_WideString pStr;
     37   std::vector<int32_t> pWidths;
     38   CFX_RetainPtr<CFGAS_GEFont> pFont;
     39   const CFX_RectF* pRect;
     40   FX_WCHAR wLineBreakChar;
     41   FX_FLOAT fFontSize;
     42   int32_t iLength;
     43   int32_t iBidiLevel;
     44   int32_t iHorizontalScale;
     45   int32_t iVerticalScale;
     46 };
     47 
     48 class CFX_RTFPiece {
     49  public:
     50   CFX_RTFPiece();
     51   ~CFX_RTFPiece();
     52 
     53   int32_t GetEndPos() const {
     54     return m_iWidth < 0 ? m_iStartPos : m_iStartPos + m_iWidth;
     55   }
     56 
     57   CFX_RTFChar& GetChar(int32_t index) {
     58     ASSERT(index > -1 && index < m_iChars && m_pChars);
     59     return (*m_pChars)[m_iStartChar + index];
     60   }
     61 
     62   CFX_WideString GetString() const {
     63     CFX_WideString ret;
     64     ret.Reserve(m_iChars);
     65     for (int32_t i = m_iStartChar; i < m_iStartChar + m_iChars; i++)
     66       ret += static_cast<FX_WCHAR>((*m_pChars)[i].m_wCharCode);
     67     return ret;
     68   }
     69 
     70   std::vector<int32_t> GetWidths() const {
     71     std::vector<int32_t> ret;
     72     ret.reserve(m_iChars);
     73     for (int32_t i = m_iStartChar; i < m_iStartChar + m_iChars; i++)
     74       ret.push_back((*m_pChars)[i].m_iCharWidth);
     75     return ret;
     76   }
     77 
     78   void Reset() {
     79     m_dwStatus = CFX_RTFBreakType::Piece;
     80     if (m_iWidth > -1)
     81       m_iStartPos += m_iWidth;
     82 
     83     m_iWidth = -1;
     84     m_iStartChar += m_iChars;
     85     m_iChars = 0;
     86     m_iBidiLevel = 0;
     87     m_iBidiPos = 0;
     88     m_iHorizontalScale = 100;
     89     m_iVerticalScale = 100;
     90   }
     91 
     92   CFX_RTFBreakType m_dwStatus;
     93   int32_t m_iStartPos;
     94   int32_t m_iWidth;
     95   int32_t m_iStartChar;
     96   int32_t m_iChars;
     97   int32_t m_iBidiLevel;
     98   int32_t m_iBidiPos;
     99   int32_t m_iFontSize;
    100   int32_t m_iFontHeight;
    101   int32_t m_iHorizontalScale;
    102   int32_t m_iVerticalScale;
    103   uint32_t m_dwIdentity;
    104   std::vector<CFX_RTFChar>* m_pChars;  // not owned.
    105   CFX_RetainPtr<CFX_Retainable> m_pUserData;
    106 };
    107 
    108 typedef CFX_BaseArrayTemplate<CFX_RTFPiece> CFX_RTFPieceArray;
    109 
    110 class CFX_RTFLine {
    111  public:
    112   CFX_RTFLine();
    113   ~CFX_RTFLine();
    114 
    115   int32_t CountChars() const {
    116     return pdfium::CollectionSize<int32_t>(m_LineChars);
    117   }
    118 
    119   CFX_RTFChar& GetChar(int32_t index) {
    120     ASSERT(index >= 0 && index < pdfium::CollectionSize<int32_t>(m_LineChars));
    121     return m_LineChars[index];
    122   }
    123 
    124   int32_t GetLineEnd() const { return m_iStart + m_iWidth; }
    125   void RemoveAll(bool bLeaveMemory) {
    126     m_LineChars.clear();
    127     m_LinePieces.RemoveAll(bLeaveMemory);
    128     m_iWidth = 0;
    129     m_iArabicChars = 0;
    130     m_iMBCSChars = 0;
    131   }
    132 
    133   std::vector<CFX_RTFChar> m_LineChars;
    134   CFX_RTFPieceArray m_LinePieces;
    135   int32_t m_iStart;
    136   int32_t m_iWidth;
    137   int32_t m_iArabicChars;
    138   int32_t m_iMBCSChars;
    139 };
    140 
    141 class CFX_RTFBreak {
    142  public:
    143   explicit CFX_RTFBreak(uint32_t dwLayoutStyles);
    144   ~CFX_RTFBreak();
    145 
    146   void SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd);
    147   void SetLineStartPos(FX_FLOAT fLinePos);
    148   void SetFont(const CFX_RetainPtr<CFGAS_GEFont>& pFont);
    149   void SetFontSize(FX_FLOAT fFontSize);
    150   void SetTabWidth(FX_FLOAT fTabWidth);
    151   void SetLineBreakTolerance(FX_FLOAT fTolerance);
    152   void SetHorizontalScale(int32_t iScale);
    153   void SetVerticalScale(int32_t iScale);
    154   void SetCharSpace(FX_FLOAT fCharSpace);
    155   void SetAlignment(CFX_RTFLineAlignment align) { m_iAlignment = align; }
    156   void SetUserData(const CFX_RetainPtr<CFX_Retainable>& pUserData);
    157 
    158   void AddPositionedTab(FX_FLOAT fTabPos);
    159 
    160   CFX_RTFBreakType EndBreak(CFX_RTFBreakType dwStatus);
    161   int32_t CountBreakPieces() const;
    162   const CFX_RTFPiece* GetBreakPiece(int32_t index) const;
    163   void ClearBreakPieces();
    164 
    165   void Reset();
    166 
    167   int32_t GetDisplayPos(const FX_RTFTEXTOBJ* pText,
    168                         FXTEXT_CHARPOS* pCharPos,
    169                         bool bCharCode) const;
    170 
    171   CFX_RTFBreakType AppendChar(FX_WCHAR wch);
    172   CFX_RTFBreakType AppendChar_Combination(CFX_RTFChar* pCurChar);
    173   CFX_RTFBreakType AppendChar_Tab(CFX_RTFChar* pCurChar);
    174   CFX_RTFBreakType AppendChar_Control(CFX_RTFChar* pCurChar);
    175   CFX_RTFBreakType AppendChar_Arabic(CFX_RTFChar* pCurChar);
    176   CFX_RTFBreakType AppendChar_Others(CFX_RTFChar* pCurChar);
    177 
    178  private:
    179   void FontChanged();
    180   void SetBreakStatus();
    181   CFX_RTFChar* GetLastChar(int32_t index) const;
    182   const CFX_RTFLine* GetRTFLine() const;
    183   const CFX_RTFPieceArray* GetRTFPieces() const;
    184   FX_CHARTYPE GetUnifiedCharType(FX_CHARTYPE chartype) const;
    185   int32_t GetLastPositionedTab() const;
    186   bool GetPositionedTab(int32_t* iTabPos) const;
    187 
    188   int32_t GetBreakPos(std::vector<CFX_RTFChar>& tca,
    189                       int32_t& iEndPos,
    190                       bool bAllChars,
    191                       bool bOnlyBrk);
    192   void SplitTextLine(CFX_RTFLine* pCurLine,
    193                      CFX_RTFLine* pNextLine,
    194                      bool bAllChars);
    195   bool EndBreak_SplitLine(CFX_RTFLine* pNextLine,
    196                           bool bAllChars,
    197                           CFX_RTFBreakType dwStatus);
    198   void EndBreak_BidiLine(std::deque<FX_TPO>* tpos, CFX_RTFBreakType dwStatus);
    199   void EndBreak_Alignment(const std::deque<FX_TPO>& tpos,
    200                           bool bAllChars,
    201                           CFX_RTFBreakType dwStatus);
    202 
    203   int32_t m_iBoundaryStart;
    204   int32_t m_iBoundaryEnd;
    205   uint32_t m_dwLayoutStyles;
    206   bool m_bPagination;
    207   CFX_RetainPtr<CFGAS_GEFont> m_pFont;
    208   int32_t m_iFontHeight;
    209   int32_t m_iFontSize;
    210   int32_t m_iTabWidth;
    211   std::vector<int32_t> m_PositionedTabs;
    212   FX_WCHAR m_wDefChar;
    213   int32_t m_iDefChar;
    214   FX_WCHAR m_wLineBreakChar;
    215   int32_t m_iHorizontalScale;
    216   int32_t m_iVerticalScale;
    217   int32_t m_iCharSpace;
    218   CFX_RTFLineAlignment m_iAlignment;
    219   CFX_RetainPtr<CFX_Retainable> m_pUserData;
    220   FX_CHARTYPE m_eCharType;
    221   uint32_t m_dwIdentity;
    222   CFX_RTFLine m_RTFLine1;
    223   CFX_RTFLine m_RTFLine2;
    224   CFX_RTFLine* m_pCurLine;
    225   int32_t m_iReady;
    226   int32_t m_iTolerance;
    227 };
    228 
    229 #endif  // XFA_FGAS_LAYOUT_FGAS_RTFBREAK_H_
    230