X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Frowpainter.C;h=fdb3450e6407679b09c51d90fc9ce9b2853d8b10;hb=35204f8f33d7400a5fefeffea533fb4cb4097211;hp=4147a742bd5139bb488930252cae56d677ec95d1;hpb=27ef7c726f4e688b615798bad160c5e6af47c3d5;p=lyx.git diff --git a/src/rowpainter.C b/src/rowpainter.C index 4147a742bd..fdb3450e64 100644 --- a/src/rowpainter.C +++ b/src/rowpainter.C @@ -156,6 +156,11 @@ int RowPainter::leftMargin() const } +// If you want to debug inset metrics uncomment the following line: +// #define DEBUG_METRICS +// This draws green lines around each inset. + + void RowPainter::paintInset(pos_type const pos, LyXFont const & font) { InsetBase const * inset = par_.getInset(pos); @@ -168,19 +173,53 @@ void RowPainter::paintInset(pos_type const pos, LyXFont const & font) font; pi.ltr_pos = (text_.bidi.level(pos) % 2 == 0); pi.erased_ = erased_ || par_.isDeleted(pos); +#ifdef DEBUG_METRICS + int const x1 = int(x_); +#endif bv_.coordCache().insets().add(inset, int(x_), yo_); InsetText const * const in = inset->asTextInset(); // non-wide insets are painted completely. Recursive bool tmp = refreshInside; - if (!in || !in->Wide()) { + if (!in || !in->wide()) { refreshInside = true; - lyxerr[Debug::PAINTING] << endl << "Paint inset fully" << endl; + if (lyxerr.debugging(Debug::PAINTING)) { + lyxerr << endl << "Paint inset fully" << endl; + } } if (refreshInside) inset->drawSelection(pi, int(x_), yo_); inset->draw(pi, int(x_), yo_); refreshInside = tmp; x_ += inset->width(); +#ifdef DEBUG_METRICS + Dimension dim; + BOOST_ASSERT(text_.maxwidth_ > 0); + int const w = text_.maxwidth_ - leftMargin() - text_.rightMargin(*bv_.buffer(), par_); + MetricsInfo mi(&bv_, font, w); + inset->metrics(mi, dim); + if (inset->width() > dim.wid) + lyxerr << "Error: inset " << to_ascii(inset->getInsetName()) + << " draw width " << inset->width() + << "> metrics width " << dim.wid << "." << std::endl; + if (inset->ascent() > dim.asc) + lyxerr << "Error: inset " << to_ascii(inset->getInsetName()) + << " draw ascent " << inset->ascent() + << "> metrics ascent " << dim.asc << "." << std::endl; + if (inset->descent() > dim.des) + lyxerr << "Error: inset " << to_ascii(inset->getInsetName()) + << " draw ascent " << inset->descent() + << "> metrics descent " << dim.des << "." << std::endl; + BOOST_ASSERT(inset->width() <= dim.wid); + BOOST_ASSERT(inset->ascent() <= dim.asc); + BOOST_ASSERT(inset->descent() <= dim.des); + int const x2 = x1 + dim.wid; + int const y1 = yo_ + dim.des; + int const y2 = yo_ - dim.asc; + pi.pain.line(x1, y1, x1, y2, LColor::green); + pi.pain.line(x1, y1, x2, y1, LColor::green); + pi.pain.line(x2, y1, x2, y2, LColor::green); + pi.pain.line(x1, y2, x2, y2, LColor::green); +#endif } @@ -368,7 +407,13 @@ void RowPainter::paintFromPos(pos_type & vpos) void RowPainter::paintChangeBar() { pos_type const start = row_.pos(); - pos_type const end = row_.endpos(); + pos_type end = row_.endpos(); + + if (par_.size() == end) { + // this is the last row of the paragraph; + // thus, we must also consider the imaginary end-of-par character + end++; + } if (start == end || !par_.isChanged(start, end)) return; @@ -837,12 +882,17 @@ void paintPar text); // If this is the only object on the row, we can make it wide + // + // FIXME: there is a const_cast here because paintPar() is not supposed + // to touch the paragraph contents. So either we move this "wide" + // property out of InsetText or we localize the feature to the painting + // done here. for (pos_type i = rit->pos() ; i != rit->endpos(); ++i) { InsetBase const * const in = par.getInset(i); if (in) { - InsetText const * const t = in->asTextInset(); + InsetText * t = const_cast(in->asTextInset()); if (t) - t->Wide() = in_inset_alone_on_row; + t->setWide(in_inset_alone_on_row); } } @@ -873,12 +923,14 @@ void paintPar // Instrumentation for testing row cache (see also // 12 lines lower): - if (text.isMainText(*pi.base.bv->buffer())) - lyxerr[Debug::PAINTING] << "#"; - else - lyxerr[Debug::PAINTING] << "[" << - repaintAll << row_has_changed << - cursor_on_row << "]"; + if (lyxerr.debugging(Debug::PAINTING)) { + if (text.isMainText(*pi.base.bv->buffer())) + lyxerr[Debug::PAINTING] << "#"; + else + lyxerr[Debug::PAINTING] << "[" << + repaintAll << row_has_changed << + cursor_on_row << "]"; + } rp.paintAppendix(); rp.paintDepthBar(); rp.paintChangeBar(); @@ -895,7 +947,9 @@ void paintPar // Re-enable screen drawing for future use of the painter. pi.pain.setDrawingEnabled(true); - lyxerr[Debug::PAINTING] << "." << endl; + if (lyxerr.debugging(Debug::PAINTING)) { + lyxerr[Debug::PAINTING] << "." << endl; + } } } // namespace anon