mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 01:59:02 +00:00
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:
parent
1751626776
commit
ac759b4368
@ -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
|
void FontList::validate(LaTeXFeatures & features) const
|
||||||
{
|
{
|
||||||
const_iterator fcit = list_.begin();
|
const_iterator fcit = list_.begin();
|
||||||
|
@ -105,13 +105,6 @@ public:
|
|||||||
///
|
///
|
||||||
void decreasePosAfterPos(pos_type pos);
|
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;
|
void validate(LaTeXFeatures & features) const;
|
||||||
|
|
||||||
|
@ -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 Paragraph::getUChar(BufferParams const & bparams, pos_type pos) const
|
||||||
{
|
{
|
||||||
char_type c = d->text_[pos];
|
char_type c = d->text_[pos];
|
||||||
|
@ -357,9 +357,6 @@ public:
|
|||||||
char_type getUChar(BufferParams const &, pos_type pos) const;
|
char_type getUChar(BufferParams const &, pos_type pos) const;
|
||||||
/// pos <= size() (there is a dummy font change at the end of each par)
|
/// pos <= size() (there is a dummy font change at the end of each par)
|
||||||
void setFont(pos_type pos, Font const & font);
|
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,
|
void insert(pos_type pos, docstring const & str,
|
||||||
Font const & font, Change const & change);
|
Font const & font, Change const & change);
|
||||||
|
@ -920,85 +920,53 @@ void TextMetrics::setRowHeight(Row & row, pit_type const pit,
|
|||||||
bool topBottomSpace) const
|
bool topBottomSpace) const
|
||||||
{
|
{
|
||||||
Paragraph const & par = text_->getPar(pit);
|
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();
|
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()
|
double const spacing_val = layout.spacing.getValue()
|
||||||
* text_->spacing(par);
|
* 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
|
// Initial value for ascent (useful if row is empty).
|
||||||
CoordCache::Insets const & insetCache = bv_->coordCache().getInsets();
|
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 cit = row.begin();
|
||||||
Row::const_iterator cend = row.end();
|
Row::const_iterator cend = row.end();
|
||||||
for ( ; cit != cend; ++cit) {
|
for ( ; cit != cend; ++cit) {
|
||||||
if (cit->inset) {
|
if (cit->inset) {
|
||||||
Dimension const & dim = insetCache.dim(cit->inset);
|
maxasc = max(maxasc, cit->dim.ascent());
|
||||||
maxasc = max(maxasc, dim.ascent());
|
maxdes = max(maxdes, cit->dim.descent());
|
||||||
maxdesc = max(maxdesc, 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 nicer with box insets
|
||||||
// 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:
|
|
||||||
++maxasc;
|
++maxasc;
|
||||||
++maxdesc;
|
++maxdes;
|
||||||
|
|
||||||
|
// Now use the layout information.
|
||||||
|
double layoutasc = 0;
|
||||||
|
double layoutdesc = 0;
|
||||||
|
int labeladdon = 0;
|
||||||
ParagraphList const & pars = text_->paragraphs();
|
ParagraphList const & pars = text_->paragraphs();
|
||||||
Inset const & inset = text_->inset();
|
Inset const & inset = text_->inset();
|
||||||
|
double const dh = defaultRowHeight();
|
||||||
|
|
||||||
// is it a top line?
|
// is it a top line?
|
||||||
if (row.pos() == 0 && topBottomSpace) {
|
if (row.pos() == 0 && topBottomSpace) {
|
||||||
BufferParams const & bufparams = buffer.params();
|
BufferParams const & bufparams = bv_->buffer().params();
|
||||||
// some parskips VERY EASY IMPLEMENTATION
|
// some parskips VERY EASY IMPLEMENTATION
|
||||||
if (bufparams.paragraph_separation == BufferParams::ParagraphSkipSeparation
|
if (bufparams.paragraph_separation == BufferParams::ParagraphSkipSeparation
|
||||||
&& !inset.getLayout().parbreakIsNewline()
|
&& !inset.getLayout().parbreakIsNewline()
|
||||||
&& !par.layout().parbreak_is_newline
|
&& !par.layout().parbreak_is_newline
|
||||||
&& pit > 0
|
&& pit > 0
|
||||||
&& ((layout.isParagraph() && par.getDepth() == 0)
|
&& ((layout.isParagraph() && par.getDepth() == 0)
|
||||||
|| (pars[pit - 1].layout().isParagraph()
|
|| (pars[pit - 1].layout().isParagraph()
|
||||||
&& pars[pit - 1].getDepth() == 0))) {
|
&& pars[pit - 1].getDepth() == 0))) {
|
||||||
maxasc += bufparams.getDefSkip().inPixels(*bv_);
|
maxasc += bufparams.getDefSkip().inPixels(*bv_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1009,6 +977,8 @@ void TextMetrics::setRowHeight(Row & row, pit_type const pit,
|
|||||||
if (layout.labelIsAbove()
|
if (layout.labelIsAbove()
|
||||||
&& (!layout.isParagraphGroup() || text_->isFirstInSequence(pit))
|
&& (!layout.isParagraphGroup() || text_->isFirstInSequence(pit))
|
||||||
&& !par.labelString().empty()) {
|
&& !par.labelString().empty()) {
|
||||||
|
FontInfo labelfont = text_->labelFont(par);
|
||||||
|
FontMetrics const & lfm = theFontMetrics(labelfont);
|
||||||
labeladdon = int(
|
labeladdon = int(
|
||||||
lfm.maxHeight()
|
lfm.maxHeight()
|
||||||
* layout.spacing.getValue()
|
* layout.spacing.getValue()
|
||||||
@ -1071,8 +1041,8 @@ void TextMetrics::setRowHeight(Row & row, pit_type const pit,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// incalculate the layout spaces
|
// incalculate the layout spaces
|
||||||
maxasc += int(layoutasc * 2 / (2 + pars[pit].getDepth()));
|
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
|
// FIXME: the correct way is to do the following is to move the
|
||||||
// following code in another method specially tailored for 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()) &&
|
if (pit + 1 == pit_type(pars.size()) &&
|
||||||
row.endpos() == par.size() &&
|
row.endpos() == par.size() &&
|
||||||
!(row.endpos() > 0 && par.isNewline(row.endpos() - 1)))
|
!(row.endpos() > 0 && par.isNewline(row.endpos() - 1)))
|
||||||
maxdesc += 20;
|
maxdes += 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
row.dimension().asc = maxasc + labeladdon;
|
row.dimension().asc = maxasc + labeladdon;
|
||||||
row.dimension().des = maxdesc;
|
row.dimension().des = maxdes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user