commit 7fdc6046069295b0993a99e34cc3d29fa1224fd7
Author: Jean-Marc Lasgouttes <[email protected]>
Date: Thu Jul 14 17:24:33 2022 +0200
Refactor GuiFontMetrics::getLayout
This allows to create a new version that takes an already built
TextLayoutHelper struct as parameter.
No intended change.
See discussion in bug #10117.
---
src/frontends/qt/GuiFontMetrics.cpp | 63 ++++++++++++++++++++++------------
src/frontends/qt/GuiFontMetrics.h | 9 ++++-
2 files changed, 48 insertions(+), 24 deletions(-)
diff --git a/src/frontends/qt/GuiFontMetrics.cpp
b/src/frontends/qt/GuiFontMetrics.cpp
index 3ee2702..5ee01ec 100644
--- a/src/frontends/qt/GuiFontMetrics.cpp
+++ b/src/frontends/qt/GuiFontMetrics.cpp
@@ -352,8 +352,6 @@ uint qHash(TextLayoutKey const & key)
}
-namespace {
-
// This holds a translation table between the original string and the
// QString that we can use with QTextLayout.
struct TextLayoutHelper
@@ -438,39 +436,60 @@ TextLayoutHelper::TextLayoutHelper(docstring const & s,
bool isrtl, bool naked)
//LYXERR0("TLH: " << dump.replace(word_joiner, "|").toStdString());
}
-}
-shared_ptr<QTextLayout const>
-GuiFontMetrics::getTextLayout(docstring const & s, bool const rtl,
- double const wordspacing) const
+namespace {
+
+shared_ptr<QTextLayout>
+getTextLayout_helper(TextLayoutHelper const & tlh, double const wordspacing,
+ QFont font)
{
- PROFILE_THIS_BLOCK(getTextLayout);
- TextLayoutKey key{s, rtl, wordspacing};
- if (auto ptl = qtextlayout_cache_[key])
- return ptl;
- PROFILE_CACHE_MISS(getTextLayout);
auto const ptl = make_shared<QTextLayout>();
ptl->setCacheEnabled(true);
- QFont copy = font_;
- copy.setWordSpacing(wordspacing);
- ptl->setFont(copy);
-
+ font.setWordSpacing(wordspacing);
+ ptl->setFont(font);
#ifdef BIDI_USE_FLAG
/* Use undocumented flag to enforce drawing direction
* FIXME: This does not work with Qt 5.11 (ticket #11284).
*/
- ptl->setFlags(rtl ? Qt::TextForceRightToLeft :
Qt::TextForceLeftToRight);
-#endif
-
-#ifdef BIDI_USE_OVERRIDE
- ptl->setText(bidi_override[rtl] + toqstr(s));
-#else
- ptl->setText(toqstr(s));
+ ptl->setFlags(tlh.rtl ? Qt::TextForceRightToLeft :
Qt::TextForceLeftToRight);
#endif
+ ptl->setText(tlh.qstr);
ptl->beginLayout();
ptl->createLine();
ptl->endLayout();
+
+ return ptl;
+}
+
+}
+
+shared_ptr<QTextLayout const>
+GuiFontMetrics::getTextLayout(TextLayoutHelper const & tlh,
+ double const wordspacing) const
+{
+ PROFILE_THIS_BLOCK(getTextLayout_TLH);
+ TextLayoutKey key{tlh.docstr, tlh.rtl, wordspacing};
+ if (auto ptl = qtextlayout_cache_[key])
+ return ptl;
+ PROFILE_CACHE_MISS(getTextLayout_TLH);
+ auto const ptl = getTextLayout_helper(tlh, wordspacing, font_);
+ qtextlayout_cache_.insert(key, ptl);
+ return ptl;
+}
+
+
+shared_ptr<QTextLayout const>
+GuiFontMetrics::getTextLayout(docstring const & s, bool const rtl,
+ double const wordspacing) const
+{
+ PROFILE_THIS_BLOCK(getTextLayout);
+ TextLayoutKey key{s, rtl, wordspacing};
+ if (auto ptl = qtextlayout_cache_[key])
+ return ptl;
+ PROFILE_CACHE_MISS(getTextLayout);
+ TextLayoutHelper tlh(s, rtl);
+ auto const ptl = getTextLayout_helper(tlh, wordspacing, font_);
qtextlayout_cache_.insert(key, ptl);
return ptl;
}
diff --git a/src/frontends/qt/GuiFontMetrics.h
b/src/frontends/qt/GuiFontMetrics.h
index 82c5839..5c32ea9 100644
--- a/src/frontends/qt/GuiFontMetrics.h
+++ b/src/frontends/qt/GuiFontMetrics.h
@@ -27,6 +27,8 @@
namespace lyx {
namespace frontend {
+struct TextLayoutHelper;
+
struct BreakStringKey
{
bool operator==(BreakStringKey const & key) const {
@@ -97,14 +99,17 @@ public:
/// Return a pointer to a cached QTextLayout object
std::shared_ptr<QTextLayout const>
- getTextLayout(docstring const & s, bool const rtl,
- double const wordspacing) const;
+ getTextLayout(docstring const & s, bool const rtl, double const
wordspacing) const;
private:
Breaks breakString_helper(docstring const & s, int first_wid, int wid,
bool rtl, bool force) const;
+ /// A different version of getTextLayout for internal use
+ std::shared_ptr<QTextLayout const>
+ getTextLayout(TextLayoutHelper const & tlh, double const wordspacing)
const;
+
/// The font
QFont font_;
--
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs