X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Frowpainter.cpp;h=6d56c27b60db69ccbb6743e91c3930cc8d68000e;hb=2455bc258f3b62c29ec4a41cb88070ff8518e842;hp=c4290581415051ce98c748c8f6346832a6685d4d;hpb=f2c9b56fb4e4abd5183858984dd9329453004c96;p=lyx.git diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index c429058141..6d56c27b60 100644 --- a/src/rowpainter.cpp +++ b/src/rowpainter.cpp @@ -10,6 +10,7 @@ */ #include +#include #include "rowpainter.h" @@ -42,11 +43,9 @@ #include "support/debug.h" #include "support/textutils.h" -#include +#include "support/lassert.h" #include -#include - using namespace std; namespace lyx { @@ -70,8 +69,8 @@ RowPainter::RowPainter(PainterInfo & pi, //lyxerr << "RowPainter: x: " << x_ << " xo: " << xo_ << " yo: " << yo_ << endl; //row_.dump(); - BOOST_ASSERT(pit >= 0); - BOOST_ASSERT(pit < int(text.paragraphs().size())); + LASSERT(pit >= 0, /**/); + LASSERT(pit < int(text.paragraphs().size()), /**/); } @@ -96,7 +95,7 @@ void RowPainter::paintInset(Inset const * inset, pos_type const pos) { Font const font = text_metrics_.displayFont(pit_, pos); - BOOST_ASSERT(inset); + LASSERT(inset, /**/); // Backup full_repaint status because some insets (InsetTabular) // requires a full repaint bool pi_full_repaint = pi_.full_repaint; @@ -125,7 +124,7 @@ void RowPainter::paintInset(Inset const * inset, pos_type const pos) #ifdef DEBUG_METRICS int const x1 = int(x_ - dim.width()); Dimension dim2; - BOOST_ASSERT(max_witdh_ > 0); + LASSERT(max_witdh_ > 0, /**/); int right_margin = text_metrics_.rightMargin(pm_); int const w = max_witdh_ - leftMargin() - right_margin; MetricsInfo mi(pi_.base.bv, font.fontInfo(), w); @@ -142,9 +141,9 @@ void RowPainter::paintInset(Inset const * inset, pos_type const pos) lyxerr << "Error: inset " << to_ascii(inset->getInsetName()) << " draw ascent " << dim.descent() << "> metrics descent " << dim2.des << "." << endl; - BOOST_ASSERT(dim2.wid == dim.wid); - BOOST_ASSERT(dim2.asc == dim.asc); - BOOST_ASSERT(dim2.des == dim.des); + LASSERT(dim2.wid == dim.wid, /**/); + LASSERT(dim2.asc == dim.asc, /**/); + LASSERT(dim2.des == dim.des, /**/); int const x2 = x1 + dim.wid; int const y1 = yo_ + dim.des; int const y2 = yo_ - dim.asc; @@ -172,7 +171,7 @@ void RowPainter::paintHebrewComposeChar(pos_type & vpos, FontInfo const & font) for (pos_type i = pos - 1; i >= 0; --i) { c = par_.getChar(i); - if (!Encodings::isComposeChar_hebrew(c)) { + if (!Encodings::isHebrewComposeChar(c)) { if (isPrintableNonspace(c)) { int const width2 = pm_.singleWidth(i, text_metrics_.displayFont(pit_, i)); @@ -206,7 +205,7 @@ void RowPainter::paintArabicComposeChar(pos_type & vpos, FontInfo const & font) for (pos_type i = pos - 1; i >= 0; --i) { c = par_.getChar(i); - if (!Encodings::isComposeChar_arabic(c)) { + if (!Encodings::isArabicComposeChar(c)) { if (isPrintableNonspace(c)) { int const width2 = pm_.singleWidth(i, text_metrics_.displayFont(pit_, i)); @@ -225,10 +224,6 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, { // This method takes up 70% of time when typing pos_type pos = bidi_.vis2log(vpos); - pos_type const end = row_.endpos(); - FontSpan const font_span = par_.fontSpan(pos); - Change::Type const prev_change = par_.lookupChange(pos).type; - // first character vector str; str.reserve(100); @@ -243,13 +238,26 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, str[0] = par_.transformChar(c, pos); } + pos_type const end = row_.endpos(); + FontSpan const font_span = par_.fontSpan(pos); + // Track-change status. + Change::Type const change_type = par_.lookupChange(pos).type; + // selected text? + bool const selection = pos >= row_.sel_beg && pos < row_.sel_end; + // collect as much similar chars as we can for (++vpos ; vpos < end ; ++vpos) { pos = bidi_.vis2log(vpos); if (pos < font_span.first || pos > font_span.last) break; - if (prev_change != par_.lookupChange(pos).type) + bool const new_selection = pos >= row_.sel_beg && pos < row_.sel_end; + if (new_selection != selection) + // Selection ends or starts here. + break; + + if (change_type != par_.lookupChange(pos).type) + // Track change type has changed. break; char_type c = par_.getChar(pos); @@ -276,10 +284,10 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, * of arabic and hebrew characters, then these breaks may have * to be re-applied. - if (arabic && Encodings::isComposeChar_arabic(c)) + if (arabic && Encodings::isArabicComposeChar(c)) break; - if (hebrew && Encodings::isComposeChar_hebrew(c)) + if (hebrew && Encodings::isHebrewComposeChar(c)) break; */ @@ -298,17 +306,20 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, docstring s(&str[0], str.size()); - if (prev_change != Change::UNCHANGED) { - FontInfo copy = font; - if (prev_change == Change::DELETED) { - copy.setColor(Color_deletedtext); - } else if (prev_change == Change::INSERTED) { - copy.setColor(Color_addedtext); - } - x_ += pi_.pain.text(int(x_), yo_, s, copy); - } else { + if (!selection && change_type == Change::UNCHANGED) { x_ += pi_.pain.text(int(x_), yo_, s, font); + return; } + + FontInfo copy = font; + if (change_type == Change::DELETED) + copy.setColor(Color_deletedtext); + else if (change_type == Change::INSERTED) + copy.setColor(Color_addedtext); + else if (selection) + copy.setColor(Color_selectiontext); + + x_ += pi_.pain.text(int(x_), yo_, s, copy); } @@ -344,8 +355,8 @@ void RowPainter::paintFromPos(pos_type & vpos) // draw as many chars as we can if ((!hebrew && !arabic) - || (hebrew && !Encodings::isComposeChar_hebrew(c)) - || (arabic && !Encodings::isComposeChar_arabic(c))) { + || (hebrew && !Encodings::isHebrewComposeChar(c)) + || (arabic && !Encodings::isArabicComposeChar(c))) { paintChars(vpos, orig_font.fontInfo(), hebrew, arabic); } else if (hebrew) { paintHebrewComposeChar(vpos, orig_font.fontInfo()); @@ -827,8 +838,6 @@ void RowPainter::paintInlineCompletion(Font const & font) // right to left? if (rtl) { swap(s1, s2); - reverse(s1.begin(), s1.end()); - reverse(s2.begin(), s2.end()); swap(c1, c2); }