| OLD | NEW | 
|     1 // Copyright 2014 PDFium Authors. All rights reserved. |     1 // Copyright 2014 PDFium Authors. All rights reserved. | 
|     2 // Use of this source code is governed by a BSD-style license that can be |     2 // Use of this source code is governed by a BSD-style license that can be | 
|     3 // found in the LICENSE file. |     3 // found in the LICENSE file. | 
|     4  |     4  | 
|     5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |     5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 
|     6  |     6  | 
|     7 #include "xfa/fgas/layout/fgas_rtfbreak.h" |     7 #include "xfa/fgas/layout/fgas_rtfbreak.h" | 
|     8  |     8  | 
|     9 #include <algorithm> |     9 #include <algorithm> | 
|    10  |    10  | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
|    21       m_dwLayoutStyles(0), |    21       m_dwLayoutStyles(0), | 
|    22       m_bPagination(false), |    22       m_bPagination(false), | 
|    23       m_bVertical(false), |    23       m_bVertical(false), | 
|    24       m_bSingleLine(false), |    24       m_bSingleLine(false), | 
|    25       m_bCharCode(false), |    25       m_bCharCode(false), | 
|    26       m_pFont(nullptr), |    26       m_pFont(nullptr), | 
|    27       m_iFontHeight(240), |    27       m_iFontHeight(240), | 
|    28       m_iFontSize(240), |    28       m_iFontSize(240), | 
|    29       m_iTabWidth(720000), |    29       m_iTabWidth(720000), | 
|    30       m_PositionedTabs(), |    30       m_PositionedTabs(), | 
|    31       m_bOrphanLine(FALSE), |    31       m_bOrphanLine(false), | 
|    32       m_wDefChar(0xFEFF), |    32       m_wDefChar(0xFEFF), | 
|    33       m_iDefChar(0), |    33       m_iDefChar(0), | 
|    34       m_wLineBreakChar(L'\n'), |    34       m_wLineBreakChar(L'\n'), | 
|    35       m_iHorizontalScale(100), |    35       m_iHorizontalScale(100), | 
|    36       m_iVerticalScale(100), |    36       m_iVerticalScale(100), | 
|    37       m_iLineRotation(0), |    37       m_iLineRotation(0), | 
|    38       m_iCharRotation(0), |    38       m_iCharRotation(0), | 
|    39       m_iRotation(0), |    39       m_iRotation(0), | 
|    40       m_iCharSpace(0), |    40       m_iCharSpace(0), | 
|    41       m_bWordSpace(FALSE), |    41       m_bWordSpace(false), | 
|    42       m_iWordSpace(0), |    42       m_iWordSpace(0), | 
|    43       m_bRTL(FALSE), |    43       m_bRTL(false), | 
|    44       m_iAlignment(FX_RTFLINEALIGNMENT_Left), |    44       m_iAlignment(FX_RTFLINEALIGNMENT_Left), | 
|    45       m_pUserData(nullptr), |    45       m_pUserData(nullptr), | 
|    46       m_eCharType(FX_CHARTYPE_Unknown), |    46       m_eCharType(FX_CHARTYPE_Unknown), | 
|    47       m_dwIdentity(0), |    47       m_dwIdentity(0), | 
|    48       m_RTFLine1(), |    48       m_RTFLine1(), | 
|    49       m_RTFLine2(), |    49       m_RTFLine2(), | 
|    50       m_pCurLine(nullptr), |    50       m_pCurLine(nullptr), | 
|    51       m_iReady(0), |    51       m_iReady(0), | 
|    52       m_iTolerance(0) { |    52       m_iTolerance(0) { | 
|    53   m_pCurLine = &m_RTFLine1; |    53   m_pCurLine = &m_RTFLine1; | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|    98   } |    98   } | 
|    99   if (m_pFont == pFont) { |    99   if (m_pFont == pFont) { | 
|   100     return; |   100     return; | 
|   101   } |   101   } | 
|   102   SetBreakStatus(); |   102   SetBreakStatus(); | 
|   103   m_pFont = pFont; |   103   m_pFont = pFont; | 
|   104   m_iDefChar = 0; |   104   m_iDefChar = 0; | 
|   105   if (m_pFont) { |   105   if (m_pFont) { | 
|   106     m_iFontHeight = m_iFontSize; |   106     m_iFontHeight = m_iFontSize; | 
|   107     if (m_wDefChar != 0xFEFF) { |   107     if (m_wDefChar != 0xFEFF) { | 
|   108       m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); |   108       m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, false); | 
|   109       m_iDefChar *= m_iFontSize; |   109       m_iDefChar *= m_iFontSize; | 
|   110     } |   110     } | 
|   111   } |   111   } | 
|   112 } |   112 } | 
|   113 void CFX_RTFBreak::SetFontSize(FX_FLOAT fFontSize) { |   113 void CFX_RTFBreak::SetFontSize(FX_FLOAT fFontSize) { | 
|   114   int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); |   114   int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); | 
|   115   if (m_iFontSize == iFontSize) { |   115   if (m_iFontSize == iFontSize) { | 
|   116     return; |   116     return; | 
|   117   } |   117   } | 
|   118   SetBreakStatus(); |   118   SetBreakStatus(); | 
|   119   m_iFontSize = iFontSize; |   119   m_iFontSize = iFontSize; | 
|   120   m_iDefChar = 0; |   120   m_iDefChar = 0; | 
|   121   if (m_pFont) { |   121   if (m_pFont) { | 
|   122     m_iFontHeight = m_iFontSize; |   122     m_iFontHeight = m_iFontSize; | 
|   123     if (m_wDefChar != 0xFEFF) { |   123     if (m_wDefChar != 0xFEFF) { | 
|   124       m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); |   124       m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, false); | 
|   125       m_iDefChar *= m_iFontSize; |   125       m_iDefChar *= m_iFontSize; | 
|   126     } |   126     } | 
|   127   } |   127   } | 
|   128 } |   128 } | 
|   129 void CFX_RTFBreak::SetTabWidth(FX_FLOAT fTabWidth) { |   129 void CFX_RTFBreak::SetTabWidth(FX_FLOAT fTabWidth) { | 
|   130   m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); |   130   m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); | 
|   131 } |   131 } | 
|   132 void CFX_RTFBreak::AddPositionedTab(FX_FLOAT fTabPos) { |   132 void CFX_RTFBreak::AddPositionedTab(FX_FLOAT fTabPos) { | 
|   133   int32_t iLineEnd = m_iBoundaryEnd; |   133   int32_t iLineEnd = m_iBoundaryEnd; | 
|   134   int32_t iTabPos = FXSYS_round(fTabPos * 20000.0f) + m_iBoundaryStart; |   134   int32_t iTabPos = FXSYS_round(fTabPos * 20000.0f) + m_iBoundaryStart; | 
|   135   if (iTabPos > iLineEnd) { |   135   if (iTabPos > iLineEnd) { | 
|   136     iTabPos = iLineEnd; |   136     iTabPos = iLineEnd; | 
|   137   } |   137   } | 
|   138   if (m_PositionedTabs.Find(iTabPos, 0) > -1) { |   138   if (m_PositionedTabs.Find(iTabPos, 0) > -1) { | 
|   139     return; |   139     return; | 
|   140   } |   140   } | 
|   141   int32_t iCount = m_PositionedTabs.GetSize(); |   141   int32_t iCount = m_PositionedTabs.GetSize(); | 
|   142   int32_t iFind = 0; |   142   int32_t iFind = 0; | 
|   143   for (; iFind < iCount; iFind++) { |   143   for (; iFind < iCount; iFind++) { | 
|   144     if (m_PositionedTabs[iFind] > iTabPos) { |   144     if (m_PositionedTabs[iFind] > iTabPos) { | 
|   145       break; |   145       break; | 
|   146     } |   146     } | 
|   147   } |   147   } | 
|   148   m_PositionedTabs.InsertAt(iFind, iTabPos); |   148   m_PositionedTabs.InsertAt(iFind, iTabPos); | 
|   149   if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) { |   149   if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) { | 
|   150     m_bOrphanLine = GetLastPositionedTab() >= iLineEnd; |   150     m_bOrphanLine = GetLastPositionedTab() >= iLineEnd; | 
|   151   } else { |   151   } else { | 
|   152     m_bOrphanLine = FALSE; |   152     m_bOrphanLine = false; | 
|   153   } |   153   } | 
|   154 } |   154 } | 
|   155 void CFX_RTFBreak::SetPositionedTabs(const CFX_FloatArray& tabs) { |   155 void CFX_RTFBreak::SetPositionedTabs(const CFX_FloatArray& tabs) { | 
|   156   m_PositionedTabs.RemoveAll(); |   156   m_PositionedTabs.RemoveAll(); | 
|   157   int32_t iCount = tabs.GetSize(); |   157   int32_t iCount = tabs.GetSize(); | 
|   158   m_PositionedTabs.SetSize(iCount); |   158   m_PositionedTabs.SetSize(iCount); | 
|   159   int32_t iLineEnd = m_iBoundaryEnd; |   159   int32_t iLineEnd = m_iBoundaryEnd; | 
|   160   int32_t iTabPos; |   160   int32_t iTabPos; | 
|   161   for (int32_t i = 0; i < iCount; i++) { |   161   for (int32_t i = 0; i < iCount; i++) { | 
|   162     iTabPos = FXSYS_round(tabs[i] * 20000.0f) + m_iBoundaryStart; |   162     iTabPos = FXSYS_round(tabs[i] * 20000.0f) + m_iBoundaryStart; | 
|   163     if (iTabPos > iLineEnd) { |   163     if (iTabPos > iLineEnd) { | 
|   164       iTabPos = iLineEnd; |   164       iTabPos = iLineEnd; | 
|   165     } |   165     } | 
|   166     m_PositionedTabs[i] = iTabPos; |   166     m_PositionedTabs[i] = iTabPos; | 
|   167   } |   167   } | 
|   168   if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) { |   168   if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) { | 
|   169     m_bOrphanLine = GetLastPositionedTab() >= iLineEnd; |   169     m_bOrphanLine = GetLastPositionedTab() >= iLineEnd; | 
|   170   } else { |   170   } else { | 
|   171     m_bOrphanLine = FALSE; |   171     m_bOrphanLine = false; | 
|   172   } |   172   } | 
|   173 } |   173 } | 
|   174 void CFX_RTFBreak::ClearPositionedTabs() { |   174 void CFX_RTFBreak::ClearPositionedTabs() { | 
|   175   m_PositionedTabs.RemoveAll(); |   175   m_PositionedTabs.RemoveAll(); | 
|   176   m_bOrphanLine = FALSE; |   176   m_bOrphanLine = false; | 
|   177 } |   177 } | 
|   178 void CFX_RTFBreak::SetDefaultChar(FX_WCHAR wch) { |   178 void CFX_RTFBreak::SetDefaultChar(FX_WCHAR wch) { | 
|   179   m_wDefChar = wch; |   179   m_wDefChar = wch; | 
|   180   m_iDefChar = 0; |   180   m_iDefChar = 0; | 
|   181   if (m_wDefChar != 0xFEFF && m_pFont) { |   181   if (m_wDefChar != 0xFEFF && m_pFont) { | 
|   182     m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); |   182     m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, false); | 
|   183     if (m_iDefChar < 0) { |   183     if (m_iDefChar < 0) { | 
|   184       m_iDefChar = 0; |   184       m_iDefChar = 0; | 
|   185     } else { |   185     } else { | 
|   186       m_iDefChar *= m_iFontSize; |   186       m_iDefChar *= m_iFontSize; | 
|   187     } |   187     } | 
|   188   } |   188   } | 
|   189 } |   189 } | 
|   190 void CFX_RTFBreak::SetLineBreakChar(FX_WCHAR wch) { |   190 void CFX_RTFBreak::SetLineBreakChar(FX_WCHAR wch) { | 
|   191   if (wch != L'\r' && wch != L'\n') { |   191   if (wch != L'\r' && wch != L'\n') { | 
|   192     return; |   192     return; | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   226     return; |   226     return; | 
|   227   } |   227   } | 
|   228   SetBreakStatus(); |   228   SetBreakStatus(); | 
|   229   m_iCharRotation = iCharRotation; |   229   m_iCharRotation = iCharRotation; | 
|   230   m_iRotation = m_iLineRotation + m_iCharRotation; |   230   m_iRotation = m_iLineRotation + m_iCharRotation; | 
|   231   m_iRotation %= 4; |   231   m_iRotation %= 4; | 
|   232 } |   232 } | 
|   233 void CFX_RTFBreak::SetCharSpace(FX_FLOAT fCharSpace) { |   233 void CFX_RTFBreak::SetCharSpace(FX_FLOAT fCharSpace) { | 
|   234   m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); |   234   m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); | 
|   235 } |   235 } | 
|   236 void CFX_RTFBreak::SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace) { |   236 void CFX_RTFBreak::SetWordSpace(bool bDefault, FX_FLOAT fWordSpace) { | 
|   237   m_bWordSpace = !bDefault; |   237   m_bWordSpace = !bDefault; | 
|   238   m_iWordSpace = FXSYS_round(fWordSpace * 20000.0f); |   238   m_iWordSpace = FXSYS_round(fWordSpace * 20000.0f); | 
|   239 } |   239 } | 
|   240 void CFX_RTFBreak::SetReadingOrder(FX_BOOL bRTL) { |   240 void CFX_RTFBreak::SetReadingOrder(bool bRTL) { | 
|   241   m_bRTL = bRTL; |   241   m_bRTL = bRTL; | 
|   242 } |   242 } | 
|   243 void CFX_RTFBreak::SetAlignment(int32_t iAlignment) { |   243 void CFX_RTFBreak::SetAlignment(int32_t iAlignment) { | 
|   244   ASSERT(iAlignment >= FX_RTFLINEALIGNMENT_Left && |   244   ASSERT(iAlignment >= FX_RTFLINEALIGNMENT_Left && | 
|   245          iAlignment <= FX_RTFLINEALIGNMENT_Distributed); |   245          iAlignment <= FX_RTFLINEALIGNMENT_Distributed); | 
|   246   m_iAlignment = iAlignment; |   246   m_iAlignment = iAlignment; | 
|   247 } |   247 } | 
|   248 void CFX_RTFBreak::SetUserData(IFX_Retainable* pUserData) { |   248 void CFX_RTFBreak::SetUserData(IFX_Retainable* pUserData) { | 
|   249   if (m_pUserData == pUserData) { |   249   if (m_pUserData == pUserData) { | 
|   250     return; |   250     return; | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   285     pTC = tca.GetDataPtr(iStart--); |   285     pTC = tca.GetDataPtr(iStart--); | 
|   286     if (pTC->m_iCharWidth >= 0 || |   286     if (pTC->m_iCharWidth >= 0 || | 
|   287         pTC->GetCharType() != FX_CHARTYPE_Combination) { |   287         pTC->GetCharType() != FX_CHARTYPE_Combination) { | 
|   288       if (--index < 0) { |   288       if (--index < 0) { | 
|   289         return pTC; |   289         return pTC; | 
|   290       } |   290       } | 
|   291     } |   291     } | 
|   292   } |   292   } | 
|   293   return nullptr; |   293   return nullptr; | 
|   294 } |   294 } | 
|   295 CFX_RTFLine* CFX_RTFBreak::GetRTFLine(FX_BOOL bReady) const { |   295 CFX_RTFLine* CFX_RTFBreak::GetRTFLine(bool bReady) const { | 
|   296   if (bReady) { |   296   if (bReady) { | 
|   297     if (m_iReady == 1) { |   297     if (m_iReady == 1) { | 
|   298       return (CFX_RTFLine*)&m_RTFLine1; |   298       return (CFX_RTFLine*)&m_RTFLine1; | 
|   299     } else if (m_iReady == 2) { |   299     } else if (m_iReady == 2) { | 
|   300       return (CFX_RTFLine*)&m_RTFLine2; |   300       return (CFX_RTFLine*)&m_RTFLine2; | 
|   301     } else { |   301     } else { | 
|   302       return nullptr; |   302       return nullptr; | 
|   303     } |   303     } | 
|   304   } |   304   } | 
|   305   ASSERT(m_pCurLine); |   305   ASSERT(m_pCurLine); | 
|   306   return m_pCurLine; |   306   return m_pCurLine; | 
|   307 } |   307 } | 
|   308 CFX_RTFPieceArray* CFX_RTFBreak::GetRTFPieces(FX_BOOL bReady) const { |   308 CFX_RTFPieceArray* CFX_RTFBreak::GetRTFPieces(bool bReady) const { | 
|   309   CFX_RTFLine* pRTFLine = GetRTFLine(bReady); |   309   CFX_RTFLine* pRTFLine = GetRTFLine(bReady); | 
|   310   return pRTFLine ? &pRTFLine->m_LinePieces : nullptr; |   310   return pRTFLine ? &pRTFLine->m_LinePieces : nullptr; | 
|   311 } |   311 } | 
|   312 inline FX_CHARTYPE CFX_RTFBreak::GetUnifiedCharType( |   312 inline FX_CHARTYPE CFX_RTFBreak::GetUnifiedCharType( | 
|   313     FX_CHARTYPE chartype) const { |   313     FX_CHARTYPE chartype) const { | 
|   314   return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype; |   314   return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype; | 
|   315 } |   315 } | 
|   316 int32_t CFX_RTFBreak::GetLastPositionedTab() const { |   316 int32_t CFX_RTFBreak::GetLastPositionedTab() const { | 
|   317   int32_t iCount = m_PositionedTabs.GetSize(); |   317   int32_t iCount = m_PositionedTabs.GetSize(); | 
|   318   if (iCount < 1) { |   318   if (iCount < 1) { | 
|   319     return m_iBoundaryStart; |   319     return m_iBoundaryStart; | 
|   320   } |   320   } | 
|   321   return m_PositionedTabs[iCount - 1]; |   321   return m_PositionedTabs[iCount - 1]; | 
|   322 } |   322 } | 
|   323 FX_BOOL CFX_RTFBreak::GetPositionedTab(int32_t& iTabPos) const { |   323 bool CFX_RTFBreak::GetPositionedTab(int32_t& iTabPos) const { | 
|   324   int32_t iCount = m_PositionedTabs.GetSize(); |   324   int32_t iCount = m_PositionedTabs.GetSize(); | 
|   325   for (int32_t i = 0; i < iCount; i++) { |   325   for (int32_t i = 0; i < iCount; i++) { | 
|   326     if (m_PositionedTabs[i] > iTabPos) { |   326     if (m_PositionedTabs[i] > iTabPos) { | 
|   327       iTabPos = m_PositionedTabs[i]; |   327       iTabPos = m_PositionedTabs[i]; | 
|   328       return TRUE; |   328       return true; | 
|   329     } |   329     } | 
|   330   } |   330   } | 
|   331   return FALSE; |   331   return false; | 
|   332 } |   332 } | 
|   333 typedef uint32_t (CFX_RTFBreak::*FX_RTFBreak_LPFAppendChar)( |   333 typedef uint32_t (CFX_RTFBreak::*FX_RTFBreak_LPFAppendChar)( | 
|   334     CFX_RTFChar* pCurChar, |   334     CFX_RTFChar* pCurChar, | 
|   335     int32_t iRotation); |   335     int32_t iRotation); | 
|   336 static const FX_RTFBreak_LPFAppendChar g_FX_RTFBreak_lpfAppendChar[16] = { |   336 static const FX_RTFBreak_LPFAppendChar g_FX_RTFBreak_lpfAppendChar[16] = { | 
|   337     &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Tab, |   337     &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Tab, | 
|   338     &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Control, |   338     &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Control, | 
|   339     &CFX_RTFBreak::AppendChar_Combination, &CFX_RTFBreak::AppendChar_Others, |   339     &CFX_RTFBreak::AppendChar_Combination, &CFX_RTFBreak::AppendChar_Others, | 
|   340     &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Arabic, |   340     &CFX_RTFBreak::AppendChar_Others,      &CFX_RTFBreak::AppendChar_Arabic, | 
|   341     &CFX_RTFBreak::AppendChar_Arabic,      &CFX_RTFBreak::AppendChar_Arabic, |   341     &CFX_RTFBreak::AppendChar_Arabic,      &CFX_RTFBreak::AppendChar_Arabic, | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   413   pCurChar->m_iCharWidth = 0; |   413   pCurChar->m_iCharWidth = 0; | 
|   414   pCurChar->m_dwIdentity = m_dwIdentity; |   414   pCurChar->m_dwIdentity = m_dwIdentity; | 
|   415   if (m_pUserData) |   415   if (m_pUserData) | 
|   416     m_pUserData->Retain(); |   416     m_pUserData->Retain(); | 
|   417  |   417  | 
|   418   pCurChar->m_pUserData = m_pUserData; |   418   pCurChar->m_pUserData = m_pUserData; | 
|   419   int32_t iCharWidth = 0; |   419   int32_t iCharWidth = 0; | 
|   420   if (m_bVertical != FX_IsOdd(m_iRotation)) { |   420   if (m_bVertical != FX_IsOdd(m_iRotation)) { | 
|   421     iCharWidth = 1000; |   421     iCharWidth = 1000; | 
|   422   } else { |   422   } else { | 
|   423     if (!m_pFont->GetCharWidth(wch, iCharWidth, TRUE)) { |   423     if (!m_pFont->GetCharWidth(wch, iCharWidth, true)) { | 
|   424       iCharWidth = m_iDefChar; |   424       iCharWidth = m_iDefChar; | 
|   425     } |   425     } | 
|   426   } |   426   } | 
|   427   iCharWidth *= m_iFontSize; |   427   iCharWidth *= m_iFontSize; | 
|   428   iCharWidth = iCharWidth * m_iHorizontalScale / 100; |   428   iCharWidth = iCharWidth * m_iHorizontalScale / 100; | 
|   429   iCharWidth += m_iCharSpace; |   429   iCharWidth += m_iCharSpace; | 
|   430   pCurChar->m_iCharWidth = iCharWidth; |   430   pCurChar->m_iCharWidth = iCharWidth; | 
|   431   m_pCurLine->m_iWidth += iCharWidth; |   431   m_pCurLine->m_iWidth += iCharWidth; | 
|   432   m_eCharType = FX_CHARTYPE_Unknown; |   432   m_eCharType = FX_CHARTYPE_Unknown; | 
|   433   if (!m_bSingleLine && |   433   if (!m_bSingleLine && | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
|   458   } |   458   } | 
|   459   pCurChar->m_iCharWidth = iCharWidth; |   459   pCurChar->m_iCharWidth = iCharWidth; | 
|   460   if (iCharWidth > 0) { |   460   if (iCharWidth > 0) { | 
|   461     m_pCurLine->m_iWidth += iCharWidth; |   461     m_pCurLine->m_iWidth += iCharWidth; | 
|   462   } |   462   } | 
|   463   return FX_RTFBREAK_None; |   463   return FX_RTFBREAK_None; | 
|   464 } |   464 } | 
|   465 uint32_t CFX_RTFBreak::AppendChar_Tab(CFX_RTFChar* pCurChar, |   465 uint32_t CFX_RTFBreak::AppendChar_Tab(CFX_RTFChar* pCurChar, | 
|   466                                       int32_t iRotation) { |   466                                       int32_t iRotation) { | 
|   467   if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ExpandTab) { |   467   if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ExpandTab) { | 
|   468     FX_BOOL bBreak = FALSE; |   468     bool bBreak = false; | 
|   469     if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) { |   469     if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) { | 
|   470       bBreak = (m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance); |   470       bBreak = (m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance); | 
|   471     } |   471     } | 
|   472     int32_t& iLineWidth = m_pCurLine->m_iWidth; |   472     int32_t& iLineWidth = m_pCurLine->m_iWidth; | 
|   473     int32_t iCharWidth = iLineWidth; |   473     int32_t iCharWidth = iLineWidth; | 
|   474     if (GetPositionedTab(iCharWidth)) { |   474     if (GetPositionedTab(iCharWidth)) { | 
|   475       iCharWidth -= iLineWidth; |   475       iCharWidth -= iLineWidth; | 
|   476     } else { |   476     } else { | 
|   477       iCharWidth = m_iTabWidth * (iLineWidth / m_iTabWidth + 1) - iLineWidth; |   477       iCharWidth = m_iTabWidth * (iLineWidth / m_iTabWidth + 1) - iLineWidth; | 
|   478     } |   478     } | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   511   } |   511   } | 
|   512   return dwRet2; |   512   return dwRet2; | 
|   513 } |   513 } | 
|   514  |   514  | 
|   515 uint32_t CFX_RTFBreak::AppendChar_Arabic(CFX_RTFChar* pCurChar, |   515 uint32_t CFX_RTFBreak::AppendChar_Arabic(CFX_RTFChar* pCurChar, | 
|   516                                          int32_t iRotation) { |   516                                          int32_t iRotation) { | 
|   517   CFX_RTFChar* pLastChar = nullptr; |   517   CFX_RTFChar* pLastChar = nullptr; | 
|   518   int32_t& iLineWidth = m_pCurLine->m_iWidth; |   518   int32_t& iLineWidth = m_pCurLine->m_iWidth; | 
|   519   int32_t iCharWidth = 0; |   519   int32_t iCharWidth = 0; | 
|   520   FX_WCHAR wForm; |   520   FX_WCHAR wForm; | 
|   521   FX_BOOL bAlef = FALSE; |   521   bool bAlef = false; | 
|   522   if (m_eCharType >= FX_CHARTYPE_ArabicAlef && |   522   if (m_eCharType >= FX_CHARTYPE_ArabicAlef && | 
|   523       m_eCharType <= FX_CHARTYPE_ArabicDistortion) { |   523       m_eCharType <= FX_CHARTYPE_ArabicDistortion) { | 
|   524     pLastChar = GetLastChar(1); |   524     pLastChar = GetLastChar(1); | 
|   525     if (pLastChar) { |   525     if (pLastChar) { | 
|   526       iLineWidth -= pLastChar->m_iCharWidth; |   526       iLineWidth -= pLastChar->m_iCharWidth; | 
|   527       CFX_RTFChar* pPrevChar = GetLastChar(2); |   527       CFX_RTFChar* pPrevChar = GetLastChar(2); | 
|   528       wForm = pdfium::arabic::GetFormChar(pLastChar, pPrevChar, pCurChar); |   528       wForm = pdfium::arabic::GetFormChar(pLastChar, pPrevChar, pCurChar); | 
|   529       bAlef = (wForm == 0xFEFF && |   529       bAlef = (wForm == 0xFEFF && | 
|   530                pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef); |   530                pLastChar->GetCharType() == FX_CHARTYPE_ArabicAlef); | 
|   531       int32_t iLastRotation = pLastChar->m_nRotation + m_iLineRotation; |   531       int32_t iLastRotation = pLastChar->m_nRotation + m_iLineRotation; | 
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   618   int32_t iCount = pCurPieces->GetSize(); |   618   int32_t iCount = pCurPieces->GetSize(); | 
|   619   if (iCount > 0) { |   619   if (iCount > 0) { | 
|   620     CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount); |   620     CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount); | 
|   621     if (dwStatus > FX_RTFBREAK_PieceBreak) |   621     if (dwStatus > FX_RTFBREAK_PieceBreak) | 
|   622       pLastPiece->m_dwStatus = dwStatus; |   622       pLastPiece->m_dwStatus = dwStatus; | 
|   623     else |   623     else | 
|   624       dwStatus = pLastPiece->m_dwStatus; |   624       dwStatus = pLastPiece->m_dwStatus; | 
|   625     return dwStatus; |   625     return dwStatus; | 
|   626   } |   626   } | 
|   627  |   627  | 
|   628   CFX_RTFLine* pLastLine = GetRTFLine(TRUE); |   628   CFX_RTFLine* pLastLine = GetRTFLine(true); | 
|   629   if (pLastLine) { |   629   if (pLastLine) { | 
|   630     pCurPieces = &pLastLine->m_LinePieces; |   630     pCurPieces = &pLastLine->m_LinePieces; | 
|   631     iCount = pCurPieces->GetSize(); |   631     iCount = pCurPieces->GetSize(); | 
|   632     if (iCount-- > 0) { |   632     if (iCount-- > 0) { | 
|   633       CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(iCount); |   633       CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(iCount); | 
|   634       if (dwStatus > FX_RTFBREAK_PieceBreak) |   634       if (dwStatus > FX_RTFBREAK_PieceBreak) | 
|   635         pLastPiece->m_dwStatus = dwStatus; |   635         pLastPiece->m_dwStatus = dwStatus; | 
|   636       else |   636       else | 
|   637         dwStatus = pLastPiece->m_dwStatus; |   637         dwStatus = pLastPiece->m_dwStatus; | 
|   638       return dwStatus; |   638       return dwStatus; | 
|   639     } |   639     } | 
|   640     return FX_RTFBREAK_None; |   640     return FX_RTFBREAK_None; | 
|   641   } |   641   } | 
|   642   iCount = m_pCurLine->CountChars(); |   642   iCount = m_pCurLine->CountChars(); | 
|   643   if (iCount < 1) |   643   if (iCount < 1) | 
|   644     return FX_RTFBREAK_None; |   644     return FX_RTFBREAK_None; | 
|   645  |   645  | 
|   646   CFX_RTFChar& tc = m_pCurLine->GetChar(iCount - 1); |   646   CFX_RTFChar& tc = m_pCurLine->GetChar(iCount - 1); | 
|   647   tc.m_dwStatus = dwStatus; |   647   tc.m_dwStatus = dwStatus; | 
|   648   if (dwStatus <= FX_RTFBREAK_PieceBreak) |   648   if (dwStatus <= FX_RTFBREAK_PieceBreak) | 
|   649     return dwStatus; |   649     return dwStatus; | 
|   650  |   650  | 
|   651   m_iReady = (m_pCurLine == &m_RTFLine1) ? 1 : 2; |   651   m_iReady = (m_pCurLine == &m_RTFLine1) ? 1 : 2; | 
|   652   CFX_RTFLine* pNextLine = |   652   CFX_RTFLine* pNextLine = | 
|   653       (m_pCurLine == &m_RTFLine1) ? &m_RTFLine2 : &m_RTFLine1; |   653       (m_pCurLine == &m_RTFLine1) ? &m_RTFLine2 : &m_RTFLine1; | 
|   654   FX_BOOL bAllChars = (m_iAlignment > FX_RTFLINEALIGNMENT_Right); |   654   bool bAllChars = (m_iAlignment > FX_RTFLINEALIGNMENT_Right); | 
|   655   CFX_TPOArray tpos(100); |   655   CFX_TPOArray tpos(100); | 
|   656   if (!EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { |   656   if (!EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { | 
|   657     if (!m_bCharCode) |   657     if (!m_bCharCode) | 
|   658       EndBreak_BidiLine(tpos, dwStatus); |   658       EndBreak_BidiLine(tpos, dwStatus); | 
|   659  |   659  | 
|   660     if (!m_bPagination && m_iAlignment > FX_RTFLINEALIGNMENT_Left) |   660     if (!m_bPagination && m_iAlignment > FX_RTFLINEALIGNMENT_Left) | 
|   661       EndBreak_Alignment(tpos, bAllChars, dwStatus); |   661       EndBreak_Alignment(tpos, bAllChars, dwStatus); | 
|   662   } |   662   } | 
|   663  |   663  | 
|   664   m_pCurLine = pNextLine; |   664   m_pCurLine = pNextLine; | 
|   665   m_pCurLine->m_iStart = m_iBoundaryStart; |   665   m_pCurLine->m_iStart = m_iBoundaryStart; | 
|   666   CFX_RTFChar* pTC = GetLastChar(0); |   666   CFX_RTFChar* pTC = GetLastChar(0); | 
|   667   m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; |   667   m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; | 
|   668   return dwStatus; |   668   return dwStatus; | 
|   669 } |   669 } | 
|   670  |   670  | 
|   671 FX_BOOL CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine* pNextLine, |   671 bool CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine* pNextLine, | 
|   672                                          FX_BOOL bAllChars, |   672                                       bool bAllChars, | 
|   673                                          uint32_t dwStatus) { |   673                                       uint32_t dwStatus) { | 
|   674   FX_BOOL bDone = FALSE; |   674   bool bDone = false; | 
|   675   if (!m_bSingleLine && !m_bOrphanLine && |   675   if (!m_bSingleLine && !m_bOrphanLine && | 
|   676       m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) { |   676       m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) { | 
|   677     CFX_RTFChar& tc = m_pCurLine->GetChar(m_pCurLine->CountChars() - 1); |   677     CFX_RTFChar& tc = m_pCurLine->GetChar(m_pCurLine->CountChars() - 1); | 
|   678     switch (tc.GetCharType()) { |   678     switch (tc.GetCharType()) { | 
|   679       case FX_CHARTYPE_Tab: |   679       case FX_CHARTYPE_Tab: | 
|   680         if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) { |   680         if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) { | 
|   681           SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); |   681           SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); | 
|   682           bDone = TRUE; |   682           bDone = true; | 
|   683         } |   683         } | 
|   684         break; |   684         break; | 
|   685       case FX_CHARTYPE_Control: |   685       case FX_CHARTYPE_Control: | 
|   686         break; |   686         break; | 
|   687       case FX_CHARTYPE_Space: |   687       case FX_CHARTYPE_Space: | 
|   688         if ((m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0) { |   688         if ((m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0) { | 
|   689           SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); |   689           SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); | 
|   690           bDone = TRUE; |   690           bDone = true; | 
|   691         } |   691         } | 
|   692         break; |   692         break; | 
|   693       default: |   693       default: | 
|   694         SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); |   694         SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); | 
|   695         bDone = TRUE; |   695         bDone = true; | 
|   696         break; |   696         break; | 
|   697     } |   697     } | 
|   698   } |   698   } | 
|   699   if (m_bPagination || m_pCurLine->m_iMBCSChars > 0) { |   699   if (m_bPagination || m_pCurLine->m_iMBCSChars > 0) { | 
|   700     const CFX_RTFChar* pCurChars = m_pCurLine->m_LineChars.GetData(); |   700     const CFX_RTFChar* pCurChars = m_pCurLine->m_LineChars.GetData(); | 
|   701     const CFX_RTFChar* pTC; |   701     const CFX_RTFChar* pTC; | 
|   702     CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces; |   702     CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces; | 
|   703     CFX_RTFPiece tp; |   703     CFX_RTFPiece tp; | 
|   704     tp.m_pChars = &m_pCurLine->m_LineChars; |   704     tp.m_pChars = &m_pCurLine->m_LineChars; | 
|   705     FX_BOOL bNew = TRUE; |   705     bool bNew = true; | 
|   706     uint32_t dwIdentity = (uint32_t)-1; |   706     uint32_t dwIdentity = (uint32_t)-1; | 
|   707     int32_t iLast = m_pCurLine->CountChars() - 1, j = 0; |   707     int32_t iLast = m_pCurLine->CountChars() - 1, j = 0; | 
|   708     for (int32_t i = 0; i <= iLast;) { |   708     for (int32_t i = 0; i <= iLast;) { | 
|   709       pTC = pCurChars + i; |   709       pTC = pCurChars + i; | 
|   710       if (bNew) { |   710       if (bNew) { | 
|   711         tp.m_iStartChar = i; |   711         tp.m_iStartChar = i; | 
|   712         tp.m_iStartPos += tp.m_iWidth; |   712         tp.m_iStartPos += tp.m_iWidth; | 
|   713         tp.m_iWidth = 0; |   713         tp.m_iWidth = 0; | 
|   714         tp.m_dwStatus = pTC->m_dwStatus; |   714         tp.m_dwStatus = pTC->m_dwStatus; | 
|   715         tp.m_iFontSize = pTC->m_iFontSize; |   715         tp.m_iFontSize = pTC->m_iFontSize; | 
|   716         tp.m_iFontHeight = pTC->m_iFontHeight; |   716         tp.m_iFontHeight = pTC->m_iFontHeight; | 
|   717         tp.m_iHorizontalScale = pTC->m_iHorizontalScale; |   717         tp.m_iHorizontalScale = pTC->m_iHorizontalScale; | 
|   718         tp.m_iVerticalScale = pTC->m_iVertialScale; |   718         tp.m_iVerticalScale = pTC->m_iVertialScale; | 
|   719         tp.m_dwLayoutStyles = pTC->m_dwLayoutStyles; |   719         tp.m_dwLayoutStyles = pTC->m_dwLayoutStyles; | 
|   720         dwIdentity = pTC->m_dwIdentity; |   720         dwIdentity = pTC->m_dwIdentity; | 
|   721         tp.m_dwIdentity = dwIdentity; |   721         tp.m_dwIdentity = dwIdentity; | 
|   722         tp.m_pUserData = pTC->m_pUserData; |   722         tp.m_pUserData = pTC->m_pUserData; | 
|   723         j = i; |   723         j = i; | 
|   724         bNew = FALSE; |   724         bNew = false; | 
|   725       } |   725       } | 
|   726       if (i == iLast || pTC->m_dwStatus != FX_RTFBREAK_None || |   726       if (i == iLast || pTC->m_dwStatus != FX_RTFBREAK_None || | 
|   727           pTC->m_dwIdentity != dwIdentity) { |   727           pTC->m_dwIdentity != dwIdentity) { | 
|   728         tp.m_iChars = i - j; |   728         tp.m_iChars = i - j; | 
|   729         if (pTC->m_dwIdentity == dwIdentity) { |   729         if (pTC->m_dwIdentity == dwIdentity) { | 
|   730           tp.m_dwStatus = pTC->m_dwStatus; |   730           tp.m_dwStatus = pTC->m_dwStatus; | 
|   731           tp.m_iWidth += pTC->m_iCharWidth; |   731           tp.m_iWidth += pTC->m_iCharWidth; | 
|   732           tp.m_iChars += 1; |   732           tp.m_iChars += 1; | 
|   733           i++; |   733           i++; | 
|   734         } |   734         } | 
|   735         pCurPieces->Add(tp); |   735         pCurPieces->Add(tp); | 
|   736         bNew = TRUE; |   736         bNew = true; | 
|   737       } else { |   737       } else { | 
|   738         tp.m_iWidth += pTC->m_iCharWidth; |   738         tp.m_iWidth += pTC->m_iCharWidth; | 
|   739         i++; |   739         i++; | 
|   740       } |   740       } | 
|   741     } |   741     } | 
|   742     return TRUE; |   742     return true; | 
|   743   } |   743   } | 
|   744   if (bAllChars && !bDone) { |   744   if (bAllChars && !bDone) { | 
|   745     int32_t iEndPos = m_pCurLine->GetLineEnd(); |   745     int32_t iEndPos = m_pCurLine->GetLineEnd(); | 
|   746     GetBreakPos(m_pCurLine->m_LineChars, iEndPos, bAllChars, TRUE); |   746     GetBreakPos(m_pCurLine->m_LineChars, iEndPos, bAllChars, true); | 
|   747   } |   747   } | 
|   748   return FALSE; |   748   return false; | 
|   749 } |   749 } | 
|   750 void CFX_RTFBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, uint32_t dwStatus) { |   750 void CFX_RTFBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, uint32_t dwStatus) { | 
|   751   FX_TPO tpo; |   751   FX_TPO tpo; | 
|   752   CFX_RTFPiece tp; |   752   CFX_RTFPiece tp; | 
|   753   CFX_RTFChar* pTC; |   753   CFX_RTFChar* pTC; | 
|   754   int32_t i, j; |   754   int32_t i, j; | 
|   755   CFX_RTFCharArray& chars = m_pCurLine->m_LineChars; |   755   CFX_RTFCharArray& chars = m_pCurLine->m_LineChars; | 
|   756   int32_t iCount = m_pCurLine->CountChars(); |   756   int32_t iCount = m_pCurLine->CountChars(); | 
|   757   FX_BOOL bDone = (!m_bPagination && !m_bCharCode && |   757   bool bDone = (!m_bPagination && !m_bCharCode && | 
|   758                    (m_pCurLine->m_iArabicChars > 0 || m_bRTL)); |   758                 (m_pCurLine->m_iArabicChars > 0 || m_bRTL)); | 
|   759   if (bDone) { |   759   if (bDone) { | 
|   760     int32_t iBidiNum = 0; |   760     int32_t iBidiNum = 0; | 
|   761     for (i = 0; i < iCount; i++) { |   761     for (i = 0; i < iCount; i++) { | 
|   762       pTC = chars.GetDataPtr(i); |   762       pTC = chars.GetDataPtr(i); | 
|   763       pTC->m_iBidiPos = i; |   763       pTC->m_iBidiPos = i; | 
|   764       if (pTC->GetCharType() != FX_CHARTYPE_Control) { |   764       if (pTC->GetCharType() != FX_CHARTYPE_Control) { | 
|   765         iBidiNum = i; |   765         iBidiNum = i; | 
|   766       } |   766       } | 
|   767       if (i == 0) { |   767       if (i == 0) { | 
|   768         pTC->m_iBidiLevel = 1; |   768         pTC->m_iBidiLevel = 1; | 
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   837     int32_t iStartPos = m_pCurLine->m_iStart; |   837     int32_t iStartPos = m_pCurLine->m_iStart; | 
|   838     for (i = 0; i <= j; i++) { |   838     for (i = 0; i <= j; i++) { | 
|   839       tpo = tpos.GetAt(i); |   839       tpo = tpos.GetAt(i); | 
|   840       CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index); |   840       CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index); | 
|   841       ttp.m_iStartPos = iStartPos; |   841       ttp.m_iStartPos = iStartPos; | 
|   842       iStartPos += ttp.m_iWidth; |   842       iStartPos += ttp.m_iWidth; | 
|   843     } |   843     } | 
|   844   } |   844   } | 
|   845 } |   845 } | 
|   846 void CFX_RTFBreak::EndBreak_Alignment(CFX_TPOArray& tpos, |   846 void CFX_RTFBreak::EndBreak_Alignment(CFX_TPOArray& tpos, | 
|   847                                       FX_BOOL bAllChars, |   847                                       bool bAllChars, | 
|   848                                       uint32_t dwStatus) { |   848                                       uint32_t dwStatus) { | 
|   849   CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces; |   849   CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces; | 
|   850   int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth; |   850   int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth; | 
|   851   int32_t iCount = pCurPieces->GetSize(); |   851   int32_t iCount = pCurPieces->GetSize(); | 
|   852   FX_BOOL bFind = FALSE; |   852   bool bFind = false; | 
|   853   uint32_t dwCharType; |   853   uint32_t dwCharType; | 
|   854   int32_t i, j; |   854   int32_t i, j; | 
|   855   FX_TPO tpo; |   855   FX_TPO tpo; | 
|   856   for (i = iCount - 1; i > -1; i--) { |   856   for (i = iCount - 1; i > -1; i--) { | 
|   857     tpo = tpos.GetAt(i); |   857     tpo = tpos.GetAt(i); | 
|   858     CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index); |   858     CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index); | 
|   859     if (!bFind) { |   859     if (!bFind) { | 
|   860       iNetWidth = ttp.GetEndPos(); |   860       iNetWidth = ttp.GetEndPos(); | 
|   861     } |   861     } | 
|   862     FX_BOOL bArabic = FX_IsOdd(ttp.m_iBidiLevel); |   862     bool bArabic = FX_IsOdd(ttp.m_iBidiLevel); | 
|   863     j = bArabic ? 0 : ttp.m_iChars - 1; |   863     j = bArabic ? 0 : ttp.m_iChars - 1; | 
|   864     while (j > -1 && j < ttp.m_iChars) { |   864     while (j > -1 && j < ttp.m_iChars) { | 
|   865       const CFX_RTFChar& tc = ttp.GetChar(j); |   865       const CFX_RTFChar& tc = ttp.GetChar(j); | 
|   866       if (tc.m_nBreakType == FX_LBT_DIRECT_BRK) { |   866       if (tc.m_nBreakType == FX_LBT_DIRECT_BRK) { | 
|   867         iGapChars++; |   867         iGapChars++; | 
|   868       } |   868       } | 
|   869       if (!bFind || !bAllChars) { |   869       if (!bFind || !bAllChars) { | 
|   870         dwCharType = tc.GetCharType(); |   870         dwCharType = tc.GetCharType(); | 
|   871         if (dwCharType == FX_CHARTYPE_Space || |   871         if (dwCharType == FX_CHARTYPE_Space || | 
|   872             dwCharType == FX_CHARTYPE_Control) { |   872             dwCharType == FX_CHARTYPE_Control) { | 
|   873           if (!bFind) { |   873           if (!bFind) { | 
|   874             iCharWidth = tc.m_iCharWidth; |   874             iCharWidth = tc.m_iCharWidth; | 
|   875             if (bAllChars && iCharWidth > 0) { |   875             if (bAllChars && iCharWidth > 0) { | 
|   876               iNetWidth -= iCharWidth; |   876               iNetWidth -= iCharWidth; | 
|   877             } |   877             } | 
|   878           } |   878           } | 
|   879         } else { |   879         } else { | 
|   880           bFind = TRUE; |   880           bFind = true; | 
|   881           if (!bAllChars) { |   881           if (!bAllChars) { | 
|   882             break; |   882             break; | 
|   883           } |   883           } | 
|   884         } |   884         } | 
|   885       } |   885       } | 
|   886       j += bArabic ? 1 : -1; |   886       j += bArabic ? 1 : -1; | 
|   887     } |   887     } | 
|   888     if (!bAllChars && bFind) { |   888     if (!bAllChars && bFind) { | 
|   889       break; |   889       break; | 
|   890     } |   890     } | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   929       for (i = 0; i < iCount; i++) { |   929       for (i = 0; i < iCount; i++) { | 
|   930         CFX_RTFPiece& ttp = pCurPieces->GetAt(i); |   930         CFX_RTFPiece& ttp = pCurPieces->GetAt(i); | 
|   931         ttp.m_iStartPos += iOffset; |   931         ttp.m_iStartPos += iOffset; | 
|   932       } |   932       } | 
|   933     } |   933     } | 
|   934   } |   934   } | 
|   935 } |   935 } | 
|   936  |   936  | 
|   937 int32_t CFX_RTFBreak::GetBreakPos(CFX_RTFCharArray& tca, |   937 int32_t CFX_RTFBreak::GetBreakPos(CFX_RTFCharArray& tca, | 
|   938                                   int32_t& iEndPos, |   938                                   int32_t& iEndPos, | 
|   939                                   FX_BOOL bAllChars, |   939                                   bool bAllChars, | 
|   940                                   FX_BOOL bOnlyBrk) { |   940                                   bool bOnlyBrk) { | 
|   941   int32_t iLength = tca.GetSize() - 1; |   941   int32_t iLength = tca.GetSize() - 1; | 
|   942   if (iLength < 1) |   942   if (iLength < 1) | 
|   943     return iLength; |   943     return iLength; | 
|   944  |   944  | 
|   945   int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, |   945   int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, | 
|   946           iLast = -1, iLastPos = -1; |   946           iLast = -1, iLastPos = -1; | 
|   947   if (m_bSingleLine || m_bOrphanLine || iEndPos <= m_iBoundaryEnd) { |   947   if (m_bSingleLine || m_bOrphanLine || iEndPos <= m_iBoundaryEnd) { | 
|   948     if (!bAllChars || m_bCharCode) |   948     if (!bAllChars || m_bCharCode) | 
|   949       return iLength; |   949       return iLength; | 
|   950  |   950  | 
|   951     iBreak = iLength; |   951     iBreak = iLength; | 
|   952     iBreakPos = iEndPos; |   952     iBreakPos = iEndPos; | 
|   953   } |   953   } | 
|   954   CFX_RTFChar* pCharArray = tca.GetData(); |   954   CFX_RTFChar* pCharArray = tca.GetData(); | 
|   955   if (m_bCharCode) { |   955   if (m_bCharCode) { | 
|   956     const CFX_RTFChar* pChar; |   956     const CFX_RTFChar* pChar; | 
|   957     int32_t iCharWidth; |   957     int32_t iCharWidth; | 
|   958     while (iLength > 0) { |   958     while (iLength > 0) { | 
|   959       if (iEndPos <= m_iBoundaryEnd) |   959       if (iEndPos <= m_iBoundaryEnd) | 
|   960         break; |   960         break; | 
|   961  |   961  | 
|   962       pChar = pCharArray + iLength--; |   962       pChar = pCharArray + iLength--; | 
|   963       iCharWidth = pChar->m_iCharWidth; |   963       iCharWidth = pChar->m_iCharWidth; | 
|   964       if (iCharWidth > 0) |   964       if (iCharWidth > 0) | 
|   965         iEndPos -= iCharWidth; |   965         iEndPos -= iCharWidth; | 
|   966     } |   966     } | 
|   967     return iLength; |   967     return iLength; | 
|   968   } |   968   } | 
|   969   FX_BOOL bSpaceBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0; |   969   bool bSpaceBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0; | 
|   970   FX_BOOL bTabBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0; |   970   bool bTabBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0; | 
|   971   FX_BOOL bNumberBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_NumberBreak) != 0; |   971   bool bNumberBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_NumberBreak) != 0; | 
|   972   FX_BOOL bInfixBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_InfixBreak) != 0; |   972   bool bInfixBreak = (m_dwPolicies & FX_RTFBREAKPOLICY_InfixBreak) != 0; | 
|   973   FX_LINEBREAKTYPE eType; |   973   FX_LINEBREAKTYPE eType; | 
|   974   uint32_t nCodeProp, nCur, nNext; |   974   uint32_t nCodeProp, nCur, nNext; | 
|   975   CFX_RTFChar* pCur = pCharArray + iLength--; |   975   CFX_RTFChar* pCur = pCharArray + iLength--; | 
|   976   if (bAllChars) { |   976   if (bAllChars) { | 
|   977     pCur->m_nBreakType = FX_LBT_UNKNOWN; |   977     pCur->m_nBreakType = FX_LBT_UNKNOWN; | 
|   978   } |   978   } | 
|   979   nCodeProp = pCur->m_dwCharProps; |   979   nCodeProp = pCur->m_dwCharProps; | 
|   980   nNext = nCodeProp & 0x003F; |   980   nNext = nCodeProp & 0x003F; | 
|   981   int32_t iCharWidth = pCur->m_iCharWidth; |   981   int32_t iCharWidth = pCur->m_iCharWidth; | 
|   982   if (iCharWidth > 0) { |   982   if (iCharWidth > 0) { | 
|   983     iEndPos -= iCharWidth; |   983     iEndPos -= iCharWidth; | 
|   984   } |   984   } | 
|   985   while (iLength >= 0) { |   985   while (iLength >= 0) { | 
|   986     pCur = pCharArray + iLength; |   986     pCur = pCharArray + iLength; | 
|   987     nCodeProp = pCur->m_dwCharProps; |   987     nCodeProp = pCur->m_dwCharProps; | 
|   988     nCur = nCodeProp & 0x003F; |   988     nCur = nCodeProp & 0x003F; | 
|   989     FX_BOOL bNeedBreak = FALSE; |   989     bool bNeedBreak = false; | 
|   990     if (nCur == FX_CBP_SP) { |   990     if (nCur == FX_CBP_SP) { | 
|   991       bNeedBreak = !bSpaceBreak; |   991       bNeedBreak = !bSpaceBreak; | 
|   992       if (nNext == FX_CBP_SP) { |   992       if (nNext == FX_CBP_SP) { | 
|   993         eType = bSpaceBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK; |   993         eType = bSpaceBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK; | 
|   994       } else { |   994       } else { | 
|   995         eType = gs_FX_LineBreak_PairTable[nCur][nNext]; |   995         eType = gs_FX_LineBreak_PairTable[nCur][nNext]; | 
|   996       } |   996       } | 
|   997     } else if (nCur == FX_CBP_TB) { |   997     } else if (nCur == FX_CBP_TB) { | 
|   998       bNeedBreak = !bTabBreak; |   998       bNeedBreak = !bTabBreak; | 
|   999       if (nNext == FX_CBP_TB) { |   999       if (nNext == FX_CBP_TB) { | 
|  1000         eType = bTabBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK; |  1000         eType = bTabBreak ? FX_LBT_DIRECT_BRK : FX_LBT_PROHIBITED_BRK; | 
|  1001       } else { |  1001       } else { | 
|  1002         eType = gs_FX_LineBreak_PairTable[nCur][nNext]; |  1002         eType = gs_FX_LineBreak_PairTable[nCur][nNext]; | 
|  1003       } |  1003       } | 
|  1004     } else if ((bNumberBreak && nCur == FX_CBP_NU && nNext == FX_CBP_NU) || |  1004     } else if ((bNumberBreak && nCur == FX_CBP_NU && nNext == FX_CBP_NU) || | 
|  1005                (bInfixBreak && nCur == FX_CBP_IS && nNext == FX_CBP_IS)) { |  1005                (bInfixBreak && nCur == FX_CBP_IS && nNext == FX_CBP_IS)) { | 
|  1006       eType = FX_LBT_DIRECT_BRK; |  1006       eType = FX_LBT_DIRECT_BRK; | 
|  1007     } else { |  1007     } else { | 
|  1008       if (nNext == FX_CBP_SP) { |  1008       if (nNext == FX_CBP_SP) { | 
|  1009         eType = FX_LBT_PROHIBITED_BRK; |  1009         eType = FX_LBT_PROHIBITED_BRK; | 
|  1010       } else { |  1010       } else { | 
|  1011         eType = gs_FX_LineBreak_PairTable[nCur][nNext]; |  1011         eType = gs_FX_LineBreak_PairTable[nCur][nNext]; | 
|  1012       } |  1012       } | 
|  1013     } |  1013     } | 
|  1014     if (bAllChars) { |  1014     if (bAllChars) { | 
|  1015       pCur->m_nBreakType = eType; |  1015       pCur->m_nBreakType = eType; | 
|  1016     } |  1016     } | 
|  1017     if (!bOnlyBrk) { |  1017     if (!bOnlyBrk) { | 
|  1018       iCharWidth = pCur->m_iCharWidth; |  1018       iCharWidth = pCur->m_iCharWidth; | 
|  1019       FX_BOOL bBreak = FALSE; |  1019       bool bBreak = false; | 
|  1020       if (nCur == FX_CBP_TB && bTabBreak) { |  1020       if (nCur == FX_CBP_TB && bTabBreak) { | 
|  1021         bBreak = iCharWidth > 0 && iEndPos - iCharWidth <= m_iBoundaryEnd; |  1021         bBreak = iCharWidth > 0 && iEndPos - iCharWidth <= m_iBoundaryEnd; | 
|  1022       } else { |  1022       } else { | 
|  1023         bBreak = iEndPos <= m_iBoundaryEnd; |  1023         bBreak = iEndPos <= m_iBoundaryEnd; | 
|  1024       } |  1024       } | 
|  1025       if (m_bSingleLine || m_bOrphanLine || bBreak || bNeedBreak) { |  1025       if (m_bSingleLine || m_bOrphanLine || bBreak || bNeedBreak) { | 
|  1026         if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) { |  1026         if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) { | 
|  1027           iBreak = iLength; |  1027           iBreak = iLength; | 
|  1028           iBreakPos = iEndPos; |  1028           iBreakPos = iEndPos; | 
|  1029           if (!bAllChars) { |  1029           if (!bAllChars) { | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
|  1058   } |  1058   } | 
|  1059   if (iLast > -1) { |  1059   if (iLast > -1) { | 
|  1060     iEndPos = iLastPos; |  1060     iEndPos = iLastPos; | 
|  1061     return iLast; |  1061     return iLast; | 
|  1062   } |  1062   } | 
|  1063   return 0; |  1063   return 0; | 
|  1064 } |  1064 } | 
|  1065  |  1065  | 
|  1066 void CFX_RTFBreak::SplitTextLine(CFX_RTFLine* pCurLine, |  1066 void CFX_RTFBreak::SplitTextLine(CFX_RTFLine* pCurLine, | 
|  1067                                  CFX_RTFLine* pNextLine, |  1067                                  CFX_RTFLine* pNextLine, | 
|  1068                                  FX_BOOL bAllChars) { |  1068                                  bool bAllChars) { | 
|  1069   ASSERT(pCurLine && pNextLine); |  1069   ASSERT(pCurLine && pNextLine); | 
|  1070   int32_t iCount = pCurLine->CountChars(); |  1070   int32_t iCount = pCurLine->CountChars(); | 
|  1071   if (iCount < 2) { |  1071   if (iCount < 2) { | 
|  1072     return; |  1072     return; | 
|  1073   } |  1073   } | 
|  1074   int32_t iEndPos = pCurLine->GetLineEnd(); |  1074   int32_t iEndPos = pCurLine->GetLineEnd(); | 
|  1075   CFX_RTFCharArray& curChars = pCurLine->m_LineChars; |  1075   CFX_RTFCharArray& curChars = pCurLine->m_LineChars; | 
|  1076   int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE); |  1076   int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, false); | 
|  1077   if (iCharPos < 0) { |  1077   if (iCharPos < 0) { | 
|  1078     iCharPos = 0; |  1078     iCharPos = 0; | 
|  1079   } |  1079   } | 
|  1080   iCharPos++; |  1080   iCharPos++; | 
|  1081   if (iCharPos >= iCount) { |  1081   if (iCharPos >= iCount) { | 
|  1082     pNextLine->RemoveAll(TRUE); |  1082     pNextLine->RemoveAll(true); | 
|  1083     CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1); |  1083     CFX_Char* pTC = curChars.GetDataPtr(iCharPos - 1); | 
|  1084     pTC->m_nBreakType = FX_LBT_UNKNOWN; |  1084     pTC->m_nBreakType = FX_LBT_UNKNOWN; | 
|  1085     return; |  1085     return; | 
|  1086   } |  1086   } | 
|  1087   CFX_RTFCharArray& nextChars = pNextLine->m_LineChars; |  1087   CFX_RTFCharArray& nextChars = pNextLine->m_LineChars; | 
|  1088   int cur_size = curChars.GetSize(); |  1088   int cur_size = curChars.GetSize(); | 
|  1089   nextChars.SetSize(cur_size - iCharPos); |  1089   nextChars.SetSize(cur_size - iCharPos); | 
|  1090   FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos), |  1090   FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos), | 
|  1091                (cur_size - iCharPos) * sizeof(CFX_RTFChar)); |  1091                (cur_size - iCharPos) * sizeof(CFX_RTFChar)); | 
|  1092   iCount -= iCharPos; |  1092   iCount -= iCharPos; | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
|  1106     } |  1106     } | 
|  1107     if (tc->m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_MBCSCode) { |  1107     if (tc->m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_MBCSCode) { | 
|  1108       pCurLine->m_iMBCSChars--; |  1108       pCurLine->m_iMBCSChars--; | 
|  1109       pNextLine->m_iMBCSChars++; |  1109       pNextLine->m_iMBCSChars++; | 
|  1110     } |  1110     } | 
|  1111     tc->m_dwStatus = 0; |  1111     tc->m_dwStatus = 0; | 
|  1112   } |  1112   } | 
|  1113 } |  1113 } | 
|  1114  |  1114  | 
|  1115 int32_t CFX_RTFBreak::CountBreakPieces() const { |  1115 int32_t CFX_RTFBreak::CountBreakPieces() const { | 
|  1116   CFX_RTFPieceArray* pRTFPieces = GetRTFPieces(TRUE); |  1116   CFX_RTFPieceArray* pRTFPieces = GetRTFPieces(true); | 
|  1117   return pRTFPieces ? pRTFPieces->GetSize() : 0; |  1117   return pRTFPieces ? pRTFPieces->GetSize() : 0; | 
|  1118 } |  1118 } | 
|  1119  |  1119  | 
|  1120 const CFX_RTFPiece* CFX_RTFBreak::GetBreakPiece(int32_t index) const { |  1120 const CFX_RTFPiece* CFX_RTFBreak::GetBreakPiece(int32_t index) const { | 
|  1121   CFX_RTFPieceArray* pRTFPieces = GetRTFPieces(TRUE); |  1121   CFX_RTFPieceArray* pRTFPieces = GetRTFPieces(true); | 
|  1122   if (!pRTFPieces) |  1122   if (!pRTFPieces) | 
|  1123     return nullptr; |  1123     return nullptr; | 
|  1124  |  1124  | 
|  1125   if (index < 0 || index >= pRTFPieces->GetSize()) |  1125   if (index < 0 || index >= pRTFPieces->GetSize()) | 
|  1126     return nullptr; |  1126     return nullptr; | 
|  1127  |  1127  | 
|  1128   return pRTFPieces->GetPtrAt(index); |  1128   return pRTFPieces->GetPtrAt(index); | 
|  1129 } |  1129 } | 
|  1130  |  1130  | 
|  1131 void CFX_RTFBreak::GetLineRect(CFX_RectF& rect) const { |  1131 void CFX_RTFBreak::GetLineRect(CFX_RectF& rect) const { | 
|  1132   rect.top = 0; |  1132   rect.top = 0; | 
|  1133   CFX_RTFLine* pRTFLine = GetRTFLine(TRUE); |  1133   CFX_RTFLine* pRTFLine = GetRTFLine(true); | 
|  1134   if (!pRTFLine) { |  1134   if (!pRTFLine) { | 
|  1135     rect.left = ((FX_FLOAT)m_iBoundaryStart) / 20000.0f; |  1135     rect.left = ((FX_FLOAT)m_iBoundaryStart) / 20000.0f; | 
|  1136     rect.width = rect.height = 0; |  1136     rect.width = rect.height = 0; | 
|  1137     return; |  1137     return; | 
|  1138   } |  1138   } | 
|  1139   rect.left = ((FX_FLOAT)pRTFLine->m_iStart) / 20000.0f; |  1139   rect.left = ((FX_FLOAT)pRTFLine->m_iStart) / 20000.0f; | 
|  1140   rect.width = ((FX_FLOAT)pRTFLine->m_iWidth) / 20000.0f; |  1140   rect.width = ((FX_FLOAT)pRTFLine->m_iWidth) / 20000.0f; | 
|  1141   CFX_RTFPieceArray& rtfPieces = pRTFLine->m_LinePieces; |  1141   CFX_RTFPieceArray& rtfPieces = pRTFLine->m_LinePieces; | 
|  1142   int32_t iCount = rtfPieces.GetSize(); |  1142   int32_t iCount = rtfPieces.GetSize(); | 
|  1143   if (iCount < 1) { |  1143   if (iCount < 1) { | 
|  1144     rect.width = 0; |  1144     rect.width = 0; | 
|  1145     return; |  1145     return; | 
|  1146   } |  1146   } | 
|  1147   CFX_RTFPiece* pBreakPiece; |  1147   CFX_RTFPiece* pBreakPiece; | 
|  1148   int32_t iLineHeight = 0, iMax; |  1148   int32_t iLineHeight = 0, iMax; | 
|  1149   for (int32_t i = 0; i < iCount; i++) { |  1149   for (int32_t i = 0; i < iCount; i++) { | 
|  1150     pBreakPiece = rtfPieces.GetPtrAt(i); |  1150     pBreakPiece = rtfPieces.GetPtrAt(i); | 
|  1151     int32_t iFontHeight = FXSYS_round(pBreakPiece->m_iFontHeight * |  1151     int32_t iFontHeight = FXSYS_round(pBreakPiece->m_iFontHeight * | 
|  1152                                       pBreakPiece->m_iVerticalScale / 100.0f); |  1152                                       pBreakPiece->m_iVerticalScale / 100.0f); | 
|  1153     iMax = std::max(pBreakPiece->m_iFontSize, iFontHeight); |  1153     iMax = std::max(pBreakPiece->m_iFontSize, iFontHeight); | 
|  1154     if (i == 0) { |  1154     if (i == 0) { | 
|  1155       iLineHeight = iMax; |  1155       iLineHeight = iMax; | 
|  1156     } else if (iLineHeight < iMax) { |  1156     } else if (iLineHeight < iMax) { | 
|  1157       iLineHeight = iMax; |  1157       iLineHeight = iMax; | 
|  1158     } |  1158     } | 
|  1159   } |  1159   } | 
|  1160   rect.height = ((FX_FLOAT)iLineHeight) / 20.0f; |  1160   rect.height = ((FX_FLOAT)iLineHeight) / 20.0f; | 
|  1161 } |  1161 } | 
|  1162 void CFX_RTFBreak::ClearBreakPieces() { |  1162 void CFX_RTFBreak::ClearBreakPieces() { | 
|  1163   CFX_RTFLine* pRTFLine = GetRTFLine(TRUE); |  1163   CFX_RTFLine* pRTFLine = GetRTFLine(true); | 
|  1164   if (pRTFLine) { |  1164   if (pRTFLine) { | 
|  1165     pRTFLine->RemoveAll(TRUE); |  1165     pRTFLine->RemoveAll(true); | 
|  1166   } |  1166   } | 
|  1167   m_iReady = 0; |  1167   m_iReady = 0; | 
|  1168 } |  1168 } | 
|  1169 void CFX_RTFBreak::Reset() { |  1169 void CFX_RTFBreak::Reset() { | 
|  1170   m_eCharType = FX_CHARTYPE_Unknown; |  1170   m_eCharType = FX_CHARTYPE_Unknown; | 
|  1171   m_RTFLine1.RemoveAll(TRUE); |  1171   m_RTFLine1.RemoveAll(true); | 
|  1172   m_RTFLine2.RemoveAll(TRUE); |  1172   m_RTFLine2.RemoveAll(true); | 
|  1173 } |  1173 } | 
|  1174 int32_t CFX_RTFBreak::GetDisplayPos(const FX_RTFTEXTOBJ* pText, |  1174 int32_t CFX_RTFBreak::GetDisplayPos(const FX_RTFTEXTOBJ* pText, | 
|  1175                                     FXTEXT_CHARPOS* pCharPos, |  1175                                     FXTEXT_CHARPOS* pCharPos, | 
|  1176                                     FX_BOOL bCharCode, |  1176                                     bool bCharCode, | 
|  1177                                     CFX_WideString* pWSForms, |  1177                                     CFX_WideString* pWSForms, | 
|  1178                                     FX_AdjustCharDisplayPos pAdjustPos) const { |  1178                                     FX_AdjustCharDisplayPos pAdjustPos) const { | 
|  1179   if (!pText || pText->iLength < 1) { |  1179   if (!pText || pText->iLength < 1) { | 
|  1180     return 0; |  1180     return 0; | 
|  1181   } |  1181   } | 
|  1182   ASSERT(pText->pStr && pText->pWidths && pText->pFont && pText->pRect); |  1182   ASSERT(pText->pStr && pText->pWidths && pText->pFont && pText->pRect); | 
|  1183   const FX_WCHAR* pStr = pText->pStr; |  1183   const FX_WCHAR* pStr = pText->pStr; | 
|  1184   int32_t* pWidths = pText->pWidths; |  1184   int32_t* pWidths = pText->pWidths; | 
|  1185   int32_t iLength = pText->iLength - 1; |  1185   int32_t iLength = pText->iLength - 1; | 
|  1186   CFGAS_GEFont* pFont = pText->pFont; |  1186   CFGAS_GEFont* pFont = pText->pFont; | 
|  1187   uint32_t dwStyles = pText->dwLayoutStyles; |  1187   uint32_t dwStyles = pText->dwLayoutStyles; | 
|  1188   CFX_RectF rtText(*pText->pRect); |  1188   CFX_RectF rtText(*pText->pRect); | 
|  1189   FX_BOOL bRTLPiece = FX_IsOdd(pText->iBidiLevel); |  1189   bool bRTLPiece = FX_IsOdd(pText->iBidiLevel); | 
|  1190   FX_FLOAT fFontSize = pText->fFontSize; |  1190   FX_FLOAT fFontSize = pText->fFontSize; | 
|  1191   int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); |  1191   int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); | 
|  1192   int32_t iAscent = pFont->GetAscent(); |  1192   int32_t iAscent = pFont->GetAscent(); | 
|  1193   int32_t iDescent = pFont->GetDescent(); |  1193   int32_t iDescent = pFont->GetDescent(); | 
|  1194   int32_t iMaxHeight = iAscent - iDescent; |  1194   int32_t iMaxHeight = iAscent - iDescent; | 
|  1195   FX_FLOAT fFontHeight = fFontSize; |  1195   FX_FLOAT fFontHeight = fFontSize; | 
|  1196   FX_FLOAT fAscent = fFontHeight * (FX_FLOAT)iAscent / (FX_FLOAT)iMaxHeight; |  1196   FX_FLOAT fAscent = fFontHeight * (FX_FLOAT)iAscent / (FX_FLOAT)iMaxHeight; | 
|  1197   FX_FLOAT fDescent = fFontHeight * (FX_FLOAT)iDescent / (FX_FLOAT)iMaxHeight; |  1197   FX_FLOAT fDescent = fFontHeight * (FX_FLOAT)iDescent / (FX_FLOAT)iMaxHeight; | 
|  1198   FX_BOOL bVerticalDoc = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalLayout) != 0; |  1198   bool bVerticalDoc = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalLayout) != 0; | 
|  1199   FX_BOOL bVerticalChar = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalChars) != 0; |  1199   bool bVerticalChar = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalChars) != 0; | 
|  1200   FX_BOOL bArabicNumber = (dwStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) != 0; |  1200   bool bArabicNumber = (dwStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) != 0; | 
|  1201   FX_BOOL bMBCSCode = (dwStyles & FX_RTFLAYOUTSTYLE_MBCSCode) != 0; |  1201   bool bMBCSCode = (dwStyles & FX_RTFLAYOUTSTYLE_MBCSCode) != 0; | 
|  1202   int32_t iRotation = GetLineRotation(dwStyles) + pText->iCharRotation; |  1202   int32_t iRotation = GetLineRotation(dwStyles) + pText->iCharRotation; | 
|  1203   int32_t iCharRotation; |  1203   int32_t iCharRotation; | 
|  1204   FX_WCHAR wch, wPrev = 0xFEFF, wNext, wForm; |  1204   FX_WCHAR wch, wPrev = 0xFEFF, wNext, wForm; | 
|  1205   int32_t iWidth, iCharWidth, iCharHeight; |  1205   int32_t iWidth, iCharWidth, iCharHeight; | 
|  1206   FX_FLOAT fX, fY, fCharWidth, fCharHeight; |  1206   FX_FLOAT fX, fY, fCharWidth, fCharHeight; | 
|  1207   int32_t iHorScale = pText->iHorizontalScale; |  1207   int32_t iHorScale = pText->iHorizontalScale; | 
|  1208   int32_t iVerScale = pText->iVerticalScale; |  1208   int32_t iVerScale = pText->iVerticalScale; | 
|  1209   FX_BOOL bEmptyChar; |  1209   bool bEmptyChar; | 
|  1210   uint32_t dwProps, dwCharType; |  1210   uint32_t dwProps, dwCharType; | 
|  1211   fX = rtText.left; |  1211   fX = rtText.left; | 
|  1212   fY = rtText.top; |  1212   fY = rtText.top; | 
|  1213   if (bVerticalDoc) { |  1213   if (bVerticalDoc) { | 
|  1214     fX += (rtText.width - fFontSize) / 2.0f; |  1214     fX += (rtText.width - fFontSize) / 2.0f; | 
|  1215     if (bRTLPiece) { |  1215     if (bRTLPiece) { | 
|  1216       fY = rtText.bottom(); |  1216       fY = rtText.bottom(); | 
|  1217     } |  1217     } | 
|  1218   } else { |  1218   } else { | 
|  1219     if (bRTLPiece) { |  1219     if (bRTLPiece) { | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|  1238     } |  1238     } | 
|  1239     if (iWidth != 0) { |  1239     if (iWidth != 0) { | 
|  1240       iCharWidth = iWidth; |  1240       iCharWidth = iWidth; | 
|  1241       if (iCharWidth < 0) { |  1241       if (iCharWidth < 0) { | 
|  1242         iCharWidth = -iCharWidth; |  1242         iCharWidth = -iCharWidth; | 
|  1243       } |  1243       } | 
|  1244       if (!bMBCSCode) { |  1244       if (!bMBCSCode) { | 
|  1245         bEmptyChar = (dwCharType >= FX_CHARTYPE_Tab && |  1245         bEmptyChar = (dwCharType >= FX_CHARTYPE_Tab && | 
|  1246                       dwCharType <= FX_CHARTYPE_Control); |  1246                       dwCharType <= FX_CHARTYPE_Control); | 
|  1247       } else { |  1247       } else { | 
|  1248         bEmptyChar = FALSE; |  1248         bEmptyChar = false; | 
|  1249       } |  1249       } | 
|  1250       if (!bEmptyChar) { |  1250       if (!bEmptyChar) { | 
|  1251         iCount++; |  1251         iCount++; | 
|  1252       } |  1252       } | 
|  1253       if (pCharPos) { |  1253       if (pCharPos) { | 
|  1254         iCharWidth /= iFontSize; |  1254         iCharWidth /= iFontSize; | 
|  1255         wForm = wch; |  1255         wForm = wch; | 
|  1256         if (!bMBCSCode) { |  1256         if (!bMBCSCode) { | 
|  1257           if (dwCharType >= FX_CHARTYPE_ArabicAlef) { |  1257           if (dwCharType >= FX_CHARTYPE_ArabicAlef) { | 
|  1258             if (i < iLength) { |  1258             if (i < iLength) { | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1305         fCharHeight = fFontSize * iCharHeight / 1000.0f; |  1305         fCharHeight = fFontSize * iCharHeight / 1000.0f; | 
|  1306         if (!bMBCSCode && bRTLPiece && dwCharType != FX_CHARTYPE_Combination) { |  1306         if (!bMBCSCode && bRTLPiece && dwCharType != FX_CHARTYPE_Combination) { | 
|  1307           if (bVerticalDoc) { |  1307           if (bVerticalDoc) { | 
|  1308             fY -= fCharHeight; |  1308             fY -= fCharHeight; | 
|  1309           } else { |  1309           } else { | 
|  1310             fX -= fCharWidth; |  1310             fX -= fCharWidth; | 
|  1311           } |  1311           } | 
|  1312         } |  1312         } | 
|  1313         if (!bEmptyChar) { |  1313         if (!bEmptyChar) { | 
|  1314           CFX_PointF ptOffset; |  1314           CFX_PointF ptOffset; | 
|  1315           FX_BOOL bAdjusted = FALSE; |  1315           bool bAdjusted = false; | 
|  1316           if (pAdjustPos) { |  1316           if (pAdjustPos) { | 
|  1317             bAdjusted = pAdjustPos(wForm, bMBCSCode, pFont, fFontSize, |  1317             bAdjusted = pAdjustPos(wForm, bMBCSCode, pFont, fFontSize, | 
|  1318                                    bVerticalChar, ptOffset); |  1318                                    bVerticalChar, ptOffset); | 
|  1319           } |  1319           } | 
|  1320           if (!bAdjusted && bVerticalChar && (dwProps & 0x00010000) != 0) { |  1320           if (!bAdjusted && bVerticalChar && (dwProps & 0x00010000) != 0) { | 
|  1321             CFX_Rect rtBBox; |  1321             CFX_Rect rtBBox; | 
|  1322             rtBBox.Reset(); |  1322             rtBBox.Reset(); | 
|  1323             if (pFont->GetCharBBox(wForm, rtBBox, bMBCSCode)) { |  1323             if (pFont->GetCharBBox(wForm, rtBBox, bMBCSCode)) { | 
|  1324               ptOffset.x = fFontSize * (850 - rtBBox.right()) / 1000.0f; |  1324               ptOffset.x = fFontSize * (850 - rtBBox.right()) / 1000.0f; | 
|  1325               ptOffset.y = fFontSize * (1000 - rtBBox.height) / 2000.0f; |  1325               ptOffset.y = fFontSize * (1000 - rtBBox.height) / 2000.0f; | 
|  1326             } |  1326             } | 
|  1327           } |  1327           } | 
|  1328           pCharPos->m_OriginX = fX + ptOffset.x; |  1328           pCharPos->m_OriginX = fX + ptOffset.x; | 
|  1329           pCharPos->m_OriginY = fY - ptOffset.y; |  1329           pCharPos->m_OriginY = fY - ptOffset.y; | 
|  1330         } |  1330         } | 
|  1331         if (!bRTLPiece && dwCharType != FX_CHARTYPE_Combination) { |  1331         if (!bRTLPiece && dwCharType != FX_CHARTYPE_Combination) { | 
|  1332           if (bVerticalDoc) { |  1332           if (bVerticalDoc) { | 
|  1333             fY += fCharHeight; |  1333             fY += fCharHeight; | 
|  1334           } else { |  1334           } else { | 
|  1335             fX += fCharWidth; |  1335             fX += fCharWidth; | 
|  1336           } |  1336           } | 
|  1337         } |  1337         } | 
|  1338         if (!bEmptyChar) { |  1338         if (!bEmptyChar) { | 
|  1339           pCharPos->m_bGlyphAdjust = TRUE; |  1339           pCharPos->m_bGlyphAdjust = true; | 
|  1340           if (bVerticalDoc) { |  1340           if (bVerticalDoc) { | 
|  1341             if (iCharRotation == 0) { |  1341             if (iCharRotation == 0) { | 
|  1342               pCharPos->m_AdjustMatrix[0] = -1; |  1342               pCharPos->m_AdjustMatrix[0] = -1; | 
|  1343               pCharPos->m_AdjustMatrix[1] = 0; |  1343               pCharPos->m_AdjustMatrix[1] = 0; | 
|  1344               pCharPos->m_AdjustMatrix[2] = 0; |  1344               pCharPos->m_AdjustMatrix[2] = 0; | 
|  1345               pCharPos->m_AdjustMatrix[3] = 1; |  1345               pCharPos->m_AdjustMatrix[3] = 1; | 
|  1346               pCharPos->m_OriginY += fAscent * iVerScale / 100.0f; |  1346               pCharPos->m_OriginY += fAscent * iVerScale / 100.0f; | 
|  1347             } else if (iCharRotation == 1) { |  1347             } else if (iCharRotation == 1) { | 
|  1348               pCharPos->m_AdjustMatrix[0] = 0; |  1348               pCharPos->m_AdjustMatrix[0] = 0; | 
|  1349               pCharPos->m_AdjustMatrix[1] = -1; |  1349               pCharPos->m_AdjustMatrix[1] = -1; | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1410       } |  1410       } | 
|  1411     } |  1411     } | 
|  1412     if (iWidth > 0) { |  1412     if (iWidth > 0) { | 
|  1413       wPrev = wch; |  1413       wPrev = wch; | 
|  1414     } |  1414     } | 
|  1415   } |  1415   } | 
|  1416   return iCount; |  1416   return iCount; | 
|  1417 } |  1417 } | 
|  1418 int32_t CFX_RTFBreak::GetCharRects(const FX_RTFTEXTOBJ* pText, |  1418 int32_t CFX_RTFBreak::GetCharRects(const FX_RTFTEXTOBJ* pText, | 
|  1419                                    CFX_RectFArray& rtArray, |  1419                                    CFX_RectFArray& rtArray, | 
|  1420                                    FX_BOOL bCharBBox) const { |  1420                                    bool bCharBBox) const { | 
|  1421   if (!pText || pText->iLength < 1) { |  1421   if (!pText || pText->iLength < 1) { | 
|  1422     return 0; |  1422     return 0; | 
|  1423   } |  1423   } | 
|  1424   ASSERT(pText->pStr && pText->pWidths && pText->pFont && pText->pRect); |  1424   ASSERT(pText->pStr && pText->pWidths && pText->pFont && pText->pRect); | 
|  1425   const FX_WCHAR* pStr = pText->pStr; |  1425   const FX_WCHAR* pStr = pText->pStr; | 
|  1426   int32_t* pWidths = pText->pWidths; |  1426   int32_t* pWidths = pText->pWidths; | 
|  1427   int32_t iLength = pText->iLength; |  1427   int32_t iLength = pText->iLength; | 
|  1428   CFX_RectF rect(*pText->pRect); |  1428   CFX_RectF rect(*pText->pRect); | 
|  1429   FX_BOOL bRTLPiece = FX_IsOdd(pText->iBidiLevel); |  1429   bool bRTLPiece = FX_IsOdd(pText->iBidiLevel); | 
|  1430   FX_FLOAT fFontSize = pText->fFontSize; |  1430   FX_FLOAT fFontSize = pText->fFontSize; | 
|  1431   int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); |  1431   int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); | 
|  1432   FX_FLOAT fScale = fFontSize / 1000.0f; |  1432   FX_FLOAT fScale = fFontSize / 1000.0f; | 
|  1433   CFGAS_GEFont* pFont = pText->pFont; |  1433   CFGAS_GEFont* pFont = pText->pFont; | 
|  1434   if (!pFont) { |  1434   if (!pFont) { | 
|  1435     bCharBBox = FALSE; |  1435     bCharBBox = false; | 
|  1436   } |  1436   } | 
|  1437   CFX_Rect bbox; |  1437   CFX_Rect bbox; | 
|  1438   bbox.Set(0, 0, 0, 0); |  1438   bbox.Set(0, 0, 0, 0); | 
|  1439   if (bCharBBox) { |  1439   if (bCharBBox) { | 
|  1440     bCharBBox = pFont->GetBBox(bbox); |  1440     bCharBBox = pFont->GetBBox(bbox); | 
|  1441   } |  1441   } | 
|  1442   FX_FLOAT fLeft = std::max(0.0f, bbox.left * fScale); |  1442   FX_FLOAT fLeft = std::max(0.0f, bbox.left * fScale); | 
|  1443   FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale); |  1443   FX_FLOAT fHeight = FXSYS_fabs(bbox.height * fScale); | 
|  1444   rtArray.RemoveAll(); |  1444   rtArray.RemoveAll(); | 
|  1445   rtArray.SetSize(iLength); |  1445   rtArray.SetSize(iLength); | 
|  1446   uint32_t dwStyles = pText->dwLayoutStyles; |  1446   uint32_t dwStyles = pText->dwLayoutStyles; | 
|  1447   FX_BOOL bVertical = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalLayout) != 0; |  1447   bool bVertical = (dwStyles & FX_RTFLAYOUTSTYLE_VerticalLayout) != 0; | 
|  1448   FX_BOOL bSingleLine = (dwStyles & FX_RTFLAYOUTSTYLE_SingleLine) != 0; |  1448   bool bSingleLine = (dwStyles & FX_RTFLAYOUTSTYLE_SingleLine) != 0; | 
|  1449   FX_BOOL bCombText = (dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0; |  1449   bool bCombText = (dwStyles & FX_TXTLAYOUTSTYLE_CombText) != 0; | 
|  1450   FX_WCHAR wch, wLineBreakChar = pText->wLineBreakChar; |  1450   FX_WCHAR wch, wLineBreakChar = pText->wLineBreakChar; | 
|  1451   int32_t iCharSize; |  1451   int32_t iCharSize; | 
|  1452   FX_FLOAT fCharSize, fStart; |  1452   FX_FLOAT fCharSize, fStart; | 
|  1453   if (bVertical) { |  1453   if (bVertical) { | 
|  1454     fStart = bRTLPiece ? rect.bottom() : rect.top; |  1454     fStart = bRTLPiece ? rect.bottom() : rect.top; | 
|  1455   } else { |  1455   } else { | 
|  1456     fStart = bRTLPiece ? rect.right() : rect.left; |  1456     fStart = bRTLPiece ? rect.right() : rect.left; | 
|  1457   } |  1457   } | 
|  1458   for (int32_t i = 0; i < iLength; i++) { |  1458   for (int32_t i = 0; i < iLength; i++) { | 
|  1459     wch = *pStr++; |  1459     wch = *pStr++; | 
|  1460     iCharSize = *pWidths++; |  1460     iCharSize = *pWidths++; | 
|  1461     fCharSize = (FX_FLOAT)iCharSize / 20000.0f; |  1461     fCharSize = (FX_FLOAT)iCharSize / 20000.0f; | 
|  1462     FX_BOOL bRet = (!bSingleLine && FX_IsCtrlCode(wch)); |  1462     bool bRet = (!bSingleLine && FX_IsCtrlCode(wch)); | 
|  1463     if (!(wch == L'\v' || wch == L'\f' || wch == 0x2028 || wch == 0x2029 || |  1463     if (!(wch == L'\v' || wch == L'\f' || wch == 0x2028 || wch == 0x2029 || | 
|  1464           (wLineBreakChar != 0xFEFF && wch == wLineBreakChar))) { |  1464           (wLineBreakChar != 0xFEFF && wch == wLineBreakChar))) { | 
|  1465       bRet = FALSE; |  1465       bRet = false; | 
|  1466     } |  1466     } | 
|  1467     if (bRet) { |  1467     if (bRet) { | 
|  1468       iCharSize = iFontSize * 500; |  1468       iCharSize = iFontSize * 500; | 
|  1469       fCharSize = fFontSize / 2.0f; |  1469       fCharSize = fFontSize / 2.0f; | 
|  1470     } |  1470     } | 
|  1471     if (bVertical) { |  1471     if (bVertical) { | 
|  1472       rect.top = fStart; |  1472       rect.top = fStart; | 
|  1473       if (bRTLPiece) { |  1473       if (bRTLPiece) { | 
|  1474         rect.top -= fCharSize; |  1474         rect.top -= fCharSize; | 
|  1475         fStart -= fCharSize; |  1475         fStart -= fCharSize; | 
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1558       iLength(0), |  1558       iLength(0), | 
|  1559       pFont(nullptr), |  1559       pFont(nullptr), | 
|  1560       fFontSize(12.0f), |  1560       fFontSize(12.0f), | 
|  1561       dwLayoutStyles(0), |  1561       dwLayoutStyles(0), | 
|  1562       iCharRotation(0), |  1562       iCharRotation(0), | 
|  1563       iBidiLevel(0), |  1563       iBidiLevel(0), | 
|  1564       pRect(nullptr), |  1564       pRect(nullptr), | 
|  1565       wLineBreakChar(L'\n'), |  1565       wLineBreakChar(L'\n'), | 
|  1566       iHorizontalScale(100), |  1566       iHorizontalScale(100), | 
|  1567       iVerticalScale(100) {} |  1567       iVerticalScale(100) {} | 
| OLD | NEW |