[Libreoffice-commits] core.git: editeng/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Sun Nov 4 00:41:55 UTC 2018
editeng/source/editeng/impedit3.cxx | 196 ++++++++++++++++--------------------
1 file changed, 89 insertions(+), 107 deletions(-)
New commits:
commit ca3b0f8242a11c23f1077117e2e9f779348da831
Author: Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Sun Nov 4 02:10:52 2018 +0300
Commit: Mike Kaganski <mike.kaganski at collabora.com>
CommitDate: Sun Nov 4 01:41:19 2018 +0100
tdf#120703 VPS: V547 Expression is always true/false
Some convoluted conditions present from the start turn out to be redundant
Change-Id: I296928c7ca3852ce3f7b21791440e1b21c64b32c
Reviewed-on: https://gerrit.libreoffice.org/62824
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
index 85ab762eeb65..d339261a5542 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -744,7 +744,6 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
ImplInitLayoutMode( GetRefDevice(), nPara, nIndex );
- bool bCalcCharPositions = true;
std::unique_ptr<long[]> pBuf(new long[ pNode->Len() ]);
bool bSameLineAgain = false; // For TextRanger, if the height changes.
@@ -798,15 +797,12 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
// Solution:
// The line before can only become longer, not smaller
// => ...
- if ( bCalcCharPositions )
- pLine->GetCharPosArray().clear();
+ pLine->GetCharPosArray().clear();
sal_Int32 nTmpPos = nIndex;
sal_Int32 nTmpPortion = pLine->GetStartPortion();
long nTmpWidth = 0;
long nXWidth = nMaxLineWidth;
- if ( nXWidth <= nTmpWidth ) // while has to be looped once
- nXWidth = nTmpWidth+1;
LongDqPtr pTextRanges = nullptr;
long nTextExtraYOffset = 0;
@@ -1033,84 +1029,80 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
case EE_FEATURE_FIELD:
{
SeekCursor( pNode, nTmpPos+1, aTmpFont );
- sal_Unicode cChar = 0; // later: NBS?
aTmpFont.SetPhysFont( GetRefDevice() );
ImplInitDigitMode(GetRefDevice(), aTmpFont.GetLanguage());
- OUString aFieldValue = cChar ? OUString(cChar) : static_cast<const EditCharAttribField*>(pNextFeature)->GetFieldValue();
- if ( bCalcCharPositions || !pPortion->HasValidSize() )
+ OUString aFieldValue = static_cast<const EditCharAttribField*>(pNextFeature)->GetFieldValue();
+ // get size, but also DXArray to allow length information in line breaking below
+ const sal_Int32 nLength(aFieldValue.getLength());
+ std::unique_ptr<long[]> pTmpDXArray(new long[nLength]);
+ pPortion->GetSize() = aTmpFont.QuickGetTextSize(GetRefDevice(), aFieldValue, 0, aFieldValue.getLength(), pTmpDXArray.get());
+
+ // So no scrolling for oversized fields
+ if ( pPortion->GetSize().Width() > nXWidth )
{
- // get size, but also DXArray to allow length information in line breaking below
- const sal_Int32 nLength(aFieldValue.getLength());
- std::unique_ptr<long[]> pTmpDXArray(new long[nLength]);
- pPortion->GetSize() = aTmpFont.QuickGetTextSize(GetRefDevice(), aFieldValue, 0, aFieldValue.getLength(), pTmpDXArray.get());
+ // create ExtraPortionInfo on-demand, flush lineBreaksList
+ ExtraPortionInfo *pExtraInfo = pPortion->GetExtraInfos();
- // So no scrolling for oversized fields
- if ( pPortion->GetSize().Width() > nXWidth )
+ if(nullptr == pExtraInfo)
{
- // create ExtraPortionInfo on-demand, flush lineBreaksList
- ExtraPortionInfo *pExtraInfo = pPortion->GetExtraInfos();
-
- if(nullptr == pExtraInfo)
- {
- pExtraInfo = new ExtraPortionInfo();
- pExtraInfo->nOrgWidth = nXWidth;
- pPortion->SetExtraInfos(pExtraInfo);
- }
- else
- {
- pExtraInfo->lineBreaksList.clear();
- }
+ pExtraInfo = new ExtraPortionInfo();
+ pExtraInfo->nOrgWidth = nXWidth;
+ pPortion->SetExtraInfos(pExtraInfo);
+ }
+ else
+ {
+ pExtraInfo->lineBreaksList.clear();
+ }
- // iterate over CellBreaks using XBreakIterator to be on the
- // safe side with international texts/charSets
- Reference < i18n::XBreakIterator > xBreakIterator(ImplGetBreakIterator());
- const sal_Int32 nTextLength(aFieldValue.getLength());
- const lang::Locale aLocale(GetLocale(EditPaM(pNode, nPortionStart)));
- sal_Int32 nDone(0);
- sal_Int32 nNextCellBreak(
- xBreakIterator->nextCharacters(
- aFieldValue,
- 0,
- aLocale,
- css::i18n::CharacterIteratorMode::SKIPCELL,
- 0,
- nDone));
- sal_Int32 nLastCellBreak(0);
- sal_Int32 nLineStartX(0);
-
- // always add 1st line break (safe, we already know we are larger than nXWidth)
- pExtraInfo->lineBreaksList.push_back(0);
-
- for(sal_Int32 a(0); a < nTextLength; a++)
+ // iterate over CellBreaks using XBreakIterator to be on the
+ // safe side with international texts/charSets
+ Reference < i18n::XBreakIterator > xBreakIterator(ImplGetBreakIterator());
+ const sal_Int32 nTextLength(aFieldValue.getLength());
+ const lang::Locale aLocale(GetLocale(EditPaM(pNode, nPortionStart)));
+ sal_Int32 nDone(0);
+ sal_Int32 nNextCellBreak(
+ xBreakIterator->nextCharacters(
+ aFieldValue,
+ 0,
+ aLocale,
+ css::i18n::CharacterIteratorMode::SKIPCELL,
+ 0,
+ nDone));
+ sal_Int32 nLastCellBreak(0);
+ sal_Int32 nLineStartX(0);
+
+ // always add 1st line break (safe, we already know we are larger than nXWidth)
+ pExtraInfo->lineBreaksList.push_back(0);
+
+ for(sal_Int32 a(0); a < nTextLength; a++)
+ {
+ if(a == nNextCellBreak)
{
- if(a == nNextCellBreak)
+ // check width
+ if(pTmpDXArray[a] - nLineStartX > nXWidth)
{
- // check width
- if(pTmpDXArray[a] - nLineStartX > nXWidth)
+ // new CellBreak does not fit in current line, need to
+ // create a break at LastCellBreak - but do not add 1st
+ // line break twice for very tall frames
+ if(0 != a)
{
- // new CellBreak does not fit in current line, need to
- // create a break at LastCellBreak - but do not add 1st
- // line break twice for very tall frames
- if(0 != a)
- {
- pExtraInfo->lineBreaksList.push_back(a);
- }
-
- // moveLineStart forward in X
- nLineStartX = pTmpDXArray[nLastCellBreak];
+ pExtraInfo->lineBreaksList.push_back(a);
}
- // update CellBreak iteration values
- nLastCellBreak = a;
- nNextCellBreak = xBreakIterator->nextCharacters(
- aFieldValue,
- a,
- aLocale,
- css::i18n::CharacterIteratorMode::SKIPCELL,
- 1,
- nDone);
+ // moveLineStart forward in X
+ nLineStartX = pTmpDXArray[nLastCellBreak];
}
+
+ // update CellBreak iteration values
+ nLastCellBreak = a;
+ nNextCellBreak = xBreakIterator->nextCharacters(
+ aFieldValue,
+ a,
+ aLocale,
+ css::i18n::CharacterIteratorMode::SKIPCELL,
+ 1,
+ nDone);
}
}
}
@@ -1118,7 +1110,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
EditLine::CharPosArrayType& rArray = pLine->GetCharPosArray();
size_t nPos = nTmpPos - pLine->GetStart();
rArray.insert(rArray.begin()+nPos, pPortion->GetSize().Width());
- pPortion->SetKind( cChar ? PortionKind::TEXT : PortionKind::FIELD );
+ pPortion->SetKind(PortionKind::FIELD);
// If this is the first token on the line,
// and nTmpWidth > aPaperSize.Width, => infinite loop!
if ( ( nTmpWidth >= nXWidth ) && ( nTmpPortion == pLine->GetStartPortion() ) )
@@ -1146,41 +1138,34 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
if (!bContinueLastPortion)
pPortion->SetRightToLeftLevel( GetRightToLeft( nPara, nTmpPos+1 ) );
- if ( bCalcCharPositions || !pPortion->HasValidSize() )
+ if (bContinueLastPortion)
{
- if (bContinueLastPortion)
- {
- Size aSize( aTmpFont.QuickGetTextSize( GetRefDevice(),
- pParaPortion->GetNode()->GetString(), nTmpPos, nPortionLen, pBuf.get() ));
- pPortion->GetSize().AdjustWidth(aSize.Width() );
- if (pPortion->GetSize().Height() < aSize.Height())
- pPortion->GetSize().setHeight( aSize.Height() );
- }
- else
- {
- pPortion->GetSize() = aTmpFont.QuickGetTextSize( GetRefDevice(),
- pParaPortion->GetNode()->GetString(), nTmpPos, nPortionLen, pBuf.get() );
- }
-
- // #i9050# Do Kerning also behind portions...
- if ( ( aTmpFont.GetFixKerning() > 0 ) && ( ( nTmpPos + nPortionLen ) < pNode->Len() ) )
- pPortion->GetSize().AdjustWidth(aTmpFont.GetFixKerning() );
- if ( IsFixedCellHeight() )
- pPortion->GetSize().setHeight( ImplCalculateFontIndependentLineSpacing( aTmpFont.GetFontHeight() ) );
+ Size aSize( aTmpFont.QuickGetTextSize( GetRefDevice(),
+ pParaPortion->GetNode()->GetString(), nTmpPos, nPortionLen, pBuf.get() ));
+ pPortion->GetSize().AdjustWidth(aSize.Width() );
+ if (pPortion->GetSize().Height() < aSize.Height())
+ pPortion->GetSize().setHeight( aSize.Height() );
}
- if ( bCalcCharPositions )
+ else
{
- // The array is generally flattened at the beginning
- // => Always simply quick inserts.
- size_t nPos = nTmpPos - pLine->GetStart();
- EditLine::CharPosArrayType& rArray = pLine->GetCharPosArray();
- rArray.insert( rArray.begin() + nPos, pBuf.get(), pBuf.get() + nPortionLen);
+ pPortion->GetSize() = aTmpFont.QuickGetTextSize( GetRefDevice(),
+ pParaPortion->GetNode()->GetString(), nTmpPos, nPortionLen, pBuf.get() );
}
+ // #i9050# Do Kerning also behind portions...
+ if ( ( aTmpFont.GetFixKerning() > 0 ) && ( ( nTmpPos + nPortionLen ) < pNode->Len() ) )
+ pPortion->GetSize().AdjustWidth(aTmpFont.GetFixKerning() );
+ if ( IsFixedCellHeight() )
+ pPortion->GetSize().setHeight( ImplCalculateFontIndependentLineSpacing( aTmpFont.GetFontHeight() ) );
+ // The array is generally flattened at the beginning
+ // => Always simply quick inserts.
+ size_t nPos = nTmpPos - pLine->GetStart();
+ EditLine::CharPosArrayType& rArray = pLine->GetCharPosArray();
+ rArray.insert( rArray.begin() + nPos, pBuf.get(), pBuf.get() + nPortionLen);
+
// And now check for Compression:
if ( !bContinueLastPortion && nPortionLen && GetAsianCompressionMode() != CharCompressType::NONE )
{
- EditLine::CharPosArrayType& rArray = pLine->GetCharPosArray();
long* pDXArray = rArray.data() + nTmpPos - pLine->GetStart();
bCompressedChars |= ImplCalcAsianCompression(
pNode, pPortion, nTmpPos, pDXArray, 10000, false);
@@ -1547,13 +1532,10 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
// If a portion was wrapped there may be far too many positions in
// CharPosArray:
- if ( bCalcCharPositions )
- {
- EditLine::CharPosArrayType& rArray = pLine->GetCharPosArray();
- size_t nLen = pLine->GetLen();
- if (rArray.size() > nLen)
- rArray.erase(rArray.begin()+nLen, rArray.end());
- }
+ EditLine::CharPosArrayType& rArray = pLine->GetCharPosArray();
+ size_t nLen = pLine->GetLen();
+ if (rArray.size() > nLen)
+ rArray.erase(rArray.begin()+nLen, rArray.end());
if ( GetTextRanger() )
{
@@ -1591,7 +1573,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
( ( nEnd-nInvalidDiff ) == aSaveLine.GetEnd() ) )
{
pLine->SetValid();
- if ( bCalcCharPositions && bQuickFormat )
+ if (bQuickFormat)
{
bLineBreak = false;
pParaPortion->CorrectValuesBehindLastFormattedLine( nLine );
@@ -1599,7 +1581,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
}
}
}
- else if ( bCalcCharPositions && bQuickFormat && ( nEnd > nInvalidEnd) )
+ else if (bQuickFormat && (nEnd > nInvalidEnd))
{
// If the invalid line ends so that the next begins on the
// 'same' passage as before, i.e. not wrapped differently,
More information about the Libreoffice-commits
mailing list