commit e0879b14602c0aff25ba951f6aa1277e4a94f988
Author: Jean-Marc Lasgouttes <[email protected]>
Date: Wed Mar 20 10:56:16 2019 +0100
Cache the value of GuiFontMetrics::lbearing().
This seems to be necessary on windows, where math editing can get very
slow. Note that other methods like rbearing already use a cache.
In the future all these caches for single characters shall be unified.
(cherry picked from commit d3979e798cd9c85041bb5e6158002384a8cddb8c)
---
src/frontends/qt4/GuiFontMetrics.cpp | 25 +++++++++++++++++--------
src/frontends/qt4/GuiFontMetrics.h | 2 ++
status.23x | 2 ++
3 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/src/frontends/qt4/GuiFontMetrics.cpp
b/src/frontends/qt4/GuiFontMetrics.cpp
index 8ed8228..63f61f2 100644
--- a/src/frontends/qt4/GuiFontMetrics.cpp
+++ b/src/frontends/qt4/GuiFontMetrics.cpp
@@ -135,20 +135,29 @@ int GuiFontMetrics::strikeoutPos() const
}
+namespace {
+int const outOfLimitMetric = -10000;
+}
+
+
int GuiFontMetrics::lbearing(char_type c) const
{
- if (!is_utf16(c))
+ int value = lbearing_cache_.value(c, outOfLimitMetric);
+ if (value != outOfLimitMetric)
+ return value;
+
+ if (is_utf16(c))
+ value = metrics_.leftBearing(ucs4_to_qchar(c));
+ else {
// FIXME: QFontMetrics::leftBearing does not support the
// full unicode range. Once it does, we could use:
- //return metrics_.leftBearing(toqstr(docstring(1, c)));
- return 0;
-
- return metrics_.leftBearing(ucs4_to_qchar(c));
-}
+ // metrics_.leftBearing(toqstr(docstring(1, c)));
+ value = 0;
+ }
+ lbearing_cache_.insert(c, value);
-namespace {
-int const outOfLimitMetric = -10000;
+ return value;
}
diff --git a/src/frontends/qt4/GuiFontMetrics.h
b/src/frontends/qt4/GuiFontMetrics.h
index 3f50dfe..6cea40f 100644
--- a/src/frontends/qt4/GuiFontMetrics.h
+++ b/src/frontends/qt4/GuiFontMetrics.h
@@ -101,6 +101,8 @@ private:
/// fill in \c metrics_cache_ at specified value.
AscendDescend const fillMetricsCache(char_type) const;
+ /// Cache of char left bearings
+ mutable QHash<char_type, int> lbearing_cache_;
/// Cache of char right bearings
mutable QHash<char_type, int> rbearing_cache_;
diff --git a/status.23x b/status.23x
index d7afa35..29f9d20 100644
--- a/status.23x
+++ b/status.23x
@@ -51,6 +51,8 @@ What's new
- Fix bad error message (bug 11486).
+- Improve performance on Windows with lots of math insets.
+
* DOCUMENTATION AND LOCALIZATION