/// return left margin
int leftMargin() const;
- /// return the font at the given pos
- LyXFont const getFont(lyx::pos_type pos) const;
-
/// return the label font for this row
LyXFont const getLabelFont() const;
- /// return pixel width for the given pos
- int singleWidth(lyx::pos_type pos) const;
- int singleWidth(lyx::pos_type pos, char c) const;
-
/// bufferview to paint on
BufferView const & bv_;
pit_type const pit_;
Paragraph const & par_;
+ /// is row erased? (change tracking)
+ bool erased_;
+
// Looks ugly - is
double const xo_;
int const yo_; // current baseline
LyXText const & text, pit_type pit, Row const & row, int x, int y)
: bv_(*pi.base.bv), pain_(pi.pain), text_(text), pars_(text.paragraphs()),
row_(row), pit_(pit), par_(text.paragraphs()[pit]),
+ erased_(pi.erased_),
xo_(x), yo_(y), width_(text_.width())
{
RowMetrics m = text_.computeRowMetrics(pit, row_);
}
-/// "temporary"
-LyXFont const RowPainter::getFont(pos_type pos) const
-{
- LyXFont pf(text_.getFont(par_, pos));
- text_.applyOuterFont(pf);
- return pf;
-}
-
-
-int RowPainter::singleWidth(lyx::pos_type pos) const
-{
- return text_.singleWidth(par_, pos);
-}
-
-
-int RowPainter::singleWidth(lyx::pos_type pos, char c) const
-{
- LyXFont const & font = text_.getFont(par_, pos);
- return text_.singleWidth(par_, pos, c, font);
-}
-
-
LyXFont const RowPainter::getLabelFont() const
{
return text_.getLabelFont(par_);
PainterInfo pi(const_cast<BufferView *>(&bv_), pain_);
pi.base.font = font;
pi.ltr_pos = (text_.bidi.level(pos) % 2 == 0);
+ pi.erased_ = erased_ || isDeletedText(par_, pos);
theCoords.insets().add(inset, int(x_), yo_);
inset->drawSelection(pi, int(x_), yo_);
inset->draw(pi, int(x_), yo_);
c = par_.getChar(i);
if (!Encodings::IsComposeChar_hebrew(c)) {
if (IsPrintableNonspace(c)) {
- int const width2 = singleWidth(i, c);
+ int const width2 =
+ text_.singleWidth(par_, i, c, text_.getFont(par_, i));
// dalet / resh
dx = (c == 'ø' || c == 'ã')
? width2 - width
c = par_.getChar(i);
if (!Encodings::IsComposeChar_arabic(c)) {
if (IsPrintableNonspace(c)) {
- int const width2 = singleWidth(i, c);
+ int const width2 =
+ text_.singleWidth(par_, i, c, text_.getFont(par_, i));
dx = (width2 - width) / 2;
}
break;
{
pos_type pos = text_.bidi.vis2log(vpos);
pos_type const end = row_.endpos();
- std::pair<lyx::pos_type, lyx::pos_type> const font_span
- = par_.getFontSpan(pos);
+ FontSpan const font_span = par_.fontSpan(pos);
Change::Type const prev_change = par_.lookupChange(pos);
// first character
// collect as much similar chars as we can
for (++vpos ; vpos < end ; ++vpos) {
pos = text_.bidi.vis2log(vpos);
- if (pos < font_span.first || pos > font_span.second)
+ if (pos < font_span.first || pos > font_span.last)
break;
if (prev_change != par_.lookupChange(pos))
void RowPainter::paintFromPos(pos_type & vpos)
{
pos_type const pos = text_.bidi.vis2log(vpos);
-
- LyXFont const & orig_font = getFont(pos);
+ LyXFont orig_font = text_.getFont(par_, pos);
+ text_.applyOuterFont(orig_font);
double const orig_x = x_;
- char const c = par_.getChar(pos);
-
- if (c == Paragraph::META_INSET) {
+ if (par_.isInset(pos)) {
paintInset(pos, orig_font);
++vpos;
paintForeignMark(orig_x, orig_font);
}
// usual characters, no insets
+ char const c = par_.getChar(pos);
// special case languages
- bool const hebrew = (orig_font.language()->lang() == "hebrew");
- bool const arabic =
- orig_font.language()->lang() == "arabic" &&
+ std::string const & lang = orig_font.language()->lang();
+ bool const hebrew = lang == "hebrew";
+ bool const arabic = lang == "arabic" &&
(lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 ||
lyxrc.font_norm_type == LyXRC::ISO_10646_1);
} else {
spacing_val = buffer.params().spacing().getValue();
}
-#ifdef WITH_WARNINGS
-#warning Look is this correct?
-#endif
+
int const labeladdon = int(font_metrics::maxHeight(font) * layout->spacing.getValue() * spacing_val);
int const maxdesc = int(font_metrics::maxDescent(font) * layout->spacing.getValue() * spacing_val)
if (!par_.getLabelstring().empty()) {
string const str = par_.getLabelstring();
double spacing_val = 1.0;
- if (!parparams.spacing().isDefault()) {
+ if (!parparams.spacing().isDefault())
spacing_val = parparams.spacing().getValue();
- } else {
+ else
spacing_val = buffer.params().spacing().getValue();
- }
+
+ int const labeladdon = int(font_metrics::maxHeight(font) * layout->spacing.getValue() * spacing_val);
int maxdesc =
int(font_metrics::maxDescent(font) * layout->spacing.getValue() * spacing_val
x = width_ - leftMargin() -
font_metrics::width(str, font);
}
- pain_.text(int(x), yo_ - maxdesc, str, font);
+ pain_.text(int(x), yo_ - maxdesc - labeladdon, str, font);
}
}
}
bool is_struckout = false;
int last_strikeout_x = 0;
+ // Use font span to speed things up, see below
+ FontSpan font_span;
+ LyXFont font;
+
for (pos_type vpos = row_.pos(); vpos < end; ) {
if (x_ > bv_.workWidth())
break;
continue;
}
- const int width_pos = singleWidth(pos);
+ // Use font span to speed things up, see above
+ if (vpos < font_span.first || vpos > font_span.last) {
+ font_span = par_.fontSpan(vpos);
+ font = text_.getFont(par_, vpos);
+ }
+
+ const int width_pos =
+ text_.singleWidth(par_, pos, par_.getChar(pos), font);
+
if (x_ + width_pos < 0) {
x_ += width_pos;
++vpos;
bool const highly_editable_inset = par_.isInset(pos)
&& isHighlyEditableInset(par_.getInset(pos));
- // if we reach the end of a struck out range, paint it
- // we also don't paint across things like tables
+ // If we reach the end of a struck out range, paint it.
+ // We also don't paint across things like tables
if (running_strikeout && (highly_editable_inset || !is_struckout)) {
- // calculate 1/3 height of the buffer's default font
+ // Calculate 1/3 height of the buffer's default font
int const middle =
yo_ - font_metrics::maxAscent(text_.defaultfont_) / 3;
pain_.line(last_strikeout_x, middle, int(x_), middle,
yy += text->getPar(pit).descent();
}
-
- // paint one paragraph above and one below
+ // Cache one paragraph above and one below
// Note MV: this cannot be suppressed even for singlepar.
// Try viewing the User Guide Mobius figure
+
if (vi.p1 > 0) {
text->redoParagraph(vi.p1 - 1);
- paintPar(pi, *bv.text(), vi.p1 - 1, 0,
- vi.y1 - text->getPar(vi.p1 - 1).descent());
+ theCoords.parPos()[bv.text()][vi.p1 - 1] =
+ Point(0, vi.y1 - text->getPar(vi.p1 - 1).descent());
}
if (vi.p2 < lyx::pit_type(text->paragraphs().size()) - 1) {
text->redoParagraph(vi.p2 + 1);
- paintPar(pi, *bv.text(), vi.p2 + 1, 0,
- vi.y2 + text->getPar(vi.p2 + 1).ascent());
+ theCoords.parPos()[bv.text()][vi.p2 + 1] =
+ Point(0, vi.y2 + text->getPar(vi.p2 + 1).ascent());
}
// and grey out above (should not happen later)
// lyxerr << "par ascent: " << text->getPar(vi.p1).ascent() << endl;
- if (vi.y1 > 0)
+ if (vi.y1 > 0 && !vi.singlepar)
pain.fillRectangle(0, 0, bv.workWidth(), vi.y1, LColor::bottomarea);
// and possibly grey out below
// lyxerr << "par descent: " << text->getPar(vi.p1).ascent() << endl;
- if (vi.y2 < bv.workHeight())
+ if (vi.y2 < bv.workHeight() && !vi.singlepar)
pain.fillRectangle(0, vi.y2, bv.workWidth(), bv.workHeight() - vi.y2, LColor::bottomarea);
}