mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-29 21:05:12 +00:00
* 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:
parent
2d5ecd2bb8
commit
73ed0b5203
@ -448,7 +448,6 @@ src_frontends_header_files = Split('''
|
||||
WorkArea.h
|
||||
key_state.h
|
||||
mouse_state.h
|
||||
nullpainter.h
|
||||
''')
|
||||
|
||||
|
||||
|
@ -42,5 +42,4 @@ libfrontends_la_SOURCES = \
|
||||
WorkArea.C \
|
||||
WorkArea.h \
|
||||
key_state.h \
|
||||
mouse_state.h \
|
||||
nullpainter.h
|
||||
mouse_state.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
|
||||
|
@ -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
|
@ -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
|
||||
|
@ -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_);
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
@ -852,6 +855,10 @@ void paintPar
|
||||
// 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());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user