mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-27 03:36:39 +00:00
* qscreen.[Ch]:
- Cursor handing is done on the server -> *cursor are QPixmap - Use new drawScreen and copyScreen methods. * QWorkArea.[Ch]: - Pixel manipulation is done on the client -> paint_device_ is a QImage - an intermediate Screen device is updated whenever expose is called -> sreen_device_ is a QPixmap. This screen_device is the one that is painted on screen in QWorkArea::repaintEvent(). - new update, drawScreen and copyScreen methods. * QLPainter.C: use the new paintDevice interface. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@13428 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
4c4b3e3cff
commit
4a5053d34e
@ -39,21 +39,10 @@ QLPainter::~QLPainter()
|
||||
}
|
||||
|
||||
QLPainter::QLPainter(QWorkArea * qwa)
|
||||
: Painter(), paint_check_(0), qwa_(qwa)
|
||||
: Painter(), qwa_(qwa)
|
||||
{
|
||||
}
|
||||
|
||||
void QLPainter::start()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void QLPainter::end()
|
||||
{
|
||||
// if (qp_->isActive())
|
||||
// qp_->end();
|
||||
}
|
||||
|
||||
|
||||
int QLPainter::paperWidth() const
|
||||
{
|
||||
@ -66,29 +55,6 @@ int QLPainter::paperHeight() const
|
||||
return qwa_->viewport()->height();
|
||||
}
|
||||
|
||||
/*
|
||||
QPainter & QLPainter::setPen(LColor_color c,
|
||||
Painter::line_style ls, Painter::line_width lw)
|
||||
{
|
||||
QPen pen = qp_->pen();
|
||||
|
||||
pen.setColor(lcolorcache.get(c));
|
||||
|
||||
switch (ls) {
|
||||
case line_solid: pen.setStyle(Qt::SolidLine); break;
|
||||
case line_onoffdash: pen.setStyle(Qt::DotLine); break;
|
||||
}
|
||||
|
||||
switch (lw) {
|
||||
case line_thin: pen.setWidth(0); break;
|
||||
case line_thick: pen.setWidth(3); break;
|
||||
}
|
||||
|
||||
qp_->setPen(pen);
|
||||
|
||||
return *qp_;
|
||||
}
|
||||
*/
|
||||
QPainter & QLPainter::setQPainterPen(QPainter & qp, LColor_color c,
|
||||
Painter::line_style ls, Painter::line_width lw)
|
||||
{
|
||||
@ -113,7 +79,7 @@ QPainter & QLPainter::setQPainterPen(QPainter & qp, LColor_color c,
|
||||
|
||||
void QLPainter::point(int x, int y, LColor_color c)
|
||||
{
|
||||
QPainter qp(qwa_->pixmap());
|
||||
QPainter qp(qwa_->paintDevice());
|
||||
setQPainterPen(qp, c).drawPoint(x, y);
|
||||
}
|
||||
|
||||
@ -123,7 +89,7 @@ void QLPainter::line(int x1, int y1, int x2, int y2,
|
||||
line_style ls,
|
||||
line_width lw)
|
||||
{
|
||||
QPainter qp(qwa_->pixmap());
|
||||
QPainter qp(qwa_->paintDevice());
|
||||
setQPainterPen(qp, col, ls, lw).drawLine(x1, y1, x2, y2);
|
||||
}
|
||||
|
||||
@ -143,7 +109,7 @@ void QLPainter::lines(int const * xp, int const * yp, int np,
|
||||
points[i].setY(yp[i]);
|
||||
}
|
||||
|
||||
QPainter qp(qwa_->pixmap());
|
||||
QPainter qp(qwa_->paintDevice());
|
||||
setQPainterPen(qp, col, ls, lw).drawPolyline(points.get(), np);
|
||||
}
|
||||
|
||||
@ -153,18 +119,14 @@ void QLPainter::rectangle(int x, int y, int w, int h,
|
||||
line_style ls,
|
||||
line_width lw)
|
||||
{
|
||||
QPainter qp(qwa_->pixmap());
|
||||
QPainter qp(qwa_->paintDevice());
|
||||
setQPainterPen(qp, col, ls, lw).drawRect(x, y, w, h);
|
||||
}
|
||||
|
||||
|
||||
void QLPainter::fillRectangle(int x, int y, int w, int h, LColor_color col)
|
||||
{
|
||||
// lyxerr[Debug::GRAPHICS] << BOOST_CURRENT_FUNCTION
|
||||
// << "\nx=" << x << " y=" << y << " w=" << w << " h=" << h
|
||||
// << " LColor " << col << endl;
|
||||
|
||||
QPainter qp(qwa_->pixmap());
|
||||
QPainter qp(qwa_->paintDevice());
|
||||
qp.fillRect(x, y, w, h, lcolorcache.get(col));
|
||||
}
|
||||
|
||||
@ -180,7 +142,7 @@ void QLPainter::fillPolygon(int const * xp, int const * yp,
|
||||
points[i].setY(yp[i]);
|
||||
}
|
||||
|
||||
QPainter qp(qwa_->pixmap());
|
||||
QPainter qp(qwa_->paintDevice());
|
||||
setQPainterPen(qp, col);
|
||||
qp.setBrush(lcolorcache.get(col));
|
||||
qp.drawPolygon(points.get(), np);
|
||||
@ -192,7 +154,7 @@ void QLPainter::arc(int x, int y, unsigned int w, unsigned int h,
|
||||
int a1, int a2, LColor_color col)
|
||||
{
|
||||
// LyX usings 1/64ths degree, Qt usings 1/16th
|
||||
QPainter qp(qwa_->pixmap());
|
||||
QPainter qp(qwa_->paintDevice());
|
||||
setQPainterPen(qp, col).drawArc(x, y, w, h, a1 / 4, a2 / 4);
|
||||
}
|
||||
|
||||
@ -205,7 +167,7 @@ void QLPainter::image(int x, int y, int w, int h,
|
||||
|
||||
fillRectangle(x, y, w, h, LColor::graphicsbg);
|
||||
|
||||
QPainter qp(qwa_->pixmap());
|
||||
QPainter qp(qwa_->paintDevice());
|
||||
qp.drawImage(x, y, qlimage.qimage(), 0, 0, w, h);
|
||||
}
|
||||
|
||||
@ -234,7 +196,7 @@ void QLPainter::smallCapsText(int x, int y,
|
||||
QFontMetrics const & qfontm = QFontMetrics(qfont);
|
||||
QFontMetrics const & qsmallfontm = QFontMetrics(qsmallfont);
|
||||
|
||||
QPainter qp(qwa_->pixmap());
|
||||
QPainter qp(qwa_->paintDevice());
|
||||
int tmpx = x;
|
||||
size_t ls = s.length();
|
||||
for (size_t i = 0; i < ls; ++i) {
|
||||
@ -256,7 +218,7 @@ void QLPainter::smallCapsText(int x, int y,
|
||||
void QLPainter::text(int x, int y, char const * s, size_t ls,
|
||||
LyXFont const & f)
|
||||
{
|
||||
QPainter qp(qwa_->pixmap());
|
||||
QPainter qp(qwa_->paintDevice());
|
||||
setQPainterPen(qp, f.realColor());
|
||||
|
||||
Encoding const * encoding = f.language()->encoding();
|
||||
@ -288,8 +250,14 @@ void QLPainter::text(int x, int y, char const * s, size_t ls,
|
||||
|
||||
}
|
||||
/// draw a pixmap from the image cache
|
||||
void QLPainter::pixmap(int x, int y, QPixmap const & pixmap)
|
||||
void QLPainter::drawPixmap(int x, int y, QPixmap const & pixmap)
|
||||
{
|
||||
QPainter qp(qwa_->pixmap());
|
||||
QPainter qp(qwa_->paintDevice());
|
||||
qp.drawPixmap(x, y, pixmap);
|
||||
}
|
||||
|
||||
void QLPainter::drawImage(int x, int y, QImage const & image)
|
||||
{
|
||||
QPainter qp(qwa_->paintDevice());
|
||||
qp.drawImage(x, y, image);
|
||||
}
|
||||
|
@ -22,6 +22,7 @@ class QPaintDevice;
|
||||
class QPainter;
|
||||
class QString;
|
||||
class QPixmap;
|
||||
class QImage;
|
||||
class QWorkArea;
|
||||
|
||||
/**
|
||||
@ -34,10 +35,16 @@ public:
|
||||
~QLPainter();
|
||||
|
||||
/// begin painting
|
||||
virtual void start();
|
||||
/**
|
||||
Not used in the the Qt4 frontend.
|
||||
*/
|
||||
virtual void start() {}
|
||||
|
||||
/// end painting
|
||||
virtual void end();
|
||||
/**
|
||||
Not used in the the Qt4 frontend.
|
||||
*/
|
||||
virtual void end() {}
|
||||
|
||||
/// return the width of the work area in pixels
|
||||
virtual int paperWidth() const;
|
||||
@ -120,7 +127,10 @@ public:
|
||||
char c, LyXFont const & f);
|
||||
|
||||
/// draw a pixmap from the image cache
|
||||
virtual void pixmap(int x, int y, QPixmap const & pixmap);
|
||||
virtual void drawPixmap(int x, int y, QPixmap const & pixmap);
|
||||
|
||||
/// draw a pixmap from the image cache
|
||||
virtual void drawImage(int x, int y, QImage const & image);
|
||||
|
||||
private:
|
||||
/// draw small caps text
|
||||
@ -135,9 +145,6 @@ private:
|
||||
/// our qt painter
|
||||
boost::scoped_ptr<QPainter> qp_;
|
||||
|
||||
/// recursion check
|
||||
int paint_check_;
|
||||
|
||||
/// the working area
|
||||
QWorkArea * qwa_;
|
||||
};
|
||||
|
@ -492,10 +492,12 @@ void QWorkArea::resizeEvent(QResizeEvent * resizeEvent)
|
||||
|
||||
verticalScrollBar()->setPageStep(viewport()->height());
|
||||
|
||||
pixmap_.reset(new QPixmap(viewport()->width(), viewport()->height()));
|
||||
screen_device_ = QPixmap(viewport()->width(), viewport()->height());
|
||||
paint_device_ = QImage(viewport()->width(), viewport()->height(), QImage::Format_RGB32);
|
||||
|
||||
this->workAreaResize();
|
||||
|
||||
/*
|
||||
lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION
|
||||
<< "\n QWidget width\t" << this->QWidget::width()
|
||||
<< "\n QWidget height\t" << this->QWidget::height()
|
||||
@ -504,10 +506,21 @@ void QWorkArea::resizeEvent(QResizeEvent * resizeEvent)
|
||||
<< "\n QResizeEvent rect left\t" << rect().left()
|
||||
<< "\n QResizeEvent rect right\t" << rect().right()
|
||||
<< endl;
|
||||
*/
|
||||
}
|
||||
|
||||
void QWorkArea::update(int x, int y, int w, int h)
|
||||
{
|
||||
//screen_device_.fromImage(paint_device_);
|
||||
QPainter q(&screen_device_);
|
||||
q.drawImage(x, y, paint_device_.copy(x, y, w, h));
|
||||
|
||||
viewport()->update(x, y, w, h);
|
||||
}
|
||||
|
||||
void QWorkArea::paintEvent(QPaintEvent * e)
|
||||
{
|
||||
/*
|
||||
lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION
|
||||
<< "\n QWidget width\t" << this->width()
|
||||
<< "\n QWidget height\t" << this->height()
|
||||
@ -520,9 +533,21 @@ void QWorkArea::paintEvent(QPaintEvent * e)
|
||||
<< "\n QPaintEvent w\t" << e->rect().width()
|
||||
<< "\n QPaintEvent h\t" << e->rect().height()
|
||||
<< endl;
|
||||
|
||||
*/
|
||||
QPainter q(viewport());
|
||||
q.drawPixmap(e->rect(), *pixmap_.get(), e->rect());
|
||||
q.drawPixmap(e->rect(), screen_device_, e->rect());
|
||||
}
|
||||
|
||||
QPixmap QWorkArea::copyScreen(int x, int y, int w, int h) const
|
||||
{
|
||||
return screen_device_.copy(x, y, w, h);
|
||||
}
|
||||
|
||||
void QWorkArea::drawScreen(int x, int y, QPixmap pixmap)
|
||||
{
|
||||
QPainter q(&screen_device_);
|
||||
q.drawPixmap(x, y, pixmap);
|
||||
viewport()->update(x, y, pixmap.width(), pixmap.height());
|
||||
}
|
||||
|
||||
|
||||
|
@ -22,13 +22,13 @@
|
||||
#undef emit
|
||||
#endif
|
||||
|
||||
#include "funcrequest.h"
|
||||
#include "frontends/Timeout.h"
|
||||
|
||||
#include "WorkArea.h"
|
||||
#include "QLPainter.h"
|
||||
#include "LyXView.h"
|
||||
|
||||
#include "funcrequest.h"
|
||||
#include "frontends/Timeout.h"
|
||||
|
||||
#include <QAbstractScrollArea>
|
||||
#include <QMouseEvent>
|
||||
#include <QWheelEvent>
|
||||
@ -36,8 +36,8 @@
|
||||
#include <QKeyEvent>
|
||||
#include <QPaintEvent>
|
||||
#include <QTimer>
|
||||
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
#include <QImage>
|
||||
#include <QPixmap>
|
||||
|
||||
#include <queue>
|
||||
|
||||
@ -130,17 +130,20 @@ public:
|
||||
/// return the widget's painter
|
||||
virtual Painter & getPainter() { return (Painter &) painter_; }
|
||||
|
||||
///
|
||||
//virtual QPaintDevice & paintDevice() { return content_->pixmap(); }
|
||||
|
||||
/// return the backing pixmap
|
||||
QPixmap * pixmap() const { return pixmap_.get(); }
|
||||
QPaintDevice * paintDevice() { return &paint_device_; }
|
||||
|
||||
/// return the widget's painter
|
||||
//virtual QLPainter & getQLPainter() const { return painter_; }
|
||||
/// update the passed area.
|
||||
void update(int x, int y, int w, int h);
|
||||
|
||||
/// get the content pane widget
|
||||
QWidget * getContent() const { return viewport(); }
|
||||
/// return a screen copy of the defined area.
|
||||
QPixmap copyScreen(int x, int y, int w, int h) const;
|
||||
|
||||
/// Draw a pixmap onto the backing pixmap.
|
||||
/**
|
||||
QPixmap is implicitely shared so no need to pass by reference.
|
||||
*/
|
||||
void drawScreen(int x, int y, QPixmap pixmap);
|
||||
|
||||
protected:
|
||||
|
||||
@ -198,8 +201,11 @@ private:
|
||||
///
|
||||
SyntheticMouseEvent synthetic_mouse_event_;
|
||||
|
||||
/// the double buffered pixmap
|
||||
boost::scoped_ptr<QPixmap> pixmap_;
|
||||
/// Our client side painting device.
|
||||
QImage paint_device_;
|
||||
|
||||
/// Our server side painting device.
|
||||
QPixmap screen_device_;
|
||||
|
||||
/// \todo remove
|
||||
QTimer step_timer_;
|
||||
|
@ -13,15 +13,14 @@
|
||||
|
||||
#include "QWorkArea.h"
|
||||
#include "qscreen.h"
|
||||
//Added by qt3to4:
|
||||
#include <QPixmap>
|
||||
|
||||
#include <QColor>
|
||||
#include <QPainter>
|
||||
#include <QApplication>
|
||||
|
||||
#include "debug.h"
|
||||
#include "lcolorcache.h"
|
||||
|
||||
#include <QApplication>
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
@ -29,7 +28,7 @@ namespace {
|
||||
|
||||
|
||||
QScreen::QScreen(QWorkArea & o)
|
||||
: LyXScreen(), owner_(o), nocursor_pixmap_(0,0)
|
||||
: LyXScreen(), owner_(o), nocursor_(0,0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -46,13 +45,12 @@ WorkArea & QScreen::workarea() const
|
||||
|
||||
void QScreen::expose(int x, int y, int w, int h)
|
||||
{
|
||||
lyxerr[Debug::GUI] << "expose " << w << 'x' << h << '+' << x << '+' << y << std::endl;
|
||||
lyxerr[Debug::GUI] << "expose " << w << 'x' << h
|
||||
<< '+' << x << '+' << y << std::endl;
|
||||
|
||||
owner_.viewport()->update(x, y, w, h);
|
||||
// owner_.update();
|
||||
owner_.update(x, y, w, h);
|
||||
}
|
||||
|
||||
|
||||
void QScreen::showCursor(int x, int y, int h, Cursor_Shape shape)
|
||||
{
|
||||
if (!qApp->focusWidget())
|
||||
@ -60,11 +58,7 @@ void QScreen::showCursor(int x, int y, int h, Cursor_Shape shape)
|
||||
|
||||
if (x==cursor_x_ && y==cursor_y_ && h==cursor_h_) {
|
||||
// Draw the new (vertical) cursor using the cached store.
|
||||
QLPainter * lp = (QLPainter *) &(owner_.getPainter());
|
||||
lp->pixmap(cursor_x_, cursor_y_, vcursor_pixmap_);
|
||||
owner_.viewport()->update(
|
||||
cursor_x_, cursor_y_,
|
||||
cursor_w_, cursor_h_);
|
||||
owner_.drawScreen(cursor_x_, cursor_y_, vcursor_);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -92,45 +86,33 @@ void QScreen::showCursor(int x, int y, int h, Cursor_Shape shape)
|
||||
// 2 the vertical line of the cursor.
|
||||
// 3 the horizontal line of the L-shaped cursor (if necessary).
|
||||
|
||||
// Initialise storage for these pixmaps as necessary.
|
||||
if (cursor_w_ != nocursor_pixmap_.width() ||
|
||||
cursor_h_ != nocursor_pixmap_.height()) {
|
||||
nocursor_pixmap_.resize(cursor_w_, cursor_h_);
|
||||
}
|
||||
|
||||
QColor const & required_color = lcolorcache.get(LColor::cursor);
|
||||
bool const cursor_color_changed = required_color != cursor_color_;
|
||||
if (cursor_color_changed)
|
||||
cursor_color_ = required_color;
|
||||
|
||||
// if (cursor_h_ != vcursor_pixmap_.height() || cursor_color_changed) {
|
||||
// if (cursor_h_ != vcursor_pixmap_.height())
|
||||
vcursor_pixmap_.resize(cursor_w_, cursor_h_);
|
||||
vcursor_pixmap_.fill(cursor_color_);
|
||||
// }
|
||||
vcursor_ = QPixmap(cursor_w_, cursor_h_);
|
||||
vcursor_ .fill(cursor_color_);
|
||||
|
||||
switch (shape) {
|
||||
case BAR_SHAPE:
|
||||
break;
|
||||
case REVERSED_L_SHAPE:
|
||||
case L_SHAPE:
|
||||
if (cursor_w_ != hcursor_pixmap_.width() ||
|
||||
if (cursor_w_ != hcursor_.width() ||
|
||||
cursor_color_changed) {
|
||||
if (cursor_w_ != hcursor_pixmap_.width())
|
||||
hcursor_pixmap_.resize(cursor_w_, 1);
|
||||
hcursor_pixmap_.fill(cursor_color_);
|
||||
if (cursor_w_ != hcursor_.width())
|
||||
hcursor_ = QPixmap(cursor_w_, 1);
|
||||
hcursor_.fill(cursor_color_);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Save the old area (no cursor).
|
||||
QPainter qp(&nocursor_pixmap_);
|
||||
qp.drawPixmap(0, 0, *owner_.pixmap(),
|
||||
cursor_x_, cursor_y_, cursor_w_, cursor_h_);
|
||||
nocursor_ = owner_.copyScreen(cursor_x_, cursor_y_, cursor_w_, cursor_h_);
|
||||
|
||||
// Draw the new (vertical) cursor using the cached store.
|
||||
QLPainter * lp = (QLPainter *) &(owner_.getPainter());
|
||||
lp->pixmap(cursor_x_, cursor_y_, vcursor_pixmap_);
|
||||
owner_.drawScreen(cursor_x_, cursor_y_, vcursor_);
|
||||
|
||||
// Draw the new (horizontal) cursor if necessary.
|
||||
switch (shape) {
|
||||
@ -138,26 +120,17 @@ void QScreen::showCursor(int x, int y, int h, Cursor_Shape shape)
|
||||
break;
|
||||
case REVERSED_L_SHAPE:
|
||||
case L_SHAPE:
|
||||
lp->pixmap(cursor_x_, y + h - 1, hcursor_pixmap_);
|
||||
owner_.drawScreen(cursor_x_, y + h - 1, hcursor_);
|
||||
break;
|
||||
}
|
||||
|
||||
owner_.viewport()->update(
|
||||
cursor_x_, cursor_y_,
|
||||
cursor_w_, cursor_h_);
|
||||
}
|
||||
|
||||
|
||||
void QScreen::removeCursor()
|
||||
{
|
||||
// before first showCursor
|
||||
if (nocursor_pixmap_.isNull())
|
||||
if (nocursor_.isNull())
|
||||
return;
|
||||
|
||||
QLPainter * lp = (QLPainter *) &(owner_.getPainter());
|
||||
lp->pixmap(cursor_x_, cursor_y_, nocursor_pixmap_);
|
||||
|
||||
owner_.viewport()->update(
|
||||
cursor_x_, cursor_y_,
|
||||
cursor_w_, cursor_h_);
|
||||
owner_.drawScreen(cursor_x_, cursor_y_, nocursor_);
|
||||
}
|
||||
|
@ -12,11 +12,13 @@
|
||||
#ifndef QSCREEN_H
|
||||
#define QSCREEN_H
|
||||
|
||||
|
||||
#include "screen.h"
|
||||
#include <qcolor.h>
|
||||
|
||||
#include <QPixmap>
|
||||
|
||||
class QColor;
|
||||
|
||||
class QWorkArea;
|
||||
class WorkArea;
|
||||
|
||||
@ -47,13 +49,9 @@ private:
|
||||
/// our owning widget
|
||||
QWorkArea & owner_;
|
||||
|
||||
// QRegion nocursor_region_;
|
||||
// QRegion hcursor_region_;
|
||||
// QRegion vcursor_region_;
|
||||
|
||||
QPixmap nocursor_pixmap_;
|
||||
QPixmap hcursor_pixmap_;
|
||||
QPixmap vcursor_pixmap_;
|
||||
QPixmap nocursor_;
|
||||
QPixmap hcursor_;
|
||||
QPixmap vcursor_;
|
||||
|
||||
//@{ the cursor pixmap position/size
|
||||
int cursor_x_;
|
||||
|
Loading…
Reference in New Issue
Block a user