* 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
This commit is contained in:
Abdelrazak Younes 2006-10-30 10:09:59 +00:00
parent 2d5ecd2bb8
commit 73ed0b5203
8 changed files with 71 additions and 109 deletions

View File

@ -448,7 +448,6 @@ src_frontends_header_files = Split('''
WorkArea.h
key_state.h
mouse_state.h
nullpainter.h
''')

View File

@ -42,5 +42,4 @@ libfrontends_la_SOURCES = \
WorkArea.C \
WorkArea.h \
key_state.h \
mouse_state.h \
nullpainter.h
mouse_state.h

View 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

View File

@ -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

View 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

View 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_);

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

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