diff options
-rw-r--r-- | include/vcl/outdev.hxx | 5 | ||||
-rw-r--r-- | include/vcl/vcllayout.hxx | 2 | ||||
-rw-r--r-- | vcl/inc/sallayout.hxx | 4 | ||||
-rw-r--r-- | vcl/source/gdi/CommonSalLayout.cxx | 9 | ||||
-rw-r--r-- | vcl/source/gdi/sallayout.cxx | 2 | ||||
-rw-r--r-- | vcl/source/outdev/font.cxx | 4 | ||||
-rw-r--r-- | vcl/source/outdev/text.cxx | 6 |
7 files changed, 22 insertions, 10 deletions
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx index fe9af36994b8..6a91fd2527e8 100644 --- a/include/vcl/outdev.hxx +++ b/include/vcl/outdev.hxx @@ -150,6 +150,8 @@ namespace o3tl } typedef std::vector< tools::Rectangle > MetricVector; +struct GlyphItem; +typedef std::vector<GlyphItem> SalLayoutGlyphs; // OutputDevice-Types @@ -1328,7 +1330,8 @@ public: ImplLayout( const OUString&, sal_Int32 nIndex, sal_Int32 nLen, const Point& rLogicPos = Point(0,0), long nLogicWidth=0, const long* pLogicDXArray=nullptr, SalLayoutFlags flags = SalLayoutFlags::NONE, - vcl::TextLayoutCache const* = nullptr) const; + vcl::TextLayoutCache const* = nullptr, + const SalLayoutGlyphs* pGlyphs = nullptr) const; SAL_DLLPRIVATE ImplLayoutArgs ImplPrepareLayoutArgs( OUString&, const sal_Int32 nIndex, const sal_Int32 nLen, DeviceCoordinate nPixelWidth, const DeviceCoordinate* pPixelDXArray, SalLayoutFlags flags = SalLayoutFlags::NONE, diff --git a/include/vcl/vcllayout.hxx b/include/vcl/vcllayout.hxx index ac61892fb415..735dc4cf748f 100644 --- a/include/vcl/vcllayout.hxx +++ b/include/vcl/vcllayout.hxx @@ -131,7 +131,7 @@ public: const Point& DrawOffset() const { return maDrawOffset; } Point GetDrawPosition( const Point& rRelative = Point(0,0) ) const; - virtual bool LayoutText( ImplLayoutArgs& ) = 0; // first step of layouting + virtual bool LayoutText( ImplLayoutArgs&, const SalLayoutGlyphs* ) = 0; // first step of layouting virtual void AdjustLayout( ImplLayoutArgs& ); // adjusting after fallback etc. virtual void InitFont() const {} virtual void DrawText( SalGraphics& ) const = 0; diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx index 2aa650a1c75a..a8b9e233f450 100644 --- a/vcl/inc/sallayout.hxx +++ b/vcl/inc/sallayout.hxx @@ -139,7 +139,7 @@ public: explicit MultiSalLayout( std::unique_ptr<SalLayout> pBaseLayout ); void AddFallback( std::unique_ptr<SalLayout> pFallbackLayout, ImplLayoutRuns const &, const PhysicalFontFace* pFallbackFont ); - bool LayoutText(ImplLayoutArgs&) override; + bool LayoutText(ImplLayoutArgs&, const SalLayoutGlyphs*) override; void AdjustLayout(ImplLayoutArgs&) override; void InitFont() const override; @@ -172,7 +172,7 @@ public: ~GenericSalLayout() override; void AdjustLayout(ImplLayoutArgs&) final override; - bool LayoutText(ImplLayoutArgs&) final override; + bool LayoutText(ImplLayoutArgs&, const SalLayoutGlyphs*) final override; void DrawText(SalGraphics&) const final override; std::shared_ptr<vcl::TextLayoutCache> CreateTextLayoutCache(OUString const&) const final override; SalLayoutGlyphs GetGlyphs() const final override; diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx index 32d8e572156a..fc38b33437e1 100644 --- a/vcl/source/gdi/CommonSalLayout.cxx +++ b/vcl/source/gdi/CommonSalLayout.cxx @@ -263,12 +263,19 @@ bool GenericSalLayout::HasVerticalAlternate(sal_UCS4 aChar, sal_UCS4 aVariationS return hb_set_has(mpVertGlyphs, nGlyphIndex) != 0; } -bool GenericSalLayout::LayoutText(ImplLayoutArgs& rArgs) +bool GenericSalLayout::LayoutText(ImplLayoutArgs& rArgs, const SalLayoutGlyphs* pGlyphs) { // No need to touch m_GlyphItems at all for an empty string. if (rArgs.mnEndCharPos - rArgs.mnMinCharPos <= 0) return true; + if (pGlyphs) + { + // Work with pre-computed glyph items. + m_GlyphItems = *pGlyphs; + return true; + } + hb_font_t *pHbFont = mpFont->GetHbFont(); hb_face_t* pHbFace = hb_font_get_face(pHbFont); diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx index 74fbd98b1c08..09cf35d8fdfe 100644 --- a/vcl/source/gdi/sallayout.cxx +++ b/vcl/source/gdi/sallayout.cxx @@ -1017,7 +1017,7 @@ void MultiSalLayout::AddFallback( std::unique_ptr<SalLayout> pFallback, ++mnLevel; } -bool MultiSalLayout::LayoutText( ImplLayoutArgs& rArgs ) +bool MultiSalLayout::LayoutText( ImplLayoutArgs& rArgs, const SalLayoutGlyphs* ) { if( mnLevel <= 1 ) return false; diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx index de8fae5a578d..d41ba14a0414 100644 --- a/vcl/source/outdev/font.cxx +++ b/vcl/source/outdev/font.cxx @@ -1334,7 +1334,7 @@ std::unique_ptr<SalLayout> OutputDevice::getFallbackFont( if (!pFallback) return nullptr; - if (!pFallback->LayoutText(rLayoutArgs)) + if (!pFallback->LayoutText(rLayoutArgs, nullptr)) { // there is no need for a font that couldn't resolve anything return nullptr; @@ -1418,7 +1418,7 @@ std::unique_ptr<SalLayout> OutputDevice::ImplGlyphFallbackLayout( std::unique_pt break; } - if( pMultiSalLayout && pMultiSalLayout->LayoutText( rLayoutArgs ) ) + if( pMultiSalLayout && pMultiSalLayout->LayoutText( rLayoutArgs, nullptr ) ) pSalLayout = std::move(pMultiSalLayout); // restore orig font settings diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx index 2ac6bd470451..f1747895e947 100644 --- a/vcl/source/outdev/text.cxx +++ b/vcl/source/outdev/text.cxx @@ -1277,7 +1277,8 @@ std::unique_ptr<SalLayout> OutputDevice::ImplLayout(const OUString& rOrigStr, sal_Int32 nMinIndex, sal_Int32 nLen, const Point& rLogicalPos, long nLogicalWidth, const long* pDXArray, SalLayoutFlags flags, - vcl::TextLayoutCache const* pLayoutCache) const + vcl::TextLayoutCache const* pLayoutCache, + const SalLayoutGlyphs* pGlyphs) const { // we need a graphics if( !mpGraphics ) @@ -1307,6 +1308,7 @@ std::unique_ptr<SalLayout> OutputDevice::ImplLayout(const OUString& rOrigStr, if( mpFontInstance->mpConversion ) { mpFontInstance->mpConversion->RecodeString( aStr, 0, aStr.getLength() ); pLayoutCache = nullptr; // don't use cache with modified string! + pGlyphs = nullptr; } DeviceCoordinate nPixelWidth = static_cast<DeviceCoordinate>(nLogicalWidth); std::unique_ptr<DeviceCoordinate[]> xDXPixelArray; @@ -1352,7 +1354,7 @@ std::unique_ptr<SalLayout> OutputDevice::ImplLayout(const OUString& rOrigStr, std::unique_ptr<SalLayout> pSalLayout = mpGraphics->GetTextLayout( aLayoutArgs, 0 ); // layout text - if( pSalLayout && !pSalLayout->LayoutText( aLayoutArgs ) ) + if( pSalLayout && !pSalLayout->LayoutText( aLayoutArgs, pGlyphs ) ) { pSalLayout.reset(); } |