commit f750d9b5cfbc2050e663044789ed9b44219b47fa
Author: Jean-Marc Lasgouttes <[email protected]>
Date: Thu Jul 16 23:34:33 2015 +0200
Remove old cruft
There are many things that are not necessary anymore:
* remove methods paintText2, paintFromPos, leftMargin, paintInlineCompletion
* Remove use of Bidi class.
* add a Font and a Change parameter to paintInset.
Also remove a comment that describes what we have just done.
diff --git a/src/RowPainter.cpp b/src/RowPainter.cpp
index 26af81e..412bdfc 100644
--- a/src/RowPainter.cpp
+++ b/src/RowPainter.cpp
@@ -64,8 +64,6 @@ RowPainter::RowPainter(PainterInfo & pi,
solid_line_thickness_(1), solid_line_offset_(1),
dotted_line_thickness_(1), dotted_line_offset_(2)
{
- bidi_.computeTables(par_, pi_.base.bv->buffer(), row_);
-
if (lyxrc.zoom >= 200) {
// derive the line thickness from zoom factor
// the zoom is given in percent
@@ -103,18 +101,14 @@ FontInfo RowPainter::labelFont() const
}
-int RowPainter::leftMargin() const
-{
- return text_metrics_.leftMargin(text_metrics_.width(), pit_,
- row_.pos());
-}
-
// If you want to debug inset metrics uncomment the following line:
//#define DEBUG_METRICS
// This draws green lines around each inset.
-void RowPainter::paintInset(Inset const * inset, pos_type const pos)
+void RowPainter::paintInset(Inset const * inset, Font const & font,
+ Change const & change,
+ pos_type const pos)
{
// Handle selection
bool const pi_selected = pi_.selected;
@@ -123,19 +117,17 @@ void RowPainter::paintInset(Inset const * inset, pos_type
const pos)
&& cur.normalAnchor().text() == &text_)
pi_.selected = row_.sel_beg <= pos && row_.sel_end > pos;
- Font const font = text_metrics_.displayFont(pit_, pos);
-
LASSERT(inset, return);
// Backup full_repaint status because some insets (InsetTabular)
// requires a full repaint
bool const pi_full_repaint = pi_.full_repaint;
bool const pi_do_spellcheck = pi_.do_spellcheck;
+ Change const pi_change = pi_.change_;
pi_.base.font = inset->inheritFont() ? font.fontInfo() :
pi_.base.bv->buffer().params().getFont().fontInfo();
- pi_.ltr_pos = (bidi_.level(pos) % 2 == 0);
- Change prev_change = change_;
- pi_.change_ = change_.changed() ? change_ : par_.lookupChange(pos);
+ pi_.ltr_pos = !font.isVisibleRightToLeft();
+ pi_.change_ = change_.changed() ? change_ : change;
pi_.do_spellcheck &= inset->allowSpellCheck();
int const x1 = int(x_);
@@ -155,7 +147,7 @@ void RowPainter::paintInset(Inset const * inset, pos_type
const pos)
// Restore full_repaint status.
pi_.full_repaint = pi_full_repaint;
- pi_.change_ = prev_change;
+ pi_.change_ = pi_change;
pi_.do_spellcheck = pi_do_spellcheck;
pi_.selected = pi_selected;
@@ -294,94 +286,6 @@ void RowPainter::paintChange(double orig_x, Font const &
font,
}
-void RowPainter::paintFromPos(pos_type & vpos, bool changed)
-{
- pos_type pos = bidi_.vis2log(vpos);
- pos_type start_pos = pos;
- // first character
- docstring str;
- str.reserve(100);
- char_type const c = par_.getChar(pos);
- str.push_back(c);
-
- double const orig_x = x_;
-
- Font const font = text_metrics_.displayFont(pit_, pos);
- FontSpan const font_span = par_.fontSpan(pos);
- // Track-change status.
- Change const & change_running = par_.lookupChange(pos);
-
- // collect as much similar chars as we can
- pos_type const end = row_.endpos();
- for (++vpos ; vpos < end ; ++vpos) {
- pos = bidi_.vis2log(vpos);
-
- if (!font_span.contains(pos))
- break;
-
- Change const & change = par_.lookupChange(pos);
- if (!change_running.isSimilarTo(change))
- // Track change type or author has changed.
- break;
-
- char_type const c = par_.getChar(pos);
-
- if (c == '\t')
- break;
-
- if (!isPrintableNonspace(c))
- break;
-
- str.push_back(c);
- }
-
- // Make pos point to the last character in the string.
- // Using "pos = bidi_.vis2log(vpos)" does not work for some reason.
- if (vpos < end)
- pos = bidi_.vis2log(vpos - 1);
-
- // Now make pos point to the position _after_ the string.
- // Using vis2log for that is not a good idea in general, we
- // want logical ordering.
- if (font.isVisibleRightToLeft())
- --pos;
- else
- ++pos;
-
- if (str[0] == '\t')
- str.replace(0,1,from_ascii(" "));
-
- /* Because we do our own bidi, at this point the strings are
- * already in visual order. However, Qt also applies its own
- * bidi algorithm to strings that it paints to the screen.
- * Therefore, if we were to paint Hebrew/Arabic words as a
- * single string, the letters in the words would get reversed
- * again. In order to avoid that, we reverse our string.
- * See also http://thread.gmane.org/gmane.editors.lyx.devel/79740
- * for an earlier thread on the subject
- */
- if (font.isVisibleRightToLeft()) {
- reverse(str.begin(), str.end());
- // If the string is reversed, the positions need to be adjusted
- ++pos;
- ++start_pos;
- swap(start_pos, pos);
- }
-
- // Actually paint the text, taking care about the selection
- paintStringAndSel(str, font, change_running, start_pos, pos);
-
- // The line that indicates word in a different language
- paintForeignMark(orig_x, font.language());
-
- // Paint the spelling mark if needed.
- if (lyxrc.spellcheck_continuously && pi_.do_spellcheck
- && par_.isMisspelled(start_pos)) {
- paintMisspelledMark(orig_x, str, font, start_pos, changed);
- }
-}
-
-
void RowPainter::paintChangeBar() const
{
pos_type const start = row_.pos();
@@ -557,7 +461,7 @@ void RowPainter::paintLabel() const
double x = x_;
if (is_rtl) {
- x = width_ - leftMargin()
+ x = width_ - row_.left_margin
+ fm.width(layout.labelsep);
} else {
x = x_ - fm.width(layout.labelsep)
@@ -597,11 +501,11 @@ void RowPainter::paintTopLevelLabel() const
double x = x_;
if (layout.labeltype == LABEL_CENTERED) {
if (is_rtl)
- x = leftMargin();
- x += (width_ - text_metrics_.rightMargin(pm_) - leftMargin()) /
2;
+ x = row_.left_margin;
+ x += (width_ - text_metrics_.rightMargin(pm_) -
row_.left_margin) / 2;
x -= fm.width(str) / 2;
} else if (is_rtl) {
- x = width_ - leftMargin() - fm.width(str);
+ x = width_ - row_.left_margin - fm.width(str);
}
pi_.pain.text(int(x), yo_ - maxdesc - labeladdon, str, font);
}
@@ -723,7 +627,8 @@ void RowPainter::paintOnlyInsets()
|| !cache.getInsets().has(inset))
continue;
x_ = cache.getInsets().x(inset);
- paintInset(inset, pos);
+ Font const font = text_metrics_.displayFont(pit_, pos);
+ paintInset(inset, font, par_.lookupChange(pos), pos);
}
}
@@ -750,7 +655,7 @@ void RowPainter::paintText()
case Row::INSET: {
// If outer row has changed, nested insets are repaint
completely.
pi_.base.bv->coordCache().insets().add(e.inset,
int(x_), yo_);
- paintInset(e.inset, e.pos);
+ paintInset(e.inset, e.font, e.change, e.pos);
foreign_descent = e.dim.descent();
}
break;
@@ -766,168 +671,6 @@ void RowPainter::paintText()
if (e.type != Row::INSET || ! e.inset->canTrackChanges())
paintChange(orig_x, e.font, e.change);
}
-
-#if 0
- x_ = row_.left_margin + xo_;
- paintText2();
-#endif
-}
-
-
-void RowPainter::paintText2()
-{
- //LYXERR0("-------------------------------------------------------");
- pos_type const end = row_.endpos();
- // Spaces at logical line breaks in bidi text must be skipped during
- // painting. However, they may appear visually in the middle
- // of a row; they must be skipped, wherever they are...
- // * logically "abc_[HEBREW_\nHEBREW]"
- // * visually "abc_[_WERBEH\nWERBEH]"
- pos_type skipped_sep_vpos = -1;
- pos_type body_pos = par_.beginOfBody();
- if (body_pos > 0 &&
- (body_pos > end || !par_.isLineSeparator(body_pos - 1))) {
- body_pos = 0;
- }
-
- Layout const & layout = par_.layout();
-
- Change change_running;
- int change_last_x = 0;
-
- // check for possible inline completion
- DocIterator const & inlineCompletionPos =
pi_.base.bv->inlineCompletionPos();
- pos_type inlineCompletionVPos = -1;
- if (inlineCompletionPos.inTexted()
- && inlineCompletionPos.text() == &text_
- && inlineCompletionPos.pit() == pit_
- && inlineCompletionPos.pos() - 1 >= row_.pos()
- && inlineCompletionPos.pos() - 1 < row_.endpos()) {
- // draw logically behind the previous character
- inlineCompletionVPos = bidi_.log2vis(inlineCompletionPos.pos()
- 1);
- }
-
- // Use font span to speed things up, see below
- FontSpan font_span;
- Font font;
-
- // If the last logical character is a separator, don't paint it, unless
- // it's in the last row of a paragraph; see skipped_sep_vpos declaration
- if (end > 0 && end < par_.size() && par_.isSeparator(end - 1))
- skipped_sep_vpos = bidi_.log2vis(end - 1);
-
- for (pos_type vpos = row_.pos(); vpos < end; ) {
- if (x_ > pi_.base.bv->workWidth())
- break;
-
- // Skip the separator at the logical end of the row
- if (vpos == skipped_sep_vpos) {
- ++vpos;
- continue;
- }
-
- pos_type const pos = bidi_.vis2log(vpos);
-
- if (pos >= par_.size()) {
- ++vpos;
- continue;
- }
-
- // Use font span to speed things up, see above
- if (!font_span.contains(pos)) {
- font_span = par_.fontSpan(pos);
- font = text_metrics_.displayFont(pit_, pos);
-
- // split font span if inline completion is inside
- if (inlineCompletionVPos != -1
- && font_span.contains(inlineCompletionPos.pos()))
- font_span.last = inlineCompletionPos.pos();
- }
-
- // Note that this value will only be used in
- // situations where no ligature of composition of
- // characters is needed. (see comments in uses of width_pos).
- const int width_pos = pm_.singleWidth(pos, font);
-
- Change const & change = par_.lookupChange(pos);
- if (change.changed() && !change_running.changed()) {
- change_running = change;
- change_last_x = int(x_);
- }
-
- Inset const * inset = par_.getInset(pos);
- bool const highly_editable_inset = inset
- && inset->editable();
-
- // If we reach the end of a change or if the author changes,
paint it.
- // We also don't paint across things like tables
- if (change_running.changed() && (highly_editable_inset
- || !change.changed() ||
!change_running.isSimilarTo(change))) {
- // Calculate 1/3 height of the buffer's default font
- FontMetrics const & fm
- =
theFontMetrics(pi_.base.bv->buffer().params().getFont());
- int const y_bar = change_running.deleted() ?
- yo_ - fm.maxAscent() / 3 : yo_ + 2 *
solid_line_offset_ + solid_line_thickness_;
- pi_.pain.line(change_last_x, y_bar, int(x_), y_bar,
- change_running.color(), Painter::line_solid,
solid_line_thickness_);
-
- // Change might continue with a different author or type
- if (change.changed() && !highly_editable_inset) {
- change_running = change;
- change_last_x = int(x_);
- } else
- change_running.setUnchanged();
- }
-
- if (body_pos > 0 && pos == body_pos - 1) {
- int const lwidth = theFontMetrics(labelFont())
- .width(layout.labelsep);
-
- // width_pos is either the width of a space or an inset
- x_ += row_.label_hfill + lwidth - width_pos;
- }
-
- // Is the inline completion in front of character?
- if (font.isRightToLeft() && vpos == inlineCompletionVPos)
- paintInlineCompletion(font);
-
- if (par_.isSeparator(pos)) {
- Font const orig_font = text_metrics_.displayFont(pit_,
pos);
- double const orig_x = x_;
- // width_pos is the width of a space
- double separator_width = width_pos;
- if (pos >= body_pos)
- separator_width += row_.separator;
- paintSeparator(separator_width, orig_font);
- paintForeignMark(orig_x, orig_font.language());
- ++vpos;
-
- } else if (inset) {
- // If outer row has changed, nested insets are repaint
completely.
- pi_.base.bv->coordCache().insets().add(inset, int(x_),
yo_);
- paintInset(inset, pos);
- ++vpos;
-
- } else {
- // paint as many characters as possible.
- paintFromPos(vpos, change_running.changed());
- }
-
- // Is the inline completion after character?
- if (!font.isRightToLeft() && vpos - 1 == inlineCompletionVPos)
- paintInlineCompletion(font);
- }
-
- // if we reach the end of a struck out range, paint it
- if (change_running.changed()) {
- FontMetrics const & fm
- =
theFontMetrics(pi_.base.bv->buffer().params().getFont());
- int const y_bar = change_running.deleted() ?
- yo_ - fm.maxAscent() / 3 : yo_ + 2 *
solid_line_offset_ + solid_line_thickness_;
- pi_.pain.line(change_last_x, y_bar, int(x_), y_bar,
- change_running.color(), Painter::line_solid,
solid_line_thickness_);
- change_running.setUnchanged();
- }
}
@@ -1029,38 +772,4 @@ void RowPainter::paintSelection() const
}
-void RowPainter::paintInlineCompletion(Font const & font)
-{
- docstring completion = pi_.base.bv->inlineCompletion();
- FontInfo f = font.fontInfo();
- bool rtl = font.isRightToLeft();
-
- // draw the unique and the non-unique completion part
- // Note: this is not time-critical as it is
- // only done once per screen.
- size_t uniqueTo = pi_.base.bv->inlineCompletionUniqueChars();
- docstring s1 = completion.substr(0, uniqueTo);
- docstring s2 = completion.substr(uniqueTo);
- ColorCode c1 = Color_inlinecompletion;
- ColorCode c2 = Color_nonunique_inlinecompletion;
-
- // right to left?
- if (rtl) {
- swap(s1, s2);
- swap(c1, c2);
- }
-
- if (!s1.empty()) {
- f.setColor(c1);
- pi_.pain.text(int(x_), yo_, s1, f);
- x_ += theFontMetrics(font).width(s1);
- }
-
- if (!s2.empty()) {
- f.setColor(c2);
- pi_.pain.text(int(x_), yo_, s2, f);
- x_ += theFontMetrics(font).width(s2);
- }
-}
-
} // namespace lyx
diff --git a/src/RowPainter.h b/src/RowPainter.h
index 33eec5f..f559eeb 100644
--- a/src/RowPainter.h
+++ b/src/RowPainter.h
@@ -14,7 +14,6 @@
#ifndef ROWPAINTER_H
#define ROWPAINTER_H
-#include "Bidi.h"
#include "Changes.h"
#include "support/types.h"
@@ -37,21 +36,6 @@ class TextMetrics;
namespace frontend { class Painter; }
/**
- * FIXME: Re-implement row painting using row elements.
- *
- * This is not difficult in principle, but the code is intricate and
- * needs some careful analysis. The first thing that needs to be done
- * is to break row elements with the same criteria. Currently breakRow
- * does not consider on-the-fly spell-checking, but it is not clear to
- * me that it is required. Moreover, this thing would only work if we
- * are sure that the Row object is up-to-date when drawing happens.
- * This depends on the update machinery.
- *
- * This would allow to get rid of the Bidi class.
- */
-
-
-/**
* A class used for painting an individual row of text.
* FIXME: get rid of that class.
*/
@@ -70,7 +54,6 @@ public:
void paintFirst() const;
void paintLast();
void paintText();
- void paintText2();
void paintOnlyInsets();
void paintSelection() const;
@@ -85,12 +68,8 @@ private:
pos_type pos, bool changed) const;
void paintChange(double orig_x , Font const & font, Change const &
change) const;
int paintAppendixStart(int y) const;
- void paintFromPos(pos_type & vpos, bool changed);
- void paintInset(Inset const * inset, pos_type const pos);
- void paintInlineCompletion(Font const & font);
-
- /// return left margin
- int leftMargin() const;
+ void paintInset(Inset const * inset, Font const & font,
+ Change const & change, pos_type const pos);
/// return the label font for this row
FontInfo labelFont() const;
@@ -117,9 +96,6 @@ private:
Paragraph const & par_;
ParagraphMetrics const & pm_;
- /// bidi cache
- Bidi bidi_;
-
/// row changed? (change tracking)
Change const change_;