Rewrite setRowHeight using row information

The initial values for maxasc and maxdes (renamed from maxdesc) is obtained as a maximum of max ascents/descents of all row elements.

This allows to get rid of Paragraph::highestFontInRange and FontList::highestInRange.

Some auxilliary variables declarations are also moved to where they are needed.
This commit is contained in:
Jean-Marc Lasgouttes 2016-03-06 16:22:53 +01:00
parent 1751626776
commit ac759b4368
5 changed files with 29 additions and 102 deletions

View File

@ -180,31 +180,6 @@ void FontList::set(pos_type pos, Font const & font)
}
FontSize FontList::highestInRange(pos_type startpos, pos_type endpos,
FontSize def_size) const
{
if (list_.empty())
return def_size;
List::const_iterator end_it = fontIterator(endpos);
const_iterator const end = list_.end();
if (end_it != end)
++end_it;
List::const_iterator cit = fontIterator(startpos);
FontSize maxsize = FONT_SIZE_TINY;
for (; cit != end_it; ++cit) {
FontSize size = cit->font().fontInfo().size();
if (size == FONT_SIZE_INHERIT)
size = def_size;
if (size > maxsize && size <= FONT_SIZE_HUGER)
maxsize = size;
}
return maxsize;
}
void FontList::validate(LaTeXFeatures & features) const
{
const_iterator fcit = list_.begin();

View File

@ -105,13 +105,6 @@ public:
///
void decreasePosAfterPos(pos_type pos);
/// Returns the height of the highest font in range
FontSize highestInRange(
pos_type startpos,
pos_type endpos,
FontSize def_size
) const;
///
void validate(LaTeXFeatures & features) const;

View File

@ -1837,14 +1837,6 @@ Font const Paragraph::getLayoutFont
}
/// Returns the height of the highest font in range
FontSize Paragraph::highestFontInRange
(pos_type startpos, pos_type endpos, FontSize def_size) const
{
return d->fontlist_.highestInRange(startpos, endpos, def_size);
}
char_type Paragraph::getUChar(BufferParams const & bparams, pos_type pos) const
{
char_type c = d->text_[pos];

View File

@ -357,9 +357,6 @@ public:
char_type getUChar(BufferParams const &, pos_type pos) const;
/// pos <= size() (there is a dummy font change at the end of each par)
void setFont(pos_type pos, Font const & font);
/// Returns the height of the highest font in range
FontSize highestFontInRange(pos_type startpos,
pos_type endpos, FontSize def_size) const;
///
void insert(pos_type pos, docstring const & str,
Font const & font, Change const & change);

View File

@ -920,77 +920,45 @@ void TextMetrics::setRowHeight(Row & row, pit_type const pit,
bool topBottomSpace) const
{
Paragraph const & par = text_->getPar(pit);
// get the maximum ascent and the maximum descent
double layoutasc = 0;
double layoutdesc = 0;
double const dh = defaultRowHeight();
// ok, let us initialize the maxasc and maxdesc value.
// Only the fontsize count. The other properties
// are taken from the layoutfont. Nicer on the screen :)
Layout const & layout = par.layout();
// as max get the first character of this row then it can
// increase but not decrease the height. Just some point to
// start with so we don't have to do the assignment below too
// often.
Buffer const & buffer = bv_->buffer();
Font font = displayFont(pit, row.pos());
FontSize const tmpsize = font.fontInfo().size();
font.fontInfo() = text_->layoutFont(pit);
FontSize const size = font.fontInfo().size();
font.fontInfo().setSize(tmpsize);
FontInfo labelfont = text_->labelFont(par);
FontMetrics const & lfm = theFontMetrics(labelfont);
FontMetrics const & fm = theFontMetrics(font);
// these are minimum values
double const spacing_val = layout.spacing.getValue()
* text_->spacing(par);
//lyxerr << "spacing_val = " << spacing_val << endl;
int maxasc = int(fm.maxAscent() * spacing_val);
int maxdesc = int(fm.maxDescent() * spacing_val);
// insets may be taller
CoordCache::Insets const & insetCache = bv_->coordCache().getInsets();
// Initial value for ascent (useful if row is empty).
Font const font = displayFont(pit, row.pos());
FontMetrics const & fm = theFontMetrics(font);
int maxasc = int(fm.maxAscent() * spacing_val);
int maxdes = int(fm.maxDescent() * spacing_val);
// Find the ascent/descent of the row contents
Row::const_iterator cit = row.begin();
Row::const_iterator cend = row.end();
for ( ; cit != cend; ++cit) {
if (cit->inset) {
Dimension const & dim = insetCache.dim(cit->inset);
maxasc = max(maxasc, dim.ascent());
maxdesc = max(maxdesc, dim.descent());
maxasc = max(maxasc, cit->dim.ascent());
maxdes = max(maxdes, cit->dim.descent());
} else {
FontMetrics const & fm = theFontMetrics(cit->font);
maxasc = max(maxasc, int(fm.maxAscent() * spacing_val));
maxdes = max(maxdes, int(fm.maxDescent() * spacing_val));
}
}
// Check if any custom fonts are larger (Asger)
// This is not completely correct, but we can live with the small,
// cosmetic error for now.
int labeladdon = 0;
FontSize maxsize =
par.highestFontInRange(row.pos(), row.endpos(), size);
if (maxsize > font.fontInfo().size()) {
// use standard paragraph font with the maximal size
FontInfo maxfont = font.fontInfo();
maxfont.setSize(maxsize);
FontMetrics const & maxfontmetrics = theFontMetrics(maxfont);
maxasc = max(maxasc, maxfontmetrics.maxAscent());
maxdesc = max(maxdesc, maxfontmetrics.maxDescent());
}
// This is nicer with box insets:
// This is nicer with box insets
++maxasc;
++maxdesc;
++maxdes;
// Now use the layout information.
double layoutasc = 0;
double layoutdesc = 0;
int labeladdon = 0;
ParagraphList const & pars = text_->paragraphs();
Inset const & inset = text_->inset();
double const dh = defaultRowHeight();
// is it a top line?
if (row.pos() == 0 && topBottomSpace) {
BufferParams const & bufparams = buffer.params();
BufferParams const & bufparams = bv_->buffer().params();
// some parskips VERY EASY IMPLEMENTATION
if (bufparams.paragraph_separation == BufferParams::ParagraphSkipSeparation
&& !inset.getLayout().parbreakIsNewline()
@ -1009,6 +977,8 @@ void TextMetrics::setRowHeight(Row & row, pit_type const pit,
if (layout.labelIsAbove()
&& (!layout.isParagraphGroup() || text_->isFirstInSequence(pit))
&& !par.labelString().empty()) {
FontInfo labelfont = text_->labelFont(par);
FontMetrics const & lfm = theFontMetrics(labelfont);
labeladdon = int(
lfm.maxHeight()
* layout.spacing.getValue()
@ -1072,7 +1042,7 @@ void TextMetrics::setRowHeight(Row & row, pit_type const pit,
// incalculate the layout spaces
maxasc += int(layoutasc * 2 / (2 + pars[pit].getDepth()));
maxdesc += int(layoutdesc * 2 / (2 + pars[pit].getDepth()));
maxdes += int(layoutdesc * 2 / (2 + pars[pit].getDepth()));
// FIXME: the correct way is to do the following is to move the
// following code in another method specially tailored for the
@ -1084,11 +1054,11 @@ void TextMetrics::setRowHeight(Row & row, pit_type const pit,
if (pit + 1 == pit_type(pars.size()) &&
row.endpos() == par.size() &&
!(row.endpos() > 0 && par.isNewline(row.endpos() - 1)))
maxdesc += 20;
maxdes += 20;
}
row.dimension().asc = maxasc + labeladdon;
row.dimension().des = maxdesc;
row.dimension().des = maxdes;
}