summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2022-04-28 08:38:17 +0200
committerLuboš Luňák <l.lunak@collabora.com>2022-04-28 12:36:23 +0200
commit12dcfc191bc258b51f5d00f46ea44a6a1c6fda91 (patch)
tree2cb861f63d2b2ec4cc1e6f7138ca659093c55951
parentf8d6ec1a516237f0e9f73080b172ecba3e96478d (diff)
include LogicalFontInstance font scale in SalLayoutGlyphsCache key
For some reason it may differ even if vcl::Font is the same. Without this ScExportTest2::testTdf66668 fails. Change-Id: I728a0848ac0420ce0d746134c7072f6ab59f2761 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133537 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
-rw-r--r--include/vcl/glyphitemcache.hxx2
-rw-r--r--include/vcl/outdev.hxx3
-rw-r--r--vcl/source/gdi/impglyphitem.cxx15
3 files changed, 15 insertions, 5 deletions
diff --git a/include/vcl/glyphitemcache.hxx b/include/vcl/glyphitemcache.hxx
index ab9ad877059a..ea6d9fca7ffb 100644
--- a/include/vcl/glyphitemcache.hxx
+++ b/include/vcl/glyphitemcache.hxx
@@ -71,6 +71,8 @@ private:
tools::Long logicWidth;
VclPtr<const OutputDevice> outputDevice;
vcl::Font font;
+ double fontScaleX;
+ double fontScaleY;
MapMode mapMode;
bool rtl;
vcl::text::ComplexTextLayoutFlags layoutMode;
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index bf4985622fad..ea14e3d018b7 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -1192,8 +1192,9 @@ public:
//If bNewFontLists is true then drop and refetch lists of system fonts
SAL_DLLPRIVATE static void ImplUpdateAllFontData( bool bNewFontLists );
-protected:
SAL_DLLPRIVATE const LogicalFontInstance* GetFontInstance() const;
+
+protected:
SAL_DLLPRIVATE tools::Long GetEmphasisAscent() const { return mnEmphasisAscent; }
SAL_DLLPRIVATE tools::Long GetEmphasisDescent() const { return mnEmphasisDescent; }
diff --git a/vcl/source/gdi/impglyphitem.cxx b/vcl/source/gdi/impglyphitem.cxx
index 09acbae46150..93f70a853a74 100644
--- a/vcl/source/gdi/impglyphitem.cxx
+++ b/vcl/source/gdi/impglyphitem.cxx
@@ -364,6 +364,9 @@ SalLayoutGlyphsCache::CachedGlyphsKey::CachedGlyphsKey(const VclPtr<const Output
, layoutMode(outputDevice->GetLayoutMode())
, digitLanguage(outputDevice->GetDigitLanguage())
{
+ const LogicalFontInstance* fi = outputDevice->GetFontInstance();
+ fi->GetScale(&fontScaleX, &fontScaleY);
+
hashValue = 0;
o3tl::hash_combine(hashValue, vcl::text::FirstCharsStringHash()(text));
o3tl::hash_combine(hashValue, index);
@@ -371,7 +374,13 @@ SalLayoutGlyphsCache::CachedGlyphsKey::CachedGlyphsKey(const VclPtr<const Output
o3tl::hash_combine(hashValue, logicWidth);
o3tl::hash_combine(hashValue, outputDevice.get());
+ // Need to use IgnoreColor, because sometimes the color changes, but it's irrelevant
+ // for text layout (and also obsolete in vcl::Font).
o3tl::hash_combine(hashValue, font.GetHashValueIgnoreColor());
+ // For some reason font scale may differ even if vcl::Font is the same,
+ // so explicitly check it too.
+ o3tl::hash_combine(hashValue, fontScaleX);
+ o3tl::hash_combine(hashValue, fontScaleY);
o3tl::hash_combine(hashValue, mapMode.GetHashValue());
o3tl::hash_combine(hashValue, rtl);
o3tl::hash_combine(hashValue, layoutMode);
@@ -383,10 +392,8 @@ inline bool SalLayoutGlyphsCache::CachedGlyphsKey::operator==(const CachedGlyphs
return hashValue == other.hashValue && index == other.index && len == other.len
&& logicWidth == other.logicWidth && outputDevice == other.outputDevice
&& 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).
- && font.EqualIgnoreColor(other.font)
+ && digitLanguage == other.digitLanguage && fontScaleX == other.fontScaleX
+ && fontScaleY == other.fontScaleY && font.EqualIgnoreColor(other.font)
&& vcl::text::FastStringCompareEqual()(text, other.text);
// Slower things last in the comparison.
}