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 <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "xfa/src/fgas/include/fx_lbk.h" | 9 #include "xfa/src/fgas/include/fx_lbk.h" |
10 #include "xfa/src/fgas/src/fgas_base.h" | 10 #include "xfa/src/fgas/src/fgas_base.h" |
11 #include "xfa/src/fgas/src/layout/fx_unicode.h" | 11 #include "xfa/src/fgas/src/layout/fx_unicode.h" |
12 #include "xfa/src/fgas/src/layout/fx_rtfbreak.h" | 12 #include "xfa/src/fgas/src/layout/fx_rtfbreak.h" |
13 | 13 |
14 IFX_RTFBreak* IFX_RTFBreak::Create(FX_DWORD dwPolicies) { | 14 IFX_RTFBreak* IFX_RTFBreak::Create(FX_DWORD dwPolicies) { |
15 return new CFX_RTFBreak(dwPolicies); | 15 return new CFX_RTFBreak(dwPolicies); |
16 } | 16 } |
17 CFX_RTFBreak::CFX_RTFBreak(FX_DWORD dwPolicies) | 17 CFX_RTFBreak::CFX_RTFBreak(FX_DWORD dwPolicies) |
18 : m_dwPolicies(dwPolicies), | 18 : m_dwPolicies(dwPolicies), |
19 m_pArabicChar(NULL), | 19 m_pArabicChar(NULL), |
20 m_iLineStart(0), | 20 m_iBoundaryStart(0), |
21 m_iLineEnd(2000000), | 21 m_iBoundaryEnd(2000000), |
22 m_dwLayoutStyles(0), | 22 m_dwLayoutStyles(0), |
23 m_bPagination(FALSE), | 23 m_bPagination(FALSE), |
24 m_bVertical(FALSE), | 24 m_bVertical(FALSE), |
25 m_bSingleLine(FALSE), | 25 m_bSingleLine(FALSE), |
26 m_bCharCode(FALSE), | 26 m_bCharCode(FALSE), |
27 m_pFont(NULL), | 27 m_pFont(NULL), |
28 m_iFontHeight(240), | 28 m_iFontHeight(240), |
29 m_iFontSize(240), | 29 m_iFontSize(240), |
30 m_iTabWidth(720000), | 30 m_iTabWidth(720000), |
31 m_PositionedTabs(), | 31 m_PositionedTabs(), |
(...skipping 23 matching lines...) Expand all Loading... |
55 m_pCurLine = &m_RTFLine1; | 55 m_pCurLine = &m_RTFLine1; |
56 } | 56 } |
57 CFX_RTFBreak::~CFX_RTFBreak() { | 57 CFX_RTFBreak::~CFX_RTFBreak() { |
58 Reset(); | 58 Reset(); |
59 m_PositionedTabs.RemoveAll(); | 59 m_PositionedTabs.RemoveAll(); |
60 m_pArabicChar->Release(); | 60 m_pArabicChar->Release(); |
61 if (m_pUserData != NULL) { | 61 if (m_pUserData != NULL) { |
62 m_pUserData->Release(); | 62 m_pUserData->Release(); |
63 } | 63 } |
64 } | 64 } |
65 void CFX_RTFBreak::SetLineWidth(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) { | 65 void CFX_RTFBreak::SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) { |
66 m_iLineStart = FXSYS_round(fLineStart * 20000.0f); | 66 if (fLineStart > fLineEnd) |
67 m_iLineEnd = FXSYS_round(fLineEnd * 20000.0f); | 67 return; |
68 FXSYS_assert(m_iLineEnd >= m_iLineStart); | 68 m_iBoundaryStart = FXSYS_round(fLineStart * 20000.0f); |
69 if (m_pCurLine->m_iStart < m_iLineStart) { | 69 m_iBoundaryEnd = FXSYS_round(fLineEnd * 20000.0f); |
70 m_pCurLine->m_iStart = m_iLineStart; | 70 m_pCurLine->m_iStart = std::min(m_pCurLine->m_iStart, m_iBoundaryEnd); |
71 } | 71 m_pCurLine->m_iStart = std::max(m_pCurLine->m_iStart, m_iBoundaryStart); |
72 } | 72 } |
73 void CFX_RTFBreak::SetLinePos(FX_FLOAT fLinePos) { | 73 void CFX_RTFBreak::SetLineStartPos(FX_FLOAT fLinePos) { |
74 int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f); | 74 int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f); |
75 if (iLinePos > m_iLineEnd) { | 75 iLinePos = std::min(iLinePos, m_iBoundaryEnd); |
76 iLinePos = m_iLineEnd; | 76 iLinePos = std::max(iLinePos, m_iBoundaryStart); |
77 } | |
78 m_pCurLine->m_iStart = iLinePos; | 77 m_pCurLine->m_iStart = iLinePos; |
79 } | 78 } |
80 void CFX_RTFBreak::SetLayoutStyles(FX_DWORD dwLayoutStyles) { | 79 void CFX_RTFBreak::SetLayoutStyles(FX_DWORD dwLayoutStyles) { |
81 if (m_dwLayoutStyles == dwLayoutStyles) { | 80 if (m_dwLayoutStyles == dwLayoutStyles) { |
82 return; | 81 return; |
83 } | 82 } |
84 SetBreakStatus(); | 83 SetBreakStatus(); |
85 m_dwLayoutStyles = dwLayoutStyles; | 84 m_dwLayoutStyles = dwLayoutStyles; |
86 m_bPagination = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_Pagination) != 0; | 85 m_bPagination = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_Pagination) != 0; |
87 m_bVertical = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_VerticalChars) != 0; | 86 m_bVertical = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_VerticalChars) != 0; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 if (m_wDefChar != 0xFEFF) { | 121 if (m_wDefChar != 0xFEFF) { |
123 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); | 122 m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, FALSE); |
124 m_iDefChar *= m_iFontSize; | 123 m_iDefChar *= m_iFontSize; |
125 } | 124 } |
126 } | 125 } |
127 } | 126 } |
128 void CFX_RTFBreak::SetTabWidth(FX_FLOAT fTabWidth) { | 127 void CFX_RTFBreak::SetTabWidth(FX_FLOAT fTabWidth) { |
129 m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); | 128 m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f); |
130 } | 129 } |
131 void CFX_RTFBreak::AddPositionedTab(FX_FLOAT fTabPos) { | 130 void CFX_RTFBreak::AddPositionedTab(FX_FLOAT fTabPos) { |
132 int32_t iLineEnd = m_iLineEnd; | 131 int32_t iLineEnd = m_iBoundaryEnd; |
133 int32_t iTabPos = FXSYS_round(fTabPos * 20000.0f) + m_iLineStart; | 132 int32_t iTabPos = FXSYS_round(fTabPos * 20000.0f) + m_iBoundaryStart; |
134 if (iTabPos > iLineEnd) { | 133 if (iTabPos > iLineEnd) { |
135 iTabPos = iLineEnd; | 134 iTabPos = iLineEnd; |
136 } | 135 } |
137 if (m_PositionedTabs.Find(iTabPos, 0) > -1) { | 136 if (m_PositionedTabs.Find(iTabPos, 0) > -1) { |
138 return; | 137 return; |
139 } | 138 } |
140 int32_t iCount = m_PositionedTabs.GetSize(); | 139 int32_t iCount = m_PositionedTabs.GetSize(); |
141 int32_t iFind = 0; | 140 int32_t iFind = 0; |
142 for (; iFind < iCount; iFind++) { | 141 for (; iFind < iCount; iFind++) { |
143 if (m_PositionedTabs[iFind] > iTabPos) { | 142 if (m_PositionedTabs[iFind] > iTabPos) { |
144 break; | 143 break; |
145 } | 144 } |
146 } | 145 } |
147 m_PositionedTabs.InsertAt(iFind, iTabPos); | 146 m_PositionedTabs.InsertAt(iFind, iTabPos); |
148 if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) { | 147 if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) { |
149 m_bOrphanLine = GetLastPositionedTab() >= iLineEnd; | 148 m_bOrphanLine = GetLastPositionedTab() >= iLineEnd; |
150 } else { | 149 } else { |
151 m_bOrphanLine = FALSE; | 150 m_bOrphanLine = FALSE; |
152 } | 151 } |
153 } | 152 } |
154 void CFX_RTFBreak::SetPositionedTabs(const CFX_FloatArray& tabs) { | 153 void CFX_RTFBreak::SetPositionedTabs(const CFX_FloatArray& tabs) { |
155 m_PositionedTabs.RemoveAll(); | 154 m_PositionedTabs.RemoveAll(); |
156 int32_t iCount = tabs.GetSize(); | 155 int32_t iCount = tabs.GetSize(); |
157 m_PositionedTabs.SetSize(iCount); | 156 m_PositionedTabs.SetSize(iCount); |
158 int32_t iLineEnd = m_iLineEnd; | 157 int32_t iLineEnd = m_iBoundaryEnd; |
159 int32_t iTabPos; | 158 int32_t iTabPos; |
160 for (int32_t i = 0; i < iCount; i++) { | 159 for (int32_t i = 0; i < iCount; i++) { |
161 iTabPos = FXSYS_round(tabs[i] * 20000.0f) + m_iLineStart; | 160 iTabPos = FXSYS_round(tabs[i] * 20000.0f) + m_iBoundaryStart; |
162 if (iTabPos > iLineEnd) { | 161 if (iTabPos > iLineEnd) { |
163 iTabPos = iLineEnd; | 162 iTabPos = iLineEnd; |
164 } | 163 } |
165 m_PositionedTabs[i] = iTabPos; | 164 m_PositionedTabs[i] = iTabPos; |
166 } | 165 } |
167 if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) { | 166 if (m_dwPolicies & FX_RTFBREAKPOLICY_OrphanPositionedTab) { |
168 m_bOrphanLine = GetLastPositionedTab() >= iLineEnd; | 167 m_bOrphanLine = GetLastPositionedTab() >= iLineEnd; |
169 } else { | 168 } else { |
170 m_bOrphanLine = FALSE; | 169 m_bOrphanLine = FALSE; |
171 } | 170 } |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 return NULL; | 309 return NULL; |
311 } | 310 } |
312 return &pRTFLine->m_LinePieces; | 311 return &pRTFLine->m_LinePieces; |
313 } | 312 } |
314 inline FX_DWORD CFX_RTFBreak::GetUnifiedCharType(FX_DWORD dwType) const { | 313 inline FX_DWORD CFX_RTFBreak::GetUnifiedCharType(FX_DWORD dwType) const { |
315 return dwType >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : dwType; | 314 return dwType >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : dwType; |
316 } | 315 } |
317 int32_t CFX_RTFBreak::GetLastPositionedTab() const { | 316 int32_t CFX_RTFBreak::GetLastPositionedTab() const { |
318 int32_t iCount = m_PositionedTabs.GetSize(); | 317 int32_t iCount = m_PositionedTabs.GetSize(); |
319 if (iCount < 1) { | 318 if (iCount < 1) { |
320 return m_iLineStart; | 319 return m_iBoundaryStart; |
321 } | 320 } |
322 return m_PositionedTabs[iCount - 1]; | 321 return m_PositionedTabs[iCount - 1]; |
323 } | 322 } |
324 FX_BOOL CFX_RTFBreak::GetPositionedTab(int32_t& iTabPos) const { | 323 FX_BOOL CFX_RTFBreak::GetPositionedTab(int32_t& iTabPos) const { |
325 int32_t iCount = m_PositionedTabs.GetSize(); | 324 int32_t iCount = m_PositionedTabs.GetSize(); |
326 for (int32_t i = 0; i < iCount; i++) { | 325 for (int32_t i = 0; i < iCount; i++) { |
327 if (m_PositionedTabs[i] > iTabPos) { | 326 if (m_PositionedTabs[i] > iTabPos) { |
328 iTabPos = m_PositionedTabs[i]; | 327 iTabPos = m_PositionedTabs[i]; |
329 return TRUE; | 328 return TRUE; |
330 } | 329 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 pCurChar->m_iCharWidth = 0; | 365 pCurChar->m_iCharWidth = 0; |
367 pCurChar->m_dwIdentity = m_dwIdentity; | 366 pCurChar->m_dwIdentity = m_dwIdentity; |
368 if (m_pUserData != NULL) { | 367 if (m_pUserData != NULL) { |
369 m_pUserData->AddRef(); | 368 m_pUserData->AddRef(); |
370 } | 369 } |
371 pCurChar->m_pUserData = m_pUserData; | 370 pCurChar->m_pUserData = m_pUserData; |
372 FX_DWORD dwRet1 = FX_RTFBREAK_None; | 371 FX_DWORD dwRet1 = FX_RTFBREAK_None; |
373 if (dwType != FX_CHARTYPE_Combination && | 372 if (dwType != FX_CHARTYPE_Combination && |
374 GetUnifiedCharType(m_dwCharType) != GetUnifiedCharType(dwType)) { | 373 GetUnifiedCharType(m_dwCharType) != GetUnifiedCharType(dwType)) { |
375 if (!m_bSingleLine && !m_bOrphanLine && m_dwCharType > 0 && | 374 if (!m_bSingleLine && !m_bOrphanLine && m_dwCharType > 0 && |
376 m_pCurLine->GetLineEnd() > m_iLineEnd + m_iTolerance) { | 375 m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) { |
377 if (m_dwCharType != FX_CHARTYPE_Space || dwType != FX_CHARTYPE_Control) { | 376 if (m_dwCharType != FX_CHARTYPE_Space || dwType != FX_CHARTYPE_Control) { |
378 dwRet1 = EndBreak(FX_RTFBREAK_LineBreak); | 377 dwRet1 = EndBreak(FX_RTFBREAK_LineBreak); |
379 int32_t iCount = m_pCurLine->CountChars(); | 378 int32_t iCount = m_pCurLine->CountChars(); |
380 if (iCount > 0) { | 379 if (iCount > 0) { |
381 pCurChar = m_pCurLine->m_LineChars.GetDataPtr(iCount - 1); | 380 pCurChar = m_pCurLine->m_LineChars.GetDataPtr(iCount - 1); |
382 } | 381 } |
383 } | 382 } |
384 } | 383 } |
385 } | 384 } |
386 int32_t iRotation = m_iRotation; | 385 int32_t iRotation = m_iRotation; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 if (!m_pFont->GetCharWidth(wch, iCharWidth, TRUE)) { | 421 if (!m_pFont->GetCharWidth(wch, iCharWidth, TRUE)) { |
423 iCharWidth = m_iDefChar; | 422 iCharWidth = m_iDefChar; |
424 } | 423 } |
425 } | 424 } |
426 iCharWidth *= m_iFontSize; | 425 iCharWidth *= m_iFontSize; |
427 iCharWidth = iCharWidth * m_iHorizontalScale / 100; | 426 iCharWidth = iCharWidth * m_iHorizontalScale / 100; |
428 iCharWidth += m_iCharSpace; | 427 iCharWidth += m_iCharSpace; |
429 pCurChar->m_iCharWidth = iCharWidth; | 428 pCurChar->m_iCharWidth = iCharWidth; |
430 m_pCurLine->m_iWidth += iCharWidth; | 429 m_pCurLine->m_iWidth += iCharWidth; |
431 m_dwCharType = 0; | 430 m_dwCharType = 0; |
432 if (!m_bSingleLine && m_pCurLine->GetLineEnd() > m_iLineEnd + m_iTolerance) { | 431 if (!m_bSingleLine && |
| 432 m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) { |
433 return EndBreak(FX_RTFBREAK_LineBreak); | 433 return EndBreak(FX_RTFBREAK_LineBreak); |
434 } | 434 } |
435 return FX_RTFBREAK_None; | 435 return FX_RTFBREAK_None; |
436 } | 436 } |
437 FX_DWORD CFX_RTFBreak::AppendChar_Combination(CFX_RTFChar* pCurChar, | 437 FX_DWORD CFX_RTFBreak::AppendChar_Combination(CFX_RTFChar* pCurChar, |
438 int32_t iRotation) { | 438 int32_t iRotation) { |
439 int32_t iCharWidth = 0; | 439 int32_t iCharWidth = 0; |
440 if (m_bVertical != FX_IsOdd(iRotation)) { | 440 if (m_bVertical != FX_IsOdd(iRotation)) { |
441 iCharWidth = 1000; | 441 iCharWidth = 1000; |
442 } else { | 442 } else { |
(...skipping 14 matching lines...) Expand all Loading... |
457 if (iCharWidth > 0) { | 457 if (iCharWidth > 0) { |
458 m_pCurLine->m_iWidth += iCharWidth; | 458 m_pCurLine->m_iWidth += iCharWidth; |
459 } | 459 } |
460 return FX_RTFBREAK_None; | 460 return FX_RTFBREAK_None; |
461 } | 461 } |
462 FX_DWORD CFX_RTFBreak::AppendChar_Tab(CFX_RTFChar* pCurChar, | 462 FX_DWORD CFX_RTFBreak::AppendChar_Tab(CFX_RTFChar* pCurChar, |
463 int32_t iRotation) { | 463 int32_t iRotation) { |
464 if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ExpandTab) { | 464 if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ExpandTab) { |
465 FX_BOOL bBreak = FALSE; | 465 FX_BOOL bBreak = FALSE; |
466 if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) { | 466 if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) { |
467 bBreak = (m_pCurLine->GetLineEnd() > m_iLineEnd + m_iTolerance); | 467 bBreak = (m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance); |
468 } | 468 } |
469 int32_t& iLineWidth = m_pCurLine->m_iWidth; | 469 int32_t& iLineWidth = m_pCurLine->m_iWidth; |
470 int32_t iCharWidth = iLineWidth; | 470 int32_t iCharWidth = iLineWidth; |
471 if (GetPositionedTab(iCharWidth)) { | 471 if (GetPositionedTab(iCharWidth)) { |
472 iCharWidth -= iLineWidth; | 472 iCharWidth -= iLineWidth; |
473 } else { | 473 } else { |
474 iCharWidth = m_iTabWidth * (iLineWidth / m_iTabWidth + 1) - iLineWidth; | 474 iCharWidth = m_iTabWidth * (iLineWidth / m_iTabWidth + 1) - iLineWidth; |
475 } | 475 } |
476 pCurChar->m_iCharWidth = iCharWidth; | 476 pCurChar->m_iCharWidth = iCharWidth; |
477 iLineWidth += iCharWidth; | 477 iLineWidth += iCharWidth; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 m_bCharCode)) { | 554 m_bCharCode)) { |
555 iCharWidth = m_iDefChar; | 555 iCharWidth = m_iDefChar; |
556 } | 556 } |
557 } | 557 } |
558 iCharWidth *= m_iFontSize; | 558 iCharWidth *= m_iFontSize; |
559 iCharWidth = iCharWidth * m_iHorizontalScale / 100; | 559 iCharWidth = iCharWidth * m_iHorizontalScale / 100; |
560 pCurChar->m_iCharWidth = iCharWidth; | 560 pCurChar->m_iCharWidth = iCharWidth; |
561 iLineWidth += iCharWidth; | 561 iLineWidth += iCharWidth; |
562 m_pCurLine->m_iArabicChars++; | 562 m_pCurLine->m_iArabicChars++; |
563 if (!m_bSingleLine && !m_bOrphanLine && | 563 if (!m_bSingleLine && !m_bOrphanLine && |
564 m_pCurLine->GetLineEnd() > m_iLineEnd + m_iTolerance) { | 564 m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) { |
565 return EndBreak(FX_RTFBREAK_LineBreak); | 565 return EndBreak(FX_RTFBREAK_LineBreak); |
566 } | 566 } |
567 return FX_RTFBREAK_None; | 567 return FX_RTFBREAK_None; |
568 } | 568 } |
569 FX_DWORD CFX_RTFBreak::AppendChar_Others(CFX_RTFChar* pCurChar, | 569 FX_DWORD CFX_RTFBreak::AppendChar_Others(CFX_RTFChar* pCurChar, |
570 int32_t iRotation) { | 570 int32_t iRotation) { |
571 FX_DWORD dwType = (pCurChar->m_dwCharProps & FX_CHARTYPEBITSMASK); | 571 FX_DWORD dwType = (pCurChar->m_dwCharProps & FX_CHARTYPEBITSMASK); |
572 FX_WCHAR wForm; | 572 FX_WCHAR wForm; |
573 if (dwType == FX_CHARTYPE_Numeric) { | 573 if (dwType == FX_CHARTYPE_Numeric) { |
574 if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) { | 574 if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) { |
(...skipping 19 matching lines...) Expand all Loading... |
594 iCharWidth = iCharWidth * m_iHorizontalScale / 100; | 594 iCharWidth = iCharWidth * m_iHorizontalScale / 100; |
595 iCharWidth += m_iCharSpace; | 595 iCharWidth += m_iCharSpace; |
596 if (dwType == FX_CHARTYPE_Space && m_bWordSpace) { | 596 if (dwType == FX_CHARTYPE_Space && m_bWordSpace) { |
597 iCharWidth += m_iWordSpace; | 597 iCharWidth += m_iWordSpace; |
598 } | 598 } |
599 pCurChar->m_iCharWidth = iCharWidth; | 599 pCurChar->m_iCharWidth = iCharWidth; |
600 m_pCurLine->m_iWidth += iCharWidth; | 600 m_pCurLine->m_iWidth += iCharWidth; |
601 FX_BOOL bBreak = (dwType != FX_CHARTYPE_Space || | 601 FX_BOOL bBreak = (dwType != FX_CHARTYPE_Space || |
602 (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0); | 602 (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0); |
603 if (!m_bSingleLine && !m_bOrphanLine && bBreak && | 603 if (!m_bSingleLine && !m_bOrphanLine && bBreak && |
604 m_pCurLine->GetLineEnd() > m_iLineEnd + m_iTolerance) { | 604 m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) { |
605 return EndBreak(FX_RTFBREAK_LineBreak); | 605 return EndBreak(FX_RTFBREAK_LineBreak); |
606 } | 606 } |
607 return FX_RTFBREAK_None; | 607 return FX_RTFBREAK_None; |
608 } | 608 } |
609 FX_DWORD CFX_RTFBreak::EndBreak(FX_DWORD dwStatus) { | 609 FX_DWORD CFX_RTFBreak::EndBreak(FX_DWORD dwStatus) { |
610 FXSYS_assert(dwStatus >= FX_RTFBREAK_PieceBreak && | 610 FXSYS_assert(dwStatus >= FX_RTFBREAK_PieceBreak && |
611 dwStatus <= FX_RTFBREAK_PageBreak); | 611 dwStatus <= FX_RTFBREAK_PageBreak); |
612 m_dwIdentity++; | 612 m_dwIdentity++; |
613 CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces; | 613 CFX_RTFPieceArray* pCurPieces = &m_pCurLine->m_LinePieces; |
614 int32_t iCount = pCurPieces->GetSize(); | 614 int32_t iCount = pCurPieces->GetSize(); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 goto EndBreak_Ret; | 655 goto EndBreak_Ret; |
656 } | 656 } |
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 EndBreak_Ret: | 663 EndBreak_Ret: |
664 m_pCurLine = pNextLine; | 664 m_pCurLine = pNextLine; |
665 m_pCurLine->m_iStart = m_iLineStart; | 665 m_pCurLine->m_iStart = m_iBoundaryStart; |
666 CFX_RTFChar* pTC = GetLastChar(0); | 666 CFX_RTFChar* pTC = GetLastChar(0); |
667 m_dwCharType = pTC == NULL ? 0 : pTC->GetCharType(); | 667 m_dwCharType = pTC == NULL ? 0 : pTC->GetCharType(); |
668 return dwStatus; | 668 return dwStatus; |
669 } | 669 } |
670 FX_BOOL CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine* pNextLine, | 670 FX_BOOL CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine* pNextLine, |
671 FX_BOOL bAllChars, | 671 FX_BOOL bAllChars, |
672 FX_DWORD dwStatus) { | 672 FX_DWORD dwStatus) { |
673 FX_BOOL bDone = FALSE; | 673 FX_BOOL bDone = FALSE; |
674 if (!m_bSingleLine && !m_bOrphanLine && | 674 if (!m_bSingleLine && !m_bOrphanLine && |
675 m_pCurLine->GetLineEnd() > m_iLineEnd + m_iTolerance) { | 675 m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) { |
676 CFX_RTFChar& tc = m_pCurLine->GetChar(m_pCurLine->CountChars() - 1); | 676 CFX_RTFChar& tc = m_pCurLine->GetChar(m_pCurLine->CountChars() - 1); |
677 switch (tc.GetCharType()) { | 677 switch (tc.GetCharType()) { |
678 case FX_CHARTYPE_Tab: | 678 case FX_CHARTYPE_Tab: |
679 if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) { | 679 if ((m_dwPolicies & FX_RTFBREAKPOLICY_TabBreak) != 0) { |
680 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); | 680 SplitTextLine(m_pCurLine, pNextLine, !m_bPagination && bAllChars); |
681 bDone = TRUE; | 681 bDone = TRUE; |
682 } | 682 } |
683 break; | 683 break; |
684 case FX_CHARTYPE_Control: | 684 case FX_CHARTYPE_Control: |
685 break; | 685 break; |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
881 break; | 881 break; |
882 } | 882 } |
883 } | 883 } |
884 } | 884 } |
885 j += bArabic ? 1 : -1; | 885 j += bArabic ? 1 : -1; |
886 } | 886 } |
887 if (!bAllChars && bFind) { | 887 if (!bAllChars && bFind) { |
888 break; | 888 break; |
889 } | 889 } |
890 } | 890 } |
891 int32_t iOffset = m_iLineEnd - iNetWidth; | 891 int32_t iOffset = m_iBoundaryEnd - iNetWidth; |
892 int32_t iLowerAlignment = (m_iAlignment & FX_RTFLINEALIGNMENT_LowerMask); | 892 int32_t iLowerAlignment = (m_iAlignment & FX_RTFLINEALIGNMENT_LowerMask); |
893 int32_t iHigherAlignment = (m_iAlignment & FX_RTFLINEALIGNMENT_HigherMask); | 893 int32_t iHigherAlignment = (m_iAlignment & FX_RTFLINEALIGNMENT_HigherMask); |
894 if (iGapChars > 0 && (iHigherAlignment == FX_RTFLINEALIGNMENT_Distributed || | 894 if (iGapChars > 0 && (iHigherAlignment == FX_RTFLINEALIGNMENT_Distributed || |
895 (iHigherAlignment == FX_RTFLINEALIGNMENT_Justified && | 895 (iHigherAlignment == FX_RTFLINEALIGNMENT_Justified && |
896 dwStatus != FX_RTFBREAK_ParagraphBreak))) { | 896 dwStatus != FX_RTFBREAK_ParagraphBreak))) { |
897 int32_t iStart = -1; | 897 int32_t iStart = -1; |
898 for (i = 0; i < iCount; i++) { | 898 for (i = 0; i < iCount; i++) { |
899 tpo = tpos.GetAt(i); | 899 tpo = tpos.GetAt(i); |
900 CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index); | 900 CFX_RTFPiece& ttp = pCurPieces->GetAt(tpo.index); |
901 if (iStart < 0) { | 901 if (iStart < 0) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
935 int32_t CFX_RTFBreak::GetBreakPos(CFX_RTFCharArray& tca, | 935 int32_t CFX_RTFBreak::GetBreakPos(CFX_RTFCharArray& tca, |
936 int32_t& iEndPos, | 936 int32_t& iEndPos, |
937 FX_BOOL bAllChars, | 937 FX_BOOL bAllChars, |
938 FX_BOOL bOnlyBrk) { | 938 FX_BOOL bOnlyBrk) { |
939 int32_t iLength = tca.GetSize() - 1; | 939 int32_t iLength = tca.GetSize() - 1; |
940 if (iLength < 1) { | 940 if (iLength < 1) { |
941 return iLength; | 941 return iLength; |
942 } | 942 } |
943 int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, | 943 int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, |
944 iLast = -1, iLastPos = -1; | 944 iLast = -1, iLastPos = -1; |
945 if (m_bSingleLine || m_bOrphanLine || iEndPos <= m_iLineEnd) { | 945 if (m_bSingleLine || m_bOrphanLine || iEndPos <= m_iBoundaryEnd) { |
946 if (!bAllChars || m_bCharCode) { | 946 if (!bAllChars || m_bCharCode) { |
947 return iLength; | 947 return iLength; |
948 } | 948 } |
949 iBreak = iLength; | 949 iBreak = iLength; |
950 iBreakPos = iEndPos; | 950 iBreakPos = iEndPos; |
951 } | 951 } |
952 CFX_RTFChar* pCharArray = tca.GetData(); | 952 CFX_RTFChar* pCharArray = tca.GetData(); |
953 if (m_bCharCode) { | 953 if (m_bCharCode) { |
954 const CFX_RTFChar* pChar; | 954 const CFX_RTFChar* pChar; |
955 int32_t iCharWidth; | 955 int32_t iCharWidth; |
956 while (iLength > 0) { | 956 while (iLength > 0) { |
957 if (iEndPos <= m_iLineEnd) { | 957 if (iEndPos <= m_iBoundaryEnd) { |
958 break; | 958 break; |
959 } | 959 } |
960 pChar = pCharArray + iLength--; | 960 pChar = pCharArray + iLength--; |
961 iCharWidth = pChar->m_iCharWidth; | 961 iCharWidth = pChar->m_iCharWidth; |
962 if (iCharWidth > 0) { | 962 if (iCharWidth > 0) { |
963 iEndPos -= iCharWidth; | 963 iEndPos -= iCharWidth; |
964 } | 964 } |
965 } | 965 } |
966 return iLength; | 966 return iLength; |
967 } | 967 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 (nCur << 5) + nNext); | 1014 (nCur << 5) + nNext); |
1015 } | 1015 } |
1016 } | 1016 } |
1017 if (bAllChars) { | 1017 if (bAllChars) { |
1018 pCur->m_nBreakType = eType; | 1018 pCur->m_nBreakType = eType; |
1019 } | 1019 } |
1020 if (!bOnlyBrk) { | 1020 if (!bOnlyBrk) { |
1021 iCharWidth = pCur->m_iCharWidth; | 1021 iCharWidth = pCur->m_iCharWidth; |
1022 FX_BOOL bBreak = FALSE; | 1022 FX_BOOL bBreak = FALSE; |
1023 if (nCur == FX_CBP_TB && bTabBreak) { | 1023 if (nCur == FX_CBP_TB && bTabBreak) { |
1024 bBreak = iCharWidth > 0 && iEndPos - iCharWidth <= m_iLineEnd; | 1024 bBreak = iCharWidth > 0 && iEndPos - iCharWidth <= m_iBoundaryEnd; |
1025 } else { | 1025 } else { |
1026 bBreak = iEndPos <= m_iLineEnd; | 1026 bBreak = iEndPos <= m_iBoundaryEnd; |
1027 } | 1027 } |
1028 if (m_bSingleLine || m_bOrphanLine || bBreak || bNeedBreak) { | 1028 if (m_bSingleLine || m_bOrphanLine || bBreak || bNeedBreak) { |
1029 if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) { | 1029 if (eType == FX_LBT_DIRECT_BRK && iBreak < 0) { |
1030 iBreak = iLength; | 1030 iBreak = iLength; |
1031 iBreakPos = iEndPos; | 1031 iBreakPos = iEndPos; |
1032 if (!bAllChars) { | 1032 if (!bAllChars) { |
1033 return iLength; | 1033 return iLength; |
1034 } | 1034 } |
1035 } else if (eType == FX_LBT_INDIRECT_BRK && iIndirect < 0) { | 1035 } else if (eType == FX_LBT_INDIRECT_BRK && iIndirect < 0) { |
1036 iIndirect = iLength; | 1036 iIndirect = iLength; |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1128 } | 1128 } |
1129 if (index < 0 || index >= pRTFPieces->GetSize()) { | 1129 if (index < 0 || index >= pRTFPieces->GetSize()) { |
1130 return NULL; | 1130 return NULL; |
1131 } | 1131 } |
1132 return pRTFPieces->GetPtrAt(index); | 1132 return pRTFPieces->GetPtrAt(index); |
1133 } | 1133 } |
1134 void CFX_RTFBreak::GetLineRect(CFX_RectF& rect) const { | 1134 void CFX_RTFBreak::GetLineRect(CFX_RectF& rect) const { |
1135 rect.top = 0; | 1135 rect.top = 0; |
1136 CFX_RTFLine* pRTFLine = GetRTFLine(TRUE); | 1136 CFX_RTFLine* pRTFLine = GetRTFLine(TRUE); |
1137 if (pRTFLine == NULL) { | 1137 if (pRTFLine == NULL) { |
1138 rect.left = ((FX_FLOAT)m_iLineStart) / 20000.0f; | 1138 rect.left = ((FX_FLOAT)m_iBoundaryStart) / 20000.0f; |
1139 rect.width = rect.height = 0; | 1139 rect.width = rect.height = 0; |
1140 return; | 1140 return; |
1141 } | 1141 } |
1142 rect.left = ((FX_FLOAT)pRTFLine->m_iStart) / 20000.0f; | 1142 rect.left = ((FX_FLOAT)pRTFLine->m_iStart) / 20000.0f; |
1143 rect.width = ((FX_FLOAT)pRTFLine->m_iWidth) / 20000.0f; | 1143 rect.width = ((FX_FLOAT)pRTFLine->m_iWidth) / 20000.0f; |
1144 CFX_RTFPieceArray& rtfPieces = pRTFLine->m_LinePieces; | 1144 CFX_RTFPieceArray& rtfPieces = pRTFLine->m_LinePieces; |
1145 int32_t iCount = rtfPieces.GetSize(); | 1145 int32_t iCount = rtfPieces.GetSize(); |
1146 if (iCount < 1) { | 1146 if (iCount < 1) { |
1147 rect.width = 0; | 1147 rect.width = 0; |
1148 return; | 1148 return; |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1516 rtBBoxF.height = fHeight; | 1516 rtBBoxF.height = fHeight; |
1517 rtBBoxF.top = std::max(rtBBoxF.top, 0.0f); | 1517 rtBBoxF.top = std::max(rtBBoxF.top, 0.0f); |
1518 } | 1518 } |
1519 rtArray.SetAt(i, rtBBoxF); | 1519 rtArray.SetAt(i, rtBBoxF); |
1520 continue; | 1520 continue; |
1521 } | 1521 } |
1522 rtArray.SetAt(i, rect); | 1522 rtArray.SetAt(i, rect); |
1523 } | 1523 } |
1524 return iLength; | 1524 return iLength; |
1525 } | 1525 } |
OLD | NEW |