Andre Poenitz wrote:

Good in theory but it looks as if this is the kind of infomration that
would be useful for a 'non-drawing real painter' (as opposed to the
original nullpainter)

I have implemented that and got rid of the NullPainter altogether:

Author: younes
Date: Mon Oct 30 11:09:59 2006
New Revision: 15613

URL: http://www.lyx.org/trac/changeset/15613
Log:
* Painter.h:
  * Painter: new ctor that sets drawing_enabled_ to true.
  * setDrawingEnabled(), isDrawingEnabled(): new methods.

* QLPainter.C: only draw if drawing is enabled.

* nullpainter.h: deleted.

* rawpainter.C::paintPar(): only draw if we are inside the Paragraph.

* InsetTabular::draw(): use new Painter method instead of a NullPainter.

* InsetMathNest::drawSelection(): ditto.

Removed:
    lyx-devel/trunk/src/frontends/nullpainter.h
Modified:
    lyx-devel/trunk/development/scons/scons_manifest.py
    lyx-devel/trunk/src/frontends/Makefile.am
    lyx-devel/trunk/src/frontends/Painter.h
    lyx-devel/trunk/src/frontends/qt4/QLPainter.C
    lyx-devel/trunk/src/insets/insettabular.C
    lyx-devel/trunk/src/mathed/InsetMathNest.C
    lyx-devel/trunk/src/rowpainter.C

Modified: lyx-devel/trunk/development/scons/scons_manifest.py
URL: http://www.lyx.org/trac/file/lyx-devel/trunk/development/scons/scons_manifest.py?rev=15613
==============================================================================
--- lyx-devel/trunk/development/scons/scons_manifest.py (original)
+++ lyx-devel/trunk/development/scons/scons_manifest.py Mon Oct 30 11:09:59 2006
@@ -448,7 +448,6 @@
     WorkArea.h
     key_state.h
     mouse_state.h
-    nullpainter.h
 ''')



Modified: lyx-devel/trunk/src/frontends/Makefile.am
URL: http://www.lyx.org/trac/file/lyx-devel/trunk/src/frontends/Makefile.am?rev=15613
==============================================================================
--- lyx-devel/trunk/src/frontends/Makefile.am (original)
+++ lyx-devel/trunk/src/frontends/Makefile.am Mon Oct 30 11:09:59 2006
@@ -42,5 +42,4 @@
        WorkArea.C \
        WorkArea.h \
        key_state.h \
-       mouse_state.h \
-       nullpainter.h
+       mouse_state.h

Modified: lyx-devel/trunk/src/frontends/Painter.h
URL: http://www.lyx.org/trac/file/lyx-devel/trunk/src/frontends/Painter.h?rev=15613
==============================================================================
--- lyx-devel/trunk/src/frontends/Painter.h (original)
+++ lyx-devel/trunk/src/frontends/Painter.h Mon Oct 30 11:09:59 2006
@@ -48,6 +48,7 @@
  */
 class Painter {
 public:
+       Painter(): drawing_enabled_(true) {}
        /// possible line widths
        enum line_width {
                line_thin, //< thin line
@@ -132,6 +133,9 @@
        virtual int text(int x, int y,
                docstring const & str, LyXFont const & f) = 0;

+       void setDrawingEnabled(bool drawing_enabled = true)
+       { drawing_enabled_ = drawing_enabled; }
+
        /**
         * Draw a string at position x, y (y is the baseline)
         * This is just for fast drawing
@@ -169,6 +173,13 @@

        /// draw a bevelled button border
        virtual void buttonFrame(int x, int y, int w, int h);
+
+       /// Indicate wether real screen drawing shall be done or not.
+       bool const isDrawingEnabled() { return drawing_enabled_; }
+
+private:
+       ///
+       bool drawing_enabled_;
 };

 } // namespace frontend

Modified: lyx-devel/trunk/src/frontends/qt4/QLPainter.C
URL: http://www.lyx.org/trac/file/lyx-devel/trunk/src/frontends/qt4/QLPainter.C?rev=15613
==============================================================================
--- lyx-devel/trunk/src/frontends/qt4/QLPainter.C (original)
+++ lyx-devel/trunk/src/frontends/qt4/QLPainter.C Mon Oct 30 11:09:59 2006
@@ -84,6 +84,9 @@

 void QLPainter::point(int x, int y, LColor_color col)
 {
+       if (!isDrawingEnabled())
+               return;
+
        setQPainterPen(col);
        drawPoint(x, y);
 }
@@ -94,6 +97,9 @@
        line_style ls,
        line_width lw)
 {
+       if (!isDrawingEnabled())
+               return;
+
        setQPainterPen(col, ls, lw);
        drawLine(x1, y1, x2, y2);
 }
@@ -114,6 +120,9 @@
                points[i].setY(yp[i]);
        }

+       if (!isDrawingEnabled())
+               return;
+
        setQPainterPen(col, ls, lw);
        drawPolyline(points.get(), np);
 }
@@ -124,6 +133,9 @@
        line_style ls,
        line_width lw)
 {
+       if (!isDrawingEnabled())
+               return;
+
        setQPainterPen(col, ls, lw);
        drawRect(x, y, w, h);
 }
@@ -138,6 +150,9 @@
 void QLPainter::arc(int x, int y, unsigned int w, unsigned int h,
        int a1, int a2, LColor_color col)
 {
+       if (!isDrawingEnabled())
+               return;
+
        // LyX usings 1/64ths degree, Qt usings 1/16th
        setQPainterPen(col);
        drawArc(x, y, w, h, a1 / 4, a2 / 4);
@@ -150,6 +165,9 @@
                static_cast<graphics::QLImage const &>(i);

        fillRectangle(x, y, w, h, LColor::graphicsbg);
+
+       if (!isDrawingEnabled())
+               return;

        drawImage(x, y, qlimage.qimage(), 0, 0, w, h);
 }
@@ -187,7 +205,8 @@
                } else {
                        setFont(qfont);
                }
-               drawText(x + textwidth, y, c);
+               if (isDrawingEnabled())
+                       drawText(x + textwidth, y, c);
                textwidth += fontMetrics().width(c);
        }
        return textwidth;
@@ -223,7 +242,8 @@
                        setFont(fi.font);
                // We need to draw the text as LTR as we use our own bidi code.
                setLayoutDirection(Qt::LeftToRight);
-               drawText(x, y, str);
+               if (isDrawingEnabled())
+                       drawText(x, y, str);
                // Here we use the font width cache instead of
                //   textwidth = fontMetrics().width(str);
                // because the above is awfully expensive on MacOSX

Modified: lyx-devel/trunk/src/insets/insettabular.C
URL: http://www.lyx.org/trac/file/lyx-devel/trunk/src/insets/insettabular.C?rev=15613
==============================================================================
--- lyx-devel/trunk/src/insets/insettabular.C (original)
+++ lyx-devel/trunk/src/insets/insettabular.C Mon Oct 30 11:09:59 2006
@@ -312,9 +312,6 @@
        //lyxerr << "InsetTabular::draw: " << x << " " << y << endl;
        BufferView * bv = pi.base.bv;

-       static frontend::NullPainter nop;
-       static PainterInfo nullpi(bv, nop);
-
        resetPos(bv->cursor());

        x += scx_;
@@ -338,8 +335,10 @@
                            || nx > bv->workWidth()
                            || y + d < 0
                            || y - a > bv->workHeight()) {
-                               cell(idx)->draw(nullpi, cx, y);
-                               drawCellLines(nop, nx, y, i, idx, pi.erased_);
+                               pi.pain.setDrawingEnabled(false);
+                               cell(idx)->draw(pi, cx, y);
+                               drawCellLines(pi.pain, nx, y, i, idx, 
pi.erased_);
+                               pi.pain.setDrawingEnabled(true);
                        } else {
                                cell(idx)->draw(pi, cx, y);
                                drawCellLines(pi.pain, nx, y, i, idx, 
pi.erased_);

Modified: lyx-devel/trunk/src/mathed/InsetMathNest.C
URL: http://www.lyx.org/trac/file/lyx-devel/trunk/src/mathed/InsetMathNest.C?rev=15613
==============================================================================
--- lyx-devel/trunk/src/mathed/InsetMathNest.C (original)
+++ lyx-devel/trunk/src/mathed/InsetMathNest.C Mon Oct 30 11:09:59 2006
@@ -241,10 +241,9 @@
                return;

        // FIXME: hack to get position cache warm
-       static frontend::NullPainter nop;
-       PainterInfo pinop(pi);
-       pinop.pain = nop;
-       draw(pinop, x, y);
+       pi.pain.setDrawingEnabled(false);
+       draw(pi, x, y);
+       pi.pain.setDrawingEnabled(true);

        CursorSlice s1 = cur.selBegin();
        CursorSlice s2 = cur.selEnd();

Modified: lyx-devel/trunk/src/rowpainter.C
URL: http://www.lyx.org/trac/file/lyx-devel/trunk/src/rowpainter.C?rev=15613
==============================================================================
--- lyx-devel/trunk/src/rowpainter.C (original)
+++ lyx-devel/trunk/src/rowpainter.C Mon Oct 30 11:09:59 2006
@@ -129,7 +129,7 @@
          erased_(pi.erased_),
          xo_(x), yo_(y), width_(text_.width())
 {
-       RowMetrics m = text_.computeRowMetrics(pit, row_);
+       RowMetrics m = text_.computeRowMetrics(*bv_.buffer(), pit, row_);
        x_ = m.x + xo_;

//lyxerr << "RowPainter: x: " << x_ << " xo: " << xo_ << " yo: " << yo_ << endl;
@@ -146,13 +146,13 @@

 LyXFont const RowPainter::getLabelFont() const
 {
-       return text_.getLabelFont(par_);
+       return text_.getLabelFont(*bv_.buffer(), par_);
 }


 int RowPainter::leftMargin() const
 {
-       return text_.leftMargin(pit_, row_.pos());
+       return text_.leftMargin(*bv_.buffer(), pit_, row_.pos());
 }


@@ -203,7 +203,8 @@
                if (!Encodings::isComposeChar_hebrew(c)) {
                        if (isPrintableNonspace(c)) {
                                int const width2 =
-                                       text_.singleWidth(par_, i, c, 
text_.getFont(par_, i));
+                                       text_.singleWidth(*bv_.buffer(), par_, 
i, c,
+                                               text_.getFont(*bv_.buffer(), 
par_, i));
                                // FIXME UNICODE
                                // This does not work anymore, and non-ascii
                                // characters in source files are forbidden
@@ -242,7 +243,8 @@
                if (!Encodings::isComposeChar_arabic(c)) {
                        if (isPrintableNonspace(c)) {
                                int const width2 =
-                                       text_.singleWidth(par_, i, c, 
text_.getFont(par_, i));
+                                       text_.singleWidth(*bv_.buffer(), par_, 
i, c,
+                                               text_.getFont(*bv_.buffer(), 
par_, i));
                                dx = (width2 - width) / 2;
                        }
                        break;
@@ -328,7 +330,7 @@
 void RowPainter::paintFromPos(pos_type & vpos)
 {
        pos_type const pos = text_.bidi.vis2log(vpos);
-       LyXFont orig_font = text_.getFont(par_, pos);
+       LyXFont orig_font = text_.getFont(*bv_.buffer(), par_, pos);

        double const orig_x = x_;

@@ -423,7 +425,7 @@
                int const w = nestMargin() / 5;
                int x = int(xo_) + w * i;
                // only consider the changebar space if we're drawing outermost 
text
-               if (text_.isMainText())
+               if (text_.isMainText(*bv_.buffer()))
                        x += changebarMargin();

                int const starty = yo_ - row_.ascent();
@@ -494,7 +496,7 @@
                }
        }

-       bool const is_rtl = text_.isRTL(par_);
+       bool const is_rtl = text_.isRTL(buffer, par_);
        bool const is_seq = isFirstInSequence(pit_, text_.paragraphs());
//lyxerr << "paintFirst: " << par_.id() << " is_seq: " << is_seq << std::endl;

@@ -576,7 +578,7 @@
                        if (layout->labeltype == 
LABEL_CENTERED_TOP_ENVIRONMENT) {
                                if (is_rtl)
                                        x = leftMargin();
-                               x += (width_ - text_.rightMargin(par_) - 
leftMargin()) / 2;
+                               x += (width_ - text_.rightMargin(buffer, par_) 
- leftMargin()) / 2;
                                x -= fm.width(str) / 2;
                        } else if (is_rtl) {
                                x = width_ - leftMargin() -     fm.width(str);
@@ -589,7 +591,7 @@

 void RowPainter::paintLast()
 {
-       bool const is_rtl = text_.isRTL(par_);
+       bool const is_rtl = text_.isRTL(*bv_.buffer(), par_);
        int const endlabel = getEndLabel(pit_, text_.paragraphs());

        // draw an endlabel
@@ -618,7 +620,7 @@
                docstring const & str = par_.layout()->endlabelstring();
                double const x = is_rtl ?
                        x_ - fm.width(str)
-                       : - text_.rightMargin(par_) - row_.width();
+                       : - text_.rightMargin(*bv_.buffer(), par_) - 
row_.width();
                pain_.text(int(x), yo_, str, font);
                break;
        }
@@ -647,6 +649,7 @@
        // Use font span to speed things up, see below
        FontSpan font_span;
        LyXFont font;
+       Buffer const & buffer = *bv_.buffer();

        for (pos_type vpos = row_.pos(); vpos < end; ) {
                if (x_ > bv_.workWidth())
@@ -662,11 +665,11 @@
                // 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(par_, vpos);
-               }
-
-               const int width_pos =
-                       text_.singleWidth(par_, pos, par_.getChar(pos), font);
+                       font = text_.getFont(buffer, par_, vpos);
+               }
+
+               const int width_pos = text_.singleWidth(buffer, par_, pos,
+                       par_.getChar(pos), font);

                if (x_ + width_pos < 0) {
                        x_ += width_pos;
@@ -851,7 +854,11 @@
                if (repaintAll || row_has_changed || cursor_on_row) {
                        // Add to row signature cache
                        par.rowSignature()[rowno] = row_sig;
-
+                       
+                       bool const inside = (y + rit->descent() >= 0
+                               && y - rit->ascent() < ww);
+                       // it is not needed to draw on screen if we are not 
inside.
+                       pi.pain.setDrawingEnabled(inside);
                        RowPainter rp(pi, text, pit, *rit, x, y);
                        // Clear background of this row
                        // (if paragraph background was not cleared)
@@ -868,7 +875,7 @@

                        // Instrumentation for testing row cache (see also
                        // 12 lines lower):
-                       if (text.isMainText())
+                       if (text.isMainText(*pi.base.bv->buffer()))
                                lyxerr[Debug::PAINTING] << "#";
                        else
                                lyxerr[Debug::PAINTING] << "[" <<
@@ -887,6 +894,9 @@
                // Restore, see above
                refreshInside = tmp;
        }
+       // Re-enable screen drawing for future use of the painter.
+       pi.pain.setDrawingEnabled(true);
+
        lyxerr[Debug::PAINTING] << "." << endl;
 }

@@ -897,7 +907,8 @@
               Painter & pain)
 {
        BOOST_ASSERT(bv.buffer());
-       LyXText & text = bv.buffer()->text();
+       Buffer const & buffer = *bv.buffer();
+       LyXText & text = buffer.text();
        bool const select = bv.cursor().selection();
        ViewMetricsInfo const & vi = bv.viewMetricsInfo();
        
@@ -929,13 +940,13 @@
        // Try viewing the User Guide Mobius figure

        if (vi.p1 > 0) {
-               text.redoParagraph(vi.p1 - 1);
+               text.redoParagraph(bv, vi.p1 - 1);
                bv.coordCache().parPos()[&text][vi.p1 - 1] =
                        Point(0, vi.y1 - text.getPar(vi.p1 - 1).descent());
        }

        if (vi.p2 < pit_type(text.paragraphs().size()) - 1) {
-               text.redoParagraph(vi.p2 + 1);
+               text.redoParagraph(bv, vi.p2 + 1);
                bv.coordCache().parPos()[&text][vi.p2 + 1] =
                        Point(0, vi.y2 + text.getPar(vi.p2 + 1).ascent());
        }



Reply via email to