summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2022-01-18 16:07:47 +0000
committerCaolán McNamara <caolanm@redhat.com>2022-01-20 17:11:56 +0100
commita557830dea9c287b11f3e610778acab94d03cdb0 (patch)
treeeddc30ae2ee15f71351d8747ea8d4d220c3cf024 /sw
parent96607133f4457b31ddaee5808c04e96243ed99c6 (diff)
centralize these GetTextArray uses
no logic change intended Change-Id: Ide0a6afc30690d05647acf9bf1a0eccf72a9e60c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128570 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sw')
-rw-r--r--sw/source/core/inc/fntcache.hxx8
-rw-r--r--sw/source/core/txtnode/fntcache.cxx80
2 files changed, 50 insertions, 38 deletions
diff --git a/sw/source/core/inc/fntcache.hxx b/sw/source/core/inc/fntcache.hxx
index 0bdc4757d9b3..4285165a3336 100644
--- a/sw/source/core/inc/fntcache.hxx
+++ b/sw/source/core/inc/fntcache.hxx
@@ -66,13 +66,13 @@ extern SwFntObj *pLastFont;
*/
struct SwTextGlyphsKey
{
- VclPtr<OutputDevice> m_pOutputDevice;
+ VclPtr<const OutputDevice> m_pOutputDevice;
OUString m_aText;
sal_Int32 m_nIndex;
sal_Int32 m_nLength;
size_t mnHashCode;
- SwTextGlyphsKey(VclPtr<OutputDevice> const& pOutputDevice, const OUString & sText, sal_Int32 nIndex, sal_Int32 nLength);
+ SwTextGlyphsKey(const OutputDevice* pOutputDevice, const OUString & sText, sal_Int32 nIndex, sal_Int32 nLength);
bool operator==(SwTextGlyphsKey const & rhs) const;
};
struct SwTextGlyphsKeyHash
@@ -113,6 +113,10 @@ class SwFntObj final : public SwCacheObj
/// Cache of already calculated layout glyphs and text widths.
SwTextGlyphsMap m_aTextGlyphs;
+ void GetTextArray(const OutputDevice& rOutputDevice, const OUString& rStr,
+ std::vector<sal_Int32>& rDXAry, sal_Int32 nIndex, sal_Int32 nLen,
+ bool bCaching);
+
static tools::Long s_nPixWidth;
static MapMode *s_pPixMap;
diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx
index cb68f6535635..2c5f81a63390 100644
--- a/sw/source/core/txtnode/fntcache.cxx
+++ b/sw/source/core/txtnode/fntcache.cxx
@@ -77,11 +77,11 @@ static vcl::DeleteOnDeinit< VclPtr<OutputDevice> > s_pFntObjPixOut {};
* Defines a substring on a given output device, to be used as an std::unordered_map<>
* key.
*/
-SwTextGlyphsKey::SwTextGlyphsKey(VclPtr<OutputDevice> const& pOutputDevice, const OUString & sText, sal_Int32 nIndex, sal_Int32 nLength)
+SwTextGlyphsKey::SwTextGlyphsKey(const OutputDevice* pOutputDevice, const OUString & sText, sal_Int32 nIndex, sal_Int32 nLength)
: m_pOutputDevice(pOutputDevice), m_aText(sText), m_nIndex(nIndex), m_nLength(nLength)
{
mnHashCode = 0;
- o3tl::hash_combine(mnHashCode, pOutputDevice.get());
+ o3tl::hash_combine(mnHashCode, pOutputDevice);
o3tl::hash_combine(mnHashCode, m_nIndex);
o3tl::hash_combine(mnHashCode, m_nLength);
if(m_nLength >= 0 && m_nIndex >= 0 && m_nIndex + m_nLength <= m_aText.getLength())
@@ -899,6 +899,18 @@ namespace
}
}
+void SwFntObj::GetTextArray(const OutputDevice& rDevice, const OUString& rStr, std::vector<sal_Int32>& rDXAry,
+ sal_Int32 nIndex, sal_Int32 nLen, bool bCaching)
+{
+ SalLayoutGlyphs* pLayoutCache = nullptr;
+ if (bCaching)
+ {
+ SwTextGlyphsKey aGlyphsKey{&rDevice, rStr, nIndex, nLen};
+ pLayoutCache = GetCachedSalLayoutGlyphs(aGlyphsKey);
+ }
+ rDevice.GetTextArray(rStr, &rDXAry, nIndex, nLen, nullptr, pLayoutCache);
+}
+
void SwFntObj::DrawText( SwDrawTextInfo &rInf )
{
OSL_ENSURE( rInf.GetShell(), "SwFntObj::DrawText without shell" );
@@ -1075,11 +1087,11 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
std::vector<sal_Int32> aKernArray;
if ( m_pPrinter )
- m_pPrinter->GetTextArray( rInf.GetText(), &aKernArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()));
+ GetTextArray(*m_pPrinter, rInf.GetText(), aKernArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), false);
else
- rInf.GetOut().GetTextArray( rInf.GetText(), &aKernArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()));
+ GetTextArray(rInf.GetOut(), rInf.GetText(), aKernArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), false);
// Change the average width per character to an appropriate grid width
// basically get the ratio of the avg width to the grid unit width, then
@@ -1182,11 +1194,11 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
std::vector<sal_Int32> aKernArray;
if ( m_pPrinter )
- m_pPrinter->GetTextArray( rInf.GetText(), &aKernArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()));
+ GetTextArray(*m_pPrinter, rInf.GetText(), aKernArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), false);
else
- rInf.GetOut().GetTextArray( rInf.GetText(), &aKernArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()));
+ GetTextArray(rInf.GetOut(), rInf.GetText(), aKernArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), false);
if ( bSwitchH2V )
rInf.GetFrame()->SwitchHorizontalToVertical( aTextOriginPos );
if ( rInf.GetSpace() || rInf.GetKanaComp())
@@ -1322,8 +1334,8 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
if( rInf.GetSpace() || rInf.GetKanaComp() )
{
std::vector<sal_Int32> aKernArray;
- rInf.GetOut().GetTextArray( rInf.GetText(), &aKernArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()));
+ GetTextArray(rInf.GetOut(), rInf.GetText(), aKernArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), false);
if( bStretch )
{
@@ -1540,10 +1552,8 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
// get screen array
std::vector<sal_Int32> aScrArray;
- SwTextGlyphsKey aGlyphsKey{ &rInf.GetOut(), rInf.GetText(), sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()) };
- SalLayoutGlyphs* pGlyphs = GetCachedSalLayoutGlyphs(aGlyphsKey);
- rInf.GetOut().GetTextArray( rInf.GetText(), &aScrArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), nullptr, pGlyphs);
+ GetTextArray(rInf.GetOut(), rInf.GetText(), aScrArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), true);
// OLE: no printer available
// OSL_ENSURE( pPrinter, "DrawText needs pPrinter" )
@@ -1555,16 +1565,14 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
if( !m_pPrtFont->IsSameInstance( m_pPrinter->GetFont() ) )
m_pPrinter->SetFont( *m_pPrtFont );
}
- aGlyphsKey = SwTextGlyphsKey{ m_pPrinter, rInf.GetText(), sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()) };
- pGlyphs = GetCachedSalLayoutGlyphs(aGlyphsKey);
- m_pPrinter->GetTextArray(rInf.GetText(), &aKernArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), nullptr, pGlyphs);
+ GetTextArray(*m_pPrinter, rInf.GetText(), aKernArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), true);
}
else
{
#ifndef NDEBUG
- rInf.GetOut().GetTextArray( rInf.GetText(), &aKernArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()));
+ GetTextArray(rInf.GetOut(), rInf.GetText(), aKernArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), false);
assert(aKernArray == aScrArray);
#endif
aKernArray = aScrArray;
@@ -1876,8 +1884,8 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
sal_Int32 nTmpIdx = bBullet
? (rInf.GetIdx() ? 1 : 0)
: sal_Int32(rInf.GetIdx());
- aGlyphsKey = SwTextGlyphsKey{ &rInf.GetOut(), *pStr, nTmpIdx, nLen };
- pGlyphs = GetCachedSalLayoutGlyphs(aGlyphsKey);
+ SwTextGlyphsKey aGlyphsKey{ &rInf.GetOut(), *pStr, nTmpIdx, nLen };
+ SalLayoutGlyphs* pGlyphs = GetCachedSalLayoutGlyphs(aGlyphsKey);
rInf.GetOut().DrawTextArray( aTextOriginPos, *pStr, aKernArray,
nTmpIdx , nLen, SalLayoutFlags::NONE, pGlyphs );
if (bBullet)
@@ -2038,8 +2046,8 @@ Size SwFntObj::GetTextSize( SwDrawTextInfo& rInf )
if( !GetScrFont()->IsSameInstance( rInf.GetOut().GetFont() ) )
rInf.GetOut().SetFont( *m_pScrFont );
- m_pPrinter->GetTextArray(rInf.GetText(), &aKernArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(nLn));
+ GetTextArray(*m_pPrinter, rInf.GetText(), aKernArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(nLn), false);
if( bCompress )
rInf.SetKanaDiff( rInf.GetScriptInfo()->Compress( aKernArray.data(),
rInf.GetIdx(), nLn, rInf.GetKanaComp(),
@@ -2057,8 +2065,8 @@ Size SwFntObj::GetTextSize( SwDrawTextInfo& rInf )
if (eGlyphPositioningMode == GlyphPositioningMode::Classic)
{
std::vector<sal_Int32> aScrArray;
- rInf.GetOut().GetTextArray( rInf.GetText(), &aScrArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()));
+ GetTextArray(rInf.GetOut(), rInf.GetText(), aScrArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), false);
tools::Long nScrPos = aScrArray[ 0 ];
TextFrameIndex nCnt(rInf.GetText().getLength());
if ( nCnt < rInf.GetIdx() )
@@ -2094,8 +2102,8 @@ Size SwFntObj::GetTextSize( SwDrawTextInfo& rInf )
if( bCompress )
{
std::vector<sal_Int32> aKernArray;
- rInf.GetOut().GetTextArray( rInf.GetText(), &aKernArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(nLn));
+ GetTextArray(rInf.GetOut(), rInf.GetText(), aKernArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(nLn), false);
rInf.SetKanaDiff( rInf.GetScriptInfo()->Compress( aKernArray.data(),
rInf.GetIdx(), nLn, rInf.GetKanaComp(),
o3tl::narrowing<sal_uInt16>(m_aFont.GetFontSize().Height()) ,lcl_IsFullstopCentered( rInf.GetOut() ) ) );
@@ -2137,14 +2145,14 @@ TextFrameIndex SwFntObj::GetModelPositionForViewPoint(SwDrawTextInfo &rInf)
{
m_pPrinter->SetLayoutMode( rInf.GetOut().GetLayoutMode() );
m_pPrinter->SetDigitLanguage( rInf.GetOut().GetDigitLanguage() );
- SwTextGlyphsKey aGlyphsKey{ m_pPrinter, rInf.GetText(), sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()) };
- SalLayoutGlyphs* pGlyphs = GetCachedSalLayoutGlyphs(aGlyphsKey);
- m_pPrinter->GetTextArray( rInf.GetText(), &aKernArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), nullptr, pGlyphs);
+ GetTextArray(*m_pPrinter, rInf.GetText(), aKernArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), true);
}
else
- rInf.GetOut().GetTextArray( rInf.GetText(), &aKernArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()));
+ {
+ GetTextArray(rInf.GetOut(), rInf.GetText(), aKernArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()), false);
+ }
const SwScriptInfo* pSI = rInf.GetScriptInfo();
if ( rInf.GetFont() && rInf.GetLen() )