include/vcl/outdev.hxx        |    2 
 include/vcl/vcllayout.hxx     |    2 
 vcl/inc/sallayout.hxx         |    4 -
 vcl/inc/textlayout.hxx        |    6 --
 vcl/source/control/edit.cxx   |   74 +++++++++++-----------------------
 vcl/source/gdi/sallayout.cxx  |   90 ++++++++++++++++++++++++++++--------------
 vcl/source/gdi/textlayout.cxx |   17 -------
 vcl/source/outdev/text.cxx    |   46 ++++++++++++++-------
 8 files changed, 119 insertions(+), 122 deletions(-)

New commits:
commit 21013c4662a9ab32d293de263c54ebeceb66828c
Author:     Khaled Hosny <kha...@libreoffice.org>
AuthorDate: Wed Jul 19 19:07:34 2023 +0300
Commit:     خالد حسني <kha...@libreoffice.org>
CommitDate: Sun Jul 23 06:05:02 2023 +0200

    tdf#156377: Improve cursor traversal in UI widgets
    
    Re-implement GetCaretPositions() on top of GetCharWidths() so it can
    benefit from our code that handles cursor insertion in middle of
    ligatures.
    
    Change-Id: I2b76b3b0125f2454f78cb6779d88617dc29386fe
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154660
    Tested-by: Jenkins
    Reviewed-by: خالد حسني <kha...@libreoffice.org>

diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 7e0a17fec545..f3d2e912d0a6 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -1047,7 +1047,7 @@ public:
                                               vcl::text::TextLayoutCache 
const* = nullptr,
                                               SalLayoutGlyphs const*const 
pLayoutCache = nullptr) const;
 
-    void                        GetCaretPositions( const OUString&, sal_Int32* 
pCaretXArray,
+    void                        GetCaretPositions( const OUString&, KernArray& 
rCaretXArray,
                                               sal_Int32 nIndex, sal_Int32 nLen,
                                               const SalLayoutGlyphs* pGlyphs = 
nullptr ) const;
     void                        DrawStretchText( const Point& rStartPt, 
sal_Int32 nWidth,
diff --git a/include/vcl/vcllayout.hxx b/include/vcl/vcllayout.hxx
index dda07f1c710e..7c7a179b9b05 100644
--- a/include/vcl/vcllayout.hxx
+++ b/include/vcl/vcllayout.hxx
@@ -96,7 +96,7 @@ public:
     virtual sal_Int32 GetTextBreak(double nMaxWidth, double nCharExtra, int 
nFactor) const = 0;
     virtual double  FillDXArray( std::vector<double>* pDXArray, const 
OUString& rStr ) const = 0;
     virtual double  GetTextWidth() const { return FillDXArray( nullptr, {} ); }
-    virtual void    GetCaretPositions( int nArraySize, sal_Int32* pCaretXArray 
) const = 0;
+    virtual void    GetCaretPositions( std::vector<double>& rCaretPositions, 
const OUString& rStr ) const = 0;
     virtual bool    IsKashidaPosValid ( int /*nCharPos*/, int /*nNextCharPos*/ 
) const = 0; // i60594
 
     // methods using glyph indexing
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index f96eb7df2977..dbe3000f8a83 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -64,7 +64,7 @@ public:
     sal_Int32       GetTextBreak(double nMaxWidth, double nCharExtra, int 
nFactor) const override;
     double          GetTextWidth() const final override;
     double          FillDXArray(std::vector<double>* pDXArray, const OUString& 
rStr) const override;
-    void            GetCaretPositions(int nArraySize, sal_Int32* pCaretXArray) 
const override;
+    void            GetCaretPositions(std::vector<double>& rCaretPositions, 
const OUString& rStr) const override;
     bool            GetNextGlyph(const GlyphItem** pGlyph, basegfx::B2DPoint& 
rPos, int& nStart,
                                  const LogicalFontInstance** ppGlyphFont = 
nullptr) const override;
     bool            GetOutline(basegfx::B2DPolyPolygonVector&) const override;
@@ -120,7 +120,7 @@ public:
     double          GetTextWidth() const final override;
     double          FillDXArray(std::vector<double>* pDXArray, const OUString& 
rStr) const final override;
     sal_Int32       GetTextBreak(double nMaxWidth, double nCharExtra, int 
nFactor) const final override;
-    void            GetCaretPositions(int nArraySize, sal_Int32* pCaretXArray) 
const final override;
+    void            GetCaretPositions(std::vector<double>& rCaretPositions, 
const OUString& rStr) const override;
 
     // used by display layers
     LogicalFontInstance& GetFont() const
diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx
index 10c68412a627..0db27e8a315a 100644
--- a/vcl/source/control/edit.cxx
+++ b/vcl/source/control/edit.cxx
@@ -473,20 +473,9 @@ void Edit::ImplRepaint(vcl::RenderContext& rRenderContext, 
const tools::Rectangl
     const OUString aText = ImplGetText();
     const sal_Int32 nLen = aText.getLength();
 
-    sal_Int32 nDXBuffer[256];
-    std::unique_ptr<sal_Int32[]> pDXBuffer;
-    sal_Int32* pDX = nDXBuffer;
-
+    KernArray aDX;
     if (nLen)
-    {
-        if (o3tl::make_unsigned(2 * nLen) > SAL_N_ELEMENTS(nDXBuffer))
-        {
-            pDXBuffer.reset(new sal_Int32[2 * (nLen + 1)]);
-            pDX = pDXBuffer.get();
-        }
-
-        GetOutDev()->GetCaretPositions(aText, pDX, 0, nLen);
-    }
+        GetOutDev()->GetCaretPositions(aText, aDX, 0, nLen);
 
     tools::Long nTH = GetTextHeight();
     Point aPos(mnXOffset, ImplGetTextYPosition());
@@ -548,8 +537,8 @@ void Edit::ImplRepaint(vcl::RenderContext& rRenderContext, 
const tools::Rectangl
         for(sal_Int32 i = 0; i < nLen; ++i)
         {
             tools::Rectangle aRect(aPos, Size(10, nTH));
-            aRect.SetLeft( pDX[2 * i] + mnXOffset + ImplGetExtraXOffset() );
-            aRect.SetRight( pDX[2 * i + 1] + mnXOffset + ImplGetExtraXOffset() 
);
+            aRect.SetLeft( aDX[2 * i] + mnXOffset + ImplGetExtraXOffset() );
+            aRect.SetRight( aDX[2 * i + 1] + mnXOffset + ImplGetExtraXOffset() 
);
             aRect.Normalize();
             bool bHighlight = false;
             if (i >= aTmpSel.Min() && i < aTmpSel.Max())
@@ -626,8 +615,8 @@ void Edit::ImplRepaint(vcl::RenderContext& rRenderContext, 
const tools::Rectangl
                     while (nIndex < mpIMEInfos->nLen && 
mpIMEInfos->pAttribs[nIndex] == nAttr)  // #112631# check nIndex before using it
                     {
                         tools::Rectangle aRect( aPos, Size( 10, nTH ) );
-                        aRect.SetLeft( pDX[2 * (nIndex + mpIMEInfos->nPos)] + 
mnXOffset + ImplGetExtraXOffset() );
-                        aRect.SetRight( pDX[2 * (nIndex + mpIMEInfos->nPos) + 
1] + mnXOffset + ImplGetExtraXOffset() );
+                        aRect.SetLeft( aDX[2 * (nIndex + mpIMEInfos->nPos)] + 
mnXOffset + ImplGetExtraXOffset() );
+                        aRect.SetRight( aDX[2 * (nIndex + mpIMEInfos->nPos) + 
1] + mnXOffset + ImplGetExtraXOffset() );
                         aRect.Normalize();
                         aClip.Union(aRect);
                         nIndex++;
@@ -1072,24 +1061,15 @@ void Edit::ImplShowCursor( bool bOnlyIfVisible )
 
     tools::Long nTextPos = 0;
 
-    sal_Int32   nDXBuffer[256];
-    std::unique_ptr<sal_Int32[]> pDXBuffer;
-    sal_Int32*  pDX = nDXBuffer;
-
     if( !aText.isEmpty() )
     {
-        if( o3tl::make_unsigned(2*aText.getLength()) > 
SAL_N_ELEMENTS(nDXBuffer) )
-        {
-            pDXBuffer.reset(new sal_Int32[2*(aText.getLength()+1)]);
-            pDX = pDXBuffer.get();
-        }
-
-        GetOutDev()->GetCaretPositions( aText, pDX, 0, aText.getLength() );
+        KernArray aDX;
+        GetOutDev()->GetCaretPositions(aText, aDX, 0, aText.getLength());
 
         if( maSelection.Max() < aText.getLength() )
-            nTextPos = pDX[ 2*maSelection.Max() ];
+            nTextPos = aDX[ 2*maSelection.Max() ];
         else
-            nTextPos = pDX[ 2*aText.getLength()-1 ];
+            nTextPos = aDX[ 2*aText.getLength()-1 ];
     }
 
     tools::Long nCursorWidth = 0;
@@ -1196,31 +1176,26 @@ sal_Int32 Edit::ImplGetCharPos( const Point& rWindowPos 
) const
     sal_Int32 nIndex = EDIT_NOLIMIT;
     OUString aText = ImplGetText();
 
-    sal_Int32   nDXBuffer[256];
-    std::unique_ptr<sal_Int32[]> pDXBuffer;
-    sal_Int32*  pDX = nDXBuffer;
-    if( o3tl::make_unsigned(2*aText.getLength()) > SAL_N_ELEMENTS(nDXBuffer) )
-    {
-        pDXBuffer.reset(new sal_Int32[2*(aText.getLength()+1)]);
-        pDX = pDXBuffer.get();
-    }
+    if (aText.isEmpty())
+        return nIndex;
 
-    GetOutDev()->GetCaretPositions( aText, pDX, 0, aText.getLength() );
+    KernArray aDX;
+    GetOutDev()->GetCaretPositions(aText, aDX, 0, aText.getLength());
     tools::Long nX = rWindowPos.X() - mnXOffset - ImplGetExtraXOffset();
     for (sal_Int32 i = 0; i < aText.getLength(); aText.iterateCodePoints(&i))
     {
-        if( (pDX[2*i] >= nX && pDX[2*i+1] <= nX) ||
-            (pDX[2*i+1] >= nX && pDX[2*i] <= nX))
+        if( (aDX[2*i] >= nX && aDX[2*i+1] <= nX) ||
+            (aDX[2*i+1] >= nX && aDX[2*i] <= nX))
         {
             nIndex = i;
-            if( pDX[2*i] < pDX[2*i+1] )
+            if( aDX[2*i] < aDX[2*i+1] )
             {
-                if( nX > (pDX[2*i]+pDX[2*i+1])/2 )
+                if( nX > (aDX[2*i]+aDX[2*i+1])/2 )
                     aText.iterateCodePoints(&nIndex);
             }
             else
             {
-                if( nX < (pDX[2*i]+pDX[2*i+1])/2 )
+                if( nX < (aDX[2*i]+aDX[2*i+1])/2 )
                     aText.iterateCodePoints(&nIndex);
             }
             break;
@@ -1230,7 +1205,7 @@ sal_Int32 Edit::ImplGetCharPos( const Point& rWindowPos ) 
const
     {
         nIndex = 0;
         sal_Int32 nFinalIndex = 0;
-        tools::Long nDiff = std::abs( pDX[0]-nX );
+        tools::Long nDiff = std::abs( aDX[0]-nX );
         sal_Int32 i = 0;
         if (!aText.isEmpty())
         {
@@ -1238,7 +1213,7 @@ sal_Int32 Edit::ImplGetCharPos( const Point& rWindowPos ) 
const
         }
         while (i < aText.getLength())
         {
-            tools::Long nNewDiff = std::abs( pDX[2*i]-nX );
+            tools::Long nNewDiff = std::abs( aDX[2*i]-nX );
 
             if( nNewDiff < nDiff )
             {
@@ -1250,7 +1225,7 @@ sal_Int32 Edit::ImplGetCharPos( const Point& rWindowPos ) 
const
 
             aText.iterateCodePoints(&i);
         }
-        if (nIndex == nFinalIndex && std::abs( pDX[2*nIndex+1] - nX ) < nDiff)
+        if (nIndex == nFinalIndex && std::abs( aDX[2*nIndex+1] - nX ) < nDiff)
             nIndex = EDIT_NOLIMIT;
     }
 
@@ -2162,9 +2137,8 @@ void Edit::Command( const CommandEvent& rCEvt )
         if (mpIMEInfos && mpIMEInfos->nLen > 0)
         {
             OUString aText = ImplGetText();
-            std::vector<sal_Int32> aDX(2*(aText.getLength()+1));
-
-            GetOutDev()->GetCaretPositions( aText, aDX.data(), 0, 
aText.getLength() );
+            KernArray aDX;
+            GetOutDev()->GetCaretPositions(aText, aDX, 0, aText.getLength());
 
             tools::Long    nTH = GetTextHeight();
             Point   aPos( mnXOffset, ImplGetTextYPosition() );
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index 65bf46f1dec0..af281127ba86 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -439,33 +439,57 @@ void 
GenericSalLayout::ApplyAsianKerning(std::u16string_view rStr)
     }
 }
 
-void GenericSalLayout::GetCaretPositions( int nMaxIndex, sal_Int32* 
pCaretXArray ) const
+void GenericSalLayout::GetCaretPositions(std::vector<double>& rCaretPositions,
+                                         const OUString& rStr) const
 {
-    // initialize result array
-    for (int i = 0; i < nMaxIndex; ++i)
-        pCaretXArray[i] = -1;
+    const int nCaretPositions = (mnEndCharPos - mnMinCharPos) * 2;
+
+    rCaretPositions.clear();
+    rCaretPositions.resize(nCaretPositions, -1);
+
+    if (m_GlyphItems.empty())
+        return;
+
+    std::vector<double> aCharWidths;
+    GetCharWidths(aCharWidths, rStr);
 
     // calculate caret positions using glyph array
     for (auto const& aGlyphItem : m_GlyphItems)
     {
-        tools::Long nXPos = aGlyphItem.linearPos().getX();
-        tools::Long nXRight = nXPos + aGlyphItem.origWidth();
-        int n = aGlyphItem.charPos();
-        int nCurrIdx = 2 * (n - mnMinCharPos);
-        // tdf#86399 if this is not the start of a cluster, don't overwrite 
the caret bounds of the cluster start
-        if (aGlyphItem.IsInCluster() && pCaretXArray[nCurrIdx] != -1)
-            continue;
-        if (!aGlyphItem.IsRTLGlyph() )
+        auto nCurrX = aGlyphItem.linearPos().getX() - aGlyphItem.xOffset();
+        auto nCharStart = aGlyphItem.charPos();
+        auto nCharEnd = nCharStart + aGlyphItem.charCount() - 1;
+        if (!aGlyphItem.IsRTLGlyph())
         {
-            // normal positions for LTR case
-            pCaretXArray[ nCurrIdx ]   = nXPos;
-            pCaretXArray[ nCurrIdx+1 ] = nXRight;
+            // unchanged positions for LTR case
+            for (int i = nCharStart; i <= nCharEnd; i++)
+            {
+                int n = i - mnMinCharPos;
+                int nCurrIdx = 2 * n;
+
+                auto nLeft = nCurrX;
+                nCurrX += aCharWidths[n];
+                auto nRight = nCurrX;
+
+                rCaretPositions[nCurrIdx] = nLeft;
+                rCaretPositions[nCurrIdx + 1] = nRight;
+            }
         }
         else
         {
             // reverse positions for RTL case
-            pCaretXArray[ nCurrIdx ]   = nXRight;
-            pCaretXArray[ nCurrIdx+1 ] = nXPos;
+            for (int i = nCharEnd; i >= nCharStart; i--)
+            {
+                int n = i - mnMinCharPos;
+                int nCurrIdx = 2 * n;
+
+                auto nRight = nCurrX;
+                nCurrX += aCharWidths[n];
+                auto nLeft = nCurrX;
+
+                rCaretPositions[nCurrIdx] = nLeft;
+                rCaretPositions[nCurrIdx + 1] = nRight;
+            }
         }
     }
 }
@@ -1054,21 +1078,29 @@ double MultiSalLayout::FillDXArray( 
std::vector<double>* pCharWidths, const OUSt
     return GetTextWidth();
 }
 
-void MultiSalLayout::GetCaretPositions( int nMaxIndex, sal_Int32* pCaretXArray 
) const
+void MultiSalLayout::GetCaretPositions(std::vector<double>& rCaretPositions,
+                                       const OUString& rStr) const
 {
-    SalLayout& rLayout = *mpLayouts[ 0 ];
-    rLayout.GetCaretPositions( nMaxIndex, pCaretXArray );
-
-    if( mnLevel <= 1 )
-        return;
+    // prepare merging of fallback levels
+    std::vector<double> aTempPos;
+    const int nCaretPositions = (mnEndCharPos - mnMinCharPos) * 2;
+    rCaretPositions.clear();
+    rCaretPositions.resize(nCaretPositions, -1);
 
-    std::unique_ptr<sal_Int32[]> const pTempPos(new sal_Int32[nMaxIndex]);
-    for( int n = 1; n < mnLevel; ++n )
+    for (int n = mnLevel; --n >= 0;)
     {
-        mpLayouts[ n ]->GetCaretPositions( nMaxIndex, pTempPos.get() );
-        for( int i = 0; i < nMaxIndex; ++i )
-            if( pTempPos[i] >= 0 )
-                pCaretXArray[i] = pTempPos[i];
+        // query every fallback level
+        mpLayouts[n]->GetCaretPositions(aTempPos, rStr);
+
+        // calculate virtual char widths using most probable fallback layout
+        for (int i = 0; i < nCaretPositions; ++i)
+        {
+            // one char cannot be resolved from different fallbacks
+            if (rCaretPositions[i] != -1)
+                continue;
+            if (aTempPos[i] >= 0)
+                rCaretPositions[i] = aTempPos[i];
+        }
     }
 }
 
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index aaa165b8f208..435110ab5bdd 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -1035,7 +1035,7 @@ tools::Long OutputDevice::GetTextArray( const OUString& 
rStr, KernArray* pKernAr
     return basegfx::fround(nWidth);
 }
 
-void OutputDevice::GetCaretPositions( const OUString& rStr, sal_Int32* 
pCaretXArray,
+void OutputDevice::GetCaretPositions( const OUString& rStr, KernArray& 
rCaretXArray,
                                       sal_Int32 nIndex, sal_Int32 nLen,
                                       const SalLayoutGlyphs* pGlyphs ) const
 {
@@ -1045,45 +1045,59 @@ void OutputDevice::GetCaretPositions( const OUString& 
rStr, sal_Int32* pCaretXAr
     if( nIndex+nLen >= rStr.getLength() )
         nLen = rStr.getLength() - nIndex;
 
-    // layout complex text
+    sal_Int32 nCaretPos = nLen * 2;
+    std::vector<sal_Int32>& rCaretPos = rCaretXArray.get_subunit_array();
+    rCaretPos.resize(nCaretPos);
+
+    // do layout
     std::unique_ptr<SalLayout> pSalLayout = ImplLayout(rStr, nIndex, nLen, 
Point(0, 0), 0, {}, {},
                                                        eDefaultLayout, 
nullptr, pGlyphs);
     if( !pSalLayout )
     {
-        std::fill(pCaretXArray, pCaretXArray + nLen * 2, -1);
+        std::fill(rCaretPos.begin(), rCaretPos.end(), -1);
         return;
     }
 
-    pSalLayout->GetCaretPositions( 2*nLen, pCaretXArray );
-    double nWidth = pSalLayout->GetTextWidth();
+    std::vector<double> aCaretPixelPos;
+    pSalLayout->GetCaretPositions(aCaretPixelPos, rStr);
 
     // fixup unknown caret positions
     int i;
-    for( i = 0; i < 2 * nLen; ++i )
-        if( pCaretXArray[ i ] >= 0 )
+    for (i = 0; i < nCaretPos; ++i)
+        if (aCaretPixelPos[i] >= 0)
             break;
-    tools::Long nXPos = (i < 2 * nLen) ? pCaretXArray[i] : -1;
-    for( i = 0; i < 2 * nLen; ++i )
+    tools::Long nXPos = (i < nCaretPos) ? aCaretPixelPos[i] : -1;
+    for (i = 0; i < nCaretPos; ++i)
     {
-        if( pCaretXArray[ i ] >= 0 )
-            nXPos = pCaretXArray[ i ];
+        if (aCaretPixelPos[i] >= 0)
+            nXPos = aCaretPixelPos[i];
         else
-            pCaretXArray[ i ] = nXPos;
+            aCaretPixelPos[i] = nXPos;
     }
 
     // handle window mirroring
     if( IsRTLEnabled() )
     {
-        for( i = 0; i < 2 * nLen; ++i )
-            pCaretXArray[i] = nWidth - pCaretXArray[i] - 1;
+        double nWidth = pSalLayout->GetTextWidth();
+        for (i = 0; i < nCaretPos; ++i)
+            aCaretPixelPos[i] = nWidth - aCaretPixelPos[i] - 1;
     }
 
+    int nSubPixelFactor = rCaretXArray.get_factor();
     // convert from font units to logical units
     if( mbMap )
     {
-        for( i = 0; i < 2*nLen; ++i )
-            pCaretXArray[i] = ImplDevicePixelToLogicWidth( pCaretXArray[i] );
+        for (i = 0; i < nCaretPos; ++i)
+            aCaretPixelPos[i] = ImplDevicePixelToLogicWidth(aCaretPixelPos[i] 
* nSubPixelFactor);
     }
+    else if (nSubPixelFactor)
+    {
+        for (i = 0; i < nCaretPos; ++i)
+            aCaretPixelPos[i] *= nSubPixelFactor;
+    }
+
+    for (i = 0; i < nCaretPos; ++i)
+        rCaretPos[i] = basegfx::fround(aCaretPixelPos[i]);
 }
 
 void OutputDevice::DrawStretchText( const Point& rStartPt, sal_Int32 nWidth,
commit 620fdb3a93e07eb87884ce3de8e436d840dc79e1
Author:     Khaled Hosny <kha...@libreoffice.org>
AuthorDate: Wed Jul 19 13:40:03 2023 +0300
Commit:     خالد حسني <kha...@libreoffice.org>
CommitDate: Sun Jul 23 06:04:55 2023 +0200

    vcl: Drop recently unused ITextLayout::GetCaretPositions()
    
    Change-Id: Ibabdeee029f19133afc5ff766cf1256a394362fb
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154649
    Tested-by: Jenkins
    Reviewed-by: خالد حسني <kha...@libreoffice.org>

diff --git a/vcl/inc/textlayout.hxx b/vcl/inc/textlayout.hxx
index 311938acdb18..05be8adacb9d 100644
--- a/vcl/inc/textlayout.hxx
+++ b/vcl/inc/textlayout.hxx
@@ -32,7 +32,6 @@ namespace vcl
         virtual tools::Long        GetTextWidth( const OUString& _rText, 
sal_Int32 _nStartIndex, sal_Int32 _nLength ) const = 0;
         virtual void        DrawText( const Point& _rStartPoint, const 
OUString& _rText, sal_Int32 _nStartIndex, sal_Int32 _nLength,
                                 std::vector< tools::Rectangle >* _pVector, 
OUString* _pDisplayText ) = 0;
-        virtual void        GetCaretPositions( const OUString& _rText, 
sal_Int32* _pCaretXArray, sal_Int32 _nStartIndex, sal_Int32 _nLength ) const = 
0;
         virtual tools::Long GetTextArray( const OUString& _rText, KernArray* 
_pDXArray, sal_Int32 _nStartIndex, sal_Int32 _nLength, bool bCaret = false ) 
const = 0;
         virtual sal_Int32   GetTextBreak( const OUString& _rText, tools::Long 
_nMaxTextWidth, sal_Int32 _nStartIndex, sal_Int32 _nLength ) const = 0;
         virtual bool        DecomposeTextRectAction() const = 0;
@@ -65,11 +64,6 @@ namespace vcl
                                       std::vector< tools::Rectangle >* 
_pVector,
                                       OUString* _pDisplayText ) override;
 
-        virtual void        GetCaretPositions( const OUString& _rText,
-                                               sal_Int32* _pCaretXArray,
-                                               sal_Int32 _nStartIndex,
-                                               sal_Int32 _nLength ) const 
override;
-
         virtual tools::Long GetTextArray( const OUString& _rText,
                                           KernArray* _pDXArray,
                                           sal_Int32 _nStartIndex,
diff --git a/vcl/source/gdi/textlayout.cxx b/vcl/source/gdi/textlayout.cxx
index 715811a3d153..dd559ac470dc 100644
--- a/vcl/source/gdi/textlayout.cxx
+++ b/vcl/source/gdi/textlayout.cxx
@@ -52,12 +52,6 @@ namespace vcl
         m_rTargetDevice.DrawText( _rStartPoint, _rText, _nStartIndex, 
_nLength, _pVector, _pDisplayText );
     }
 
-    void DefaultTextLayout::GetCaretPositions( const OUString& _rText, 
sal_Int32* _pCaretXArray,
-        sal_Int32 _nStartIndex, sal_Int32 _nLength ) const
-    {
-        m_rTargetDevice.GetCaretPositions( _rText, _pCaretXArray, 
_nStartIndex, _nLength );
-    }
-
     tools::Long DefaultTextLayout::GetTextArray( const OUString& _rText, 
KernArray* _pDXArray,
         sal_Int32 _nStartIndex, sal_Int32 _nLength, bool bCaret ) const
     {
@@ -83,7 +77,6 @@ namespace vcl
         // ITextLayout
         virtual tools::Long        GetTextWidth( const OUString& rStr, 
sal_Int32 nIndex, sal_Int32 nLen ) const override;
         virtual void        DrawText( const Point& _rStartPoint, const 
OUString& _rText, sal_Int32 _nStartIndex, sal_Int32 _nLength, std::vector< 
tools::Rectangle >* _pVector, OUString* _pDisplayText ) override;
-        virtual void        GetCaretPositions( const OUString& _rText, 
sal_Int32* _pCaretXArray, sal_Int32 _nStartIndex, sal_Int32 _nLength ) const 
override;
         virtual tools::Long GetTextArray( const OUString& _rText, KernArray* 
_pDXAry, sal_Int32 _nStartIndex, sal_Int32 _nLength, bool bCaret = false ) 
const override;
         virtual sal_Int32   GetTextBreak(const OUString& _rText, tools::Long 
_nMaxTextWidth, sal_Int32 _nStartIndex, sal_Int32 _nLength) const override;
         virtual bool        DecomposeTextRectAction() const override;
@@ -221,16 +214,6 @@ namespace vcl
         m_aCompleteTextRect.Union( tools::Rectangle( _rStartPoint, Size( 
nTextWidth, m_rTargetDevice.GetTextHeight() ) ) );
     }
 
-    void ReferenceDeviceTextLayout::GetCaretPositions( const OUString& _rText, 
sal_Int32* _pCaretXArray,
-                                                       sal_Int32 _nStartIndex, 
sal_Int32 _nLength ) const
-    {
-        if ( !lcl_normalizeLength( _rText, _nStartIndex, _nLength ) )
-            return;
-
-        // retrieve the caret positions from the reference device
-        m_rReferenceDevice.GetCaretPositions( _rText, _pCaretXArray, 
_nStartIndex, _nLength );
-    }
-
     sal_Int32 ReferenceDeviceTextLayout::GetTextBreak( const OUString& _rText, 
tools::Long _nMaxTextWidth, sal_Int32 _nStartIndex, sal_Int32 _nLength ) const
     {
         if ( !lcl_normalizeLength( _rText, _nStartIndex, _nLength ) )

Reply via email to