WorkArea.h
key_state.h
mouse_state.h
- nullpainter.h
''')
WorkArea.C \
WorkArea.h \
key_state.h \
- mouse_state.h \
- nullpainter.h
+ mouse_state.h
*/
class Painter {
public:
+ Painter(): drawing_enabled_(true) {}
/// possible line widths
enum line_width {
line_thin, //< thin line
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
/// 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
+++ /dev/null
-// -*- 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
void QLPainter::point(int x, int y, LColor_color col)
{
+ if (!isDrawingEnabled())
+ return;
+
setQPainterPen(col);
drawPoint(x, y);
}
line_style ls,
line_width lw)
{
+ if (!isDrawingEnabled())
+ return;
+
setQPainterPen(col, ls, lw);
drawLine(x1, y1, x2, y2);
}
points[i].setY(yp[i]);
}
+ if (!isDrawingEnabled())
+ return;
+
setQPainterPen(col, ls, lw);
drawPolyline(points.get(), np);
}
line_style ls,
line_width lw)
{
+ if (!isDrawingEnabled())
+ return;
+
setQPainterPen(col, ls, lw);
drawRect(x, y, w, h);
}
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);
fillRectangle(x, y, w, h, LColor::graphicsbg);
+ if (!isDrawingEnabled())
+ return;
+
drawImage(x, y, qlimage.qimage(), 0, 0, w, h);
}
} else {
setFont(qfont);
}
- drawText(x + textwidth, y, c);
+ if (isDrawingEnabled())
+ drawText(x + textwidth, y, c);
textwidth += fontMetrics().width(c);
}
return textwidth;
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
//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_;
|| 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_);
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();
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;
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());
}
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
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;
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_;
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();
}
}
- 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;
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);
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
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;
}
// 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())
// 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;
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)
// 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] << "[" <<
// Restore, see above
refreshInside = tmp;
}
+ // Re-enable screen drawing for future use of the painter.
+ pi.pain.setDrawingEnabled(true);
+
lyxerr[Debug::PAINTING] << "." << endl;
}
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();
// 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());
}