From 8b89709fc9e128f85757642db3bfe1ec3145e9c8 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Fri, 18 Sep 2015 15:42:24 +0100 Subject: [PATCH] New helper method Row::Element::isRTL() --- src/Row.cpp | 30 +++++++++++++----------------- src/Row.h | 5 ++++- src/RowPainter.cpp | 4 ++-- src/TextMetrics.cpp | 2 +- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/Row.cpp b/src/Row.cpp index 7108c3c2ad..e3e8a3430a 100644 --- a/src/Row.cpp +++ b/src/Row.cpp @@ -52,18 +52,16 @@ double Row::Element::pos2x(pos_type const i) const if (i < pos || i > endpos) return 0; - bool const rtl = font.isVisibleRightToLeft(); - double w = 0; //handle first the two bounds of the element if (i == endpos && type != VIRTUAL && !(inset && inset->lyxCode() == SEPARATOR_CODE)) - w = rtl ? 0 : full_width(); + w = isRTL() ? 0 : full_width(); else if (i == pos || type != STRING) - w = rtl ? full_width() : 0; + w = isRTL() ? full_width() : 0; else { FontMetrics const & fm = theFontMetrics(font); - w = fm.pos2x(str, i - pos, font.isVisibleRightToLeft(), extra); + w = fm.pos2x(str, i - pos, isRTL(), extra); } return w; @@ -73,19 +71,18 @@ double Row::Element::pos2x(pos_type const i) const pos_type Row::Element::x2pos(int &x) const { //lyxerr << "x2pos: x=" << x << " w=" << width() << " " << *this; - bool const rtl = font.isVisibleRightToLeft(); size_t i = 0; switch (type) { case STRING: { FontMetrics const & fm = theFontMetrics(font); - i = fm.x2pos(str, x, rtl, extra); + i = fm.x2pos(str, x, isRTL(), extra); break; } case VIRTUAL: // those elements are actually empty (but they have a width) i = 0; - x = rtl ? int(full_width()) : 0; + x = isRTL() ? int(full_width()) : 0; break; case INSET: case SPACE: @@ -93,10 +90,10 @@ pos_type Row::Element::x2pos(int &x) const // the closest side. if (x > full_width()) { x = int(full_width()); - i = !rtl; + i = !isRTL(); } else { x = 0; - i = rtl; + i = isRTL(); } } @@ -111,10 +108,9 @@ bool Row::Element::breakAt(int w, bool force) if (type != STRING || dim.wid <= w) return false; - bool const rtl = font.isVisibleRightToLeft(); FontMetrics const & fm = theFontMetrics(font); int x = w; - if(fm.breakAt(str, x, rtl, force)) { + if(fm.breakAt(str, x, isRTL(), force)) { dim.wid = x; endpos = pos + str.length(); //lyxerr << "breakAt(" << w << ") Row element Broken at " << x << "(w(str)=" << fm.width(str) << "): e=" << *this << endl; @@ -126,13 +122,13 @@ bool Row::Element::breakAt(int w, bool force) pos_type Row::Element::left_pos() const { - return font.isVisibleRightToLeft() ? endpos : pos; + return isRTL() ? endpos : pos; } pos_type Row::Element::right_pos() const { - return font.isVisibleRightToLeft() ? pos : endpos; + return isRTL() ? pos : endpos; } @@ -217,7 +213,7 @@ bool Row::selection() const ostream & operator<<(ostream & os, Row::Element const & e) { - if (e.font.isVisibleRightToLeft()) + if (e.isRTL()) os << e.endpos << "<<" << e.pos << " "; else os << e.pos << ">>" << e.endpos << " "; @@ -480,9 +476,9 @@ void Row::reverseRTL(bool const rtl_par) pos_type const end = elements_.size(); while (i < end) { // gather a sequence of elements with the same direction - bool const rtl = elements_[i].font.isVisibleRightToLeft(); + bool const rtl = elements_[i].isRTL(); pos_type j = i; - while (j < end && elements_[j].font.isVisibleRightToLeft() == rtl) + while (j < end && elements_[j].isRTL() == rtl) ++j; // if the direction is not the same as the paragraph // direction, the sequence has to be reverted. diff --git a/src/Row.h b/src/Row.h index 92521ef4ba..c0580c0e69 100644 --- a/src/Row.h +++ b/src/Row.h @@ -62,7 +62,7 @@ public: extra(0), font(f), change(ch), final(false) {} // Return total width of element, including separator overhead - double full_width() const { return dim.wid + extra * countSeparators(); }; + double full_width() const { return dim.wid + extra * countSeparators(); } // Return the number of separator in the element (only STRING type) int countSeparators() const; @@ -87,6 +87,9 @@ public: // Returns the position on right side of the element. pos_type right_pos() const; + // + bool isRTL() const { return font.isVisibleRightToLeft(); } + // The kind of row element Type type; // position of the element in the paragraph diff --git a/src/RowPainter.cpp b/src/RowPainter.cpp index f54cf2853b..81b58a8691 100644 --- a/src/RowPainter.cpp +++ b/src/RowPainter.cpp @@ -219,10 +219,10 @@ void RowPainter::paintMisspelledMark(double const orig_x, FontMetrics const & fm = theFontMetrics(e.font); int x1 = fm.pos2x(e.str, range.first - e.pos, - e.font.isVisibleRightToLeft(), e.extra); + e.isRTL(), e.extra); int x2 = fm.pos2x(e.str, min(range.last - e.pos + 1, pos_type(e.str.length())), - e.font.isVisibleRightToLeft(), e.extra); + e.isRTL(), e.extra); if (x1 > x2) swap(x1, x2); diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index b394169fac..fc5e1c5ac5 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -1103,7 +1103,7 @@ pos_type TextMetrics::getPosNearX(Row const & row, int & x, */ else if (pos == cit->endpos && cit + 1 != row.end() - && cit->font.isVisibleRightToLeft() != (cit + 1)->font.isVisibleRightToLeft()) + && cit->isRTL() != (cit + 1)->isRTL()) boundary = true; } -- 2.39.2