diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2022-05-20 09:02:27 +0200 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2022-05-25 11:43:33 +0200 |
commit | 04a36851aab1272c9c21ac97d0fc0f4ffe372fe0 (patch) | |
tree | 2df33f292765e5defb34954b99c1af0d90b25485 | |
parent | ed45b67db66ef0f6c69887c75013a178c4412f74 (diff) |
verify that all results from SalLayoutGlyphsCache match
The code used to do it only for computting glyph subsets, but
some of the failures there show that bugs in font code elsewhere
can make the cache returning different results, so check
even for normal repeated cached calls.
Change-Id: I8a18710546fe2557f69aaef4ab0bdb63c62a9253
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134659
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
-rw-r--r-- | vcl/source/gdi/impglyphitem.cxx | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/vcl/source/gdi/impglyphitem.cxx b/vcl/source/gdi/impglyphitem.cxx index ffed4d56c743..7a4be20c4262 100644 --- a/vcl/source/gdi/impglyphitem.cxx +++ b/vcl/source/gdi/impglyphitem.cxx @@ -295,6 +295,24 @@ static void checkGlyphsEqual(const SalLayoutGlyphs& g1, const SalLayoutGlyphs& g assert(l1->isEqual(l2)); } } + +static void verifyGlyphs(const SalLayoutGlyphs& glyphs, VclPtr<const OutputDevice> outputDevice, + const OUString& text, sal_Int32 nIndex, sal_Int32 nLen, + tools::Long nLogicWidth, const vcl::text::TextLayoutCache* layoutCache) +{ + // Check if the cached result really matches what we would get normally. + std::shared_ptr<const vcl::text::TextLayoutCache> tmpLayoutCache; + if (layoutCache == nullptr) + { + tmpLayoutCache = vcl::text::TextLayoutCache::Create(text); + layoutCache = tmpLayoutCache.get(); + } + std::unique_ptr<SalLayout> layout + = outputDevice->ImplLayout(text, nIndex, nLen, Point(0, 0), nLogicWidth, {}, + SalLayoutFlags::GlyphItemsOnly, layoutCache); + assert(layout); + checkGlyphsEqual(glyphs, layout->GetGlyphs()); +} #endif const SalLayoutGlyphs* @@ -309,7 +327,12 @@ SalLayoutGlyphsCache::GetLayoutGlyphs(VclPtr<const OutputDevice> outputDevice, c if (it != mCachedGlyphs.end()) { if (it->second.IsValid()) + { +#ifdef DBG_UTIL + verifyGlyphs(it->second, outputDevice, text, nIndex, nLen, nLogicWidth, layoutCache); +#endif return &it->second; + } // Do not try to create the layout here. If a cache item exists, it's already // been attempted and the layout was invalid (this happens with MultiSalLayout). // So in that case this is a cached failure. @@ -378,19 +401,8 @@ SalLayoutGlyphsCache::GetLayoutGlyphs(VclPtr<const OutputDevice> outputDevice, c { mLastTemporaryKey = std::move(key); #ifdef DBG_UTIL - std::shared_ptr<const vcl::text::TextLayoutCache> tmpLayoutCache; - if (layoutCache == nullptr) - { - tmpLayoutCache = vcl::text::TextLayoutCache::Create(text); - layoutCache = tmpLayoutCache.get(); - } - // Check if the subset result really matches what we would get normally, - // to make sure corner cases are handled well (see SalLayoutGlyphsImpl::cloneCharRange()). - std::unique_ptr<SalLayout> layout - = outputDevice->ImplLayout(text, nIndex, nLen, Point(0, 0), nLogicWidth, {}, - SalLayoutFlags::GlyphItemsOnly, layoutCache); - assert(layout); - checkGlyphsEqual(mLastTemporaryGlyphs, layout->GetGlyphs()); + verifyGlyphs(mLastTemporaryGlyphs, outputDevice, text, nIndex, nLen, nLogicWidth, + layoutCache); #endif return &mLastTemporaryGlyphs; } |