X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextMetrics.cpp;h=fc610ad854b3370527c61bb76839d46b29355d0f;hb=29d80772fc832a914c73b4de3010b7f4c108a5e3;hp=d0b90713adf9731498bb2b517b5efd8b978627e4;hpb=051da4ba252e5ef1073ba85de3ff1f197ac061d5;p=lyx.git diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index d0b90713ad..fc610ad854 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,6 +882,7 @@ 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(); @@ -892,7 +890,6 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const 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) @@ -1154,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; } @@ -2016,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