if (pos >= pit->size())
return 0;
- LyXFont const font = getFont(bv()->buffer(), pit, pos);
+ LyXFont const & font = getFont(bv()->buffer(), pit, pos);
// The most common case is handled first (Asger)
if (IsPrintable(c)) {
if (font.language()->RightToLeft()) {
- if (font.language()->lang() == "arabic" &&
- (lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 ||
- lyxrc.font_norm_type == LyXRC::ISO_10646_1)) {
+ if ((lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 ||
+ lyxrc.font_norm_type == LyXRC::ISO_10646_1)
+ && font.language()->lang() == "arabic") {
if (Encodings::IsComposeChar_arabic(c))
return 0;
else
return 0;
}
return font_metrics::width(c, font);
-
}
if (c == Paragraph::META_INSET) {
bool fullrow = false;
pos_type i = pos;
+
+ // We re-use the font resolution for the entire font span when possible
+ LyXFont font = getFont(bv()->buffer(), pit, i);
+ lyx::pos_type endPosOfFontSpan = pit->getEndPosOfFontSpan(i);
+
for (; i < last; ++i) {
if (pit->isNewline(i)) {
point = i;
thiswidth = left_margin - x;
thiswidth += singleWidth(pit, i, c);
} else {
- thiswidth = singleWidth(pit, i, c);
+ // Manual inlined optimised version of common case of "thiswidth = singleWidth(pit, i, c);"
+ if (IsPrintable(c)) {
+ if (pos > endPosOfFontSpan) {
+ // We need to get the next font
+ font = getFont(bv()->buffer(), pit, i);
+ endPosOfFontSpan = pit->getEndPosOfFontSpan(i);
+ }
+ if (! font.language()->RightToLeft()) {
+ thiswidth = font_metrics::width(c, font);
+ } else {
+ // Fall-back to normal case
+ thiswidth = singleWidth(pit, i, c);
+ // And flush font cache
+ endPosOfFontSpan = 0;
+ }
+ } else {
+ // Fall-back to normal case
+ thiswidth = singleWidth(pit, i, c);
+ // And flush font cache
+ endPosOfFontSpan = 0;
+ }
}
x += thiswidth;
pos_type const body_pos = pit->beginningOfBody();
pos_type i = row->pos();
- while (i <= last) {
- if (body_pos > 0 && i == body_pos) {
- w += font_metrics::width(layout->labelsep, getLabelFont(bv()->buffer(), pit));
- if (pit->isLineSeparator(i - 1))
- w -= singleWidth(pit, i - 1);
- int left_margin = labelEnd(*row);
- if (w < left_margin)
- w = left_margin;
+ if (! pit->empty() && i <= last) {
+ // We re-use the font resolution for the entire span when possible
+ LyXFont font = getFont(bv()->buffer(), pit, i);
+ lyx::pos_type endPosOfFontSpan = pit->getEndPosOfFontSpan(i);
+ while (i <= last) {
+ if (body_pos > 0 && i == body_pos) {
+ w += font_metrics::width(layout->labelsep, getLabelFont(bv()->buffer(), pit));
+ if (pit->isLineSeparator(i - 1))
+ w -= singleWidth(pit, i - 1);
+ int left_margin = labelEnd(*row);
+ if (w < left_margin)
+ w = left_margin;
+ }
+ { // Manual inlined an optimised version of the common case of "w += singleWidth(pit, i);"
+ char const c = pit->getChar(i);
+
+ if (IsPrintable(c)) {
+ if (i > endPosOfFontSpan) {
+ // We need to get the next font
+ font = getFont(bv()->buffer(), pit, i);
+ endPosOfFontSpan = pit->getEndPosOfFontSpan(i);
+ }
+ if (! font.language()->RightToLeft()) {
+ w += font_metrics::width(c, font);
+ } else {
+ // Fall-back to the normal case
+ w += singleWidth(pit, i, c);
+ // And flush font cache
+ endPosOfFontSpan = 0;
+ }
+ } else {
+ // Fall-back to the normal case
+ w += singleWidth(pit, i, c);
+ // And flush font cache
+ endPosOfFontSpan = 0;
+ }
+ }
+ ++i;
}
- w += singleWidth(pit, i);
- ++i;
}
if (body_pos > 0 && body_pos > last) {
w += font_metrics::width(layout->labelsep, getLabelFont(bv()->buffer(), pit));
float layoutasc = 0;
float layoutdesc = 0;
float tmptop = 0;
- LyXFont tmpfont;
- InsetOld * tmpinset = 0;
// ok, let us initialize the maxasc and maxdesc value.
// This depends in LaTeX of the font of the last character
int maxwidth = 0;
if (!pit->empty()) {
+ // We re-use the font resolution for the entire font span when possible
+ LyXFont font = getFont(bv()->buffer(), pit, rit->pos());
+ lyx::pos_type endPosOfFontSpan = pit->getEndPosOfFontSpan(rit->pos());
+
+ // Optimisation
+ Paragraph const & par = *pit;
+
// Check if any insets are larger
for (pos_type pos = rit->pos(); pos <= pos_end; ++pos) {
- if (pit->isInset(pos)) {
- tmpfont = getFont(bv()->buffer(), pit, pos);
- tmpinset = pit->getInset(pos);
- if (tmpinset) {
+ // Manual inlined optimised version of common case of "maxwidth += singleWidth(pit, pos);"
+ char const c = par.getChar(pos);
+
+ if (IsPrintable(c)) {
+ if (pos > endPosOfFontSpan) {
+ // We need to get the next font
+ font = getFont(bv()->buffer(), pit, pos);
+ endPosOfFontSpan = par.getEndPosOfFontSpan(pos);
+ }
+ if (! font.language()->RightToLeft()) {
+ maxwidth += font_metrics::width(c, font);
+ } else {
+ // Fall-back to normal case
+ maxwidth += singleWidth(pit, pos, c);
+ // And flush font cache
+ endPosOfFontSpan = 0;
+ }
+ } else {
+ // Special handling of insets - are any larger?
+ if (par.isInset(pos)) {
+ LyXFont const tmpfont = getFont(bv()->buffer(), pit, pos);
+ InsetOld const * tmpinset = par.getInset(pos);
+ if (tmpinset) {
#if 1 // this is needed for deep update on initialitation
#warning inset->update FIXME
- //tmpinset->update(bv());
- Dimension dim;
- MetricsInfo mi(bv(), tmpfont, workWidth());
- tmpinset->metrics(mi, dim);
- maxwidth += dim.wid;
- maxasc = max(maxasc, dim.asc);
- maxdesc = max(maxdesc, dim.des);
+ //tmpinset->update(bv());
+ Dimension dim;
+ MetricsInfo mi(bv(), tmpfont, workWidth());
+ tmpinset->metrics(mi, dim);
+ maxwidth += dim.wid;
+ maxasc = max(maxasc, dim.asc);
+ maxdesc = max(maxdesc, dim.des);
#else
- maxwidth += tmpinset->width();
- maxasc = max(maxasc, tmpinset->ascent());
- maxdesc = max(maxdesc, tmpinset->descent());
+ maxwidth += tmpinset->width();
+ maxasc = max(maxasc, tmpinset->ascent());
+ maxdesc = max(maxdesc, tmpinset->descent());
#endif
+ }
+ } else {
+ // Fall-back to normal case
+ maxwidth += singleWidth(pit, pos, c);
+ // And flush font cache
+ endPosOfFontSpan = 0;
}
- } else {
- maxwidth += singleWidth(pit, pos);
}
}
}