X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextMetrics.cpp;h=739b980dccf6e8f8f4c181363a4f6ea3da72661a;hb=b0a73c0dfdbfa0541f04d7ee2578c4cd272ef7b9;hp=a29b4dca77edf74f8cd9917886cda721ca4a484b;hpb=c2732a30f9e09208cb1010ae42d8e56ee80f2a78;p=lyx.git diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index a29b4dca77..739b980dcc 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -48,7 +48,6 @@ #include "support/convert.h" #include "support/debug.h" #include "support/lassert.h" -#include "support/lyxlib.h" #include #include @@ -62,10 +61,6 @@ using frontend::FontMetrics; namespace { -// the somewhat arbitrary leading added between rows. This is 20% of -// the characters height, inluding the possible leading of the font. -// 20% is a standard value used by LaTeX and word processors. -double const extra_leading = 0.2; int numberOfLabelHfills(Paragraph const & par, Row const & row) { @@ -436,8 +431,9 @@ bool TextMetrics::redoParagraph(pit_type const pit, bool const align_rows) // FIXME: This check ought to be done somewhere else. It is the reason // why text_ is not const. But then, where else to do it? // Well, how can you end up with either (a) a biblio environment that - // has no InsetBibitem or (b) a biblio environment with more than one - // InsetBibitem? I think the answer is: when paragraphs are merged; + // has no InsetBibitem, (b) a biblio environment with more than one + // InsetBibitem or (c) a paragraph that has a bib item but is no biblio + // environment? I think the answer is: when paragraphs are merged; // when layout is set; when material is pasted. if (par.brokenBiblio()) { Cursor & cur = const_cast(bv_->cursor()); @@ -528,10 +524,11 @@ bool TextMetrics::redoParagraph(pit_type const pit, bool const align_rows) do { if (row_index == pm.rows().size()) pm.rows().push_back(Row()); + else + pm.rows()[row_index] = Row(); Row & row = pm.rows()[row_index]; row.pit(pit); row.pos(first); - row.pit(pit); need_new_row = breakRow(row, right_margin); setRowHeight(row); row.changed(true); @@ -885,14 +882,14 @@ private: */ bool TextMetrics::breakRow(Row & row, int const right_margin) const { + LATTEST(row.empty()); Paragraph const & par = text_->getPar(row.pit()); pos_type const end = par.size(); pos_type const pos = row.pos(); pos_type const body_pos = par.beginOfBody(); - bool const is_rtl = text_->isRTL(par); + bool const is_rtl = text_->isRTL(row.pit()); bool need_new_row = false; - row.clear(); row.left_margin = leftMargin(row.pit(), pos); row.right_margin = right_margin; if (is_rtl) @@ -983,11 +980,17 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const Inset const * inset = 0; if (par.isNewline(i) || par.isEnvSeparator(i) || (i + 1 < end && (inset = par.getInset(i + 1)) - && inset->display()) + && inset->display()) || (!row.empty() && row.back().inset - && row.back().inset->display())) { + && row.back().inset->display())) { row.flushed(true); - need_new_row = par.isNewline(i); + // We will force a row creation after either + // - a newline; + // - a display inset followed by a end label. + need_new_row = + par.isNewline(i) + || (inset && inset->display() && i + 1 == end + && text_->getEndLabel(row.pit()) != END_LABEL_NO_LABEL); ++i; break; } @@ -1148,19 +1151,27 @@ void TextMetrics::setRowHeight(Row & row) const // Initial value for ascent (useful if row is empty). Font const font = displayFont(row.pit(), row.pos()); FontMetrics const & fm = theFontMetrics(font); - int maxasc = fm.maxAscent() + fm.leading(); - int maxdes = fm.maxDescent(); + int maxasc = int(fm.maxAscent() * spacing_val); + int maxdes = int(fm.maxDescent() * spacing_val); // Find the ascent/descent of the row contents for (Row::Element const & e : row) { - maxasc = max(maxasc, e.dim.ascent()); - maxdes = max(maxdes, e.dim.descent()); + if (e.inset) { + maxasc = max(maxasc, e.dim.ascent()); + maxdes = max(maxdes, e.dim.descent()); + } else { + FontMetrics const & fm2 = theFontMetrics(e.font); + maxasc = max(maxasc, int(fm2.maxAscent() * spacing_val)); + maxdes = max(maxdes, int(fm2.maxDescent() * spacing_val)); + } } - // Add some leading (split between before and after) - int const leading = support::iround(extra_leading * (maxasc + maxdes)); - row.dim().asc = int((maxasc + leading - leading / 2) * spacing_val); - row.dim().des = int((maxdes + leading / 2) * spacing_val); + // This is nicer with box insets + ++maxasc; + ++maxdes; + + row.dim().asc = maxasc; + row.dim().des = maxdes; } @@ -1960,7 +1971,7 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const static int count = 0; ++count; FontInfo fi(sane_font); - fi.setSize(FONT_SIZE_TINY); + fi.setSize(TINY_SIZE); fi.setColor(Color_red); pi.pain.text(row_x, y, convert(count), fi); #endif @@ -2010,8 +2021,7 @@ void TextMetrics::completionPosAndDim(Cursor const & cur, int & x, int & y, int defaultRowHeight() { - FontMetrics const & fm = theFontMetrics(sane_font); - return support::iround(fm.maxHeight() * (1 + extra_leading) + fm.leading()); + return int(theFontMetrics(sane_font).maxHeight() * 1.2); } } // namespace lyx