Index: xfa/fgas/layout/fgas_rtfbreak.cpp |
diff --git a/xfa/fgas/layout/fgas_rtfbreak.cpp b/xfa/fgas/layout/fgas_rtfbreak.cpp |
index bfe3ca674f4587f75dc0d1ae0573567b31631387..21ed0665b94cdc7ab496349a519dd0a54f168a4f 100644 |
--- a/xfa/fgas/layout/fgas_rtfbreak.cpp |
+++ b/xfa/fgas/layout/fgas_rtfbreak.cpp |
@@ -19,10 +19,10 @@ CFX_RTFBreak::CFX_RTFBreak(uint32_t dwPolicies) |
m_iBoundaryStart(0), |
m_iBoundaryEnd(2000000), |
m_dwLayoutStyles(0), |
- m_bPagination(FALSE), |
- m_bVertical(FALSE), |
- m_bSingleLine(FALSE), |
- m_bCharCode(FALSE), |
+ m_bPagination(false), |
+ m_bVertical(false), |
+ m_bSingleLine(false), |
+ m_bCharCode(false), |
m_pFont(nullptr), |
m_iFontHeight(240), |
m_iFontSize(240), |
@@ -52,31 +52,35 @@ CFX_RTFBreak::CFX_RTFBreak(uint32_t dwPolicies) |
m_iTolerance(0) { |
m_pCurLine = &m_RTFLine1; |
} |
+ |
CFX_RTFBreak::~CFX_RTFBreak() { |
Reset(); |
m_PositionedTabs.RemoveAll(); |
- if (m_pUserData) { |
+ if (m_pUserData) |
m_pUserData->Release(); |
- } |
} |
+ |
void CFX_RTFBreak::SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) { |
if (fLineStart > fLineEnd) |
return; |
+ |
m_iBoundaryStart = FXSYS_round(fLineStart * 20000.0f); |
m_iBoundaryEnd = FXSYS_round(fLineEnd * 20000.0f); |
m_pCurLine->m_iStart = std::min(m_pCurLine->m_iStart, m_iBoundaryEnd); |
m_pCurLine->m_iStart = std::max(m_pCurLine->m_iStart, m_iBoundaryStart); |
} |
+ |
void CFX_RTFBreak::SetLineStartPos(FX_FLOAT fLinePos) { |
int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f); |
iLinePos = std::min(iLinePos, m_iBoundaryEnd); |
iLinePos = std::max(iLinePos, m_iBoundaryStart); |
m_pCurLine->m_iStart = iLinePos; |
} |
+ |
void CFX_RTFBreak::SetLayoutStyles(uint32_t dwLayoutStyles) { |
- if (m_dwLayoutStyles == dwLayoutStyles) { |
+ if (m_dwLayoutStyles == dwLayoutStyles) |
return; |
- } |
+ |
SetBreakStatus(); |
m_dwLayoutStyles = dwLayoutStyles; |
m_bPagination = (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_Pagination) != 0; |
@@ -87,6 +91,7 @@ void CFX_RTFBreak::SetLayoutStyles(uint32_t dwLayoutStyles) { |
m_iRotation = m_iLineRotation + m_iCharRotation; |
m_iRotation %= 4; |
} |
+ |
void CFX_RTFBreak::SetFont(CFGAS_GEFont* pFont) { |
if (!pFont) { |
return; |
@@ -340,9 +345,9 @@ static const FX_RTFBreak_LPFAppendChar g_FX_RTFBreak_lpfAppendChar[16] = { |
}; |
uint32_t CFX_RTFBreak::AppendChar(FX_WCHAR wch) { |
ASSERT(m_pFont && m_pCurLine); |
- if (m_bCharCode) { |
+ if (m_bCharCode) |
return AppendChar_CharCode(wch); |
- } |
+ |
uint32_t dwProps = kTextLayoutCodeProperties[(uint16_t)wch]; |
FX_CHARTYPE chartype = GetCharTypeFromProp(dwProps); |
CFX_RTFCharArray& tca = m_pCurLine->m_LineChars; |
@@ -388,6 +393,7 @@ uint32_t CFX_RTFBreak::AppendChar(FX_WCHAR wch) { |
m_eCharType = chartype; |
return std::max(dwRet1, dwRet2); |
} |
+ |
uint32_t CFX_RTFBreak::AppendChar_CharCode(FX_WCHAR wch) { |
ASSERT(m_pFont && m_pCurLine); |
ASSERT(m_bCharCode); |
@@ -406,9 +412,9 @@ uint32_t CFX_RTFBreak::AppendChar_CharCode(FX_WCHAR wch) { |
pCurChar->m_nRotation = m_iCharRotation; |
pCurChar->m_iCharWidth = 0; |
pCurChar->m_dwIdentity = m_dwIdentity; |
- if (m_pUserData) { |
+ if (m_pUserData) |
m_pUserData->Retain(); |
- } |
+ |
pCurChar->m_pUserData = m_pUserData; |
int32_t iCharWidth = 0; |
if (m_bVertical != FX_IsOdd(m_iRotation)) { |
@@ -430,6 +436,7 @@ uint32_t CFX_RTFBreak::AppendChar_CharCode(FX_WCHAR wch) { |
} |
return FX_RTFBREAK_None; |
} |
+ |
uint32_t CFX_RTFBreak::AppendChar_Combination(CFX_RTFChar* pCurChar, |
int32_t iRotation) { |
int32_t iCharWidth = 0; |
@@ -504,6 +511,7 @@ uint32_t CFX_RTFBreak::AppendChar_Control(CFX_RTFChar* pCurChar, |
} |
return dwRet2; |
} |
+ |
uint32_t CFX_RTFBreak::AppendChar_Arabic(CFX_RTFChar* pCurChar, |
int32_t iRotation) { |
CFX_RTFChar* pLastChar = nullptr; |
@@ -562,16 +570,16 @@ uint32_t CFX_RTFBreak::AppendChar_Arabic(CFX_RTFChar* pCurChar, |
} |
return FX_RTFBREAK_None; |
} |
+ |
uint32_t CFX_RTFBreak::AppendChar_Others(CFX_RTFChar* pCurChar, |
int32_t iRotation) { |
FX_CHARTYPE chartype = pCurChar->GetCharType(); |
FX_WCHAR wForm; |
if (chartype == FX_CHARTYPE_Numeric) { |
- if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) { |
+ if (m_dwLayoutStyles & FX_RTFLAYOUTSTYLE_ArabicNumber) |
wForm = pCurChar->m_wCharCode + 0x0630; |
- } else { |
+ else |
wForm = pCurChar->m_wCharCode; |
- } |
} else if (m_bRTL || m_bVertical) { |
wForm = FX_GetMirrorChar(pCurChar->m_wCharCode, pCurChar->m_dwCharProps, |
m_bRTL, m_bVertical); |
@@ -579,29 +587,29 @@ uint32_t CFX_RTFBreak::AppendChar_Others(CFX_RTFChar* pCurChar, |
wForm = pCurChar->m_wCharCode; |
} |
int32_t iCharWidth = 0; |
- if (m_bVertical != FX_IsOdd(iRotation)) { |
- iCharWidth = 1000; |
- } else { |
- if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode)) { |
+ if (m_bVertical == FX_IsOdd(iRotation)) { |
+ if (!m_pFont->GetCharWidth(wForm, iCharWidth, m_bCharCode)) |
iCharWidth = m_iDefChar; |
- } |
+ } else { |
+ iCharWidth = 1000; |
} |
iCharWidth *= m_iFontSize; |
- iCharWidth = iCharWidth * m_iHorizontalScale / 100; |
+ iCharWidth *= m_iHorizontalScale / 100; |
iCharWidth += m_iCharSpace; |
- if (chartype == FX_CHARTYPE_Space && m_bWordSpace) { |
+ if (chartype == FX_CHARTYPE_Space && m_bWordSpace) |
iCharWidth += m_iWordSpace; |
- } |
+ |
pCurChar->m_iCharWidth = iCharWidth; |
m_pCurLine->m_iWidth += iCharWidth; |
- FX_BOOL bBreak = (chartype != FX_CHARTYPE_Space || |
- (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0); |
+ bool bBreak = (chartype != FX_CHARTYPE_Space || |
+ (m_dwPolicies & FX_RTFBREAKPOLICY_SpaceBreak) != 0); |
if (!m_bSingleLine && !m_bOrphanLine && bBreak && |
m_pCurLine->GetLineEnd() > m_iBoundaryEnd + m_iTolerance) { |
return EndBreak(FX_RTFBREAK_LineBreak); |
} |
return FX_RTFBREAK_None; |
} |
+ |
uint32_t CFX_RTFBreak::EndBreak(uint32_t dwStatus) { |
ASSERT(dwStatus >= FX_RTFBREAK_PieceBreak && |
dwStatus <= FX_RTFBREAK_PageBreak); |
@@ -610,59 +618,56 @@ uint32_t CFX_RTFBreak::EndBreak(uint32_t dwStatus) { |
int32_t iCount = pCurPieces->GetSize(); |
if (iCount > 0) { |
CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount); |
- if (dwStatus > FX_RTFBREAK_PieceBreak) { |
+ if (dwStatus > FX_RTFBREAK_PieceBreak) |
pLastPiece->m_dwStatus = dwStatus; |
- } else { |
+ else |
dwStatus = pLastPiece->m_dwStatus; |
- } |
return dwStatus; |
- } else { |
- CFX_RTFLine* pLastLine = GetRTFLine(TRUE); |
- if (pLastLine) { |
- pCurPieces = &pLastLine->m_LinePieces; |
- iCount = pCurPieces->GetSize(); |
- if (iCount-- > 0) { |
- CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(iCount); |
- if (dwStatus > FX_RTFBREAK_PieceBreak) { |
- pLastPiece->m_dwStatus = dwStatus; |
- } else { |
- dwStatus = pLastPiece->m_dwStatus; |
- } |
- return dwStatus; |
- } |
- return FX_RTFBREAK_None; |
- } |
- iCount = m_pCurLine->CountChars(); |
- if (iCount < 1) { |
- return FX_RTFBREAK_None; |
- } |
- CFX_RTFChar& tc = m_pCurLine->GetChar(iCount - 1); |
- tc.m_dwStatus = dwStatus; |
- if (dwStatus <= FX_RTFBREAK_PieceBreak) { |
+ } |
+ |
+ CFX_RTFLine* pLastLine = GetRTFLine(TRUE); |
+ if (pLastLine) { |
+ pCurPieces = &pLastLine->m_LinePieces; |
+ iCount = pCurPieces->GetSize(); |
+ if (iCount-- > 0) { |
+ CFX_RTFPiece* pLastPiece = pCurPieces->GetPtrAt(iCount); |
+ if (dwStatus > FX_RTFBREAK_PieceBreak) |
+ pLastPiece->m_dwStatus = dwStatus; |
+ else |
+ dwStatus = pLastPiece->m_dwStatus; |
return dwStatus; |
} |
+ return FX_RTFBREAK_None; |
} |
+ iCount = m_pCurLine->CountChars(); |
+ if (iCount < 1) |
+ return FX_RTFBREAK_None; |
+ |
+ CFX_RTFChar& tc = m_pCurLine->GetChar(iCount - 1); |
+ tc.m_dwStatus = dwStatus; |
+ if (dwStatus <= FX_RTFBREAK_PieceBreak) |
+ return dwStatus; |
+ |
m_iReady = (m_pCurLine == &m_RTFLine1) ? 1 : 2; |
CFX_RTFLine* pNextLine = |
(m_pCurLine == &m_RTFLine1) ? &m_RTFLine2 : &m_RTFLine1; |
FX_BOOL bAllChars = (m_iAlignment > FX_RTFLINEALIGNMENT_Right); |
CFX_TPOArray tpos(100); |
- if (EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { |
- goto EndBreak_Ret; |
- } |
- if (!m_bCharCode) { |
- EndBreak_BidiLine(tpos, dwStatus); |
- } |
- if (!m_bPagination && m_iAlignment > FX_RTFLINEALIGNMENT_Left) { |
- EndBreak_Alignment(tpos, bAllChars, dwStatus); |
+ if (!EndBreak_SplitLine(pNextLine, bAllChars, dwStatus)) { |
+ if (!m_bCharCode) |
+ EndBreak_BidiLine(tpos, dwStatus); |
+ |
+ if (!m_bPagination && m_iAlignment > FX_RTFLINEALIGNMENT_Left) |
+ EndBreak_Alignment(tpos, bAllChars, dwStatus); |
} |
-EndBreak_Ret: |
+ |
m_pCurLine = pNextLine; |
m_pCurLine->m_iStart = m_iBoundaryStart; |
CFX_RTFChar* pTC = GetLastChar(0); |
m_eCharType = pTC ? pTC->GetCharType() : FX_CHARTYPE_Unknown; |
return dwStatus; |
} |
+ |
FX_BOOL CFX_RTFBreak::EndBreak_SplitLine(CFX_RTFLine* pNextLine, |
FX_BOOL bAllChars, |
uint32_t dwStatus) { |
@@ -928,20 +933,21 @@ void CFX_RTFBreak::EndBreak_Alignment(CFX_TPOArray& tpos, |
} |
} |
} |
+ |
int32_t CFX_RTFBreak::GetBreakPos(CFX_RTFCharArray& tca, |
int32_t& iEndPos, |
FX_BOOL bAllChars, |
FX_BOOL bOnlyBrk) { |
int32_t iLength = tca.GetSize() - 1; |
- if (iLength < 1) { |
+ if (iLength < 1) |
return iLength; |
- } |
+ |
int32_t iBreak = -1, iBreakPos = -1, iIndirect = -1, iIndirectPos = -1, |
iLast = -1, iLastPos = -1; |
if (m_bSingleLine || m_bOrphanLine || iEndPos <= m_iBoundaryEnd) { |
- if (!bAllChars || m_bCharCode) { |
+ if (!bAllChars || m_bCharCode) |
return iLength; |
- } |
+ |
iBreak = iLength; |
iBreakPos = iEndPos; |
} |
@@ -950,14 +956,13 @@ int32_t CFX_RTFBreak::GetBreakPos(CFX_RTFCharArray& tca, |
const CFX_RTFChar* pChar; |
int32_t iCharWidth; |
while (iLength > 0) { |
- if (iEndPos <= m_iBoundaryEnd) { |
+ if (iEndPos <= m_iBoundaryEnd) |
break; |
- } |
+ |
pChar = pCharArray + iLength--; |
iCharWidth = pChar->m_iCharWidth; |
- if (iCharWidth > 0) { |
+ if (iCharWidth > 0) |
iEndPos -= iCharWidth; |
- } |
} |
return iLength; |
} |
@@ -1040,9 +1045,9 @@ int32_t CFX_RTFBreak::GetBreakPos(CFX_RTFCharArray& tca, |
nNext = nCodeProp & 0x003F; |
iLength--; |
} |
- if (bOnlyBrk) { |
+ if (bOnlyBrk) |
return 0; |
- } |
+ |
if (iBreak > -1) { |
iEndPos = iBreakPos; |
return iBreak; |
@@ -1057,6 +1062,7 @@ int32_t CFX_RTFBreak::GetBreakPos(CFX_RTFCharArray& tca, |
} |
return 0; |
} |
+ |
void CFX_RTFBreak::SplitTextLine(CFX_RTFLine* pCurLine, |
CFX_RTFLine* pNextLine, |
FX_BOOL bAllChars) { |
@@ -1105,20 +1111,23 @@ void CFX_RTFBreak::SplitTextLine(CFX_RTFLine* pCurLine, |
tc->m_dwStatus = 0; |
} |
} |
+ |
int32_t CFX_RTFBreak::CountBreakPieces() const { |
CFX_RTFPieceArray* pRTFPieces = GetRTFPieces(TRUE); |
return pRTFPieces ? pRTFPieces->GetSize() : 0; |
} |
+ |
const CFX_RTFPiece* CFX_RTFBreak::GetBreakPiece(int32_t index) const { |
CFX_RTFPieceArray* pRTFPieces = GetRTFPieces(TRUE); |
- if (!pRTFPieces) { |
+ if (!pRTFPieces) |
return nullptr; |
- } |
- if (index < 0 || index >= pRTFPieces->GetSize()) { |
+ |
+ if (index < 0 || index >= pRTFPieces->GetSize()) |
return nullptr; |
- } |
+ |
return pRTFPieces->GetPtrAt(index); |
} |
+ |
void CFX_RTFBreak::GetLineRect(CFX_RectF& rect) const { |
rect.top = 0; |
CFX_RTFLine* pRTFLine = GetRTFLine(TRUE); |
@@ -1480,7 +1489,7 @@ int32_t CFX_RTFBreak::GetCharRects(const FX_RTFTEXTOBJ* pText, |
} |
if (bCharBBox && !bRet) { |
int32_t iCharWidth = 1000; |
- pFont->GetCharWidth(wch, iCharWidth); |
+ pFont->GetCharWidth(wch, iCharWidth, false); |
FX_FLOAT fRTLeft = 0, fCharWidth = 0; |
if (iCharWidth > 0) { |
fCharWidth = iCharWidth * fScale; |