]> git.lyx.org Git - features.git/commitdiff
* Painter.h:
authorAbdelrazak Younes <younes@lyx.org>
Mon, 30 Oct 2006 10:09:59 +0000 (10:09 +0000)
committerAbdelrazak Younes <younes@lyx.org>
Mon, 30 Oct 2006 10:09:59 +0000 (10:09 +0000)
  * 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.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@15613 a592a061-630c-0410-9148-cb99ea01b6c8

development/scons/scons_manifest.py
src/frontends/Makefile.am
src/frontends/Painter.h
src/frontends/nullpainter.h [deleted file]
src/frontends/qt4/QLPainter.C
src/insets/insettabular.C
src/mathed/InsetMathNest.C
src/rowpainter.C

index 19ffd565c413c2c4f0e378492e1299de31b2fde7..3b48db495f61fb02b4d607ade407fe869a1f13c3 100644 (file)
@@ -448,7 +448,6 @@ src_frontends_header_files = Split('''
     WorkArea.h
     key_state.h
     mouse_state.h
-    nullpainter.h
 ''')
 
 
index 38eb4bae764ef8f78df8c1be0c6ccf61abd9a284..f9ee6a9b0807ec17388e5d6df66a1413b31ba50f 100644 (file)
@@ -42,5 +42,4 @@ libfrontends_la_SOURCES = \
        WorkArea.C \
        WorkArea.h \
        key_state.h \
-       mouse_state.h \
-       nullpainter.h
+       mouse_state.h
index 5f8e2250b763856ff8c10e06ef7d2ea2a93f2de7..925d489a563629e60249cd1b5dccf067f29c2b63 100644 (file)
@@ -48,6 +48,7 @@ namespace frontend {
  */
 class Painter {
 public:
+       Painter(): drawing_enabled_(true) {}
        /// possible line widths
        enum line_width {
                line_thin, //< thin line
@@ -132,6 +133,9 @@ public:
        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 @@ protected:
 
        /// 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
diff --git a/src/frontends/nullpainter.h b/src/frontends/nullpainter.h
deleted file mode 100644 (file)
index f2449a9..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-// -*- C++ -*-
-/**
- * \file nullpainter.h
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author Alfredo Braunstein
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#ifndef NULLPAINTER_H
-#define NULLPAINTER_H
-
-#include "LColor.h"
-#include "Painter.h"
-
-
-namespace lyx {
-namespace frontend {
-
-class NullPainter : public Painter {
-public:
-       ///
-       NullPainter() {}
-
-       virtual ~NullPainter() {}
-
-       /// begin painting
-       void start() {}
-       /// end painting
-       void end() {}
-
-       ///
-       void line(int, int, int, int, LColor_color,
-                      line_style = line_solid, line_width = line_thin) {}
-       ///
-       void lines(int const *, int const *, int, LColor_color,
-                       line_style = line_solid, line_width = line_thin) {}
-       ///
-       void rectangle(int, int, int, int,      LColor_color,
-               line_style = line_solid, line_width = line_thin) {}
-       ///
-       void fillRectangle(int, int, int, int, LColor_color) {}
-       ///
-       void arc(int, int,      unsigned int, unsigned int,
-               int, int, LColor_color) {}
-       ///
-       void point(int, int, LColor_color) {}
-       ///
-       void button(int, int, int, int) {}
-       ///
-       void image(int, int, int, int, graphics::Image const &) {}
-       ///
-       int text(int, int, docstring const &, LyXFont const &) { return 0; }
-//     ///
-//     int text(int, int, char const *, size_t, LyXFont const &) { return 0; }
-       ///
-       int text(int, int, char_type const *, size_t, LyXFont const &) { return 0; }
-       ///
-       int text(int, int, char_type, LyXFont const &) { return 0; }
-       ///
-       void rectText(int, int, docstring const &,
-               LyXFont const &, LColor_color, LColor_color) {}
-       ///
-       void buttonText(int, int, docstring const &, LyXFont const &) {}
-       ///
-       void underline(LyXFont const &, int, int, int) {}
-       ///
-       void buttonFrame(int, int, int, int) {}
-};
-
-} // namespace frontend
-} // namespace lyx
-
-#endif // NULLPAINTER_H
index 2e5941a65c7858f4eac5b1ec42bb5490ccaba669..da811712fe696b3af7dec4e63e76aa6660a3e5b0 100644 (file)
@@ -84,6 +84,9 @@ void QLPainter::setQPainterPen(LColor_color col,
 
 void QLPainter::point(int x, int y, LColor_color col)
 {
+       if (!isDrawingEnabled())
+               return;
+
        setQPainterPen(col);
        drawPoint(x, y);
 }
@@ -94,6 +97,9 @@ void QLPainter::line(int x1, int y1, int x2, int y2,
        line_style ls,
        line_width lw)
 {
+       if (!isDrawingEnabled())
+               return;
+
        setQPainterPen(col, ls, lw);
        drawLine(x1, y1, x2, y2);
 }
@@ -114,6 +120,9 @@ void QLPainter::lines(int const * xp, int const * yp, int np,
                points[i].setY(yp[i]);
        }
 
+       if (!isDrawingEnabled())
+               return;
+
        setQPainterPen(col, ls, lw);
        drawPolyline(points.get(), np);
 }
@@ -124,6 +133,9 @@ void QLPainter::rectangle(int x, int y, int w, int h,
        line_style ls,
        line_width lw)
 {
+       if (!isDrawingEnabled())
+               return;
+
        setQPainterPen(col, ls, lw);
        drawRect(x, y, w, h);
 }
@@ -138,6 +150,9 @@ void QLPainter::fillRectangle(int x, int y, int w, int h, LColor_color col)
 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);
@@ -151,6 +166,9 @@ void QLPainter::image(int x, int y, int w, int h, graphics::Image 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 @@ int QLPainter::smallCapsText(int x, int y,
                } 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 @@ int QLPainter::text(int x, int y, char_type const * s, size_t ls,
                        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
index 18ad8575301eee95e0b103b3a7058ff4804d45c6..c189398c888c031e1664a22903874b5914c9bc07 100644 (file)
@@ -312,9 +312,6 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const
        //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 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const
                            || 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_);
index c1dee95a2d44e56716d52f77c90a59bfd3e1a155..1596e95794817a1903d320aab7f5955a36ae9456 100644 (file)
@@ -241,10 +241,9 @@ void InsetMathNest::drawSelection(PainterInfo & pi, int x, int y) const
                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();
index fc381fda3d4f84d51335fc6163f9685e4307f4a6..f29b51e1d592023d038c0cfeefdc95d62cc2c006 100644 (file)
@@ -129,7 +129,7 @@ RowPainter::RowPainter(PainterInfo & pi,
          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 @@ RowPainter::RowPainter(PainterInfo & pi,
 
 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 @@ void RowPainter::paintHebrewComposeChar(pos_type & vpos, LyXFont const & font)
                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 @@ void RowPainter::paintArabicComposeChar(pos_type & vpos, LyXFont const & font)
                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::paintForeignMark(double orig_x, LyXFont const & font, int desc)
 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 @@ void RowPainter::paintDepthBar()
                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 @@ void RowPainter::paintFirst()
                }
        }
 
-       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 @@ void RowPainter::paintFirst()
                        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::paintFirst()
 
 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 @@ void RowPainter::paintLast()
                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 @@ void RowPainter::paintText()
        // 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 @@ 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(par_, vpos);
+                       font = text_.getFont(buffer, par_, vpos);
                }
 
-               const int width_pos =
-                       text_.singleWidth(par_, pos, par_.getChar(pos), font);
+               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 @@ void paintPar
                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 @@ void paintPar
 
                        // 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 @@ void paintPar
                // 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 @@ void paintText(BufferView & bv,
               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 @@ void paintText(BufferView & bv,
        // 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());
        }