From e0879b14602c0aff25ba951f6aa1277e4a94f988 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Wed, 20 Mar 2019 10:56:16 +0100 Subject: [PATCH] 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 8ed82280c0..63f61f2e3f 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 3f50dfe5d2..6cea40f3ec 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 lbearing_cache_; /// Cache of char right bearings mutable QHash rbearing_cache_; diff --git a/status.23x b/status.23x index d7afa3592b..29f9d20add 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 -- 2.39.5