include/tools/fract.hxx | 3 +++ include/tools/gen.hxx | 5 +++++ include/vcl/glyphitemcache.hxx | 1 + include/vcl/mapmod.hxx | 3 +++ tools/source/generic/fract.cxx | 10 ++++++++++ tools/source/generic/gen.cxx | 9 +++++++++ vcl/source/gdi/impglyphitem.cxx | 4 +++- vcl/source/gdi/mapmod.cxx | 12 ++++++++++++ 8 files changed, 46 insertions(+), 1 deletion(-)
New commits: commit 3361db2179dfe4ddb017ac59660c26c2acaaac8d Author: Luboš Luňák <l.lu...@collabora.com> AuthorDate: Mon Apr 11 12:43:05 2022 +0200 Commit: Luboš Luňák <l.lu...@collabora.com> CommitDate: Tue Apr 12 13:31:09 2022 +0200 include OutputDevice MapMode in SalLayoutGlyphsCache key (tdf#148400) The mapmode also affects the layout of the glyphs. Change-Id: I9492bc4d3d9e991ef8ab5dc30ce424e44cbc79f7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132822 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lu...@collabora.com> diff --git a/include/tools/fract.hxx b/include/tools/fract.hxx index 7f2bb3d320ac..c844f8eed619 100644 --- a/include/tools/fract.hxx +++ b/include/tools/fract.hxx @@ -72,6 +72,9 @@ public: void ReduceInaccurate( unsigned nSignificantBits ); + // Compute value usable as hash. + size_t GetHashValue() const; + TOOLS_DLLPUBLIC friend Fraction operator+( const Fraction& rVal1, const Fraction& rVal2 ); TOOLS_DLLPUBLIC friend Fraction operator-( const Fraction& rVal1, const Fraction& rVal2 ); TOOLS_DLLPUBLIC friend Fraction operator*( const Fraction& rVal1, const Fraction& rVal2 ); diff --git a/include/tools/gen.hxx b/include/tools/gen.hxx index 01e3b45e456d..6d4548065495 100644 --- a/include/tools/gen.hxx +++ b/include/tools/gen.hxx @@ -53,6 +53,9 @@ public: TOOLS_DLLPUBLIC rtl::OString toString() const; + // Compute value usable as hash. + TOOLS_DLLPUBLIC size_t GetHashValue() const; + protected: tools::Long nA; tools::Long nB; @@ -111,6 +114,7 @@ public: sal_Int64 nMulY, sal_Int64 nDivY) const; using Pair::toString; + using Pair::GetHashValue; }; inline void Point::Move( tools::Long nHorzMove, tools::Long nVertMove ) @@ -232,6 +236,7 @@ public: Pair & toPair() { return *this; } using Pair::toString; + using Pair::GetHashValue; Size& operator += ( const Size& rSize ); Size& operator -= ( const Size& rSize ); diff --git a/include/vcl/glyphitemcache.hxx b/include/vcl/glyphitemcache.hxx index 34a5b51d6c1b..e0ab8aaf1013 100644 --- a/include/vcl/glyphitemcache.hxx +++ b/include/vcl/glyphitemcache.hxx @@ -67,6 +67,7 @@ private: tools::Long logicWidth; VclPtr<const OutputDevice> outputDevice; vcl::Font font; + MapMode mapMode; bool rtl; vcl::text::ComplexTextLayoutFlags layoutMode; LanguageType digitLanguage; diff --git a/include/vcl/mapmod.hxx b/include/vcl/mapmod.hxx index 591db8d8c1c0..f3c937a5f915 100644 --- a/include/vcl/mapmod.hxx +++ b/include/vcl/mapmod.hxx @@ -64,6 +64,9 @@ public: } bool IsDefault() const; + // Compute value usable as hash. + size_t GetHashValue() const; + // tdf#117984 needs to be thread-safe due to being used e.g. in Bitmaps // vcl::ScopedBitmapAccess in parallelized 3D renderer typedef o3tl::cow_wrapper< ImplMapMode, o3tl::ThreadSafeRefCountingPolicy > ImplType; diff --git a/tools/source/generic/fract.cxx b/tools/source/generic/fract.cxx index 49c26c0f1be4..7f2ffba1003d 100644 --- a/tools/source/generic/fract.cxx +++ b/tools/source/generic/fract.cxx @@ -19,6 +19,7 @@ #include <tools/fract.hxx> #include <tools/debug.hxx> +#include <o3tl/hash_combine.hxx> #include <o3tl/safeint.hxx> #include <sal/log.hxx> #include <osl/diagnose.h> @@ -473,4 +474,13 @@ static void rational_ReduceInaccurate(boost::rational<sal_Int32>& rRational, uns rRational.assign( bNeg ? -nMul : nMul, nDiv ); } +size_t Fraction::GetHashValue() const +{ + size_t hash = 0; + o3tl::hash_combine( hash, mnNumerator ); + o3tl::hash_combine( hash, mnDenominator ); + o3tl::hash_combine( hash, mbValid ); + return hash; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/tools/source/generic/gen.cxx b/tools/source/generic/gen.cxx index b3331b7b4e4d..27120d6abbd1 100644 --- a/tools/source/generic/gen.cxx +++ b/tools/source/generic/gen.cxx @@ -22,6 +22,7 @@ #include <algorithm> #include <tuple> +#include <o3tl/hash_combine.hxx> #include <o3tl/safeint.hxx> #include <tools/gen.hxx> @@ -33,6 +34,14 @@ OString Pair::toString() const return OString::number(A()) + ", " + OString::number(B()); } +size_t Pair::GetHashValue() const +{ + size_t hash = 0; + o3tl::hash_combine( hash, nA ); + o3tl::hash_combine( hash, nB ); + return hash; +} + void tools::Rectangle::SetSize( const Size& rSize ) { if ( rSize.Width() < 0 ) diff --git a/vcl/source/gdi/impglyphitem.cxx b/vcl/source/gdi/impglyphitem.cxx index 130039ed88ee..b97096cd199c 100644 --- a/vcl/source/gdi/impglyphitem.cxx +++ b/vcl/source/gdi/impglyphitem.cxx @@ -163,6 +163,7 @@ SalLayoutGlyphsCache::CachedGlyphsKey::CachedGlyphsKey(const VclPtr<const Output // TODO there is still something missing, otherwise it wouldn't be necessary to compare // also the OutputDevice pointers , font(outputDevice->GetFont()) + , mapMode(outputDevice->GetMapMode()) , rtl(outputDevice->IsRTLEnabled()) , layoutMode(outputDevice->GetLayoutMode()) , digitLanguage(outputDevice->GetDigitLanguage()) @@ -177,6 +178,7 @@ SalLayoutGlyphsCache::CachedGlyphsKey::CachedGlyphsKey(const VclPtr<const Output SvMemoryStream stream; WriteFont(stream, font); o3tl::hash_combine(hashValue, static_cast<const char*>(stream.GetData()), stream.GetSize()); + o3tl::hash_combine(hashValue, mapMode.GetHashValue()); o3tl::hash_combine(hashValue, rtl); o3tl::hash_combine(hashValue, layoutMode); o3tl::hash_combine(hashValue, digitLanguage.get()); @@ -186,7 +188,7 @@ inline bool SalLayoutGlyphsCache::CachedGlyphsKey::operator==(const CachedGlyphs { return hashValue == other.hashValue && index == other.index && len == other.len && logicWidth == other.logicWidth && outputDevice == other.outputDevice - && rtl == other.rtl && layoutMode == other.layoutMode + && mapMode == other.mapMode && rtl == other.rtl && layoutMode == other.layoutMode && digitLanguage == other.digitLanguage // Need to use EqualIgnoreColor, because sometimes the color changes, but it's irrelevant // for text layout (and also obsolete in vcl::Font). diff --git a/vcl/source/gdi/mapmod.cxx b/vcl/source/gdi/mapmod.cxx index 0e74157dec86..3efb0529368a 100644 --- a/vcl/source/gdi/mapmod.cxx +++ b/vcl/source/gdi/mapmod.cxx @@ -19,6 +19,7 @@ #include <vcl/mapmod.hxx> +#include <o3tl/hash_combine.hxx> #include <tools/gen.hxx> #include <tools/fract.hxx> #include <tools/stream.hxx> @@ -135,6 +136,17 @@ bool MapMode::IsDefault() const return mpImplMapMode.same_object(GetGlobalDefault()); } +size_t MapMode::GetHashValue() const +{ + size_t hash = 0; + o3tl::hash_combine( hash, mpImplMapMode->meUnit ); + o3tl::hash_combine( hash, mpImplMapMode->maOrigin.GetHashValue()); + o3tl::hash_combine( hash, mpImplMapMode->maScaleX.GetHashValue()); + o3tl::hash_combine( hash, mpImplMapMode->maScaleY.GetHashValue()); + o3tl::hash_combine( hash, mpImplMapMode->mbSimple ); + return hash; +} + MapUnit MapMode::GetMapUnit() const { return mpImplMapMode->meUnit; } const Point& MapMode::GetOrigin() const { return mpImplMapMode->maOrigin; }