Home | History | Annotate | Download | only in include
      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 _FX_TEXTBREAK
      8 #define _FX_TEXTBREAK
      9 
     10 #include "core/include/fxcrt/fx_ucd.h"
     11 
     12 class IFX_Font;
     13 class CFX_Char;
     14 class IFX_TxtAccess;
     15 class CFX_TxtChar;
     16 class CFX_TxtPiece;
     17 class IFX_TxtBreak;
     18 #define FX_TXTBREAKPOLICY_None 0x00
     19 #define FX_TXTBREAKPOLICY_Pagination 0x01
     20 #define FX_TXTBREAKPOLICY_SpaceBreak 0x02
     21 #define FX_TXTBREAKPOLICY_NumberBreak 0x04
     22 #define FX_TXTBREAK_None 0x00
     23 #define FX_TXTBREAK_PieceBreak 0x01
     24 #define FX_TXTBREAK_LineBreak 0x02
     25 #define FX_TXTBREAK_ParagraphBreak 0x03
     26 #define FX_TXTBREAK_PageBreak 0x04
     27 #define FX_TXTBREAK_ControlChar 0x10
     28 #define FX_TXTBREAK_BreakChar 0x20
     29 #define FX_TXTBREAK_UnknownChar 0x40
     30 #define FX_TXTBREAK_RemoveChar 0x80
     31 #define FX_TXTLAYOUTSTYLE_MutipleFormat 0x0001
     32 #define FX_TXTLAYOUTSTYLE_VerticalLayout 0x0002
     33 #define FX_TXTLAYOUTSTYLE_VerticalChars 0x0004
     34 #define FX_TXTLAYOUTSTYLE_ReverseLine 0x0008
     35 #define FX_TXTLAYOUTSTYLE_ArabicContext 0x0010
     36 #define FX_TXTLAYOUTSTYLE_ArabicShapes 0x0020
     37 #define FX_TXTLAYOUTSTYLE_RTLReadingOrder 0x0040
     38 #define FX_TXTLAYOUTSTYLE_ExpandTab 0x0100
     39 #define FX_TXTLAYOUTSTYLE_SingleLine 0x0200
     40 #define FX_TXTLAYOUTSTYLE_CombText 0x0400
     41 #define FX_TXTCHARSTYLE_Alignment 0x000F
     42 #define FX_TXTCHARSTYLE_ArabicNumber 0x0010
     43 #define FX_TXTCHARSTYLE_ArabicShadda 0x0020
     44 #define FX_TXTCHARSTYLE_OddBidiLevel 0x0040
     45 #define FX_TXTCHARSTYLE_RTLReadingOrder 0x0080
     46 #define FX_TXTCHARSTYLE_ArabicContext 0x0300
     47 #define FX_TXTCHARSTYLE_ArabicIndic 0x0400
     48 #define FX_TXTCHARSTYLE_ArabicComma 0x0800
     49 #define FX_TXTLINEALIGNMENT_Left 0
     50 #define FX_TXTLINEALIGNMENT_Center 1
     51 #define FX_TXTLINEALIGNMENT_Right 2
     52 #define FX_TXTLINEALIGNMENT_Justified (1 << 2)
     53 #define FX_TXTLINEALIGNMENT_Distributed (2 << 2)
     54 #define FX_TXTLINEALIGNMENT_JustifiedLeft \
     55   (FX_TXTLINEALIGNMENT_Left | FX_TXTLINEALIGNMENT_Justified)
     56 #define FX_TXTLINEALIGNMENT_JustifiedCenter \
     57   (FX_TXTLINEALIGNMENT_Center | FX_TXTLINEALIGNMENT_Justified)
     58 #define FX_TXTLINEALIGNMENT_JustifiedRight \
     59   (FX_TXTLINEALIGNMENT_Right | FX_TXTLINEALIGNMENT_Justified)
     60 #define FX_TXTLINEALIGNMENT_DistributedLeft \
     61   (FX_TXTLINEALIGNMENT_Left | FX_TXTLINEALIGNMENT_Distributed)
     62 #define FX_TXTLINEALIGNMENT_DistributedCenter \
     63   (FX_TXTLINEALIGNMENT_Center | FX_TXTLINEALIGNMENT_Distributed)
     64 #define FX_TXTLINEALIGNMENT_DistributedRight \
     65   (FX_TXTLINEALIGNMENT_Right | FX_TXTLINEALIGNMENT_Distributed)
     66 #define FX_TXTLINEALIGNMENT_LowerMask 0x03
     67 #define FX_TXTLINEALIGNMENT_HigherMask 0x0C
     68 #define FX_TXTBREAK_MinimumTabWidth 160000
     69 
     70 class IFX_TxtAccess {
     71  public:
     72   virtual ~IFX_TxtAccess() {}
     73   virtual FX_WCHAR GetChar(void* pIdentity, int32_t index) const = 0;
     74   virtual int32_t GetWidth(void* pIdentity, int32_t index) const = 0;
     75 };
     76 typedef struct _FX_TXTRUN {
     77   _FX_TXTRUN() {
     78     pAccess = NULL;
     79     pIdentity = NULL;
     80     pStr = NULL;
     81     pWidths = NULL;
     82     iLength = 0;
     83     pFont = NULL;
     84     fFontSize = 12;
     85     dwStyles = 0;
     86     iHorizontalScale = 100;
     87     iVerticalScale = 100;
     88     iCharRotation = 0;
     89     dwCharStyles = 0;
     90     pRect = NULL;
     91     wLineBreakChar = L'\n';
     92     bSkipSpace = TRUE;
     93   }
     94   IFX_TxtAccess* pAccess;
     95   void* pIdentity;
     96   const FX_WCHAR* pStr;
     97   int32_t* pWidths;
     98   int32_t iLength;
     99   IFX_Font* pFont;
    100   FX_FLOAT fFontSize;
    101   FX_DWORD dwStyles;
    102   int32_t iHorizontalScale;
    103   int32_t iVerticalScale;
    104   int32_t iCharRotation;
    105   FX_DWORD dwCharStyles;
    106   FX_LPCRECTF pRect;
    107   FX_WCHAR wLineBreakChar;
    108   FX_BOOL bSkipSpace;
    109 } FX_TXTRUN, *FX_LPTXTRUN;
    110 typedef FX_TXTRUN const* FX_LPCTXTRUN;
    111 class CFX_TxtPiece : public CFX_Target {
    112  public:
    113   CFX_TxtPiece()
    114       : m_dwStatus(FX_TXTBREAK_PieceBreak),
    115         m_iStartPos(0),
    116         m_iWidth(-1),
    117         m_iStartChar(0),
    118         m_iChars(0),
    119         m_iBidiLevel(0),
    120         m_iBidiPos(0),
    121         m_iHorizontalScale(100),
    122         m_iVerticalScale(100),
    123         m_dwCharStyles(0),
    124         m_pChars(NULL),
    125         m_pUserData(NULL) {}
    126   int32_t GetEndPos() const {
    127     return m_iWidth < 0 ? m_iStartPos : m_iStartPos + m_iWidth;
    128   }
    129   int32_t GetLength() const { return m_iChars; }
    130   int32_t GetEndChar() const { return m_iStartChar + m_iChars; }
    131   CFX_TxtChar* GetCharPtr(int32_t index) const {
    132     FXSYS_assert(index > -1 && index < m_iChars && m_pChars != NULL);
    133     return m_pChars->GetDataPtr(m_iStartChar + index);
    134   }
    135   void GetString(FX_WCHAR* pText) const {
    136     FXSYS_assert(pText != NULL);
    137     int32_t iEndChar = m_iStartChar + m_iChars;
    138     CFX_Char* pChar;
    139     for (int32_t i = m_iStartChar; i < iEndChar; i++) {
    140       pChar = m_pChars->GetDataPtr(i);
    141       *pText++ = (FX_WCHAR)pChar->m_wCharCode;
    142     }
    143   }
    144 
    145   void GetString(CFX_WideString& wsText) const {
    146     FX_WCHAR* pText = wsText.GetBuffer(m_iChars);
    147     GetString(pText);
    148     wsText.ReleaseBuffer(m_iChars);
    149   }
    150   void GetWidths(int32_t* pWidths) const {
    151     FXSYS_assert(pWidths != NULL);
    152     int32_t iEndChar = m_iStartChar + m_iChars;
    153     CFX_Char* pChar;
    154     for (int32_t i = m_iStartChar; i < iEndChar; i++) {
    155       pChar = m_pChars->GetDataPtr(i);
    156       *pWidths++ = pChar->m_iCharWidth;
    157     }
    158   }
    159   FX_DWORD m_dwStatus;
    160   int32_t m_iStartPos;
    161   int32_t m_iWidth;
    162   int32_t m_iStartChar;
    163   int32_t m_iChars;
    164   int32_t m_iBidiLevel;
    165   int32_t m_iBidiPos;
    166   int32_t m_iHorizontalScale;
    167   int32_t m_iVerticalScale;
    168   FX_DWORD m_dwCharStyles;
    169   CFX_TxtCharArray* m_pChars;
    170   void* m_pUserData;
    171 };
    172 typedef CFX_BaseArrayTemplate<CFX_TxtPiece> CFX_TxtPieceArray;
    173 class IFX_TxtBreak {
    174  public:
    175   static IFX_TxtBreak* Create(FX_DWORD dwPolicies);
    176   virtual ~IFX_TxtBreak() {}
    177   virtual void Release() = 0;
    178   virtual void SetLineWidth(FX_FLOAT fLineWidth) = 0;
    179   virtual void SetLinePos(FX_FLOAT fLinePos) = 0;
    180   virtual FX_DWORD GetLayoutStyles() const = 0;
    181   virtual void SetLayoutStyles(FX_DWORD dwLayoutStyles) = 0;
    182   virtual void SetFont(IFX_Font* pFont) = 0;
    183   virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
    184   virtual void SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) = 0;
    185   virtual void SetDefaultChar(FX_WCHAR wch) = 0;
    186   virtual void SetParagraphBreakChar(FX_WCHAR wch) = 0;
    187   virtual void SetLineBreakTolerance(FX_FLOAT fTolerance) = 0;
    188   virtual void SetHorizontalScale(int32_t iScale) = 0;
    189   virtual void SetVerticalScale(int32_t iScale) = 0;
    190   virtual void SetCharRotation(int32_t iCharRotation) = 0;
    191   virtual void SetCharSpace(FX_FLOAT fCharSpace) = 0;
    192   virtual void SetAlignment(int32_t iAlignment) = 0;
    193   virtual FX_DWORD GetContextCharStyles() const = 0;
    194   virtual void SetContextCharStyles(FX_DWORD dwCharStyles) = 0;
    195   virtual void SetCombWidth(FX_FLOAT fCombWidth) = 0;
    196   virtual void SetUserData(void* pUserData) = 0;
    197   virtual FX_DWORD AppendChar(FX_WCHAR wch) = 0;
    198   virtual FX_DWORD EndBreak(FX_DWORD dwStatus = FX_TXTBREAK_PieceBreak) = 0;
    199   virtual int32_t CountBreakChars() const = 0;
    200   virtual int32_t CountBreakPieces() const = 0;
    201   virtual const CFX_TxtPiece* GetBreakPiece(int32_t index) const = 0;
    202   virtual void ClearBreakPieces() = 0;
    203   virtual void Reset() = 0;
    204   virtual int32_t GetDisplayPos(
    205       FX_LPCTXTRUN pTxtRun,
    206       FXTEXT_CHARPOS* pCharPos,
    207       FX_BOOL bCharCode = FALSE,
    208       CFX_WideString* pWSForms = NULL,
    209       FX_AdjustCharDisplayPos pAdjustPos = NULL) const = 0;
    210   virtual int32_t GetCharRects(FX_LPCTXTRUN pTxtRun,
    211                                CFX_RectFArray& rtArray,
    212                                FX_BOOL bCharBBox = FALSE) const = 0;
    213 };
    214 #endif
    215