editeng/source/editeng/editeng.cxx  |   10 -
 editeng/source/editeng/impedit.cxx  |   22 +-
 editeng/source/editeng/impedit.hxx  |   34 +--
 editeng/source/editeng/impedit2.cxx |  275 +++++++++++++++----------------
 editeng/source/editeng/impedit3.cxx |  317 +++++++++++++++++-------------------
 include/editeng/editeng.hxx         |    6 
 6 files changed, 321 insertions(+), 343 deletions(-)

New commits:
commit 01092e632994a9b73ebcb29a4173d6eec6f1141c
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Sun Jan 14 13:49:48 2024 +0900
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Sun Jan 14 16:06:17 2024 +0100

    editeng: change the ParaPortion parameter from pointer to ref.
    
    In most cases we expect the ParaPortion pointer to be not-null,
    so it makes more sense to have the ParaPortion parameter as a ref.
    and not a raw pointer.
    
    Change-Id: I1659a1978e2615982e4ce6bdd99c9d9f3719e7bf
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162040
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/editeng/source/editeng/editeng.cxx 
b/editeng/source/editeng/editeng.cxx
index d7a30a60b935..300b2fc65a0d 100644
--- a/editeng/source/editeng/editeng.cxx
+++ b/editeng/source/editeng/editeng.cxx
@@ -865,16 +865,14 @@ EditSelection EditEngine::SelectWord(
     return pImpEditEngine->SelectWord(rCurSelection, nWordType);
 }
 
-tools::Long EditEngine::GetXPos(
-        const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 
nIndex, bool bPreferPortionStart) const
+tools::Long EditEngine::GetXPos(ParaPortion const& rParaPortion, EditLine 
const& rLine, sal_Int32 nIndex, bool bPreferPortionStart) const
 {
-    return pImpEditEngine->GetXPos(pParaPortion, rLine, nIndex, 
bPreferPortionStart);
+    return pImpEditEngine->GetXPos(rParaPortion, rLine, nIndex, 
bPreferPortionStart);
 }
 
-Range EditEngine::GetLineXPosStartEnd(
-        const ParaPortion* pParaPortion, EditLine const& rLine) const
+Range EditEngine::GetLineXPosStartEnd(ParaPortion const& rParaPortion, 
EditLine const& rLine) const
 {
-    return pImpEditEngine->GetLineXPosStartEnd(pParaPortion, rLine);
+    return pImpEditEngine->GetLineXPosStartEnd(rParaPortion, rLine);
 }
 
 bool EditEngine::IsFormatted() const
diff --git a/editeng/source/editeng/impedit.cxx 
b/editeng/source/editeng/impedit.cxx
index c1f20e9e55df..46c9928e300f 100644
--- a/editeng/source/editeng/impedit.cxx
+++ b/editeng/source/editeng/impedit.cxx
@@ -576,7 +576,7 @@ void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, 
vcl::Region* pRegion,
                 nEndIndex = nStartIndex;
 
             tools::Rectangle 
aTmpRect(pEditEngine->pImpEditEngine->GetEditCursor(
-                &rInfo.rPortion, *rInfo.pLine, nStartIndex, 
GetCursorFlags::NONE));
+                rInfo.rPortion, *rInfo.pLine, nStartIndex, 
GetCursorFlags::NONE));
             const Size aLineOffset = 
pEditEngine->pImpEditEngine->getTopLeftDocOffset(rInfo.aArea);
             aTmpRect.Move(0, aLineOffset.Height());
 
@@ -595,7 +595,7 @@ void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, 
vcl::Region* pRegion,
             // Now that we have Bidi, the first/last index doesn't have to be 
the 'most outside' position
             if (!bPartOfLine)
             {
-                Range aLineXPosStartEnd = 
pEditEngine->GetLineXPosStartEnd(&rInfo.rPortion, *rInfo.pLine);
+                Range aLineXPosStartEnd = 
pEditEngine->GetLineXPosStartEnd(rInfo.rPortion, *rInfo.pLine);
                 aTmpRect.SetLeft(aLineXPosStartEnd.Min());
                 aTmpRect.SetRight(aLineXPosStartEnd.Max());
                 aTmpRect.Move(aLineOffset.Width(), 0);
@@ -616,8 +616,8 @@ void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, 
vcl::Region* pRegion,
 
                     DBG_ASSERT(nTmpEndIndex > nTmpStartIndex, 
"DrawSelectionXOR, Start >= End?");
 
-                    tools::Long nX1 = pEditEngine->GetXPos(&rInfo.rPortion, 
*rInfo.pLine, nTmpStartIndex, true);
-                    tools::Long nX2 = pEditEngine->GetXPos(&rInfo.rPortion, 
*rInfo.pLine, nTmpEndIndex);
+                    tools::Long nX1 = pEditEngine->GetXPos(rInfo.rPortion, 
*rInfo.pLine, nTmpStartIndex, true);
+                    tools::Long nX2 = pEditEngine->GetXPos(rInfo.rPortion, 
*rInfo.pLine, nTmpEndIndex);
 
                     aTmpRect.SetLeft(std::min(nX1, nX2));
                     aTmpRect.SetRight(std::max(nX1, nX2));
@@ -1103,8 +1103,7 @@ boost::property_tree::ptree getHyperlinkPropTree(const 
OUString& sText, const OU
 
 } // End of anon namespace
 
-tools::Rectangle ImpEditView::ImplGetEditCursor(EditPaM& aPaM, GetCursorFlags 
nShowCursorFlags, sal_Int32& nTextPortionStart,
-        const ParaPortion* pParaPortion) const
+tools::Rectangle ImpEditView::ImplGetEditCursor(EditPaM& aPaM, GetCursorFlags 
nShowCursorFlags, sal_Int32& nTextPortionStart, ParaPortion const& 
rParaPortion) const
 {
     tools::Rectangle aEditCursor = 
pEditEngine->pImpEditEngine->PaMtoEditCursor( aPaM, nShowCursorFlags );
     if ( !IsInsertMode() && !aEditSelection.HasRange() )
@@ -1115,8 +1114,8 @@ tools::Rectangle ImpEditView::ImplGetEditCursor(EditPaM& 
aPaM, GetCursorFlags nS
             aEditCursor.SetLeft( pEditEngine->pImpEditEngine->PaMtoEditCursor( 
aPaM, GetCursorFlags::TextOnly|GetCursorFlags::PreferPortionStart ).Left() );
             aEditCursor.SetRight( aEditCursor.Left() );
 
-            sal_Int32 nTextPortion = 
pParaPortion->GetTextPortions().FindPortion( aPaM.GetIndex(), 
nTextPortionStart, true );
-            const TextPortion& rTextPortion = 
pParaPortion->GetTextPortions()[nTextPortion];
+            sal_Int32 nTextPortion = 
rParaPortion.GetTextPortions().FindPortion( aPaM.GetIndex(), nTextPortionStart, 
true );
+            const TextPortion& rTextPortion = 
rParaPortion.GetTextPortions()[nTextPortion];
             if ( rTextPortion.GetKind() == PortionKind::TAB )
             {
                 aEditCursor.AdjustRight(rTextPortion.GetSize().Width() );
@@ -1163,7 +1162,7 @@ tools::Rectangle ImpEditView::GetEditCursor() const
         nShowCursorFlags |= GetCursorFlags::PreferPortionStart;
     }
 
-    return ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, 
pParaPortion);
+    return ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, 
*pParaPortion);
 }
 
 void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
@@ -1210,7 +1209,7 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool 
bForceVisCursor )
         nShowCursorFlags |= GetCursorFlags::PreferPortionStart;
     }
 
-    tools::Rectangle aEditCursor = ImplGetEditCursor(aPaM, nShowCursorFlags, 
nTextPortionStart, pParaPortion);
+    tools::Rectangle aEditCursor = ImplGetEditCursor(aPaM, nShowCursorFlags, 
nTextPortionStart, *pParaPortion);
 
     if ( bGotoCursor  ) // && 
(!pEditEngine->pImpEditEngine->GetStatus().AutoPageSize() ) )
     {
diff --git a/editeng/source/editeng/impedit.hxx 
b/editeng/source/editeng/impedit.hxx
index 61afaea21b83..75a89f3cb047 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -344,8 +344,7 @@ protected:
     void HideDDCursor();
 
     void ImplDrawHighlightRect(OutputDevice& rTarget, const Point& 
rDocPosTopLeft, const Point& rDocPosBottomRight, tools::PolyPolygon* pPolyPoly, 
bool bLOKCalcRTL);
-    tools::Rectangle ImplGetEditCursor(EditPaM& aPaM, GetCursorFlags 
nShowCursorFlags,
-            sal_Int32& nTextPortionStart, const ParaPortion* pParaPortion) 
const;
+    tools::Rectangle ImplGetEditCursor(EditPaM& aPaM, GetCursorFlags 
nShowCursorFlags, sal_Int32& nTextPortionStart, ParaPortion const& 
rParaPortion) const;
 
 public:
                     ImpEditView( EditView* pView, EditEngine* pEng, 
vcl::Window* pWindow );
@@ -643,7 +642,7 @@ private:
 
     void                ParaAttribsChanged( ContentNode const * pNode, bool 
bIgnoreUndoCheck = false );
     void                TextModified();
-    void                CalcHeight( ParaPortion* pPortion );
+    void                CalcHeight(ParaPortion& rParaPortion);
 
     void                InsertUndo( std::unique_ptr<EditUndo> pUndo, bool 
bTryMerge = false );
     void                ResetUndoManager();
@@ -656,10 +655,10 @@ private:
     std::tuple<const ParaPortion*, const EditLine*, tools::Long> 
GetPortionAndLine(Point aDocPos);
     EditPaM             GetPaM( Point aDocPos, bool bSmart = true );
     bool IsTextPos(const Point& rDocPos, sal_uInt16 nBorder);
-    tools::Long GetXPos(const ParaPortion* pParaPortion, EditLine const& 
rLine, sal_Int32 nIndex, bool bPreferPortionStart = false) const;
-    tools::Long GetPortionXOffset(const ParaPortion* pParaPortion, EditLine 
const& rLine, sal_Int32 nTextPortion) const;
-    sal_Int32 GetChar(const ParaPortion* pParaPortion, EditLine const& rLine, 
tools::Long nX, bool bSmart = true);
-    Range GetLineXPosStartEnd(const ParaPortion* pParaPortion, EditLine const& 
rLine) const;
+    tools::Long GetXPos(ParaPortion const& rParaPortion, EditLine const& 
rLine, sal_Int32 nIndex, bool bPreferPortionStart = false) const;
+    tools::Long GetPortionXOffset(ParaPortion const& rParaPortion, EditLine 
const& rLine, sal_Int32 nTextPortion) const;
+    sal_Int32 GetChar(ParaPortion const& rParaPortion, EditLine const& rLine, 
tools::Long nX, bool bSmart = true);
+    Range GetLineXPosStartEnd(ParaPortion const& rParaPortion, EditLine const& 
rLine) const;
 
     void                ParaAttribsToCharAttribs( ContentNode* pNode );
     void                GetCharAttribs( sal_Int32 nPara, 
std::vector<EECharAttrib>& rLst ) const;
@@ -678,17 +677,17 @@ private:
     tools::Long calculateMaxLineWidth(tools::Long nStartX, SvxLRSpaceItem 
const& rLRItem);
     bool CreateLines(sal_Int32 nPara, sal_uInt32 nStartPosY);
 
-    void                CreateAndInsertEmptyLine( ParaPortion* pParaPortion );
-    bool                FinishCreateLines( ParaPortion* pParaPortion );
-    void                CreateTextPortions( ParaPortion* pParaPortion, 
sal_Int32& rStartPos /*, sal_Bool bCreateBlockPortions */ );
-    void                RecalcTextPortion( ParaPortion* pParaPortion, 
sal_Int32 nStartPos, sal_Int32 nNewChars );
-    sal_Int32           SplitTextPortion( ParaPortion* pParaPortion, sal_Int32 
nPos,  EditLine* pCurLine = nullptr );
+    void                CreateAndInsertEmptyLine(ParaPortion& rParaPortion);
+    bool                FinishCreateLines(ParaPortion& rParaPortion);
+    void                CreateTextPortions(ParaPortion& rParaPortion, 
sal_Int32& rStartPos);
+    void                RecalcTextPortion(ParaPortion& rParaPortion, sal_Int32 
nStartPos, sal_Int32 nNewChars);
+    sal_Int32           SplitTextPortion(ParaPortion& rParaPortion, sal_Int32 
nPos,  EditLine* pCurLine = nullptr);
     void                SeekCursor( ContentNode* pNode, sal_Int32 nPos, 
SvxFont& rFont, OutputDevice* pOut = nullptr );
     void                RecalcFormatterFontMetrics( FormatterFontMetric& 
rCurMetrics, SvxFont& rFont );
     void                CheckAutoPageSize();
 
-    void                ImpBreakLine( ParaPortion* pParaPortion, EditLine& 
rLine, TextPortion const * pPortion, sal_Int32 nPortionStart, tools::Long 
nRemainingWidth, bool bCanHyphenate );
-    void                ImpAdjustBlocks( ParaPortion* pParaPortion, EditLine& 
rLine, tools::Long nRemainingSpace );
+    void                ImpBreakLine(ParaPortion& rParaPortion, EditLine& 
rLine, TextPortion const * pPortion, sal_Int32 nPortionStart, tools::Long 
nRemainingWidth, bool bCanHyphenate);
+    void                ImpAdjustBlocks(ParaPortion& rParaPortion, EditLine& 
rLine, tools::Long nRemainingSpace );
     EditPaM             ImpConnectParagraphs( ContentNode* pLeft, ContentNode* 
pRight, bool bBackward = false );
     EditPaM             ImpDeleteSelection(const EditSelection& rCurSel);
     EditPaM             ImpInsertParaBreak( EditPaM& rPaM, bool 
bKeepEndingAttribs = true );
@@ -744,7 +743,7 @@ private:
 
     bool                ImplCalcAsianCompression( ContentNode* pNode, 
TextPortion* pTextPortion, sal_Int32 nStartPos,
                                                 sal_Int32* pDXArray, 
sal_uInt16 n100thPercentFromMax, bool bManipulateDXArray );
-    void                ImplExpandCompressedPortions(EditLine& rLine, 
ParaPortion* pParaPortion, tools::Long nRemainingWidth);
+    void                ImplExpandCompressedPortions(EditLine& rLine, 
ParaPortion& rParaPortion, tools::Long nRemainingWidth);
 
     void                ImplInitLayoutMode(OutputDevice& rOutDev, sal_Int32 
nPara, sal_Int32 nIndex);
     static LanguageType ImplCalcDigitLang(LanguageType eCurLang);
@@ -1025,7 +1024,7 @@ public:
     sal_uInt32      GetTextHeightNTP() const;
     sal_uInt32      CalcTextWidth( bool bIgnoreExtraSpace);
     sal_uInt32      CalcParaWidth( sal_Int32 nParagraph, bool 
bIgnoreExtraSpace );
-    sal_uInt32      CalcLineWidth( ParaPortion* pPortion, EditLine const& 
rLine, bool bIgnoreExtraSpace);
+    sal_uInt32      CalcLineWidth(ParaPortion const& rPortion, EditLine const& 
rLine, bool bIgnoreExtraSpace);
     sal_Int32       GetLineCount( sal_Int32 nParagraph ) const;
     sal_Int32       GetLineLen( sal_Int32 nParagraph, sal_Int32 nLine ) const;
     void            GetLineBoundaries( /*out*/sal_Int32& rStart, 
/*out*/sal_Int32& rEnd, sal_Int32 nParagraph, sal_Int32 nLine ) const;
@@ -1052,7 +1051,7 @@ public:
     }
 
     tools::Rectangle       PaMtoEditCursor( EditPaM aPaM, GetCursorFlags 
nFlags = GetCursorFlags::NONE );
-    tools::Rectangle GetEditCursor(const ParaPortion* pPortion, EditLine 
const& rLine, sal_Int32 nIndex, GetCursorFlags nFlags);
+    tools::Rectangle GetEditCursor(ParaPortion const& rPortion, EditLine 
const& rLine, sal_Int32 nIndex, GetCursorFlags nFlags);
 
     bool            IsModified() const { return maEditDoc.IsModified(); }
     void            SetModifyFlag(bool b) { maEditDoc.SetModified( b ); }
diff --git a/editeng/source/editeng/impedit2.cxx 
b/editeng/source/editeng/impedit2.cxx
index 065b28e69f18..ccb485789c74 100644
--- a/editeng/source/editeng/impedit2.cxx
+++ b/editeng/source/editeng/impedit2.cxx
@@ -578,7 +578,7 @@ bool ImpEditEngine::Command( const CommandEvent& rCEvt, 
EditView* pView )
                         {
                             if (rInfo.pLine->IsIn(n))
                             {
-                                tools::Rectangle aR = 
GetEditCursor(pParaPortion, *rInfo.pLine, n, GetCursorFlags::NONE);
+                                tools::Rectangle aR = 
GetEditCursor(*pParaPortion, *rInfo.pLine, n, GetCursorFlags::NONE);
                                 aR.Move(getTopLeftDocOffset(rInfo.aArea));
                                 aRects[n - nMinPos] = 
pView->GetImpEditView()->GetWindowPos(aR);
                             }
@@ -790,7 +790,7 @@ void ImpEditEngine::ParaAttribsChanged( ContentNode const * 
pNode, bool bIgnoreU
     ParaPortion* pNextPortion = GetParaPortions().SafeGetObject( nPara+1 );
     // => is formatted again anyway, if Invalid.
     if ( pNextPortion && !pNextPortion->IsInvalid() )
-        CalcHeight( pNextPortion );
+        CalcHeight(*pNextPortion);
 }
 
 
@@ -1274,7 +1274,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, 
EditView const * pView )
     tools::Long nX;
     if ( pView->pImpEditView->nTravelXPos == TRAVEL_X_DONTKNOW )
     {
-        nX = GetXPos(pPPortion, rLine, rPaM.GetIndex());
+        nX = GetXPos(*pPPortion, rLine, rPaM.GetIndex());
         pView->pImpEditView->nTravelXPos = nX + mnOnePixelInRef;
     }
     else
@@ -1284,7 +1284,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, 
EditView const * pView )
     if ( nLine )    // same paragraph
     {
         const EditLine& rPrevLine = pPPortion->GetLines()[nLine-1];
-        aNewPaM.SetIndex(GetChar(pPPortion, rPrevLine, nX));
+        aNewPaM.SetIndex(GetChar(*pPPortion, rPrevLine, nX));
         // If a previous automatically wrapped line, and one has to be exactly
         // at the end of this line, the cursor lands on the current line at the
         // beginning. See Problem: Last character of an automatically wrapped
@@ -1299,7 +1299,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, 
EditView const * pView )
         {
             const EditLine& rLine2 = 
pPrevPortion->GetLines()[pPrevPortion->GetLines().Count()-1];
             aNewPaM.SetNode( pPrevPortion->GetNode() );
-            aNewPaM.SetIndex(GetChar(pPrevPortion, rLine2, nX + 
mnOnePixelInRef));
+            aNewPaM.SetIndex(GetChar(*pPrevPortion, rLine2, nX + 
mnOnePixelInRef));
         }
     }
 
@@ -1318,7 +1318,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, 
EditView const * pView )
     if ( pView->pImpEditView->nTravelXPos == TRAVEL_X_DONTKNOW )
     {
         const EditLine& rLine = pPPortion->GetLines()[nLine];
-        nX = GetXPos(pPPortion, rLine, rPaM.GetIndex());
+        nX = GetXPos(*pPPortion, rLine, rPaM.GetIndex());
         pView->pImpEditView->nTravelXPos = nX + mnOnePixelInRef;
     }
     else
@@ -1328,7 +1328,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, 
EditView const * pView )
     if ( nLine < pPPortion->GetLines().Count()-1 )
     {
         const EditLine& rNextLine = pPPortion->GetLines()[nLine+1];
-        aNewPaM.SetIndex(GetChar(pPPortion, rNextLine, nX));
+        aNewPaM.SetIndex(GetChar(*pPPortion, rNextLine, nX));
         // Special treatment, see CursorUp ...
         if ( ( aNewPaM.GetIndex() == rNextLine.GetEnd() ) && ( 
aNewPaM.GetIndex() > rNextLine.GetStart() ) && ( aNewPaM.GetIndex() < 
pPPortion->GetNode()->Len() ) )
             aNewPaM = CursorLeft( aNewPaM );
@@ -1342,7 +1342,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, 
EditView const * pView )
             aNewPaM.SetNode( pNextPortion->GetNode() );
             // Never at the very end when several lines, because then a line
             // below the cursor appears.
-            aNewPaM.SetIndex(GetChar(pNextPortion, rLine, nX + 
mnOnePixelInRef));
+            aNewPaM.SetIndex(GetChar(*pNextPortion, rLine, nX + 
mnOnePixelInRef));
             if ( ( aNewPaM.GetIndex() == rLine.GetEnd() ) && ( 
aNewPaM.GetIndex() > rLine.GetStart() ) && ( pNextPortion->GetLines().Count() > 
1 ) )
                 aNewPaM = CursorLeft( aNewPaM );
         }
@@ -2247,14 +2247,14 @@ EditSelection ImpEditEngine::ImpMoveParagraphs( Range 
aOldPositions, sal_Int32 n
 
     maEditDoc.SetModified( true );
 
-    if ( pRecalc1 )
-        CalcHeight( pRecalc1 );
-    if ( pRecalc2 )
-        CalcHeight( pRecalc2 );
-    if ( pRecalc3 )
-        CalcHeight( pRecalc3 );
-    if ( pRecalc4 )
-        CalcHeight( pRecalc4 );
+    if (pRecalc1)
+        CalcHeight(*pRecalc1);
+    if (pRecalc2)
+        CalcHeight(*pRecalc2);
+    if (pRecalc3)
+        CalcHeight(*pRecalc3);
+    if (pRecalc4)
+        CalcHeight(*pRecalc4);
 
 #if OSL_DEBUG_LEVEL > 0 && !defined NDEBUG
     ParaPortionList::DbgCheck(GetParaPortions(), maEditDoc);
@@ -3120,29 +3120,28 @@ EditPaM ImpEditEngine::InsertLineBreak(const 
EditSelection& aCurSel)
 
 //  Helper functions
 
-tools::Rectangle ImpEditEngine::GetEditCursor(const ParaPortion* pPortion, 
EditLine const& rLine,
+tools::Rectangle ImpEditEngine::GetEditCursor(ParaPortion const& rPortion, 
EditLine const& rLine,
                                               sal_Int32 nIndex, GetCursorFlags 
nFlags)
 {
-    assert(pPortion);
     // nIndex might be not in the line
     // Search within the line...
     tools::Long nX;
 
     if ((nIndex == rLine.GetStart()) && (nFlags & GetCursorFlags::StartOfLine))
     {
-        Range aXRange = GetLineXPosStartEnd(pPortion, rLine);
-        nX = !IsRightToLeft(GetEditDoc().GetPos(pPortion->GetNode())) ? 
aXRange.Min()
+        Range aXRange = GetLineXPosStartEnd(rPortion, rLine);
+        nX = !IsRightToLeft(GetEditDoc().GetPos(rPortion.GetNode())) ? 
aXRange.Min()
                                                                       : 
aXRange.Max();
     }
     else if ((nIndex == rLine.GetEnd()) && (nFlags & 
GetCursorFlags::EndOfLine))
     {
-        Range aXRange = GetLineXPosStartEnd(pPortion, rLine);
-        nX = !IsRightToLeft(GetEditDoc().GetPos(pPortion->GetNode())) ? 
aXRange.Max()
+        Range aXRange = GetLineXPosStartEnd(rPortion, rLine);
+        nX = !IsRightToLeft(GetEditDoc().GetPos(rPortion.GetNode())) ? 
aXRange.Max()
                                                                       : 
aXRange.Min();
     }
     else
     {
-        nX = GetXPos(pPortion, rLine, nIndex, bool(nFlags & 
GetCursorFlags::PreferPortionStart));
+        nX = GetXPos(rPortion, rLine, nIndex, bool(nFlags & 
GetCursorFlags::PreferPortionStart));
     }
 
     tools::Rectangle aEditCursor;
@@ -3189,9 +3188,9 @@ tools::Rectangle ImpEditEngine::PaMtoEditCursor( EditPaM 
aPaM, GetCursorFlags nF
     };
     IterateLineAreas(FindPortionLineAndArea, IterFlag::none);
 
-    if (pLastLine)
+    if (pLastLine && pPortion)
     {
-        aEditCursor = GetEditCursor(pPortion, *pLastLine, nIndex, nFlags);
+        aEditCursor = GetEditCursor(*pPortion, *pLastLine, nIndex, nFlags);
         aEditCursor.Move(getTopLeftDocOffset(aLineArea));
     }
     else
@@ -3334,7 +3333,8 @@ EditPaM ImpEditEngine::GetPaM( Point aDocPos, bool bSmart 
)
     if (const auto& [pPortion, pLine, nLineStartX] = 
GetPortionAndLine(aDocPos); pPortion)
     {
         assert(pLine);
-        sal_Int32 nCurIndex = GetChar(pPortion, *pLine, aDocPos.X() - 
nLineStartX, bSmart);
+        assert(pPortion);
+        sal_Int32 nCurIndex = GetChar(*pPortion, *pLine, aDocPos.X() - 
nLineStartX, bSmart);
         EditPaM aPaM(pPortion->GetNode(), nCurIndex);
 
         if (nCurIndex && (nCurIndex == pLine->GetEnd())
@@ -3353,7 +3353,8 @@ bool ImpEditEngine::IsTextPos(const Point& rDocPos, 
sal_uInt16 nBorder)
     if (const auto& [pPortion, pLine, nLineStartX] = 
GetPortionAndLine(rDocPos); pPortion)
     {
         assert(pLine);
-        Range aLineXPosStartEnd = GetLineXPosStartEnd(pPortion, *pLine);
+        assert(pPortion);
+        Range aLineXPosStartEnd = GetLineXPosStartEnd(*pPortion, *pLine);
         if ((rDocPos.X() >= nLineStartX + aLineXPosStartEnd.Min() - nBorder)
             && (rDocPos.X() <= nLineStartX + aLineXPosStartEnd.Max() + 
nBorder))
             return true;
@@ -3431,7 +3432,7 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, 
bool bIgnoreExtraSpace
                 }
             }
             nCurWidth += scaleXSpacingValue(rLRItem.GetRight());
-            nCurWidth += CalcLineWidth(pPortion, rLine, bIgnoreExtraSpace);
+            nCurWidth += CalcLineWidth(*pPortion, rLine, bIgnoreExtraSpace);
             if ( nCurWidth > nMaxWidth )
             {
                 nMaxWidth = nCurWidth;
@@ -3443,9 +3444,9 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, 
bool bIgnoreExtraSpace
     return static_cast<sal_uInt32>(nMaxWidth);
 }
 
-sal_uInt32 ImpEditEngine::CalcLineWidth(ParaPortion* pPortion, EditLine const& 
rLine, bool bIgnoreExtraSpace)
+sal_uInt32 ImpEditEngine::CalcLineWidth(ParaPortion const& rPortion, EditLine 
const& rLine, bool bIgnoreExtraSpace)
 {
-    sal_Int32 nPara = GetEditDoc().GetPos( pPortion->GetNode() );
+    sal_Int32 nPara = GetEditDoc().GetPos(rPortion.GetNode());
 
     // #114278# Saving both layout mode and language (since I'm
     // potentially changing both)
@@ -3460,7 +3461,7 @@ sal_uInt32 ImpEditEngine::CalcLineWidth(ParaPortion* 
pPortion, EditLine const& r
     sal_Int32 nPos = rLine.GetStart();
     for ( sal_Int32 nTP = rLine.GetStartPortion(); nTP <= 
rLine.GetEndPortion(); nTP++ )
     {
-        const TextPortion& rTextPortion = pPortion->GetTextPortions()[nTP];
+        const TextPortion& rTextPortion = rPortion.GetTextPortions()[nTP];
         switch ( rTextPortion.GetKind() )
         {
             case PortionKind::FIELD:
@@ -3478,12 +3479,12 @@ sal_uInt32 ImpEditEngine::CalcLineWidth(ParaPortion* 
pPortion, EditLine const& r
                 }
                 else
                 {
-                    SvxFont aTmpFont( 
pPortion->GetNode()->GetCharAttribs().GetDefFont() );
-                    SeekCursor( pPortion->GetNode(), nPos+1, aTmpFont );
+                    SvxFont 
aTmpFont(rPortion.GetNode()->GetCharAttribs().GetDefFont());
+                    SeekCursor(rPortion.GetNode(), nPos + 1, aTmpFont);
                     aTmpFont.SetPhysFont(*GetRefDevice());
                     ImplInitDigitMode(*GetRefDevice(), aTmpFont.GetLanguage());
                     nWidth += aTmpFont.QuickGetTextSize( GetRefDevice(),
-                        pPortion->GetNode()->GetString(), nPos, 
rTextPortion.GetLen(), nullptr ).Width();
+                        rPortion.GetNode()->GetString(), nPos, 
rTextPortion.GetLen(), nullptr ).Width();
                 }
             }
             break;
@@ -3997,7 +3998,7 @@ EditSelection ImpEditEngine::PasteText( uno::Reference< 
datatransfer::XTransfera
     return aNewSelection;
 }
 
-sal_Int32 ImpEditEngine::GetChar(const ParaPortion* pParaPortion, EditLine 
const& rLine, tools::Long nXPos, bool bSmart)
+sal_Int32 ImpEditEngine::GetChar(ParaPortion const& rParaPortion, EditLine 
const& rLine, tools::Long nXPos, bool bSmart)
 {
     sal_Int32 nChar = -1;
     sal_Int32 nCurIndex = rLine.GetStart();
@@ -4006,8 +4007,8 @@ sal_Int32 ImpEditEngine::GetChar(const ParaPortion* 
pParaPortion, EditLine const
     // Search best matching portion with GetPortionXOffset()
     for ( sal_Int32 i = rLine.GetStartPortion(); i <= rLine.GetEndPortion(); 
i++ )
     {
-        const TextPortion& rPortion = pParaPortion->GetTextPortions()[i];
-        tools::Long nXLeft = GetPortionXOffset( pParaPortion, rLine, i );
+        const TextPortion& rPortion = rParaPortion.GetTextPortions()[i];
+        tools::Long nXLeft = GetPortionXOffset(rParaPortion, rLine, i);
         tools::Long nXRight = nXLeft + rPortion.GetSize().Width();
         if ( ( nXLeft <= nXPos ) && ( nXRight >= nXPos ) )
         {
@@ -4075,9 +4076,9 @@ sal_Int32 ImpEditEngine::GetChar(const ParaPortion* 
pParaPortion, EditLine const
                 nChar = nChar + nOffset;
 
                 // Check if index is within a cell:
-                if ( nChar && ( nChar < pParaPortion->GetNode()->Len() ) )
+                if ( nChar && ( nChar < rParaPortion.GetNode()->Len() ) )
                 {
-                    EditPaM aPaM( pParaPortion->GetNode(), nChar+1 );
+                    EditPaM aPaM( rParaPortion.GetNode(), nChar+1 );
                     sal_uInt16 nScriptType = GetI18NScriptType( aPaM );
                     if ( nScriptType == i18n::ScriptType::COMPLEX )
                     {
@@ -4085,9 +4086,9 @@ sal_Int32 ImpEditEngine::GetChar(const ParaPortion* 
pParaPortion, EditLine const
                         sal_Int32 nCount = 1;
                         lang::Locale aLocale = GetLocale( aPaM );
                         sal_Int32 nRight = _xBI->nextCharacters(
-                            pParaPortion->GetNode()->GetString(), nChar, 
aLocale, css::i18n::CharacterIteratorMode::SKIPCELL, nCount, nCount );
+                            rParaPortion.GetNode()->GetString(), nChar, 
aLocale, css::i18n::CharacterIteratorMode::SKIPCELL, nCount, nCount );
                         sal_Int32 nLeft = _xBI->previousCharacters(
-                            pParaPortion->GetNode()->GetString(), nRight, 
aLocale, css::i18n::CharacterIteratorMode::SKIPCELL, nCount, nCount );
+                            rParaPortion.GetNode()->GetString(), nRight, 
aLocale, css::i18n::CharacterIteratorMode::SKIPCELL, nCount, nCount );
                         if ( ( nLeft != nChar ) && ( nRight != nChar ) )
                         {
                             nChar = ( std::abs( nRight - nChar ) < std::abs( 
nLeft - nChar ) ) ? nRight : nLeft;
@@ -4095,7 +4096,7 @@ sal_Int32 ImpEditEngine::GetChar(const ParaPortion* 
pParaPortion, EditLine const
                     }
                     else
                     {
-                        OUString aStr(pParaPortion->GetNode()->GetString());
+                        OUString aStr(rParaPortion.GetNode()->GetString());
                         // tdf#102625: don't select middle of a pair of 
surrogates with mouse cursor
                         if (rtl::isSurrogate(aStr[nChar]))
                             --nChar;
@@ -4115,11 +4116,11 @@ sal_Int32 ImpEditEngine::GetChar(const ParaPortion* 
pParaPortion, EditLine const
     return nChar;
 }
 
-Range ImpEditEngine::GetLineXPosStartEnd(const ParaPortion* pParaPortion, 
EditLine const& rLine) const
+Range ImpEditEngine::GetLineXPosStartEnd(ParaPortion const& rParaPortion, 
EditLine const& rLine) const
 {
     Range aLineXPosStartEnd;
 
-    sal_Int32 nPara = GetEditDoc().GetPos( pParaPortion->GetNode() );
+    sal_Int32 nPara = GetEditDoc().GetPos(rParaPortion.GetNode());
     if ( !IsRightToLeft( nPara ) )
     {
         aLineXPosStartEnd.Min() = rLine.GetStartPosX();
@@ -4134,13 +4135,13 @@ Range ImpEditEngine::GetLineXPosStartEnd(const 
ParaPortion* pParaPortion, EditLi
     return aLineXPosStartEnd;
 }
 
-tools::Long ImpEditEngine::GetPortionXOffset(const ParaPortion* pParaPortion, 
EditLine const& rLine, sal_Int32 nTextPortion) const
+tools::Long ImpEditEngine::GetPortionXOffset(ParaPortion const& rParaPortion, 
EditLine const& rLine, sal_Int32 nTextPortion) const
 {
     tools::Long nX = rLine.GetStartPosX();
 
     for ( sal_Int32 i = rLine.GetStartPortion(); i < nTextPortion; i++ )
     {
-        const TextPortion& rPortion = pParaPortion->GetTextPortions()[i];
+        const TextPortion& rPortion = rParaPortion.GetTextPortions()[i];
         switch ( rPortion.GetKind() )
         {
             case PortionKind::FIELD:
@@ -4155,10 +4156,10 @@ tools::Long ImpEditEngine::GetPortionXOffset(const 
ParaPortion* pParaPortion, Ed
         }
     }
 
-    sal_Int32 nPara = GetEditDoc().GetPos( pParaPortion->GetNode() );
+    sal_Int32 nPara = GetEditDoc().GetPos(rParaPortion.GetNode());
     bool bR2LPara = IsRightToLeft( nPara );
 
-    const TextPortion& rDestPortion = 
pParaPortion->GetTextPortions()[nTextPortion];
+    const TextPortion& rDestPortion = 
rParaPortion.GetTextPortions()[nTextPortion];
     if ( rDestPortion.GetKind() != PortionKind::TAB )
     {
         if ( !bR2LPara && rDestPortion.GetRightToLeftLevel() )
@@ -4167,7 +4168,7 @@ tools::Long ImpEditEngine::GetPortionXOffset(const 
ParaPortion* pParaPortion, Ed
             sal_Int32 nTmpPortion = nTextPortion+1;
             while ( nTmpPortion <= rLine.GetEndPortion() )
             {
-                const TextPortion& rNextTextPortion = 
pParaPortion->GetTextPortions()[nTmpPortion];
+                const TextPortion& rNextTextPortion = 
rParaPortion.GetTextPortions()[nTmpPortion];
                 if ( rNextTextPortion.GetRightToLeftLevel() && ( 
rNextTextPortion.GetKind() != PortionKind::TAB ) )
                     nX += rNextTextPortion.GetSize().Width();
                 else
@@ -4179,7 +4180,7 @@ tools::Long ImpEditEngine::GetPortionXOffset(const 
ParaPortion* pParaPortion, Ed
             while ( nTmpPortion > rLine.GetStartPortion() )
             {
                 --nTmpPortion;
-                const TextPortion& rPrevTextPortion = 
pParaPortion->GetTextPortions()[nTmpPortion];
+                const TextPortion& rPrevTextPortion = 
rParaPortion.GetTextPortions()[nTmpPortion];
                 if ( rPrevTextPortion.GetRightToLeftLevel() && ( 
rPrevTextPortion.GetKind() != PortionKind::TAB ) )
                     nX -= rPrevTextPortion.GetSize().Width();
                 else
@@ -4192,7 +4193,7 @@ tools::Long ImpEditEngine::GetPortionXOffset(const 
ParaPortion* pParaPortion, Ed
             sal_Int32 nTmpPortion = nTextPortion+1;
             while ( nTmpPortion <= rLine.GetEndPortion() )
             {
-                const TextPortion& rNextTextPortion = 
pParaPortion->GetTextPortions()[nTmpPortion];
+                const TextPortion& rNextTextPortion = 
rParaPortion.GetTextPortions()[nTmpPortion];
                 if ( !rNextTextPortion.IsRightToLeft() && ( 
rNextTextPortion.GetKind() != PortionKind::TAB ) )
                     nX += rNextTextPortion.GetSize().Width();
                 else
@@ -4204,7 +4205,7 @@ tools::Long ImpEditEngine::GetPortionXOffset(const 
ParaPortion* pParaPortion, Ed
             while ( nTmpPortion > rLine.GetStartPortion() )
             {
                 --nTmpPortion;
-                const TextPortion& rPrevTextPortion = 
pParaPortion->GetTextPortions()[nTmpPortion];
+                const TextPortion& rPrevTextPortion = 
rParaPortion.GetTextPortions()[nTmpPortion];
                 if ( !rPrevTextPortion.IsRightToLeft() && ( 
rPrevTextPortion.GetKind() != PortionKind::TAB ) )
                     nX -= rPrevTextPortion.GetSize().Width();
                 else
@@ -4224,8 +4225,7 @@ tools::Long ImpEditEngine::GetPortionXOffset(const 
ParaPortion* pParaPortion, Ed
     return nX;
 }
 
-tools::Long ImpEditEngine::GetXPos(
-    const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 nIndex, 
bool bPreferPortionStart) const
+tools::Long ImpEditEngine::GetXPos(ParaPortion const& rParaPortion, EditLine 
const& rLine, sal_Int32 nIndex, bool bPreferPortionStart) const
 {
     OSL_ENSURE( ( nIndex >= rLine.GetStart() ) && ( nIndex <= rLine.GetEnd() ) 
, "GetXPos has to be called properly!" );
 
@@ -4237,13 +4237,13 @@ tools::Long ImpEditEngine::GetXPos(
         bDoPreferPortionStart = false;
 
     sal_Int32 nTextPortionStart = 0;
-    sal_Int32 nTextPortion = pParaPortion->GetTextPortions().FindPortion( 
nIndex, nTextPortionStart, bDoPreferPortionStart );
+    sal_Int32 nTextPortion = rParaPortion.GetTextPortions().FindPortion( 
nIndex, nTextPortionStart, bDoPreferPortionStart );
 
     OSL_ENSURE( ( nTextPortion >= rLine.GetStartPortion() ) && ( nTextPortion 
<= rLine.GetEndPortion() ), "GetXPos: Portion not in current line! " );
 
-    const TextPortion& rPortion = 
pParaPortion->GetTextPortions()[nTextPortion];
+    const TextPortion& rPortion = rParaPortion.GetTextPortions()[nTextPortion];
 
-    tools::Long nX = GetPortionXOffset( pParaPortion, rLine, nTextPortion );
+    tools::Long nX = GetPortionXOffset(rParaPortion, rLine, nTextPortion);
 
     // calc text width, portion size may include CJK/CTL spacing...
     // But the array might not be init yet, if using text ranger this method 
is called within CreateLines()...
@@ -4259,18 +4259,18 @@ tools::Long ImpEditEngine::GetXPos(
             // End of Portion
             if ( rPortion.GetKind() == PortionKind::TAB )
             {
-                if ( nTextPortion+1 < pParaPortion->GetTextPortions().Count() )
+                if ( nTextPortion+1 < rParaPortion.GetTextPortions().Count() )
                 {
-                    const TextPortion& rNextPortion = 
pParaPortion->GetTextPortions()[nTextPortion+1];
+                    const TextPortion& rNextPortion = 
rParaPortion.GetTextPortions()[nTextPortion+1];
                     if ( rNextPortion.GetKind() != PortionKind::TAB )
                     {
                         if ( !bPreferPortionStart )
-                            nX = GetXPos( pParaPortion, rLine, nIndex, true );
-                        else if ( !IsRightToLeft( GetEditDoc().GetPos( 
pParaPortion->GetNode() ) ) )
+                            nX = GetXPos(rParaPortion, rLine, nIndex, true );
+                        else if ( !IsRightToLeft( 
GetEditDoc().GetPos(rParaPortion.GetNode()) ) )
                             nX += nPortionTextWidth;
                     }
                 }
-                else if ( !IsRightToLeft( GetEditDoc().GetPos( 
pParaPortion->GetNode() ) ) )
+                else if ( !IsRightToLeft( 
GetEditDoc().GetPos(rParaPortion.GetNode()) ) )
                 {
                     nX += nPortionTextWidth;
                 }
@@ -4311,7 +4311,7 @@ tools::Long ImpEditEngine::GetXPos(
                     nX += rPortion.GetExtraInfos()->nPortionOffsetX;
                     if ( rPortion.GetExtraInfos()->nAsianCompressionTypes & 
AsianCompressionFlags::PunctuationRight )
                     {
-                        AsianCompressionFlags nType = 
GetCharTypeForCompression( pParaPortion->GetNode()->GetChar( nIndex ) );
+                        AsianCompressionFlags nType = 
GetCharTypeForCompression(rParaPortion.GetNode()->GetChar(nIndex));
                         if ( nType == AsianCompressionFlags::PunctuationRight 
&& !rLine.GetCharPosArray().empty() )
                         {
                             sal_Int32 n = nIndex - nTextPortionStart;
@@ -4321,7 +4321,7 @@ tools::Long ImpEditEngine::GetXPos(
                             if ( (n+1) < rPortion.GetLen() )
                             {
                                 // smaller, when char behind is 
AsianCompressionFlags::PunctuationRight also
-                                nType = GetCharTypeForCompression( 
pParaPortion->GetNode()->GetChar( nIndex+1 ) );
+                                nType = 
GetCharTypeForCompression(rParaPortion.GetNode()->GetChar(nIndex + 1));
                                 if ( nType == 
AsianCompressionFlags::PunctuationRight )
                                 {
                                     sal_Int32 nNextCharWidth = ( ( (n+2) < 
rPortion.GetLen() ) ? pDXArray[n+1] : rPortion.GetSize().Width() )
@@ -4354,44 +4354,44 @@ tools::Long ImpEditEngine::GetXPos(
     return nX;
 }
 
-void ImpEditEngine::CalcHeight( ParaPortion* pPortion )
+void ImpEditEngine::CalcHeight(ParaPortion& rPortion)
 {
-    pPortion->nHeight = 0;
-    pPortion->nFirstLineOffset = 0;
+    rPortion.nHeight = 0;
+    rPortion.nFirstLineOffset = 0;
 
-    if ( !pPortion->IsVisible() )
+    if (!rPortion.IsVisible())
         return;
 
-    OSL_ENSURE( pPortion->GetLines().Count(), "Paragraph with no lines in 
ParaPortion::CalcHeight" );
-    for (sal_Int32 nLine = 0; nLine < pPortion->GetLines().Count(); ++nLine)
-        pPortion->nHeight += pPortion->GetLines()[nLine].GetHeight();
+    OSL_ENSURE(rPortion.GetLines().Count(), "Paragraph with no lines in 
ParaPortion::CalcHeight");
+    for (sal_Int32 nLine = 0; nLine < rPortion.GetLines().Count(); ++nLine)
+        rPortion.nHeight += rPortion.GetLines()[nLine].GetHeight();
 
     if (maStatus.IsOutliner())
         return;
 
-    const SvxULSpaceItem& rULItem = 
pPortion->GetNode()->GetContentAttribs().GetItem( EE_PARA_ULSPACE );
-    const SvxLineSpacingItem& rLSItem = 
pPortion->GetNode()->GetContentAttribs().GetItem( EE_PARA_SBL );
+    const SvxULSpaceItem& rULItem = 
rPortion.GetNode()->GetContentAttribs().GetItem( EE_PARA_ULSPACE );
+    const SvxLineSpacingItem& rLSItem = 
rPortion.GetNode()->GetContentAttribs().GetItem( EE_PARA_SBL );
     sal_Int32 nSBL = ( rLSItem.GetInterLineSpaceRule() == 
SvxInterLineSpaceRule::Fix ) ? scaleYSpacingValue(rLSItem.GetInterLineSpace()) 
: 0;
 
     if ( nSBL )
     {
-        if ( pPortion->GetLines().Count() > 1 )
-            pPortion->nHeight += ( pPortion->GetLines().Count() - 1 ) * nSBL;
+        if (rPortion.GetLines().Count() > 1)
+            rPortion.nHeight += (rPortion.GetLines().Count() - 1) * nSBL;
         if (maStatus.ULSpaceSummation())
-            pPortion->nHeight += nSBL;
+            rPortion.nHeight += nSBL;
     }
 
-    sal_Int32 nPortion = GetParaPortions().GetPos( pPortion );
+    sal_Int32 nPortion = GetParaPortions().GetPos(&rPortion);
     if ( nPortion )
     {
         sal_uInt16 nUpper = scaleYSpacingValue(rULItem.GetUpper());
-        pPortion->nHeight += nUpper;
-        pPortion->nFirstLineOffset = nUpper;
+        rPortion.nHeight += nUpper;
+        rPortion.nFirstLineOffset = nUpper;
     }
 
     if ( nPortion != (GetParaPortions().Count()-1) )
     {
-        pPortion->nHeight += scaleYSpacingValue(rULItem.GetLower());   // not 
in the last
+        rPortion.nHeight += scaleYSpacingValue(rULItem.GetLower());   // not 
in the last
     }
 
 
@@ -4412,29 +4412,28 @@ void ImpEditEngine::CalcHeight( ParaPortion* pPortion )
 
     // check if distance by LineSpacing > Upper:
     sal_uInt16 nExtraSpace = scaleYSpacingValue(lcl_CalcExtraSpace(rLSItem));
-    if ( nExtraSpace > pPortion->nFirstLineOffset )
+    if (nExtraSpace > rPortion.nFirstLineOffset)
     {
         // Paragraph becomes 'bigger':
-        pPortion->nHeight += ( nExtraSpace - pPortion->nFirstLineOffset );
-        pPortion->nFirstLineOffset = nExtraSpace;
+        rPortion.nHeight += (nExtraSpace - rPortion.nFirstLineOffset);
+        rPortion.nFirstLineOffset = nExtraSpace;
     }
 
     // Determine nFirstLineOffset now f(pNode) => now f(pNode, pPrev):
     sal_uInt16 nPrevLower = scaleYSpacingValue(rPrevULItem.GetLower());
 
     // This PrevLower is still in the height of PrevPortion ...
-    if ( nPrevLower > pPortion->nFirstLineOffset )
+    if (nPrevLower > rPortion.nFirstLineOffset)
     {
         // Paragraph is 'small':
-        pPortion->nHeight -= pPortion->nFirstLineOffset;
-        pPortion->nFirstLineOffset = 0;
+        rPortion.nHeight -= rPortion.nFirstLineOffset;
+        rPortion.nFirstLineOffset = 0;
     }
     else if ( nPrevLower )
     {
         // Paragraph becomes 'somewhat smaller':
-        pPortion->nHeight -= nPrevLower;
-        pPortion->nFirstLineOffset =
-            pPortion->nFirstLineOffset - nPrevLower;
+        rPortion.nHeight -= nPrevLower;
+        rPortion.nFirstLineOffset = rPortion.nFirstLineOffset - nPrevLower;
     }
     // I find it not so good, but Writer3 feature:
     // Check if distance by LineSpacing > Lower: this value is not
@@ -4447,10 +4446,10 @@ void ImpEditEngine::CalcHeight( ParaPortion* pPortion )
     {
         sal_uInt16 nMoreLower = nExtraSpace - nPrevLower;
         // Paragraph becomes 'bigger', 'grows' downwards:
-        if ( nMoreLower > pPortion->nFirstLineOffset )
+        if ( nMoreLower > rPortion.nFirstLineOffset )
         {
-            pPortion->nHeight += ( nMoreLower - pPortion->nFirstLineOffset );
-            pPortion->nFirstLineOffset = nMoreLower;
+            rPortion.nHeight += (nMoreLower - rPortion.nFirstLineOffset);
+            rPortion.nFirstLineOffset = nMoreLower;
         }
     }
 }
diff --git a/editeng/source/editeng/impedit3.cxx 
b/editeng/source/editeng/impedit3.cxx
index d9a20723826e..43bc6d34f4ef 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -643,8 +643,8 @@ bool 
ImpEditEngine::createLinesForEmptyParagraph(ParaPortion& rParaPortion)
     if (rParaPortion.GetLines().Count())
         rParaPortion.GetLines().Reset();
 
-    CreateAndInsertEmptyLine(&rParaPortion);
-    return FinishCreateLines(&rParaPortion);
+    CreateAndInsertEmptyLine(rParaPortion);
+    return FinishCreateLines(rParaPortion);
 }
 
 tools::Long ImpEditEngine::calculateMaxLineWidth(tools::Long nStartX, 
SvxLRSpaceItem const& rLRItem)
@@ -770,11 +770,11 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, 
sal_uInt32 nStartPosY )
     else if ( bQuickFormat )
     {
         // faster Method:
-        RecalcTextPortion( pParaPortion, nInvalidStart, nInvalidDiff );
+        RecalcTextPortion(*pParaPortion, nInvalidStart, nInvalidDiff);
     }
     else    // nRealInvalidStart can be before InvalidStart, since Portions 
were deleted...
     {
-        CreateTextPortions( pParaPortion, nRealInvalidStart );
+        CreateTextPortions(*pParaPortion, nRealInvalidStart);
     }
 
     // Search for line with InvalidPos, start one line before
@@ -877,7 +877,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, 
sal_uInt32 nStartPosY )
         {
             GetTextRanger()->SetVertical( IsEffectivelyVertical() );
 
-            tools::Long nTextY = nStartPosY + GetEditCursor(pParaPortion, 
*pLine, pLine->GetStart(), GetCursorFlags::NONE).Top();
+            tools::Long nTextY = nStartPosY + GetEditCursor(*pParaPortion, 
*pLine, pLine->GetStart(), GetCursorFlags::NONE).Top();
             if ( !bSameLineAgain )
             {
                 SeekCursor( pNode, nTmpPos+1, aTmpFont );
@@ -1344,7 +1344,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, 
sal_uInt32 nStartPosY )
             {
                 DBG_ASSERT( pPortion->GetKind() == PortionKind::TEXT, "Len>1, 
but no TextPortion?" );
                 nTmpWidth -= pPortion->GetSize().Width();
-                sal_Int32 nP = SplitTextPortion( pParaPortion, nTmpPos, pLine 
);
+                sal_Int32 nP = SplitTextPortion(*pParaPortion, nTmpPos, pLine);
                 nTmpWidth += 
pParaPortion->GetTextPortions()[nP].GetSize().Width();
             }
         }
@@ -1419,8 +1419,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, 
sal_uInt32 nStartPosY )
                     pNode, pPortion, nPortionStart, pDXArray, 10000, true);
             }
             if( pPortion )
-                ImpBreakLine( pParaPortion, *pLine, pPortion, nPortionStart,
-                                                nRemainingWidth, bCanHyphenate 
&& bHyphenatePara );
+                ImpBreakLine(*pParaPortion, *pLine, pPortion, nPortionStart, 
nRemainingWidth, bCanHyphenate && bHyphenatePara);
         }
 
 
@@ -1566,7 +1565,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, 
sal_uInt32 nStartPosY )
             tools::Long nRemainingWidth = nMaxLineWidth - aTextSize.Width();
             if ( nRemainingWidth > 0 )
             {
-                ImplExpandCompressedPortions(*pLine, pParaPortion, 
nRemainingWidth);
+                ImplExpandCompressedPortions(*pLine, *pParaPortion, 
nRemainingWidth);
                 aTextSize = pLine->CalcTextSize( *pParaPortion );
             }
         }
@@ -1611,7 +1610,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, 
sal_uInt32 nStartPosY )
                 tools::Long nRemainingSpace = nMaxLineWidth - 
aTextSize.Width();
                 pLine->SetStartPosX( nStartX );
                 if ( nRemainingSpace > 0 && (!bEOC || bDistLastLine) )
-                    ImpAdjustBlocks(pParaPortion, *pLine, nRemainingSpace);
+                    ImpAdjustBlocks(*pParaPortion, *pLine, nRemainingSpace);
             }
             break;
             default:
@@ -1755,9 +1754,9 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, 
sal_uInt32 nStartPosY )
     DBG_ASSERT( pParaPortion->GetLines().Count(), "No line after CreateLines!" 
);
 
     if ( bLineBreak )
-        CreateAndInsertEmptyLine( pParaPortion );
+        CreateAndInsertEmptyLine(*pParaPortion);
 
-    bool bHeightChanged = FinishCreateLines( pParaPortion );
+    bool bHeightChanged = FinishCreateLines(*pParaPortion);
 
     if ( bMapChanged )
         GetRefDevice()->Pop();
@@ -1767,20 +1766,20 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, 
sal_uInt32 nStartPosY )
     return bHeightChanged;
 }
 
-void ImpEditEngine::CreateAndInsertEmptyLine( ParaPortion* pParaPortion )
+void ImpEditEngine::CreateAndInsertEmptyLine(ParaPortion& rParaPortion)
 {
     DBG_ASSERT( !GetTextRanger(), "Don't use CreateAndInsertEmptyLine with a 
polygon!" );
 
     EditLine* pTmpLine = new EditLine;
-    pTmpLine->SetStart( pParaPortion->GetNode()->Len() );
-    pTmpLine->SetEnd( pParaPortion->GetNode()->Len() );
-    pParaPortion->GetLines().Append(std::unique_ptr<EditLine>(pTmpLine));
+    pTmpLine->SetStart(rParaPortion.GetNode()->Len());
+    pTmpLine->SetEnd(rParaPortion.GetNode()->Len());
+    rParaPortion.GetLines().Append(std::unique_ptr<EditLine>(pTmpLine));
 
-    bool bLineBreak = pParaPortion->GetNode()->Len() > 0;
+    bool bLineBreak = rParaPortion.GetNode()->Len() > 0;
     sal_Int32 nSpaceBefore = 0;
-    sal_Int32 nSpaceBeforeAndMinLabelWidth = GetSpaceBeforeAndMinLabelWidth( 
pParaPortion->GetNode(), &nSpaceBefore );
-    const SvxLRSpaceItem& rLRItem = GetLRSpaceItem( pParaPortion->GetNode() );
-    const SvxLineSpacingItem& rLSItem = 
pParaPortion->GetNode()->GetContentAttribs().GetItem( EE_PARA_SBL );
+    sal_Int32 nSpaceBeforeAndMinLabelWidth = 
GetSpaceBeforeAndMinLabelWidth(rParaPortion.GetNode(), &nSpaceBefore);
+    const SvxLRSpaceItem& rLRItem = GetLRSpaceItem(rParaPortion.GetNode());
+    const SvxLineSpacingItem& rLSItem = 
rParaPortion.GetNode()->GetContentAttribs().GetItem( EE_PARA_SBL );
     tools::Long nStartX = scaleXSpacingValue(rLRItem.GetTextLeft() + 
rLRItem.GetTextFirstLineOffset() + nSpaceBefore);
 
     tools::Rectangle aBulletArea { Point(), Point() };
@@ -1790,28 +1789,28 @@ void ImpEditEngine::CreateAndInsertEmptyLine( 
ParaPortion* pParaPortion )
     }
     else
     {
-        aBulletArea = GetEditEnginePtr()->GetBulletArea( 
GetParaPortions().GetPos( pParaPortion ) );
+        aBulletArea = GetEditEnginePtr()->GetBulletArea( 
GetParaPortions().GetPos(&rParaPortion));
         if ( !aBulletArea.IsEmpty() && aBulletArea.Right() > 0 )
-            
pParaPortion->SetBulletX(sal_Int32(scaleXSpacingValue(aBulletArea.Right())));
+            
rParaPortion.SetBulletX(sal_Int32(scaleXSpacingValue(aBulletArea.Right())));
         else
-            pParaPortion->SetBulletX( 0 ); // If Bullet set incorrectly.
-        if ( pParaPortion->GetBulletX() > nStartX )
+            rParaPortion.SetBulletX( 0 ); // If Bullet set incorrectly.
+        if (rParaPortion.GetBulletX() > nStartX)
         {
             nStartX = scaleXSpacingValue(rLRItem.GetTextLeft() + 
rLRItem.GetTextFirstLineOffset() + nSpaceBeforeAndMinLabelWidth);
-            if ( pParaPortion->GetBulletX() > nStartX )
-                nStartX = pParaPortion->GetBulletX();
+            if (rParaPortion.GetBulletX() > nStartX)
+                nStartX = rParaPortion.GetBulletX();
         }
     }
 
     SvxFont aTmpFont;
-    SeekCursor( pParaPortion->GetNode(), bLineBreak ? 
pParaPortion->GetNode()->Len() : 0, aTmpFont );
+    SeekCursor(rParaPortion.GetNode(), bLineBreak ? 
rParaPortion.GetNode()->Len() : 0, aTmpFont );
     aTmpFont.SetPhysFont(*mpRefDev);
 
     TextPortion* pDummyPortion = new TextPortion( 0 );
     pDummyPortion->SetSize(aTmpFont.GetPhysTxtSize(mpRefDev));
     if ( IsFixedCellHeight() )
         pDummyPortion->setHeight( ImplCalculateFontIndependentLineSpacing( 
aTmpFont.GetFontHeight() ) );
-    pParaPortion->GetTextPortions().Append(pDummyPortion);
+    rParaPortion.GetTextPortions().Append(pDummyPortion);
     FormatterFontMetric aFormatterMetrics;
     RecalcFormatterFontMetrics( aFormatterMetrics, aTmpFont );
     pTmpLine->SetMaxAscent( aFormatterMetrics.nMaxAscent );
@@ -1822,7 +1821,7 @@ void ImpEditEngine::CreateAndInsertEmptyLine( 
ParaPortion* pParaPortion )
 
     if (!maStatus.IsOutliner())
     {
-        sal_Int32 nPara = GetParaPortions().GetPos( pParaPortion );
+        sal_Int32 nPara = GetParaPortions().GetPos(&rParaPortion);
         SvxAdjust eJustification = GetJustification( nPara );
         tools::Long nMaxLineWidth = GetColumnWidth(maPaperSize);
         nMaxLineWidth -= scaleXSpacingValue(rLRItem.GetRight());
@@ -1860,7 +1859,7 @@ void ImpEditEngine::CreateAndInsertEmptyLine( 
ParaPortion* pParaPortion )
         }
         else if ( rLSItem.GetInterLineSpaceRule() == 
SvxInterLineSpaceRule::Prop )
         {
-            sal_Int32 nPara = GetParaPortions().GetPos( pParaPortion );
+            sal_Int32 nPara = GetParaPortions().GetPos(&rParaPortion);
             if ( nPara || pTmpLine->GetStartPortion() ) // Not the very first 
line
             {
                 // There are documents with PropLineSpace 0, why?
@@ -1897,30 +1896,30 @@ void ImpEditEngine::CreateAndInsertEmptyLine( 
ParaPortion* pParaPortion )
     {
         // -2: The new one is already inserted.
 #ifdef DBG_UTIL
-        EditLine& rLastLine = 
pParaPortion->GetLines()[pParaPortion->GetLines().Count()-2];
-        DBG_ASSERT( rLastLine.GetEnd() == pParaPortion->GetNode()->Len(), 
"different anyway?" );
+        EditLine& rLastLine = 
rParaPortion.GetLines()[rParaPortion.GetLines().Count()-2];
+        DBG_ASSERT( rLastLine.GetEnd() == rParaPortion.GetNode()->Len(), 
"different anyway?" );
 #endif
-        sal_Int32 nPos = pParaPortion->GetTextPortions().Count() - 1 ;
+        sal_Int32 nPos = rParaPortion.GetTextPortions().Count() - 1 ;
         pTmpLine->SetStartPortion( nPos );
         pTmpLine->SetEndPortion( nPos );
     }
 }
 
-bool ImpEditEngine::FinishCreateLines( ParaPortion* pParaPortion )
+bool ImpEditEngine::FinishCreateLines(ParaPortion& rParaPortion)
 {
 //  CalcCharPositions( pParaPortion );
-    pParaPortion->SetValid();
-    tools::Long nOldHeight = pParaPortion->GetHeight();
-    CalcHeight( pParaPortion );
+    rParaPortion.SetValid();
+    tools::Long nOldHeight = rParaPortion.GetHeight();
+    CalcHeight(rParaPortion);
 
-    DBG_ASSERT( pParaPortion->GetTextPortions().Count(), "FinishCreateLines: 
No Text-Portion?" );
-    bool bRet = ( pParaPortion->GetHeight() != nOldHeight );
+    DBG_ASSERT(rParaPortion.GetTextPortions().Count(), "FinishCreateLines: No 
Text-Portion?");
+    bool bRet = rParaPortion.GetHeight() != nOldHeight;
     return bRet;
 }
 
-void ImpEditEngine::ImpBreakLine( ParaPortion* pParaPortion, EditLine& rLine, 
TextPortion const * pPortion, sal_Int32 nPortionStart, tools::Long 
nRemainingWidth, bool bCanHyphenate )
+void ImpEditEngine::ImpBreakLine(ParaPortion& rParaPortion, EditLine& rLine, 
TextPortion const * pPortion, sal_Int32 nPortionStart, tools::Long 
nRemainingWidth, bool bCanHyphenate)
 {
-    ContentNode* const pNode = pParaPortion->GetNode();
+    ContentNode* const pNode = rParaPortion.GetNode();
 
     sal_Int32 nBreakInLine = nPortionStart - rLine.GetStart();
     sal_Int32 nMax = nBreakInLine + pPortion->GetLen();
@@ -2138,7 +2137,7 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* 
pParaPortion, EditLine& rLine, Te
     // the dickey portion is the end portion
     rLine.SetEnd( nBreakPos );
 
-    sal_Int32 nEndPortion = SplitTextPortion( pParaPortion, nBreakPos, &rLine);
+    sal_Int32 nEndPortion = SplitTextPortion(rParaPortion, nBreakPos, &rLine);
 
     if ( !bCompressBlank && !bHangingPunctuation )
     {
@@ -2152,7 +2151,7 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* 
pParaPortion, EditLine& rLine, Te
 
     if ( bCompressBlank || bHangingPunctuation )
     {
-        TextPortion& rTP = pParaPortion->GetTextPortions()[nEndPortion];
+        TextPortion& rTP = rParaPortion.GetTextPortions()[nEndPortion];
         DBG_ASSERT( rTP.GetKind() == PortionKind::TEXT, "BlankRubber: No 
TextPortion!" );
         DBG_ASSERT( nBreakPos > rLine.GetStart(), "SplitTextPortion at the 
beginning of the line?" );
         sal_Int32 nPosInArray = nBreakPos - 1 - rLine.GetStart();
@@ -2169,7 +2168,7 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* 
pParaPortion, EditLine& rLine, Te
         pHyphPortion->SetKind( PortionKind::HYPHENATOR );
         if ( (cAlternateReplChar || cAlternateExtraChar) && bAltFullRight ) // 
alternation after the break doesn't supported
         {
-            TextPortion& rPrev = pParaPortion->GetTextPortions()[nEndPortion];
+            TextPortion& rPrev = rParaPortion.GetTextPortions()[nEndPortion];
             DBG_ASSERT( rPrev.GetLen(), "Hyphenate: Prev portion?!" );
             rPrev.SetLen( rPrev.GetLen() - nAltDelChar );
             pHyphPortion->SetLen( nAltDelChar );
@@ -2181,27 +2180,25 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* 
pParaPortion, EditLine& rLine, Te
 
         // Determine the width of the Hyph-Portion:
         SvxFont aFont;
-        SeekCursor( pParaPortion->GetNode(), nBreakPos, aFont );
+        SeekCursor(rParaPortion.GetNode(), nBreakPos, aFont);
         aFont.SetPhysFont(*GetRefDevice());
         pHyphPortion->SetSize(Size(GetRefDevice()->GetTextWidth(CH_HYPH), 
GetRefDevice()->GetTextHeight()));
 
-        pParaPortion->GetTextPortions().Insert(++nEndPortion, pHyphPortion);
+        rParaPortion.GetTextPortions().Insert(++nEndPortion, pHyphPortion);
     }
     rLine.SetEndPortion( nEndPortion );
 }
 
-void ImpEditEngine::ImpAdjustBlocks( ParaPortion* pParaPortion, EditLine& 
rLine, tools::Long nRemainingSpace )
+void ImpEditEngine::ImpAdjustBlocks(ParaPortion& rParaPortion, EditLine& 
rLine, tools::Long nRemainingSpace )
 {
     DBG_ASSERT( nRemainingSpace > 0, "AdjustBlocks: Somewhat too little..." );
 
     if ( ( nRemainingSpace < 0 ) || rLine.IsEmpty() )
         return ;
 
-    assert(pParaPortion);
-
     const sal_Int32 nFirstChar = rLine.GetStart();
     const sal_Int32 nLastChar = rLine.GetEnd() -1;    // Last points behind
-    ContentNode* pNode = pParaPortion->GetNode();
+    ContentNode* pNode = rParaPortion.GetNode();
 
     DBG_ASSERT( nLastChar < pNode->Len(), "AdjustBlocks: Out of range!" );
 
@@ -2256,8 +2253,8 @@ void ImpEditEngine::ImpAdjustBlocks( ParaPortion* 
pParaPortion, EditLine& rLine,
     {
         aPositions.pop_back();
         sal_Int32 nPortionStart, nPortion;
-        nPortion = pParaPortion->GetTextPortions().FindPortion( nLastChar+1, 
nPortionStart );
-        TextPortion& rLastPortion = pParaPortion->GetTextPortions()[ nPortion 
];
+        nPortion = rParaPortion.GetTextPortions().FindPortion( nLastChar+1, 
nPortionStart );
+        TextPortion& rLastPortion = rParaPortion.GetTextPortions()[ nPortion ];
         tools::Long nRealWidth = rLine.GetCharPosArray()[nLastChar-nFirstChar];
         tools::Long nBlankWidth = nRealWidth;
         if ( nLastChar > nPortionStart )
@@ -2301,8 +2298,8 @@ void ImpEditEngine::ImpAdjustBlocks( ParaPortion* 
pParaPortion, EditLine& rLine,
         if ( nChar < nLastChar )
         {
             sal_Int32 nPortionStart, nPortion;
-            nPortion = pParaPortion->GetTextPortions().FindPortion( nChar, 
nPortionStart, true );
-            TextPortion& rLastPortion = pParaPortion->GetTextPortions()[ 
nPortion ];
+            nPortion = rParaPortion.GetTextPortions().FindPortion( nChar, 
nPortionStart, true );
+            TextPortion& rLastPortion = rParaPortion.GetTextPortions()[ 
nPortion ];
 
             // The width of the portion:
             rLastPortion.adjustSize(nMore4Everyone, 0);
@@ -2522,21 +2519,19 @@ void ImpEditEngine::ImpFindKashidas( ContentNode* 
pNode, sal_Int32 nStart, sal_I
              rArray.push_back(pos);
 }
 
-sal_Int32 ImpEditEngine::SplitTextPortion( ParaPortion* pPortion, sal_Int32 
nPos, EditLine* pCurLine )
+sal_Int32 ImpEditEngine::SplitTextPortion(ParaPortion& rParaPortion, sal_Int32 
nPos, EditLine* pCurLine)
 {
     // The portion at nPos is split, if there is not a transition at nPos 
anyway
     if ( nPos == 0 )
         return 0;
 
-    assert( pPortion && "SplitTextPortion: Which ?" );
-
     sal_Int32 nSplitPortion;
     sal_Int32 nTmpPos = 0;
     TextPortion* pTextPortion = nullptr;
-    sal_Int32 nPortions = pPortion->GetTextPortions().Count();
+    sal_Int32 nPortions = rParaPortion.GetTextPortions().Count();
     for ( nSplitPortion = 0; nSplitPortion < nPortions; nSplitPortion++ )
     {
-        TextPortion& rTP = pPortion->GetTextPortions()[nSplitPortion];
+        TextPortion& rTP = rParaPortion.GetTextPortions()[nSplitPortion];
         nTmpPos = nTmpPos + rTP.GetLen();
         if ( nTmpPos >= nPos )
         {
@@ -2559,7 +2554,7 @@ sal_Int32 ImpEditEngine::SplitTextPortion( ParaPortion* 
pPortion, sal_Int32 nPos
     sal_Int32 nOverlapp = nTmpPos - nPos;
     pTextPortion->SetLen( pTextPortion->GetLen() - nOverlapp );
     TextPortion* pNewPortion = new TextPortion( nOverlapp );
-    pPortion->GetTextPortions().Insert(nSplitPortion+1, pNewPortion);
+    rParaPortion.GetTextPortions().Insert(nSplitPortion+1, pNewPortion);
     // Set sizes
     if ( pCurLine )
     {
@@ -2570,13 +2565,13 @@ sal_Int32 ImpEditEngine::SplitTextPortion( ParaPortion* 
pPortion, sal_Int32 nPos
         if ( pTextPortion->GetExtraInfos() && 
pTextPortion->GetExtraInfos()->bCompressed )
         {
             // We need the original size from the portion
-            sal_Int32 nTxtPortionStart = 
pPortion->GetTextPortions().GetStartPos( nSplitPortion );
-            SvxFont aTmpFont( 
pPortion->GetNode()->GetCharAttribs().GetDefFont() );
-            SeekCursor( pPortion->GetNode(), nTxtPortionStart+1, aTmpFont );
+            sal_Int32 nTxtPortionStart = 
rParaPortion.GetTextPortions().GetStartPos( nSplitPortion );
+            SvxFont aTmpFont = 
rParaPortion.GetNode()->GetCharAttribs().GetDefFont();
+            SeekCursor(rParaPortion.GetNode(), nTxtPortionStart + 1, aTmpFont);
             aTmpFont.SetPhysFont(*GetRefDevice());
             GetRefDevice()->Push( vcl::PushFlags::TEXTLANGUAGE );
             ImplInitDigitMode(*GetRefDevice(), aTmpFont.GetLanguage());
-            Size aSz = aTmpFont.QuickGetTextSize( GetRefDevice(), 
pPortion->GetNode()->GetString(),
+            Size aSz = aTmpFont.QuickGetTextSize( GetRefDevice(), 
rParaPortion.GetNode()->GetString(),
                 nTxtPortionStart, pTextPortion->GetLen(), nullptr );
             GetRefDevice()->Pop();
             pTextPortion->GetExtraInfos()->nOrgWidth = aSz.Width();
@@ -2588,10 +2583,10 @@ sal_Int32 ImpEditEngine::SplitTextPortion( ParaPortion* 
pPortion, sal_Int32 nPos
     return nSplitPortion;
 }
 
-void ImpEditEngine::CreateTextPortions( ParaPortion* pParaPortion, sal_Int32& 
rStart )
+void ImpEditEngine::CreateTextPortions(ParaPortion& rParaPortion, sal_Int32& 
rStart)
 {
     sal_Int32 nStartPos = rStart;
-    ContentNode* pNode = pParaPortion->GetNode();
+    ContentNode* pNode = rParaPortion.GetNode();
     DBG_ASSERT( pNode->Len(), "CreateTextPortions should not be used for empty 
paragraphs!" );
 
     o3tl::sorted_vector< sal_Int32 > aPositions;
@@ -2609,14 +2604,14 @@ void ImpEditEngine::CreateTextPortions( ParaPortion* 
pParaPortion, sal_Int32& rS
     }
     aPositions.insert( pNode->Len() );
 
-    if ( pParaPortion->aScriptInfos.empty() )
-        InitScriptTypes( GetParaPortions().GetPos( pParaPortion ) );
+    if (rParaPortion.aScriptInfos.empty())
+        InitScriptTypes(GetParaPortions().GetPos(&rParaPortion));
 
-    const ScriptTypePosInfos& rTypes = pParaPortion->aScriptInfos;
+    const ScriptTypePosInfos& rTypes = rParaPortion.aScriptInfos;
     for (const ScriptTypePosInfo& rType : rTypes)
         aPositions.insert( rType.nStartPos );
 
-    const WritingDirectionInfos& rWritingDirections = 
pParaPortion->aWritingDirectionInfos;
+    const WritingDirectionInfos& rWritingDirections = 
rParaPortion.aWritingDirectionInfos;
     for (const WritingDirectionInfo & rWritingDirection : rWritingDirections)
         aPositions.insert( rWritingDirection.nStartPos );
 
@@ -2640,9 +2635,9 @@ void ImpEditEngine::CreateTextPortions( ParaPortion* 
pParaPortion, sal_Int32& rS
     sal_Int32 nPortionStart = 0;
     sal_Int32 nInvPortion = 0;
     sal_Int32 nP;
-    for ( nP = 0; nP < pParaPortion->GetTextPortions().Count(); nP++ )
+    for ( nP = 0; nP < rParaPortion.GetTextPortions().Count(); nP++ )
     {
-        const TextPortion& rTmpPortion = pParaPortion->GetTextPortions()[nP];
+        const TextPortion& rTmpPortion = rParaPortion.GetTextPortions()[nP];
         nPortionStart = nPortionStart + rTmpPortion.GetLen();
         if ( nPortionStart >= nStartPos )
         {
@@ -2652,16 +2647,16 @@ void ImpEditEngine::CreateTextPortions( ParaPortion* 
pParaPortion, sal_Int32& rS
             break;
         }
     }
-    DBG_ASSERT( nP < pParaPortion->GetTextPortions().Count() || 
!pParaPortion->GetTextPortions().Count(), "Nothing to delete: 
CreateTextPortions" );
-    if ( nInvPortion && ( 
nPortionStart+pParaPortion->GetTextPortions()[nInvPortion].GetLen() > nStartPos 
) )
+    DBG_ASSERT( nP < rParaPortion.GetTextPortions().Count() || 
!rParaPortion.GetTextPortions().Count(), "Nothing to delete: 
CreateTextPortions" );
+    if ( nInvPortion && ( nPortionStart + 
rParaPortion.GetTextPortions()[nInvPortion].GetLen() > nStartPos ) )
     {
         // prefer one in front...
         // But only if it was in the middle of the portion of, otherwise it
         // might be the only one in the row in front!
         nInvPortion--;
-        nPortionStart = nPortionStart - 
pParaPortion->GetTextPortions()[nInvPortion].GetLen();
+        nPortionStart = nPortionStart - 
rParaPortion.GetTextPortions()[nInvPortion].GetLen();
     }
-    pParaPortion->GetTextPortions().DeleteFromPortion( nInvPortion );
+    rParaPortion.GetTextPortions().DeleteFromPortion( nInvPortion );
 
     // A portion may also have been formed by a line break:
     aPositions.insert( nPortionStart );
@@ -2674,21 +2669,21 @@ void ImpEditEngine::CreateTextPortions( ParaPortion* 
pParaPortion, sal_Int32& rS
     while ( i != aPositions.end() )
     {
         TextPortion* pNew = new TextPortion( (*i++) - *nInvPos++ );
-        pParaPortion->GetTextPortions().Append(pNew);
+        rParaPortion.GetTextPortions().Append(pNew);
     }
 
-    DBG_ASSERT( pParaPortion->GetTextPortions().Count(), "No Portions?!" );
+    DBG_ASSERT(rParaPortion.GetTextPortions().Count(), "No Portions?!");
 #if OSL_DEBUG_LEVEL > 0
-    OSL_ENSURE( ParaPortion::DbgCheckTextPortions(*pParaPortion), "Portion is 
broken?" );
+    OSL_ENSURE( ParaPortion::DbgCheckTextPortions(rParaPortion), "Portion is 
broken?" );
 #endif
 }
 
-void ImpEditEngine::RecalcTextPortion( ParaPortion* pParaPortion, sal_Int32 
nStartPos, sal_Int32 nNewChars )
+void ImpEditEngine::RecalcTextPortion(ParaPortion& rParaPortion, sal_Int32 
nStartPos, sal_Int32 nNewChars)
 {
-    DBG_ASSERT( pParaPortion->GetTextPortions().Count(), "No Portions!" );
+    DBG_ASSERT(rParaPortion.GetTextPortions().Count(), "No Portions!");
     DBG_ASSERT( nNewChars, "RecalcTextPortion with Diff == 0" );
 
-    ContentNode* const pNode = pParaPortion->GetNode();
+    ContentNode* const pNode = rParaPortion.GetNode();
     if ( nNewChars > 0 )
     {
         // If an Attribute begins/ends at nStartPos, then a new portion starts
@@ -2697,29 +2692,28 @@ void ImpEditEngine::RecalcTextPortion( ParaPortion* 
pParaPortion, sal_Int32 nSta
         {
             sal_Int32 nNewPortionPos = 0;
             if ( nStartPos )
-                nNewPortionPos = SplitTextPortion( pParaPortion, nStartPos ) + 
1;
+                nNewPortionPos = SplitTextPortion(rParaPortion, nStartPos) + 1;
 
             // A blank portion may be here, if the paragraph was empty,
             // or if a line was created by a hard line break.
-            if ( ( nNewPortionPos < pParaPortion->GetTextPortions().Count() ) 
&&
-                    !pParaPortion->GetTextPortions()[nNewPortionPos].GetLen() )
+            if ( ( nNewPortionPos < rParaPortion.GetTextPortions().Count() ) &&
+                    !rParaPortion.GetTextPortions()[nNewPortionPos].GetLen() )
             {
-                TextPortion& rTP = 
pParaPortion->GetTextPortions()[nNewPortionPos];
+                TextPortion& rTP = 
rParaPortion.GetTextPortions()[nNewPortionPos];
                 DBG_ASSERT( rTP.GetKind() == PortionKind::TEXT, "the empty 
portion was no TextPortion!" );
                 rTP.SetLen( rTP.GetLen() + nNewChars );
             }
             else
             {
                 TextPortion* pNewPortion = new TextPortion( nNewChars );
-                pParaPortion->GetTextPortions().Insert(nNewPortionPos, 
pNewPortion);
+                rParaPortion.GetTextPortions().Insert(nNewPortionPos, 
pNewPortion);
             }
         }
         else
         {
             sal_Int32 nPortionStart;
-            const sal_Int32 nTP = pParaPortion->GetTextPortions().
-                FindPortion( nStartPos, nPortionStart );
-            TextPortion& rTP = pParaPortion->GetTextPortions()[ nTP ];
+            const sal_Int32 nTP = rParaPortion.GetTextPortions().FindPortion( 
nStartPos, nPortionStart );
+            TextPortion& rTP = rParaPortion.GetTextPortions()[ nTP ];
             rTP.SetLen( rTP.GetLen() + nNewChars );
             rTP.setWidth(-1);
         }
@@ -2736,11 +2730,11 @@ void ImpEditEngine::RecalcTextPortion( ParaPortion* 
pParaPortion, sal_Int32 nSta
         sal_Int32 nPortion = 0;
         sal_Int32 nPos = 0;
         sal_Int32 nEnd = nStartPos-nNewChars;
-        sal_Int32 nPortions = pParaPortion->GetTextPortions().Count();
+        sal_Int32 nPortions = rParaPortion.GetTextPortions().Count();
         TextPortion* pTP = nullptr;
         for ( nPortion = 0; nPortion < nPortions; nPortion++ )
         {
-            pTP = &pParaPortion->GetTextPortions()[ nPortion ];
+            pTP = &rParaPortion.GetTextPortions()[ nPortion ];
             if ( ( nPos+pTP->GetLen() ) > nStartPos )
             {
                 DBG_ASSERT( nPos <= nStartPos, "Wrong Start!" );
@@ -2754,14 +2748,14 @@ void ImpEditEngine::RecalcTextPortion( ParaPortion* 
pParaPortion, sal_Int32 nSta
         {
             // Remove portion;
             PortionKind nType = pTP->GetKind();
-            pParaPortion->GetTextPortions().Remove( nPortion );
+            rParaPortion.GetTextPortions().Remove( nPortion );
             if ( nType == PortionKind::LINEBREAK )
             {
-                TextPortion& rNext = pParaPortion->GetTextPortions()[ nPortion 
];
+                TextPortion& rNext = rParaPortion.GetTextPortions()[ nPortion 
];
                 if ( !rNext.GetLen() )
                 {
                     // Remove dummy portion
-                    pParaPortion->GetTextPortions().Remove( nPortion );
+                    rParaPortion.GetTextPortions().Remove( nPortion );
                 }
             }
         }
@@ -2771,30 +2765,30 @@ void ImpEditEngine::RecalcTextPortion( ParaPortion* 
pParaPortion, sal_Int32 nSta
             pTP->SetLen( pTP->GetLen() + nNewChars );
         }
 
-        sal_Int32 nPortionCount = pParaPortion->GetTextPortions().Count();
+        sal_Int32 nPortionCount = rParaPortion.GetTextPortions().Count();
         assert( nPortionCount );
         if (nPortionCount)
         {
             // No HYPHENATOR portion is allowed to get stuck right at the 
end...
             sal_Int32 nLastPortion = nPortionCount - 1;
-            pTP = &pParaPortion->GetTextPortions()[nLastPortion];
+            pTP = &rParaPortion.GetTextPortions()[nLastPortion];
             if ( pTP->GetKind() == PortionKind::HYPHENATOR )
             {
                 // Discard portion; if possible, correct the ones before,
                 // if the Hyphenator portion has swallowed one character...
                 if ( nLastPortion && pTP->GetLen() )
                 {
-                    TextPortion& rPrev = 
pParaPortion->GetTextPortions()[nLastPortion - 1];
+                    TextPortion& rPrev = 
rParaPortion.GetTextPortions()[nLastPortion - 1];
                     DBG_ASSERT( rPrev.GetKind() == PortionKind::TEXT, 
"Portion?!" );
                     rPrev.SetLen( rPrev.GetLen() + pTP->GetLen() );
                     rPrev.setWidth(-1);
                 }
-                pParaPortion->GetTextPortions().Remove( nLastPortion );
+                rParaPortion.GetTextPortions().Remove( nLastPortion );
             }
         }
     }
 #if OSL_DEBUG_LEVEL > 0
-    OSL_ENSURE( ParaPortion::DbgCheckTextPortions(*pParaPortion), "Portions 
are broken?" );
+    OSL_ENSURE( ParaPortion::DbgCheckTextPortions(rParaPortion), "Portions are 
broken?" );
 #endif
 }
 
@@ -3423,7 +3417,7 @@ void ImpEditEngine::Paint( OutputDevice& rOutDev, 
tools::Rectangle aClipRect, Po
                         DBG_ASSERT( pPortion->GetTextPortions().Count(), "Line 
without Textportion in Paint!" );
                         const TextPortion& rTextPortion = 
pPortion->GetTextPortions()[nPortion];
 
-                        const tools::Long nPortionXOffset = GetPortionXOffset( 
pPortion, rLine, nPortion );
+                        const tools::Long nPortionXOffset = 
GetPortionXOffset(*pPortion, rLine, nPortion);
                         setXDirectionAwareFrom(aTmpPos, aStartPos);
                         adjustXDirectionAware(aTmpPos, nPortionXOffset);
                         if (isXOverflowDirectionAware(aTmpPos, aClipRect))
@@ -4227,7 +4221,7 @@ void ImpEditEngine::ShowParagraph( sal_Int32 nParagraph, 
bool bShow )
             }
             else
             {
-                CalcHeight( pPPortion );
+                CalcHeight(*pPPortion);
             }
             mnCurTextHeight += pPPortion->GetHeight();
         }
@@ -4840,14 +4834,14 @@ bool 
ImpEditEngine::ImplCalcAsianCompression(ContentNode* pNode,
 }
 
 
-void ImpEditEngine::ImplExpandCompressedPortions(EditLine& rLine, ParaPortion* 
pParaPortion, tools::Long nRemainingWidth)
+void ImpEditEngine::ImplExpandCompressedPortions(EditLine& rLine, ParaPortion& 
rParaPortion, tools::Long nRemainingWidth)
 {
     bool bFoundCompressedPortion = false;
     tools::Long nCompressed = 0;
     std::vector<TextPortion*> aCompressedPortions;
 
     sal_Int32 nPortion = rLine.GetEndPortion();
-    TextPortion* pTP = &pParaPortion->GetTextPortions()[ nPortion ];
+    TextPortion* pTP = &rParaPortion.GetTextPortions()[ nPortion ];
     while ( pTP && ( pTP->GetKind() == PortionKind::TEXT ) )
     {
         if ( pTP->GetExtraInfos() && pTP->GetExtraInfos()->bCompressed )
@@ -4856,7 +4850,7 @@ void 
ImpEditEngine::ImplExpandCompressedPortions(EditLine& rLine, ParaPortion* p
             nCompressed += pTP->GetExtraInfos()->nOrgWidth - 
pTP->GetSize().Width();
             aCompressedPortions.push_back(pTP);
         }
-        pTP = ( nPortion > rLine.GetStartPortion() ) ? 
&pParaPortion->GetTextPortions()[ --nPortion ] : nullptr;
+        pTP = ( nPortion > rLine.GetStartPortion() ) ? 
&rParaPortion.GetTextPortions()[ --nPortion ] : nullptr;
     }
 
     if ( !bFoundCompressedPortion )
@@ -4878,13 +4872,13 @@ void 
ImpEditEngine::ImplExpandCompressedPortions(EditLine& rLine, ParaPortion* p
         pTP->setWidth(pTP->GetExtraInfos()->nOrgWidth);
         if ( nCompressPercent )
         {
-            sal_Int32 nTxtPortion = pParaPortion->GetTextPortions().GetPos( 
pTP );
-            sal_Int32 nTxtPortionStart = 
pParaPortion->GetTextPortions().GetStartPos( nTxtPortion );
+            sal_Int32 nTxtPortion = rParaPortion.GetTextPortions().GetPos( pTP 
);
+            sal_Int32 nTxtPortionStart = 
rParaPortion.GetTextPortions().GetStartPos( nTxtPortion );
             DBG_ASSERT( nTxtPortionStart >= rLine.GetStart(), "Portion doesn't 
belong to the line!!!" );
             sal_Int32* pDXArray = rLine.GetCharPosArray().data() + 
(nTxtPortionStart - rLine.GetStart());
             if ( pTP->GetExtraInfos()->pOrgDXArray )
                 memcpy( pDXArray, pTP->GetExtraInfos()->pOrgDXArray.get(), 
(pTP->GetLen()-1)*sizeof(sal_Int32) );
-            ImplCalcAsianCompression( pParaPortion->GetNode(), pTP, 
nTxtPortionStart, pDXArray, static_cast<sal_uInt16>(nCompressPercent), true );
+            ImplCalcAsianCompression( rParaPortion.GetNode(), pTP, 
nTxtPortionStart, pDXArray, static_cast<sal_uInt16>(nCompressPercent), true );
         }
     }
 }
diff --git a/include/editeng/editeng.hxx b/include/editeng/editeng.hxx
index 241473832286..bf0b5bb34951 100644
--- a/include/editeng/editeng.hxx
+++ b/include/editeng/editeng.hxx
@@ -184,10 +184,9 @@ private:
         const EditSelection& rCurSelection,
         sal_Int16 nWordType = css::i18n::WordType::ANYWORD_IGNOREWHITESPACES);
 
-    EDITENG_DLLPRIVATE tools::Long GetXPos(
-        const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 
nIndex, bool bPreferPortionStart = false) const;
+    EDITENG_DLLPRIVATE tools::Long GetXPos(ParaPortion const& rParaPortion, 
EditLine const& rLine, sal_Int32 nIndex, bool bPreferPortionStart = false) 
const;
 
-    EDITENG_DLLPRIVATE Range GetLineXPosStartEnd(const ParaPortion* 
pParaPortion, EditLine const& rLine) const;
+    EDITENG_DLLPRIVATE Range GetLineXPosStartEnd(ParaPortion const& 
rParaPortion, EditLine const& rLine) const;
 
     EDITENG_DLLPRIVATE InternalEditStatus& GetInternalEditStatus();
 
commit ee880f953e8b04c736a44fea63513d041681955f
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri Jan 12 13:35:22 2024 +0900
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Sun Jan 14 16:06:07 2024 +0100

    editeng: use EditLine as ref. and use const
    
    We assert the EditLine pointer is valid (not nullptr) in some
    methods or just expect it to be valid without asserting.  If this
    is the case then we might as well change the parameter to be a
    reference.
    
    Also change EditLine to const&, where this makes sense in the code.
    
    Change-Id: Ia28810fea9d4e053f18fbb45968644545f5bf83b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162012
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/editeng/source/editeng/editeng.cxx 
b/editeng/source/editeng/editeng.cxx
index 7af59f499e12..d7a30a60b935 100644
--- a/editeng/source/editeng/editeng.cxx
+++ b/editeng/source/editeng/editeng.cxx
@@ -866,15 +866,15 @@ EditSelection EditEngine::SelectWord(
 }
 
 tools::Long EditEngine::GetXPos(
-        const ParaPortion* pParaPortion, const EditLine* pLine, sal_Int32 
nIndex, bool bPreferPortionStart) const
+        const ParaPortion* pParaPortion, EditLine const& rLine, sal_Int32 
nIndex, bool bPreferPortionStart) const
 {
-    return pImpEditEngine->GetXPos(pParaPortion, pLine, nIndex, 
bPreferPortionStart);
+    return pImpEditEngine->GetXPos(pParaPortion, rLine, nIndex, 
bPreferPortionStart);
 }
 
 Range EditEngine::GetLineXPosStartEnd(
-        const ParaPortion* pParaPortion, const EditLine* pLine) const
+        const ParaPortion* pParaPortion, EditLine const& rLine) const
 {
-    return pImpEditEngine->GetLineXPosStartEnd(pParaPortion, pLine);
+    return pImpEditEngine->GetLineXPosStartEnd(pParaPortion, rLine);
 }
 
 bool EditEngine::IsFormatted() const
diff --git a/editeng/source/editeng/impedit.cxx 
b/editeng/source/editeng/impedit.cxx
index abf3c5337255..c1f20e9e55df 100644
--- a/editeng/source/editeng/impedit.cxx
+++ b/editeng/source/editeng/impedit.cxx
@@ -576,7 +576,7 @@ void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, 
vcl::Region* pRegion,
                 nEndIndex = nStartIndex;
 
             tools::Rectangle 
aTmpRect(pEditEngine->pImpEditEngine->GetEditCursor(
-                &rInfo.rPortion, rInfo.pLine, nStartIndex, 
GetCursorFlags::NONE));
+                &rInfo.rPortion, *rInfo.pLine, nStartIndex, 
GetCursorFlags::NONE));
             const Size aLineOffset = 
pEditEngine->pImpEditEngine->getTopLeftDocOffset(rInfo.aArea);
             aTmpRect.Move(0, aLineOffset.Height());
 
@@ -595,8 +595,7 @@ void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, 
vcl::Region* pRegion,
             // Now that we have Bidi, the first/last index doesn't have to be 
the 'most outside' position
             if (!bPartOfLine)
             {
-                Range aLineXPosStartEnd
-                    = pEditEngine->GetLineXPosStartEnd(&rInfo.rPortion, 
rInfo.pLine);
+                Range aLineXPosStartEnd = 
pEditEngine->GetLineXPosStartEnd(&rInfo.rPortion, *rInfo.pLine);
                 aTmpRect.SetLeft(aLineXPosStartEnd.Min());
                 aTmpRect.SetRight(aLineXPosStartEnd.Max());
                 aTmpRect.Move(aLineOffset.Width(), 0);
@@ -617,10 +616,8 @@ void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, 
vcl::Region* pRegion,
 
                     DBG_ASSERT(nTmpEndIndex > nTmpStartIndex, 
"DrawSelectionXOR, Start >= End?");
 
-                    tools::Long nX1
-                        = pEditEngine->GetXPos(&rInfo.rPortion, rInfo.pLine, 
nTmpStartIndex, true);
-                    tools::Long nX2
-                        = pEditEngine->GetXPos(&rInfo.rPortion, rInfo.pLine, 
nTmpEndIndex);
+                    tools::Long nX1 = pEditEngine->GetXPos(&rInfo.rPortion, 
*rInfo.pLine, nTmpStartIndex, true);
+                    tools::Long nX2 = pEditEngine->GetXPos(&rInfo.rPortion, 
*rInfo.pLine, nTmpEndIndex);
 
                     aTmpRect.SetLeft(std::min(nX1, nX2));
                     aTmpRect.SetRight(std::max(nX1, nX2));
diff --git a/editeng/source/editeng/impedit.hxx 
b/editeng/source/editeng/impedit.hxx
index 6705f4e5dc4f..61afaea21b83 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -656,10 +656,10 @@ private:
     std::tuple<const ParaPortion*, const EditLine*, tools::Long> 
GetPortionAndLine(Point aDocPos);
     EditPaM             GetPaM( Point aDocPos, bool bSmart = true );
     bool IsTextPos(const Point& rDocPos, sal_uInt16 nBorder);
-    tools::Long GetXPos(const ParaPortion* pParaPortion, const EditLine* 
pLine, sal_Int32 nIndex, bool bPreferPortionStart = false) const;
-    tools::Long GetPortionXOffset(const ParaPortion* pParaPortion, const 
EditLine* pLine, sal_Int32 nTextPortion) const;
-    sal_Int32 GetChar(const ParaPortion* pParaPortion, const EditLine* pLine, 
tools::Long nX, bool bSmart = true);
-    Range GetLineXPosStartEnd( const ParaPortion* pParaPortion, const 
EditLine* pLine ) const;
+    tools::Long GetXPos(const ParaPortion* pParaPortion, EditLine const& 
rLine, sal_Int32 nIndex, bool bPreferPortionStart = false) const;
+    tools::Long GetPortionXOffset(const ParaPortion* pParaPortion, EditLine 
const& rLine, sal_Int32 nTextPortion) const;
+    sal_Int32 GetChar(const ParaPortion* pParaPortion, EditLine const& rLine, 
tools::Long nX, bool bSmart = true);
+    Range GetLineXPosStartEnd(const ParaPortion* pParaPortion, EditLine const& 
rLine) const;
 
     void                ParaAttribsToCharAttribs( ContentNode* pNode );
     void                GetCharAttribs( sal_Int32 nPara, 
std::vector<EECharAttrib>& rLst ) const;
@@ -687,8 +687,8 @@ private:
     void                RecalcFormatterFontMetrics( FormatterFontMetric& 
rCurMetrics, SvxFont& rFont );
     void                CheckAutoPageSize();
 
-    void                ImpBreakLine( ParaPortion* pParaPortion, EditLine* 
pLine, TextPortion const * pPortion, sal_Int32 nPortionStart, tools::Long 
nRemainingWidth, bool bCanHyphenate );
-    void                ImpAdjustBlocks( ParaPortion* pParaPortion, EditLine* 
pLine, tools::Long nRemainingSpace );
+    void                ImpBreakLine( ParaPortion* pParaPortion, EditLine& 
rLine, TextPortion const * pPortion, sal_Int32 nPortionStart, tools::Long 
nRemainingWidth, bool bCanHyphenate );
+    void                ImpAdjustBlocks( ParaPortion* pParaPortion, EditLine& 
rLine, tools::Long nRemainingSpace );
     EditPaM             ImpConnectParagraphs( ContentNode* pLeft, ContentNode* 
pRight, bool bBackward = false );
     EditPaM             ImpDeleteSelection(const EditSelection& rCurSel);
     EditPaM             ImpInsertParaBreak( EditPaM& rPaM, bool 
bKeepEndingAttribs = true );
@@ -744,7 +744,7 @@ private:
 
     bool                ImplCalcAsianCompression( ContentNode* pNode, 
TextPortion* pTextPortion, sal_Int32 nStartPos,
                                                 sal_Int32* pDXArray, 
sal_uInt16 n100thPercentFromMax, bool bManipulateDXArray );
-    void                ImplExpandCompressedPortions( EditLine* pLine, 
ParaPortion* pParaPortion, tools::Long nRemainingWidth );
+    void                ImplExpandCompressedPortions(EditLine& rLine, 
ParaPortion* pParaPortion, tools::Long nRemainingWidth);
 
     void                ImplInitLayoutMode(OutputDevice& rOutDev, sal_Int32 
nPara, sal_Int32 nIndex);
     static LanguageType ImplCalcDigitLang(LanguageType eCurLang);
@@ -1025,7 +1025,7 @@ public:
     sal_uInt32      GetTextHeightNTP() const;
     sal_uInt32      CalcTextWidth( bool bIgnoreExtraSpace);
     sal_uInt32      CalcParaWidth( sal_Int32 nParagraph, bool 
bIgnoreExtraSpace );
-    sal_uInt32      CalcLineWidth( ParaPortion* pPortion, EditLine* pLine, 
bool bIgnoreExtraSpace);
+    sal_uInt32      CalcLineWidth( ParaPortion* pPortion, EditLine const& 
rLine, bool bIgnoreExtraSpace);
     sal_Int32       GetLineCount( sal_Int32 nParagraph ) const;
     sal_Int32       GetLineLen( sal_Int32 nParagraph, sal_Int32 nLine ) const;
     void            GetLineBoundaries( /*out*/sal_Int32& rStart, 
/*out*/sal_Int32& rEnd, sal_Int32 nParagraph, sal_Int32 nLine ) const;
@@ -1052,8 +1052,7 @@ public:
     }
 
     tools::Rectangle       PaMtoEditCursor( EditPaM aPaM, GetCursorFlags 
nFlags = GetCursorFlags::NONE );
-    tools::Rectangle GetEditCursor(const ParaPortion* pPortion, const 
EditLine* pLine,
-                                   sal_Int32 nIndex, GetCursorFlags nFlags);
+    tools::Rectangle GetEditCursor(const ParaPortion* pPortion, EditLine 
const& rLine, sal_Int32 nIndex, GetCursorFlags nFlags);
 
     bool            IsModified() const { return maEditDoc.IsModified(); }
     void            SetModifyFlag(bool b) { maEditDoc.SetModified( b ); }
diff --git a/editeng/source/editeng/impedit2.cxx 
b/editeng/source/editeng/impedit2.cxx
index 6e9351a7c80e..065b28e69f18 100644
--- a/editeng/source/editeng/impedit2.cxx
+++ b/editeng/source/editeng/impedit2.cxx
@@ -578,8 +578,7 @@ bool ImpEditEngine::Command( const CommandEvent& rCEvt, 
EditView* pView )
                         {
                             if (rInfo.pLine->IsIn(n))
                             {
-                                tools::Rectangle aR = 
GetEditCursor(pParaPortion, rInfo.pLine, n,
-                                                                    
GetCursorFlags::NONE);
+                                tools::Rectangle aR = 
GetEditCursor(pParaPortion, *rInfo.pLine, n, GetCursorFlags::NONE);
                                 aR.Move(getTopLeftDocOffset(rInfo.aArea));
                                 aRects[n - nMinPos] = 
pView->GetImpEditView()->GetWindowPos(aR);
                             }
@@ -1275,7 +1274,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, 
EditView const * pView )
     tools::Long nX;
     if ( pView->pImpEditView->nTravelXPos == TRAVEL_X_DONTKNOW )
     {
-        nX = GetXPos( pPPortion, &rLine, rPaM.GetIndex() );
+        nX = GetXPos(pPPortion, rLine, rPaM.GetIndex());
         pView->pImpEditView->nTravelXPos = nX + mnOnePixelInRef;
     }
     else
@@ -1285,7 +1284,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, 
EditView const * pView )
     if ( nLine )    // same paragraph
     {
         const EditLine& rPrevLine = pPPortion->GetLines()[nLine-1];
-        aNewPaM.SetIndex( GetChar( pPPortion, &rPrevLine, nX ) );
+        aNewPaM.SetIndex(GetChar(pPPortion, rPrevLine, nX));
         // If a previous automatically wrapped line, and one has to be exactly
         // at the end of this line, the cursor lands on the current line at the
         // beginning. See Problem: Last character of an automatically wrapped
@@ -1300,7 +1299,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, 
EditView const * pView )
         {
             const EditLine& rLine2 = 
pPrevPortion->GetLines()[pPrevPortion->GetLines().Count()-1];
             aNewPaM.SetNode( pPrevPortion->GetNode() );
-            aNewPaM.SetIndex( GetChar( pPrevPortion, &rLine2, nX + 
mnOnePixelInRef ) );
+            aNewPaM.SetIndex(GetChar(pPrevPortion, rLine2, nX + 
mnOnePixelInRef));
         }
     }
 
@@ -1319,7 +1318,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, 
EditView const * pView )
     if ( pView->pImpEditView->nTravelXPos == TRAVEL_X_DONTKNOW )
     {
         const EditLine& rLine = pPPortion->GetLines()[nLine];
-        nX = GetXPos( pPPortion, &rLine, rPaM.GetIndex() );
+        nX = GetXPos(pPPortion, rLine, rPaM.GetIndex());
         pView->pImpEditView->nTravelXPos = nX + mnOnePixelInRef;
     }
     else
@@ -1329,7 +1328,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, 
EditView const * pView )
     if ( nLine < pPPortion->GetLines().Count()-1 )
     {
         const EditLine& rNextLine = pPPortion->GetLines()[nLine+1];
-        aNewPaM.SetIndex( GetChar( pPPortion, &rNextLine, nX ) );
+        aNewPaM.SetIndex(GetChar(pPPortion, rNextLine, nX));
         // Special treatment, see CursorUp ...
         if ( ( aNewPaM.GetIndex() == rNextLine.GetEnd() ) && ( 
aNewPaM.GetIndex() > rNextLine.GetStart() ) && ( aNewPaM.GetIndex() < 
pPPortion->GetNode()->Len() ) )
             aNewPaM = CursorLeft( aNewPaM );
@@ -1343,7 +1342,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, 
EditView const * pView )
             aNewPaM.SetNode( pNextPortion->GetNode() );
             // Never at the very end when several lines, because then a line
             // below the cursor appears.
-            aNewPaM.SetIndex( GetChar( pNextPortion, &rLine, nX + 
mnOnePixelInRef ) );
+            aNewPaM.SetIndex(GetChar(pNextPortion, rLine, nX + 
mnOnePixelInRef));
             if ( ( aNewPaM.GetIndex() == rLine.GetEnd() ) && ( 
aNewPaM.GetIndex() > rLine.GetStart() ) && ( pNextPortion->GetLines().Count() > 
1 ) )
                 aNewPaM = CursorLeft( aNewPaM );
         }
@@ -3121,41 +3120,41 @@ EditPaM ImpEditEngine::InsertLineBreak(const 
EditSelection& aCurSel)
 
 //  Helper functions
 
-tools::Rectangle ImpEditEngine::GetEditCursor(const ParaPortion* pPortion, 
const EditLine* pLine,
+tools::Rectangle ImpEditEngine::GetEditCursor(const ParaPortion* pPortion, 
EditLine const& rLine,
                                               sal_Int32 nIndex, GetCursorFlags 
nFlags)
 {
-    assert(pPortion && pLine);
+    assert(pPortion);
     // nIndex might be not in the line
     // Search within the line...
     tools::Long nX;
 
-    if ((nIndex == pLine->GetStart()) && (nFlags & 
GetCursorFlags::StartOfLine))
+    if ((nIndex == rLine.GetStart()) && (nFlags & GetCursorFlags::StartOfLine))
     {
-        Range aXRange = GetLineXPosStartEnd(pPortion, pLine);
+        Range aXRange = GetLineXPosStartEnd(pPortion, rLine);
         nX = !IsRightToLeft(GetEditDoc().GetPos(pPortion->GetNode())) ? 
aXRange.Min()
                                                                       : 
aXRange.Max();
     }
-    else if ((nIndex == pLine->GetEnd()) && (nFlags & 
GetCursorFlags::EndOfLine))
+    else if ((nIndex == rLine.GetEnd()) && (nFlags & 
GetCursorFlags::EndOfLine))
     {
-        Range aXRange = GetLineXPosStartEnd(pPortion, pLine);
+        Range aXRange = GetLineXPosStartEnd(pPortion, rLine);
         nX = !IsRightToLeft(GetEditDoc().GetPos(pPortion->GetNode())) ? 
aXRange.Max()
                                                                       : 
aXRange.Min();
     }
     else
     {
-        nX = GetXPos(pPortion, pLine, nIndex, bool(nFlags & 
GetCursorFlags::PreferPortionStart));
+        nX = GetXPos(pPortion, rLine, nIndex, bool(nFlags & 
GetCursorFlags::PreferPortionStart));
     }
 
     tools::Rectangle aEditCursor;
     aEditCursor.SetLeft(nX);
     aEditCursor.SetRight(nX);
 
-    aEditCursor.SetBottom(pLine->GetHeight() - 1);
+    aEditCursor.SetBottom(rLine.GetHeight() - 1);
     if (nFlags & GetCursorFlags::TextOnly)
-        aEditCursor.SetTop(aEditCursor.Bottom() - pLine->GetTxtHeight() + 1);
+        aEditCursor.SetTop(aEditCursor.Bottom() - rLine.GetTxtHeight() + 1);
     else
         aEditCursor.SetTop(aEditCursor.Bottom()
-                           - std::min(pLine->GetTxtHeight(), 
pLine->GetHeight()) + 1);
+                           - std::min(rLine.GetTxtHeight(), rLine.GetHeight()) 
+ 1);
     return aEditCursor;
 }
 
@@ -3192,7 +3191,7 @@ tools::Rectangle ImpEditEngine::PaMtoEditCursor( EditPaM 
aPaM, GetCursorFlags nF
 
     if (pLastLine)
     {
-        aEditCursor = GetEditCursor(pPortion, pLastLine, nIndex, nFlags);
+        aEditCursor = GetEditCursor(pPortion, *pLastLine, nIndex, nFlags);
         aEditCursor.Move(getTopLeftDocOffset(aLineArea));
     }
     else
@@ -3334,8 +3333,8 @@ EditPaM ImpEditEngine::GetPaM( Point aDocPos, bool bSmart 
)
 
     if (const auto& [pPortion, pLine, nLineStartX] = 
GetPortionAndLine(aDocPos); pPortion)
     {
-        sal_Int32 nCurIndex
-            = GetChar(pPortion, pLine, aDocPos.X() - nLineStartX, bSmart);
+        assert(pLine);
+        sal_Int32 nCurIndex = GetChar(pPortion, *pLine, aDocPos.X() - 
nLineStartX, bSmart);
         EditPaM aPaM(pPortion->GetNode(), nCurIndex);
 
         if (nCurIndex && (nCurIndex == pLine->GetEnd())
@@ -3353,7 +3352,8 @@ bool ImpEditEngine::IsTextPos(const Point& rDocPos, 
sal_uInt16 nBorder)
 {
     if (const auto& [pPortion, pLine, nLineStartX] = 
GetPortionAndLine(rDocPos); pPortion)
     {
-        Range aLineXPosStartEnd = GetLineXPosStartEnd(pPortion, pLine);
+        assert(pLine);
+        Range aLineXPosStartEnd = GetLineXPosStartEnd(pPortion, *pLine);
         if ((rDocPos.X() >= nLineStartX + aLineXPosStartEnd.Min() - nBorder)
             && (rDocPos.X() <= nLineStartX + aLineXPosStartEnd.Max() + 
nBorder))
             return true;
@@ -3412,7 +3412,7 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, 
bool bIgnoreExtraSpace
         sal_Int32 nLines = pPortion->GetLines().Count();
         for ( sal_Int32 nLine = 0; nLine < nLines; nLine++ )
         {
-            EditLine& rLine = pPortion->GetLines()[nLine];
+            EditLine const& rLine = pPortion->GetLines()[nLine];
             // nCurWidth = pLine->GetStartPosX();
             // For Center- or Right- alignment it depends on the paper
             // width, here not preferred. I general, it is best not leave it
@@ -3431,7 +3431,7 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, 
bool bIgnoreExtraSpace
                 }
             }
             nCurWidth += scaleXSpacingValue(rLRItem.GetRight());
-            nCurWidth += CalcLineWidth( pPortion, &rLine, bIgnoreExtraSpace );
+            nCurWidth += CalcLineWidth(pPortion, rLine, bIgnoreExtraSpace);
             if ( nCurWidth > nMaxWidth )
             {
                 nMaxWidth = nCurWidth;
@@ -3443,7 +3443,7 @@ sal_uInt32 ImpEditEngine::CalcParaWidth( sal_Int32 nPara, 
bool bIgnoreExtraSpace
     return static_cast<sal_uInt32>(nMaxWidth);
 }
 
-sal_uInt32 ImpEditEngine::CalcLineWidth( ParaPortion* pPortion, EditLine* 
pLine, bool bIgnoreExtraSpace )
+sal_uInt32 ImpEditEngine::CalcLineWidth(ParaPortion* pPortion, EditLine const& 
rLine, bool bIgnoreExtraSpace)
 {
     sal_Int32 nPara = GetEditDoc().GetPos( pPortion->GetNode() );
 
@@ -3457,8 +3457,8 @@ sal_uInt32 ImpEditEngine::CalcLineWidth( ParaPortion* 
pPortion, EditLine* pLine,
 
     // Calculation of the width without the Indents ...
     sal_uInt32 nWidth = 0;
-    sal_Int32 nPos = pLine->GetStart();
-    for ( sal_Int32 nTP = pLine->GetStartPortion(); nTP <= 
pLine->GetEndPortion(); nTP++ )
+    sal_Int32 nPos = rLine.GetStart();
+    for ( sal_Int32 nTP = rLine.GetStartPortion(); nTP <= 
rLine.GetEndPortion(); nTP++ )
     {
         const TextPortion& rTextPortion = pPortion->GetTextPortions()[nTP];
         switch ( rTextPortion.GetKind() )
@@ -3997,20 +3997,17 @@ EditSelection ImpEditEngine::PasteText( uno::Reference< 
datatransfer::XTransfera
     return aNewSelection;
 }
 
-sal_Int32 ImpEditEngine::GetChar(
-    const ParaPortion* pParaPortion, const EditLine* pLine, tools::Long nXPos, 
bool bSmart)
+sal_Int32 ImpEditEngine::GetChar(const ParaPortion* pParaPortion, EditLine 
const& rLine, tools::Long nXPos, bool bSmart)
 {
-    assert(pLine);
-
     sal_Int32 nChar = -1;
-    sal_Int32 nCurIndex = pLine->GetStart();
+    sal_Int32 nCurIndex = rLine.GetStart();
 
 
     // Search best matching portion with GetPortionXOffset()
-    for ( sal_Int32 i = pLine->GetStartPortion(); i <= pLine->GetEndPortion(); 
i++ )
+    for ( sal_Int32 i = rLine.GetStartPortion(); i <= rLine.GetEndPortion(); 
i++ )
     {
         const TextPortion& rPortion = pParaPortion->GetTextPortions()[i];
-        tools::Long nXLeft = GetPortionXOffset( pParaPortion, pLine, i );
+        tools::Long nXLeft = GetPortionXOffset( pParaPortion, rLine, i );
         tools::Long nXRight = nXLeft + rPortion.GetSize().Width();
         if ( ( nXLeft <= nXPos ) && ( nXRight >= nXPos ) )
         {
@@ -4034,7 +4031,7 @@ sal_Int32 ImpEditEngine::GetChar(
             {
                 sal_Int32 nMax = rPortion.GetLen();
                 sal_Int32 nOffset = -1;
-                sal_Int32 nTmpCurIndex = nChar - pLine->GetStart();
+                sal_Int32 nTmpCurIndex = nChar - rLine.GetStart();
 
                 tools::Long nXInPortion = nXPos - nXLeft;
                 if ( rPortion.IsRightToLeft() )
@@ -4043,11 +4040,11 @@ sal_Int32 ImpEditEngine::GetChar(
                 // Search in Array...
                 for ( sal_Int32 x = 0; x < nMax; x++ )
                 {
-                    tools::Long nTmpPosMax = 
pLine->GetCharPosArray()[nTmpCurIndex+x];
+                    tools::Long nTmpPosMax = 
rLine.GetCharPosArray()[nTmpCurIndex+x];
                     if ( nTmpPosMax > nXInPortion )
                     {
                         // Check whether this or the previous...
-                        tools::Long nTmpPosMin = x ? 
pLine->GetCharPosArray()[nTmpCurIndex+x-1] : 0;
+                        tools::Long nTmpPosMin = x ? 
rLine.GetCharPosArray()[nTmpCurIndex+x-1] : 0;
                         tools::Long nDiffLeft = nXInPortion - nTmpPosMin;
                         tools::Long nDiffRight = nTmpPosMax - nXInPortion;
                         OSL_ENSURE( nDiffLeft >= 0, "DiffLeft negative" );
@@ -4058,8 +4055,8 @@ sal_Int32 ImpEditEngine::GetChar(
                             // I18N: If there are character position with the 
length of 0,
                             // they belong to the same character, we can not 
use this position as an index.
                             // Skip all 0-positions, cheaper than using 
XBreakIterator:
-                            tools::Long nX = 
pLine->GetCharPosArray()[nTmpCurIndex + x];
-                            while(x < nMax && 
pLine->GetCharPosArray()[nTmpCurIndex + x] == nX)
+                            tools::Long nX = 
rLine.GetCharPosArray()[nTmpCurIndex + x];
+                            while(x < nMax && 
rLine.GetCharPosArray()[nTmpCurIndex + x] == nX)
                                 ++x;
                         }
                         nOffset = x;
@@ -4112,38 +4109,36 @@ sal_Int32 ImpEditEngine::GetChar(
 
     if ( nChar == -1 )
     {
-        nChar = ( nXPos <= pLine->GetStartPosX() ) ? pLine->GetStart() : 
pLine->GetEnd();
+        nChar = ( nXPos <= rLine.GetStartPosX() ) ? rLine.GetStart() : 
rLine.GetEnd();
     }
 
     return nChar;
 }
 
-Range ImpEditEngine::GetLineXPosStartEnd( const ParaPortion* pParaPortion, 
const EditLine* pLine ) const
+Range ImpEditEngine::GetLineXPosStartEnd(const ParaPortion* pParaPortion, 
EditLine const& rLine) const
 {
     Range aLineXPosStartEnd;
 
     sal_Int32 nPara = GetEditDoc().GetPos( pParaPortion->GetNode() );
     if ( !IsRightToLeft( nPara ) )
     {
-        aLineXPosStartEnd.Min() = pLine->GetStartPosX();
-        aLineXPosStartEnd.Max() = pLine->GetStartPosX() + 
pLine->GetTextWidth();
+        aLineXPosStartEnd.Min() = rLine.GetStartPosX();
+        aLineXPosStartEnd.Max() = rLine.GetStartPosX() + rLine.GetTextWidth();
     }
     else
     {
-        aLineXPosStartEnd.Min() = GetPaperSize().Width() - ( 
pLine->GetStartPosX() + pLine->GetTextWidth() );
-        aLineXPosStartEnd.Max() = GetPaperSize().Width() - 
pLine->GetStartPosX();
+        aLineXPosStartEnd.Min() = GetPaperSize().Width() - 
(rLine.GetStartPosX() + rLine.GetTextWidth());
+        aLineXPosStartEnd.Max() = GetPaperSize().Width() - 
rLine.GetStartPosX();
     }
 
-
     return aLineXPosStartEnd;
 }
 
-tools::Long ImpEditEngine::GetPortionXOffset(
-    const ParaPortion* pParaPortion, const EditLine* pLine, sal_Int32 
nTextPortion) const
+tools::Long ImpEditEngine::GetPortionXOffset(const ParaPortion* pParaPortion, 
EditLine const& rLine, sal_Int32 nTextPortion) const
 {
-    tools::Long nX = pLine->GetStartPosX();
+    tools::Long nX = rLine.GetStartPosX();
 
-    for ( sal_Int32 i = pLine->GetStartPortion(); i < nTextPortion; i++ )
+    for ( sal_Int32 i = rLine.GetStartPortion(); i < nTextPortion; i++ )
     {
         const TextPortion& rPortion = pParaPortion->GetTextPortions()[i];
         switch ( rPortion.GetKind() )
@@ -4170,7 +4165,7 @@ tools::Long ImpEditEngine::GetPortionXOffset(
         {
             // Portions behind must be added, visual before this portion
             sal_Int32 nTmpPortion = nTextPortion+1;
-            while ( nTmpPortion <= pLine->GetEndPortion() )
+            while ( nTmpPortion <= rLine.GetEndPortion() )
             {
                 const TextPortion& rNextTextPortion = 
pParaPortion->GetTextPortions()[nTmpPortion];
                 if ( rNextTextPortion.GetRightToLeftLevel() && ( 
rNextTextPortion.GetKind() != PortionKind::TAB ) )
@@ -4181,7 +4176,7 @@ tools::Long ImpEditEngine::GetPortionXOffset(
             }
-e 
... etc. - the rest is truncated

Reply via email to