+ if ((force && line.textLength() == offset) || int(line.naturalTextWidth()) > x)
+ return {-1, -1};
+ /* Since QString is UTF-16 and docstring is UCS-4, the offsets may
+ * not be the same when there are high-plan unicode characters
+ * (bug #10443).
+ */
+ // The variable `offset' is here to account for the extra leading characters.
+ // The ending character zerow_nbsp has to be ignored if the line is complete.
+ int const qlen = line.textLength() - offset - (line.textLength() == qs.length());
+#if QT_VERSION < 0x040801 || QT_VERSION >= 0x050100
+ int len = qstring_to_ucs4(qs.mid(offset, qlen)).length();
+#else
+ /* Due to QTBUG-25536 in 4.8.1 <= Qt < 5.1.0, the string returned
+ * by QString::toUcs4 (used by qstring_to_ucs4) may have wrong
+ * length. We work around the problem by trying all docstring
+ * positions until the right one is found. This is slow only if
+ * there are many high-plane Unicode characters. It might be
+ * worthwhile to implement a dichotomy search if this shows up
+ * under a profiler.
+ */
+ int len = min(qlen, static_cast<int>(s.length()));
+ while (len >= 0 && toqstr(s.substr(0, len)).length() != qlen)
+ --len;
+ LASSERT(len > 0 || qlen == 0, /**/);
+#endif
+ // The -1 is here to account for the leading zerow_nbsp.
+ return {len, int(line.naturalTextWidth())};
+}
+
+
+bool GuiFontMetrics::breakAt(docstring & s, int & x, bool const rtl, bool const force) const
+{
+ PROFILE_THIS_BLOCK(breakAt);
+ if (s.empty())