diff options
author | Caolán McNamara <caolanm@redhat.com> | 2022-01-18 16:07:47 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2022-01-20 17:11:56 +0100 |
commit | a557830dea9c287b11f3e610778acab94d03cdb0 (patch) | |
tree | eddc30ae2ee15f71351d8747ea8d4d220c3cf024 /sw | |
parent | 96607133f4457b31ddaee5808c04e96243ed99c6 (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.hxx | 8 | ||||
-rw-r--r-- | sw/source/core/txtnode/fntcache.cxx | 80 |
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() ) |