Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(580)

Side by Side Diff: xfa/src/fgas/src/layout/fx_rtfbreak.cpp

Issue 1573893002: Fix an assertion failure in CFX_RTFBreak::SetLineWidth() (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: nit Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/src/fgas/src/layout/fx_rtfbreak.h ('k') | xfa/src/fxfa/src/app/xfa_textlayout.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « xfa/src/fgas/src/layout/fx_rtfbreak.h ('k') | xfa/src/fxfa/src/app/xfa_textlayout.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698