]> git.lyx.org Git - lyx.git/blobdiff - src/rowpainter.cpp
adjust
[lyx.git] / src / rowpainter.cpp
index d20c644ca433373a7ac246b116d0a4aa8b9a5093..9ed482c9905957b239342b7cbc1595b6dbab79f8 100644 (file)
@@ -16,6 +16,7 @@
 #include "Bidi.h"
 #include "Buffer.h"
 #include "CoordCache.h"
+#include "Color.h"
 #include "Cursor.h"
 #include "debug.h"
 #include "BufferParams.h"
@@ -23,7 +24,7 @@
 #include "Encoding.h"
 #include "gettext.h"
 #include "Language.h"
-#include "Color.h"
+#include "Layout.h"
 #include "LyXRC.h"
 #include "Row.h"
 #include "MetricsInfo.h"
@@ -82,7 +83,7 @@ Font const RowPainter::getLabelFont() const
 
 int RowPainter::leftMargin() const
 {
-       return text_.leftMargin(pi_.base.bv->buffer(), text_metrics_.width(), pit_,
+       return text_metrics_.leftMargin(text_metrics_.width(), pit_,
                row_.pos());
 }
 
@@ -96,7 +97,7 @@ void RowPainter::paintHfill(pos_type const pos, pos_type const body_pos)
 
        pi_.pain.line(int(x_), y1, int(x_), y0, Color::added_space);
 
-       if (par_.hfillExpansion(row_, pos)) {
+       if (pm_.hfillExpansion(row_, pos)) {
                int const y2 = (y0 + y1) / 2;
 
                if (pos >= body_pos) {
@@ -123,7 +124,7 @@ void RowPainter::paintHfill(pos_type const pos, pos_type const body_pos)
 
 void RowPainter::paintInset(Inset const * inset, pos_type const pos)
 {
-       Font font = text_.getFont(pi_.base.bv->buffer(), par_, pos);
+       Font font = text_metrics_.getDisplayFont(pit_, pos);
 
        BOOST_ASSERT(inset);
        // FIXME: We should always use font, see documentation of
@@ -133,37 +134,40 @@ void RowPainter::paintInset(Inset const * inset, pos_type const pos)
                font;
        pi_.ltr_pos = (bidi_.level(pos) % 2 == 0);
        pi_.erased_ = erased_ || par_.isDeleted(pos);
+       pi_.base.bv->coordCache().insets().add(inset, int(x_), yo_);
        // insets are painted completely. Recursive
        inset->drawSelection(pi_, int(x_), yo_);
        inset->draw(pi_, int(x_), yo_);
 
-       paintForeignMark(x_, font, inset->descent());
+       Dimension const & dim = pm_.insetDimension(inset);
 
-       x_ += inset->width();
+       paintForeignMark(x_, font, dim.descent());
+
+       x_ += dim.width();
 
 #ifdef DEBUG_METRICS
-       int const x1 = int(x_ - inset->width());
-       Dimension dim;
+       int const x1 = int(x_ - dim.width());
+       Dimension dim2;
        BOOST_ASSERT(max_witdh_ > 0);
        int right_margin = text_metrics_.rightMargin(pm_);
        int const w = max_witdh_ - leftMargin() - right_margin;
        MetricsInfo mi(pi_.base.bv, font, w);
-       inset->metrics(mi, dim);
-       if (inset->width() > dim.wid)
+       inset->metrics(mi, dim2);
+       if (dim.wid != dim2.wid)
                lyxerr << "Error: inset " << to_ascii(inset->getInsetName())
-                      << " draw width " << inset->width()
-                      << "> metrics width " << dim.wid << "." << std::endl;
-       if (inset->ascent() > dim.asc)
+                      << " draw width " << dim.width()
+                      << "> metrics width " << dim2.wid << "." << std::endl;
+       if (dim->asc != dim2.asc)
                lyxerr << "Error: inset " << to_ascii(inset->getInsetName())
-                      << " draw ascent " << inset->ascent()
-                      << "> metrics ascent " << dim.asc << "." << std::endl;
-       if (inset->descent() > dim.des)
+                      << " draw ascent " << dim.ascent()
+                      << "> metrics ascent " << dim2.asc << "." << std::endl;
+       if (dim2.descent() != dim.des)
                lyxerr << "Error: inset " << to_ascii(inset->getInsetName())
-                      << " draw ascent " << inset->descent()
-                      << "> metrics descent " << dim.des << "." << std::endl;
-       BOOST_ASSERT(inset->width() <= dim.wid);
-       BOOST_ASSERT(inset->ascent() <= dim.asc);
-       BOOST_ASSERT(inset->descent() <= dim.des);
+                      << " draw ascent " << dim.descent()
+                      << "> metrics descent " << dim2.des << "." << std::endl;
+       BOOST_ASSERT(dim2.wid == dim.wid);
+       BOOST_ASSERT(dim2.asc == dim.asc);
+       BOOST_ASSERT(dim2.des == dim.des);
        int const x2 = x1 + dim.wid;
        int const y1 = yo_ + dim.des;
        int const y2 = yo_ - dim.asc;
@@ -194,7 +198,7 @@ void RowPainter::paintHebrewComposeChar(pos_type & vpos, Font const & font)
                if (!Encodings::isComposeChar_hebrew(c)) {
                        if (isPrintableNonspace(c)) {
                                int const width2 = pm_.singleWidth(i,
-                                       text_.getFont(pi_.base.bv->buffer(), par_, i));
+                                       text_metrics_.getDisplayFont(pit_, i));
                                dx = (c == 0x05e8 || // resh
                                      c == 0x05d3)   // dalet
                                        ? width2 - width
@@ -228,7 +232,7 @@ void RowPainter::paintArabicComposeChar(pos_type & vpos, Font const & font)
                if (!Encodings::isComposeChar_arabic(c)) {
                        if (isPrintableNonspace(c)) {
                                int const width2 = pm_.singleWidth(i,
-                                               text_.getFont(pi_.base.bv->buffer(), par_, i));
+                                               text_metrics_.getDisplayFont(pit_, i));
                                dx = (width2 - width) / 2;
                        }
                        break;
@@ -348,7 +352,7 @@ void RowPainter::paintForeignMark(double orig_x, Font const & font, int desc)
 void RowPainter::paintFromPos(pos_type & vpos)
 {
        pos_type const pos = bidi_.vis2log(vpos);
-       Font orig_font = text_.getFont(pi_.base.bv->buffer(), par_, pos);
+       Font orig_font = text_metrics_.getDisplayFont(pit_, pos);
        double const orig_x = x_;
 
        // usual characters, no insets
@@ -389,7 +393,7 @@ void RowPainter::paintChangeBar()
        if (start == end || !par_.isChanged(start, end))
                return;
 
-       int const height = text_.isLastRow(pit_, row_)
+       int const height = text_metrics_.isLastRow(pit_, row_)
                ? row_.ascent()
                : row_.height();
 
@@ -421,7 +425,7 @@ void RowPainter::paintDepthBar()
                return;
 
        depth_type prev_depth = 0;
-       if (!text_.isFirstRow(pit_, row_)) {
+       if (!text_metrics_.isFirstRow(pit_, row_)) {
                pit_type pit2 = pit_;
                if (row_.pos() == 0)
                        --pit2;
@@ -429,7 +433,7 @@ void RowPainter::paintDepthBar()
        }
 
        depth_type next_depth = 0;
-       if (!text_.isLastRow(pit_, row_)) {
+       if (!text_metrics_.isLastRow(pit_, row_)) {
                pit_type pit2 = pit_;
                if (row_.endpos() >= pars_[pit2].size())
                        ++pit2;
@@ -701,7 +705,6 @@ void RowPainter::paintText()
        // Use font span to speed things up, see below
        FontSpan font_span;
        Font font;
-       Buffer const & buffer = pi_.base.bv->buffer();
 
        // If the last logical character is a separator, don't paint it, unless
        // it's in the last row of a paragraph; see skipped_sep_vpos declaration
@@ -728,7 +731,7 @@ void RowPainter::paintText()
                // Use font span to speed things up, see above
                if (vpos < font_span.first || vpos > font_span.last) {
                        font_span = par_.fontSpan(vpos);
-                       font = text_.getFont(buffer, par_, vpos);
+                       font = text_metrics_.getDisplayFont(pit_, vpos);
                }
 
                const int width_pos = pm_.singleWidth(pos, font);
@@ -747,7 +750,7 @@ void RowPainter::paintText()
                }
 
                bool const highly_editable_inset = par_.isInset(pos)
-                       && isHighlyEditableInset(par_.getInset(pos));
+                       && par_.getInset(pos)->editable() == Inset::HIGHLY_EDITABLE;
 
                // If we reach the end of a struck out range, paint it.
                // We also don't paint across things like tables
@@ -773,7 +776,7 @@ void RowPainter::paintText()
                        ++vpos;
 
                } else if (par_.isSeparator(pos)) {
-                       Font orig_font = text_.getFont(buffer, par_, pos);
+                       Font orig_font = text_metrics_.getDisplayFont(pit_, pos);
                        double const orig_x = x_;
                        x_ += width_pos;
                        if (pos >= body_pos)