summaryrefslogtreecommitdiff
path: root/editeng/source/items/svxfont.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'editeng/source/items/svxfont.cxx')
-rw-r--r--editeng/source/items/svxfont.cxx297
1 files changed, 198 insertions, 99 deletions
diff --git a/editeng/source/items/svxfont.cxx b/editeng/source/items/svxfont.cxx
index d4370e9b00de..a4367de4680e 100644
--- a/editeng/source/items/svxfont.cxx
+++ b/editeng/source/items/svxfont.cxx
@@ -17,6 +17,9 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
+#include <editeng/svxfont.hxx>
+
+#include <vcl/glyphitemcache.hxx>
#include <vcl/metric.hxx>
#include <vcl/outdev.hxx>
#include <vcl/print.hxx>
@@ -25,13 +28,22 @@
#include <tools/poly.hxx>
#include <unotools/charclass.hxx>
#include <com/sun/star/i18n/KCharacterType.hpp>
-#include <editeng/svxfont.hxx>
#include <editeng/escapementitem.hxx>
+#include <editeng/smallcaps.hxx>
#include <sal/log.hxx>
+#include <limits>
+
+static tools::Long GetTextArray( const OutputDevice* pOut, const OUString& rStr, KernArray* pDXAry,
+ sal_Int32 nIndex, sal_Int32 nLen )
+
+{
+ const SalLayoutGlyphs* layoutGlyphs = SalLayoutGlyphsCache::self()->GetLayoutGlyphs(pOut, rStr, nIndex, nLen);
+ return pOut->GetTextArray( rStr, pDXAry, nIndex, nLen, true, nullptr, layoutGlyphs);
+}
SvxFont::SvxFont()
{
- nKern = nEsc = 0;
+ nEsc = 0;
nPropr = 100;
eCaseMap = SvxCaseMap::NotMapped;
SetLanguage(LANGUAGE_SYSTEM);
@@ -40,7 +52,7 @@ SvxFont::SvxFont()
SvxFont::SvxFont( const vcl::Font &rFont )
: Font( rFont )
{
- nKern = nEsc = 0;
+ nEsc = 0;
nPropr = 100;
eCaseMap = SvxCaseMap::NotMapped;
SetLanguage(LANGUAGE_SYSTEM);
@@ -49,7 +61,6 @@ SvxFont::SvxFont( const vcl::Font &rFont )
SvxFont::SvxFont( const SvxFont &rFont )
: Font( rFont )
{
- nKern = rFont.GetFixKerning();
nEsc = rFont.GetEscapement();
nPropr = rFont.GetPropr();
eCaseMap = rFont.GetCaseMap();
@@ -162,8 +173,7 @@ OUString SvxFont::CalcCaseMap(const OUString &rTxt) const
const LanguageType eLang = LANGUAGE_DONTKNOW == GetLanguage()
? LANGUAGE_SYSTEM : GetLanguage();
- LanguageTag aLanguageTag(eLang);
- CharClass aCharClass( aLanguageTag );
+ CharClass aCharClass(( LanguageTag(eLang) ));
switch( eCaseMap )
{
@@ -211,40 +221,6 @@ OUString SvxFont::CalcCaseMap(const OUString &rTxt) const
return aTxt;
}
-/*************************************************************************
- * class SvxDoCapitals
- * The virtual Method Do si called by SvxFont::DoOnCapitals alternately
- * the uppercase and lowercase parts. The derivate of SvxDoCapitals fills
- * this method with life.
- *************************************************************************/
-
-class SvxDoCapitals
-{
-protected:
- VclPtr<OutputDevice> pOut;
- const OUString &rTxt;
- const sal_Int32 nIdx;
- const sal_Int32 nLen;
-
-public:
- SvxDoCapitals( OutputDevice *_pOut, const OUString &_rTxt,
- const sal_Int32 _nIdx, const sal_Int32 _nLen )
- : pOut(_pOut), rTxt(_rTxt), nIdx(_nIdx), nLen(_nLen)
- { }
-
- virtual ~SvxDoCapitals() {}
-
- virtual void DoSpace( const bool bDraw );
- virtual void SetSpace();
- virtual void Do( const OUString &rTxt,
- const sal_Int32 nIdx, const sal_Int32 nLen,
- const bool bUpper ) = 0;
-
- const OUString &GetTxt() const { return rTxt; }
- sal_Int32 GetIdx() const { return nIdx; }
- sal_Int32 GetLen() const { return nLen; }
-};
-
void SvxDoCapitals::DoSpace( const bool /*bDraw*/ ) { }
void SvxDoCapitals::SetSpace() { }
@@ -272,8 +248,7 @@ void SvxFont::DoOnCapitals(SvxDoCapitals &rDo) const
const LanguageType eLang = LANGUAGE_DONTKNOW == GetLanguage()
? LANGUAGE_SYSTEM : GetLanguage();
- LanguageTag aLanguageTag(eLang);
- CharClass aCharClass( aLanguageTag );
+ CharClass aCharClass(( LanguageTag(eLang) ));
OUString aCharString;
while( nPos < nTxtLen )
@@ -400,7 +375,7 @@ vcl::Font SvxFont::ChgPhysFont(OutputDevice& rOut) const
Size SvxFont::GetPhysTxtSize( const OutputDevice *pOut, const OUString &rTxt,
const sal_Int32 nIdx, const sal_Int32 nLen ) const
{
- if ( !IsCaseMap() && !IsKern() )
+ if ( !IsCaseMap() && !IsFixKerning() )
return Size( pOut->GetTextWidth( rTxt, nIdx, nLen ),
pOut->GetTextHeight() );
@@ -430,15 +405,30 @@ Size SvxFont::GetPhysTxtSize( const OutputDevice *pOut, const OUString &rTxt,
aTxtSize.setWidth(nWidth);
}
- if( IsKern() && ( nLen > 1 ) )
- aTxtSize.AdjustWidth( ( nLen-1 ) * tools::Long( nKern ) );
+ if( IsFixKerning() && ( nLen > 1 ) )
+ {
+ auto nKern = GetFixKerning();
+ KernArray aDXArray;
+ GetTextArray(pOut, rTxt, &aDXArray, nIdx, nLen);
+ tools::Long nOldValue = aDXArray[0];
+ sal_Int32 nSpaceCount = 0;
+ for(sal_Int32 i = 1; i < nLen; ++i)
+ {
+ if (aDXArray[i] != nOldValue)
+ {
+ nOldValue = aDXArray[i];
+ ++nSpaceCount;
+ }
+ }
+ aTxtSize.AdjustWidth( nSpaceCount * tools::Long( nKern ) );
+ }
return aTxtSize;
}
Size SvxFont::GetPhysTxtSize( const OutputDevice *pOut )
{
- if ( !IsCaseMap() && !IsKern() )
+ if ( !IsCaseMap() && !IsFixKerning() )
return Size( pOut->GetTextWidth( "" ), pOut->GetTextHeight() );
Size aTxtSize;
@@ -452,32 +442,67 @@ Size SvxFont::GetPhysTxtSize( const OutputDevice *pOut )
}
Size SvxFont::QuickGetTextSize( const OutputDevice *pOut, const OUString &rTxt,
- const sal_Int32 nIdx, const sal_Int32 nLen, std::vector<sal_Int32>* pDXArray ) const
+ const sal_Int32 nIdx, const sal_Int32 nLen, KernArray* pDXArray, bool bStacked ) const
{
- if ( !IsCaseMap() && !IsKern() )
- return Size( pOut->GetTextArray( rTxt, pDXArray, nIdx, nLen ),
+ if ( !IsCaseMap() && !IsFixKerning() )
+ {
+ SAL_INFO( "editeng.quicktextsize", "SvxFont::QuickGetTextSize before GetTextArray(): Case map: " << IsCaseMap() << " Fix kerning: " << IsFixKerning());
+ Size aTxtSize( GetTextArray( pOut, rTxt, pDXArray, nIdx, nLen ),
pOut->GetTextHeight() );
+ SAL_INFO( "editeng.quicktextsize", "SvxFont::QuickGetTextSize after GetTextArray(): Text length: " << nLen << " Text size: " << aTxtSize.Width() << "x" << aTxtSize.Height());
+ return aTxtSize;
+ }
+
+ KernArray aDXArray;
+
+ // We always need pDXArray to count the number of kern spaces
+ if (!pDXArray && IsFixKerning() && nLen > 1)
+ {
+ pDXArray = &aDXArray;
+ aDXArray.reserve(nLen);
+ }
Size aTxtSize;
aTxtSize.setHeight( pOut->GetTextHeight() );
+ SAL_INFO( "editeng.quicktextsize", "SvxFont::QuickGetTextSize before GetTextArray(): Case map: " << IsCaseMap() << " Fix kerning: " << IsFixKerning());
if ( !IsCaseMap() )
- aTxtSize.setWidth( pOut->GetTextArray( rTxt, pDXArray, nIdx, nLen ) );
+ aTxtSize.setWidth( GetTextArray( pOut, rTxt, pDXArray, nIdx, nLen ) );
else
- aTxtSize.setWidth( pOut->GetTextArray( CalcCaseMap( rTxt ),
- pDXArray, nIdx, nLen ) );
+ {
+ if (IsCapital() && !rTxt.isEmpty())
+ aTxtSize = GetCapitalSize(pOut, rTxt, pDXArray, nIdx, nLen);
+ else
+ aTxtSize.setWidth( GetTextArray( pOut, CalcCaseMap( rTxt ),
+ pDXArray, nIdx, nLen ) );
+ }
+ SAL_INFO( "editeng.quicktextsize", "SvxFont::QuickGetTextSize after GetTextArray(): Text length: " << nLen << " Text size: " << aTxtSize.Width() << "x" << aTxtSize.Height());
- if( IsKern() && ( nLen > 1 ) )
+ if( IsFixKerning() && ( nLen > 1 ) && !bStacked)
{
- aTxtSize.AdjustWidth( ( nLen-1 ) * tools::Long( nKern ) );
+ auto nKern = GetFixKerning();
+ tools::Long nOldValue = (*pDXArray)[0];
+ tools::Long nSpaceSum = nKern;
+ pDXArray->adjust(0, nSpaceSum);
- if ( pDXArray )
+ for ( sal_Int32 i = 1; i < nLen; i++ )
{
- for ( sal_Int32 i = 0; i < nLen; i++ )
- (*pDXArray)[i] += ( (i+1) * tools::Long( nKern ) );
- // The last one is a nKern too big:
- (*pDXArray)[nLen-1] -= nKern;
+ if ( (*pDXArray)[i] != nOldValue )
+ {
+ nOldValue = (*pDXArray)[i];
+ nSpaceSum += nKern;
+ }
+ pDXArray->adjust(i, nSpaceSum);
}
+
+ // The last one is a nKern too big:
+ nOldValue = (*pDXArray)[nLen - 1];
+ tools::Long nNewValue = nOldValue - nKern;
+ for ( sal_Int32 i = nLen - 1; i >= 0 && (*pDXArray)[i] == nOldValue; --i)
+ pDXArray->set(i, nNewValue);
+
+ aTxtSize.AdjustWidth(nSpaceSum - nKern);
}
+
return aTxtSize;
}
@@ -491,22 +516,33 @@ Size SvxFont::GetTextSize(const OutputDevice& rOut, const OUString &rTxt,
Size aTxtSize;
if( IsCapital() && !rTxt.isEmpty() )
{
- aTxtSize = GetCapitalSize(&rOut, rTxt, nIdx, nTmp);
+ aTxtSize = GetCapitalSize(&rOut, rTxt, nullptr, nIdx, nTmp);
}
else aTxtSize = GetPhysTxtSize(&rOut,rTxt,nIdx,nTmp);
const_cast<OutputDevice&>(rOut).SetFont(aOldFont);
return aTxtSize;
}
+static void DrawTextArray( OutputDevice* pOut, const Point& rStartPt, const OUString& rStr,
+ std::span<const sal_Int32> pDXAry,
+ std::span<const sal_Bool> pKashidaAry,
+ sal_Int32 nIndex, sal_Int32 nLen )
+{
+ const SalLayoutGlyphs* layoutGlyphs = SalLayoutGlyphsCache::self()->GetLayoutGlyphs(pOut, rStr, nIndex, nLen);
+ pOut->DrawTextArray(rStartPt, rStr, pDXAry, pKashidaAry, nIndex, nLen, SalLayoutFlags::NONE, layoutGlyphs);
+}
+
void SvxFont::QuickDrawText( OutputDevice *pOut,
const Point &rPos, const OUString &rTxt,
- const sal_Int32 nIdx, const sal_Int32 nLen, o3tl::span<const sal_Int32> pDXArray ) const
+ const sal_Int32 nIdx, const sal_Int32 nLen,
+ std::span<const sal_Int32> pDXArray,
+ std::span<const sal_Bool> pKashidaArray) const
{
// Font has to be selected in OutputDevice...
- if ( !IsCaseMap() && !IsCapital() && !IsKern() && !IsEsc() )
+ if ( !IsCaseMap() && !IsCapital() && !IsFixKerning() && !IsEsc() )
{
- pOut->DrawTextArray( rPos, rTxt, pDXArray, nIdx, nLen );
+ DrawTextArray( pOut, rPos, rTxt, pDXArray, pKashidaArray, nIdx, nLen );
return;
}
@@ -526,12 +562,11 @@ void SvxFont::QuickDrawText( OutputDevice *pOut,
if( IsCapital() )
{
- DBG_ASSERT( pDXArray.empty(), "DrawCapital not for TextArray!" );
- DrawCapital( pOut, aPos, rTxt, nIdx, nLen );
+ DrawCapital( pOut, aPos, rTxt, pDXArray, pKashidaArray, nIdx, nLen );
}
else
{
- if ( IsKern() && pDXArray.empty() )
+ if ( IsFixKerning() && pDXArray.empty() )
{
Size aSize = GetPhysTxtSize( pOut, rTxt, nIdx, nLen );
@@ -543,9 +578,9 @@ void SvxFont::QuickDrawText( OutputDevice *pOut,
else
{
if ( !IsCaseMap() )
- pOut->DrawTextArray( aPos, rTxt, pDXArray, nIdx, nLen );
+ DrawTextArray( pOut, aPos, rTxt, pDXArray, pKashidaArray, nIdx, nLen );
else
- pOut->DrawTextArray( aPos, CalcCaseMap( rTxt ), pDXArray, nIdx, nLen );
+ DrawTextArray( pOut, aPos, CalcCaseMap( rTxt ), pDXArray, pKashidaArray, nIdx, nLen );
}
}
}
@@ -587,7 +622,7 @@ void SvxFont::DrawPrev( OutputDevice *pOut, Printer* pPrinter,
Font aOldPrnFont( ChgPhysFont(*pPrinter) );
if ( IsCapital() )
- DrawCapital( pOut, aPos, rTxt, nIdx, nTmp );
+ DrawCapital( pOut, aPos, rTxt, {}, {}, nIdx, nTmp );
else
{
Size aSize = GetPhysTxtSize( pPrinter, rTxt, nIdx, nTmp );
@@ -631,7 +666,6 @@ SvxFont& SvxFont::operator=( const SvxFont& rFont )
eCaseMap = rFont.eCaseMap;
nEsc = rFont.nEsc;
nPropr = rFont.nPropr;
- nKern = rFont.nKern;
return *this;
}
@@ -640,17 +674,27 @@ namespace {
class SvxDoGetCapitalSize : public SvxDoCapitals
{
protected:
+ VclPtr<OutputDevice> pOut;
SvxFont* pFont;
Size aTxtSize;
short nKern;
+ KernArray* pDXAry;
public:
SvxDoGetCapitalSize( SvxFont *_pFnt, const OutputDevice *_pOut,
- const OUString &_rTxt, const sal_Int32 _nIdx,
+ const OUString &_rTxt, KernArray* _pDXAry, const sal_Int32 _nIdx,
const sal_Int32 _nLen, const short _nKrn )
- : SvxDoCapitals( const_cast<OutputDevice*>(_pOut), _rTxt, _nIdx, _nLen ),
+ : SvxDoCapitals( _rTxt, _nIdx, _nLen ),
+ pOut( const_cast<OutputDevice*>(_pOut) ),
pFont( _pFnt ),
- nKern( _nKrn )
- { }
+ nKern( _nKrn ),
+ pDXAry( _pDXAry )
+ {
+ if (pDXAry)
+ {
+ pDXAry->clear();
+ pDXAry->reserve(_nLen);
+ }
+ }
virtual void Do( const OUString &rTxt, const sal_Int32 nIdx,
const sal_Int32 nLen, const bool bUpper ) override;
@@ -664,31 +708,50 @@ void SvxDoGetCapitalSize::Do( const OUString &_rTxt, const sal_Int32 _nIdx,
const sal_Int32 _nLen, const bool bUpper )
{
Size aPartSize;
+ sal_uInt8 nProp(0);
if ( !bUpper )
{
- sal_uInt8 nProp = pFont->GetPropr();
+ nProp = pFont->GetPropr();
pFont->SetProprRel( SMALL_CAPS_PERCENTAGE );
pFont->SetPhysFont( *pOut );
- aPartSize.setWidth( pOut->GetTextWidth( _rTxt, _nIdx, _nLen ) );
- aPartSize.setHeight( pOut->GetTextHeight() );
- aTxtSize.setHeight( aPartSize.Height() );
- pFont->SetPropr( nProp );
- pFont->SetPhysFont( *pOut );
+ }
+
+ if (pDXAry)
+ {
+ KernArray aKernArray;
+ aPartSize.setWidth(pOut->GetTextArray(_rTxt, &aKernArray, _nIdx, _nLen));
+ assert(pDXAry->get_factor() == aKernArray.get_factor());
+ auto& dest = pDXAry->get_subunit_array();
+ sal_Int32 nStart = dest.empty() ? 0 : dest.back();
+ size_t nSrcLen = aKernArray.size();
+ dest.reserve(dest.size() + nSrcLen);
+ const auto& src = aKernArray.get_subunit_array();
+ for (size_t i = 0; i < nSrcLen; ++i)
+ dest.push_back(src[i] + nStart);
}
else
{
aPartSize.setWidth( pOut->GetTextWidth( _rTxt, _nIdx, _nLen ) );
- aPartSize.setHeight( pOut->GetTextHeight() );
}
+
+ aPartSize.setHeight( pOut->GetTextHeight() );
+
+ if ( !bUpper )
+ {
+ aTxtSize.setHeight( aPartSize.Height() );
+ pFont->SetPropr( nProp );
+ pFont->SetPhysFont( *pOut );
+ }
+
aTxtSize.AdjustWidth(aPartSize.Width() );
aTxtSize.AdjustWidth( _nLen * tools::Long( nKern ) );
}
-Size SvxFont::GetCapitalSize( const OutputDevice *pOut, const OUString &rTxt,
+Size SvxFont::GetCapitalSize( const OutputDevice *pOut, const OUString &rTxt, KernArray* pDXAry,
const sal_Int32 nIdx, const sal_Int32 nLen) const
{
// Start:
- SvxDoGetCapitalSize aDo( const_cast<SvxFont *>(this), pOut, rTxt, nIdx, nLen, nKern );
+ SvxDoGetCapitalSize aDo( const_cast<SvxFont *>(this), pOut, rTxt, pDXAry, nIdx, nLen, GetFixKerning() );
DoOnCapitals( aDo );
Size aTxtSize( aDo.GetSize() );
@@ -706,19 +769,27 @@ namespace {
class SvxDoDrawCapital : public SvxDoCapitals
{
protected:
+ VclPtr<OutputDevice> pOut;
SvxFont *pFont;
Point aPos;
Point aSpacePos;
short nKern;
+ std::span<const sal_Int32> pDXArray;
+ std::span<const sal_Bool> pKashidaArray;
public:
SvxDoDrawCapital( SvxFont *pFnt, OutputDevice *_pOut, const OUString &_rTxt,
+ std::span<const sal_Int32> _pDXArray,
+ std::span<const sal_Bool> _pKashidaArray,
const sal_Int32 _nIdx, const sal_Int32 _nLen,
const Point &rPos, const short nKrn )
- : SvxDoCapitals( _pOut, _rTxt, _nIdx, _nLen ),
+ : SvxDoCapitals( _rTxt, _nIdx, _nLen ),
+ pOut( _pOut ),
pFont( pFnt ),
aPos( rPos ),
aSpacePos( rPos ),
- nKern( nKrn )
+ nKern( nKrn ),
+ pDXArray(_pDXArray),
+ pKashidaArray(_pKashidaArray)
{ }
virtual void DoSpace( const bool bDraw ) override;
virtual void SetSpace() override;
@@ -733,7 +804,7 @@ void SvxDoDrawCapital::DoSpace( const bool bDraw )
if ( !(bDraw || pFont->IsWordLineMode()) )
return;
- sal_uLong nDiff = static_cast<sal_uLong>(aPos.X() - aSpacePos.X());
+ sal_Int32 nDiff = static_cast<sal_Int32>(aPos.X() - aSpacePos.X());
if ( nDiff )
{
bool bWordWise = pFont->IsWordLineMode();
@@ -754,16 +825,17 @@ void SvxDoDrawCapital::SetSpace()
aSpacePos.setX( aPos.X() );
}
-void SvxDoDrawCapital::Do( const OUString &_rTxt, const sal_Int32 _nIdx,
- const sal_Int32 _nLen, const bool bUpper)
+void SvxDoDrawCapital::Do( const OUString &_rTxt, const sal_Int32 nSpanIdx,
+ const sal_Int32 nSpanLen, const bool bUpper)
{
sal_uInt8 nProp = 0;
- Size aPartSize;
// Set the desired font
FontLineStyle eUnder = pFont->GetUnderline();
+ FontLineStyle eOver = pFont->GetOverline();
FontStrikeout eStrike = pFont->GetStrikeout();
pFont->SetUnderline( LINESTYLE_NONE );
+ pFont->SetOverline( LINESTYLE_NONE );
pFont->SetStrikeout( STRIKEOUT_NONE );
if ( !bUpper )
{
@@ -772,24 +844,47 @@ void SvxDoDrawCapital::Do( const OUString &_rTxt, const sal_Int32 _nIdx,
}
pFont->SetPhysFont(*pOut);
- aPartSize.setWidth( pOut->GetTextWidth( _rTxt, _nIdx, _nLen ) );
- aPartSize.setHeight( pOut->GetTextHeight() );
- tools::Long nWidth = aPartSize.Width();
- if ( nKern )
+ if (pDXArray.empty())
{
- aPos.AdjustX(nKern/2);
- if ( _nLen ) nWidth += (_nLen*tools::Long(nKern));
+ auto nWidth = pOut->GetTextWidth(_rTxt, nSpanIdx, nSpanLen);
+ if (nKern)
+ {
+ aPos.AdjustX(nKern/2);
+ if (nSpanLen)
+ nWidth += (nSpanLen * nKern);
+ }
+ pOut->DrawStretchText(aPos, nWidth-nKern, _rTxt, nSpanIdx, nSpanLen);
+ // in this case we move aPos along to be the start of each subspan
+ aPos.AdjustX(nWidth-(nKern/2) );
+ }
+ else
+ {
+ const sal_Int32 nStartOffset = nSpanIdx - nIdx;
+ sal_Int32 nStartX = nStartOffset ? pDXArray[nStartOffset - 1] : 0;
+
+ Point aStartPos(aPos.X() + nStartX, aPos.Y());
+
+ std::vector<sal_Int32> aDXArray;
+ aDXArray.reserve(nSpanLen);
+ for (sal_Int32 i = 0; i < nSpanLen; ++i)
+ aDXArray.push_back(pDXArray[nStartOffset + i] - nStartX);
+
+ auto aKashidaArray = !pKashidaArray.empty() ?
+ std::span<const sal_Bool>(pKashidaArray.data() + nStartOffset, nSpanLen) :
+ std::span<const sal_Bool>();
+
+ DrawTextArray(pOut, aStartPos, _rTxt, aDXArray, aKashidaArray, nSpanIdx, nSpanLen);
+ // in this case we leave aPos at the start and use the DXArray to find the start
+ // of each subspan
}
- pOut->DrawStretchText(aPos,nWidth-nKern,_rTxt,_nIdx,_nLen);
// Restore Font
pFont->SetUnderline( eUnder );
+ pFont->SetOverline( eOver );
pFont->SetStrikeout( eStrike );
if ( !bUpper )
pFont->SetPropr( nProp );
pFont->SetPhysFont(*pOut);
-
- aPos.AdjustX(nWidth-(nKern/2) );
}
/*************************************************************************
@@ -798,9 +893,13 @@ void SvxDoDrawCapital::Do( const OUString &_rTxt, const sal_Int32 _nIdx,
void SvxFont::DrawCapital( OutputDevice *pOut,
const Point &rPos, const OUString &rTxt,
+ std::span<const sal_Int32> pDXArray,
+ std::span<const sal_Bool> pKashidaArray,
const sal_Int32 nIdx, const sal_Int32 nLen ) const
{
- SvxDoDrawCapital aDo( const_cast<SvxFont *>(this),pOut,rTxt,nIdx,nLen,rPos,nKern );
+ SvxDoDrawCapital aDo(const_cast<SvxFont *>(this), pOut,
+ rTxt, pDXArray, pKashidaArray,
+ nIdx, nLen, rPos, GetFixKerning());
DoOnCapitals( aDo );
}