]> git.lyx.org Git - lyx.git/blobdiff - src/text.C
cosmetic fix
[lyx.git] / src / text.C
index a35e9cf4ef846cb4ac804d60cf9be389006f5a99..179c6db01de1f03d008b8ebdd2ae716d18e63b32 100644 (file)
@@ -284,14 +284,14 @@ int LyXText::singleWidth(ParagraphList::iterator pit,
        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
@@ -301,7 +301,6 @@ int LyXText::singleWidth(ParagraphList::iterator pit,
                                return 0;
                }
                return font_metrics::width(c, font);
-
        }
 
        if (c == Paragraph::META_INSET) {
@@ -818,6 +817,11 @@ pos_type LyXText::rowBreakPoint(Row const & row) const
        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;
@@ -839,7 +843,27 @@ pos_type LyXText::rowBreakPoint(Row const & row) const
                                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;
@@ -935,17 +959,45 @@ int LyXText::fill(RowList::iterator row, int paper_width) const
        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));
@@ -1028,8 +1080,6 @@ void LyXText::setHeightOfRow(RowList::iterator rit)
        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
@@ -1073,29 +1123,59 @@ void LyXText::setHeightOfRow(RowList::iterator rit)
        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);
                        }
                }
        }