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@collabora.com>
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
index 85ab762..d339261 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -744,7 +744,6 @@

    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 @@
        // 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 @@
                    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();
                                pExtraInfo = new ExtraPortionInfo();
                                pExtraInfo->nOrgWidth = nXWidth;
                                pPortion->SetExtraInfos(pExtraInfo);
                            }
                            else
                            {
                                pExtraInfo->lineBreaksList.clear();
                            }

                                if(nullptr == pExtraInfo)
                            // 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)
                                {
                                    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++)
                                {
                                    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 @@
                        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 @@
                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() );
                    }
                     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() ) );
                }
                if ( bCalcCharPositions )
                {
                    // 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);
                }
                // #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 @@

        // 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 @@
                            ( ( nEnd-nInvalidDiff ) == aSaveLine.GetEnd() ) )
                    {
                        pLine->SetValid();
                        if ( bCalcCharPositions && bQuickFormat )
                        if (bQuickFormat)
                        {
                            bLineBreak = false;
                            pParaPortion->CorrectValuesBehindLastFormattedLine( nLine );
@@ -1599,7 +1581,7 @@
                        }
                    }
                }
                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,