Revert optimization where several words are drawn at the same time

This can only be done where splitting of string is identical in row breaking and display. It will be possible to reintroduce this when row painting uses the tokenized row information.
This commit is contained in:
Jean-Marc Lasgouttes 2014-07-20 18:54:31 +02:00
parent 45eb314a86
commit bbe6e9f593
4 changed files with 9 additions and 20 deletions

View File

@ -39,10 +39,6 @@ What is done:
* Draw also RtL text string-wise. This speeds-up drawing. * Draw also RtL text string-wise. This speeds-up drawing.
* Do not cut strings at separators in RowPainter when text is not
justified. This speeds-up painting by reducing the number of strings
to draw.
* Do not cut strings at selection boundary in RowPainter. This avoids * Do not cut strings at selection boundary in RowPainter. This avoids
ligature/kerning breaking in latin text, and bad rendering problems ligature/kerning breaking in latin text, and bad rendering problems
in Arabic. in Arabic.

View File

@ -565,7 +565,7 @@ void TextMetrics::computeRowMetrics(pit_type const pit,
Paragraph const & par = text_->getPar(pit); Paragraph const & par = text_->getPar(pit);
double w = width - row.right_margin - row.width(); double const w = width - row.right_margin - row.width();
// FIXME: put back this assertion when the crash on new doc is solved. // FIXME: put back this assertion when the crash on new doc is solved.
//LASSERT(w >= 0, /**/); //LASSERT(w >= 0, /**/);
@ -607,9 +607,7 @@ void TextMetrics::computeRowMetrics(pit_type const pit,
} else if (int(row.width()) < max_width_) { } else if (int(row.width()) < max_width_) {
// is it block, flushleft or flushright? // is it block, flushleft or flushright?
// set x how you need it // set x how you need it
int const align = getAlign(par, row.pos()); switch (getAlign(par, row.pos())) {
switch (align) {
case LYX_ALIGN_BLOCK: { case LYX_ALIGN_BLOCK: {
int const ns = numberOfSeparators(row); int const ns = numberOfSeparators(row);
/** If we have separators, and this row has /** If we have separators, and this row has
@ -650,12 +648,12 @@ void TextMetrics::computeRowMetrics(pit_type const pit,
} }
#endif #endif
// Finally, handle hfill insets
pos_type const endpos = row.endpos(); pos_type const endpos = row.endpos();
pos_type body_pos = par.beginOfBody(); pos_type body_pos = par.beginOfBody();
if (body_pos > 0 if (body_pos > 0
&& (body_pos > endpos || !par.isLineSeparator(body_pos - 1))) && (body_pos > endpos || !par.isLineSeparator(body_pos - 1)))
body_pos = 0; body_pos = 0;
ParagraphMetrics & pm = par_metrics_[pit]; ParagraphMetrics & pm = par_metrics_[pit];
Row::iterator cit = row.begin(); Row::iterator cit = row.begin();
Row::iterator const cend = row.end(); Row::iterator const cend = row.end();
@ -798,8 +796,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
int const width = max_width_ - right_margin; int const width = max_width_ - right_margin;
pos_type const body_pos = par.beginOfBody(); pos_type const body_pos = par.beginOfBody();
row.clear(); row.clear();
row.x = leftMargin(max_width_, pit, pos); row.dimension().wid = leftMargin(max_width_, pit, pos);
row.dimension().wid = row.x;
row.right_margin = right_margin; row.right_margin = right_margin;
if (pos >= end || row.width() > width) { if (pos >= end || row.width() > width) {

View File

@ -273,14 +273,14 @@ void GuiPainter::image(int x, int y, int w, int h, graphics::Image const & i)
int GuiPainter::text(int x, int y, char_type c, FontInfo const & f) int GuiPainter::text(int x, int y, char_type c, FontInfo const & f)
{ {
docstring s(1, c); return text(x, y, docstring(1, c), f);
return text(x, y, s, f);
} }
int GuiPainter::text(int x, int y, docstring const & s, int GuiPainter::text(int x, int y, docstring const & s,
FontInfo const & f) FontInfo const & f)
{ {
//LYXERR0("text: x=" << x << ", s=" << s);
if (s.empty()) if (s.empty())
return 0; return 0;

View File

@ -186,16 +186,15 @@ void RowPainter::paintChars(pos_type & vpos, Font const & font)
} }
str.push_back(c); str.push_back(c);
pos_type const end = row_.endpos();
FontSpan const font_span = par_.fontSpan(pos); FontSpan const font_span = par_.fontSpan(pos);
// Track-change status. // Track-change status.
Change const & change_running = par_.lookupChange(pos); Change const & change_running = par_.lookupChange(pos);
// spelling correct? // spelling correct?
bool const spell_state = bool const spell_state =
lyxrc.spellcheck_continuously && par_.isMisspelled(pos); lyxrc.spellcheck_continuously && par_.isMisspelled(pos);
// collect as much similar chars as we can // collect as much similar chars as we can
pos_type const end = row_.endpos();
for (++vpos ; vpos < end ; ++vpos) { for (++vpos ; vpos < end ; ++vpos) {
pos = bidi_.vis2log(vpos); pos = bidi_.vis2log(vpos);
@ -218,11 +217,7 @@ void RowPainter::paintChars(pos_type & vpos, Font const & font)
if (c == '\t') if (c == '\t')
break; break;
// When row_.separator == 0, it is possible to print a if (!isPrintableNonspace(c))
// string longer than a word in one fell swoop.
// Therefore there is no need to break at spaces.
if (!isPrintableNonspace(c)
&& (c != ' ' || row_.separator > 0))
break; break;
// FIXME: Why only round brackets and why the difference to // FIXME: Why only round brackets and why the difference to
@ -707,6 +702,7 @@ void RowPainter::paintOnlyInsets()
void RowPainter::paintText() void RowPainter::paintText()
{ {
//LYXERR0("-------------------------------------------------------");
pos_type const end = row_.endpos(); pos_type const end = row_.endpos();
// Spaces at logical line breaks in bidi text must be skipped during // Spaces at logical line breaks in bidi text must be skipped during
// painting. However, they may appear visually in the middle // painting. However, they may appear visually in the middle