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());
}