From 73ed0b5203ffefa9a4c2ad8e8cf54396a6e72a9c Mon Sep 17 00:00:00 2001 From: Abdelrazak Younes Date: Mon, 30 Oct 2006 10:09:59 +0000 Subject: [PATCH] * 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. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@15613 a592a061-630c-0410-9148-cb99ea01b6c8 --- development/scons/scons_manifest.py | 1 - src/frontends/Makefile.am | 3 +- src/frontends/Painter.h | 11 +++++ src/frontends/nullpainter.h | 76 ----------------------------- src/frontends/qt4/QLPainter.C | 24 ++++++++- src/insets/insettabular.C | 9 ++-- src/mathed/InsetMathNest.C | 7 ++- src/rowpainter.C | 49 +++++++++++-------- 8 files changed, 71 insertions(+), 109 deletions(-) delete mode 100644 src/frontends/nullpainter.h diff --git a/development/scons/scons_manifest.py b/development/scons/scons_manifest.py index 19ffd565c4..3b48db495f 100644 --- a/development/scons/scons_manifest.py +++ b/development/scons/scons_manifest.py @@ -448,7 +448,6 @@ src_frontends_header_files = Split(''' WorkArea.h key_state.h mouse_state.h - nullpainter.h ''') diff --git a/src/frontends/Makefile.am b/src/frontends/Makefile.am index 38eb4bae76..f9ee6a9b08 100644 --- a/src/frontends/Makefile.am +++ b/src/frontends/Makefile.am @@ -42,5 +42,4 @@ libfrontends_la_SOURCES = \ WorkArea.C \ WorkArea.h \ key_state.h \ - mouse_state.h \ - nullpainter.h + mouse_state.h diff --git a/src/frontends/Painter.h b/src/frontends/Painter.h index 5f8e2250b7..925d489a56 100644 --- a/src/frontends/Painter.h +++ b/src/frontends/Painter.h @@ -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 index f2449a9318..0000000000 --- a/src/frontends/nullpainter.h +++ /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 diff --git a/src/frontends/qt4/QLPainter.C b/src/frontends/qt4/QLPainter.C index 2e5941a65c..da811712fe 100644 --- a/src/frontends/qt4/QLPainter.C +++ b/src/frontends/qt4/QLPainter.C @@ -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 diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index 18ad857530..c189398c88 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -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_); diff --git a/src/mathed/InsetMathNest.C b/src/mathed/InsetMathNest.C index c1dee95a2d..1596e95794 100644 --- a/src/mathed/InsetMathNest.C +++ b/src/mathed/InsetMathNest.C @@ -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(); diff --git a/src/rowpainter.C b/src/rowpainter.C index fc381fda3d..f29b51e1d5 100644 --- a/src/rowpainter.C +++ b/src/rowpainter.C @@ -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()); } -- 2.39.2