mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 01:59:02 +00:00
backing store
This commit is contained in:
parent
4c587fb9da
commit
1a2b1a3bfa
@ -235,13 +235,27 @@ SyntheticMouseEvent::SyntheticMouseEvent()
|
||||
|
||||
|
||||
GuiWorkArea::Private::Private(GuiWorkArea * parent)
|
||||
: p(parent), buffer_view_(0), lyx_view_(0),
|
||||
caret_(0), caret_visible_(false),
|
||||
need_resize_(false), preedit_lines_(1),
|
||||
last_pixel_ratio_(1.0),
|
||||
completer_(new GuiCompleter(p, p)), dialog_mode_(false), shell_escape_(false),
|
||||
read_only_(false), clean_(true), externally_modified_(false)
|
||||
: p(parent), buffer_view_(0), lyx_view_(0), caret_(0),
|
||||
caret_visible_(false), need_resize_(false), preedit_lines_(1),
|
||||
last_pixel_ratio_(1.0), completer_(new GuiCompleter(p, p)),
|
||||
dialog_mode_(false), shell_escape_(false), read_only_(false),
|
||||
clean_(true), externally_modified_(false)
|
||||
{
|
||||
/* Qt on macOS and Wayland does not respect the
|
||||
* Qt::WA_OpaquePaintEvent attribute and resets the widget backing
|
||||
* store at each update. Therefore, we use our own backing store in
|
||||
* these two cases. */
|
||||
#if QT_VERSION >= 0x050000
|
||||
use_backingstore_ = guiApp->platformName() == "cocoa"
|
||||
|| guiApp->platformName() == "wayland";
|
||||
#else
|
||||
# ifdef Q_OS_MAC
|
||||
use_backingstore_ = true;
|
||||
# else
|
||||
use_backingstore_ = false;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
int const time = QApplication::cursorFlashTime() / 2;
|
||||
if (time > 0) {
|
||||
caret_timeout_.setInterval(time);
|
||||
@ -1261,6 +1275,41 @@ void GuiWorkArea::Private::paintPreeditText(GuiPainter & pain)
|
||||
}
|
||||
|
||||
|
||||
void GuiWorkArea::Private::resetScreen()
|
||||
{
|
||||
if (use_backingstore_) {
|
||||
int const pr = p->pixelRatio();
|
||||
screen_ = QImage(static_cast<int>(pr * p->viewport()->width()),
|
||||
static_cast<int>(pr * p->viewport()->height()),
|
||||
QImage::Format_ARGB32_Premultiplied);
|
||||
# if QT_VERSION >= 0x050000
|
||||
screen_.setDevicePixelRatio(pr);
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
QPaintDevice * GuiWorkArea::Private::screenDevice()
|
||||
{
|
||||
if (use_backingstore_)
|
||||
return &screen_;
|
||||
else
|
||||
return p->viewport();
|
||||
}
|
||||
|
||||
|
||||
void GuiWorkArea::Private::updateScreen(QRectF const & rc)
|
||||
{
|
||||
if (use_backingstore_) {
|
||||
QPainter qpain(p->viewport());
|
||||
double const pr = p->pixelRatio();
|
||||
QRectF const rcs = QRectF(rc.x() * pr, rc.y() * pr,
|
||||
rc.width() * pr, rc.height() * pr);
|
||||
qpain.drawImage(rc, screen_, rcs);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void GuiWorkArea::paintEvent(QPaintEvent * ev)
|
||||
{
|
||||
// Do not trigger the painting machinery if we are not ready (see
|
||||
|
@ -20,14 +20,6 @@
|
||||
#include <QMouseEvent>
|
||||
#include <QTimer>
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
/* Qt on macOS does not respect the Qt::WA_OpaquePaintEvent attribute
|
||||
* and resets the widget backing store at each update. Therefore, we
|
||||
* use our own backing store in this case */
|
||||
#define LYX_BACKINGSTORE 1
|
||||
#include <QPainter>
|
||||
#endif
|
||||
|
||||
namespace lyx {
|
||||
|
||||
class Buffer;
|
||||
@ -107,37 +99,12 @@ struct GuiWorkArea::Private
|
||||
|
||||
void paintPreeditText(GuiPainter & pain);
|
||||
|
||||
void resetScreen() {
|
||||
#ifdef LYX_BACKINGSTORE
|
||||
int const pr = p->pixelRatio();
|
||||
screen_ = QImage(static_cast<int>(pr * p->viewport()->width()),
|
||||
static_cast<int>(pr * p->viewport()->height()),
|
||||
QImage::Format_ARGB32_Premultiplied);
|
||||
# if QT_VERSION >= 0x050000
|
||||
screen_.setDevicePixelRatio(pr);
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
QPaintDevice * screenDevice() {
|
||||
#ifdef LYX_BACKINGSTORE
|
||||
return &screen_;
|
||||
#else
|
||||
return p->viewport();
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef LYX_BACKINGSTORE
|
||||
void updateScreen(QRectF const & rc) {
|
||||
QPainter qpain(p->viewport());
|
||||
double const pr = p->pixelRatio();
|
||||
QRectF const rcs = QRectF(rc.x() * pr, rc.y() * pr,
|
||||
rc.width() * pr, rc.height() * pr);
|
||||
qpain.drawImage(rc, screen_, rcs);
|
||||
}
|
||||
#else
|
||||
void updateScreen(QRectF const & ) {}
|
||||
#endif
|
||||
/// Prepare screen for next painting
|
||||
void resetScreen();
|
||||
/// Where painting takes place
|
||||
QPaintDevice * screenDevice();
|
||||
/// Put backingstore to screen if necessary
|
||||
void updateScreen(QRectF const & rc);
|
||||
|
||||
///
|
||||
GuiWorkArea * p;
|
||||
@ -146,10 +113,11 @@ struct GuiWorkArea::Private
|
||||
///
|
||||
GuiView * lyx_view_;
|
||||
|
||||
#ifdef LYX_BACKINGSTORE
|
||||
/// Do we need an intermediate image when painting (for now macOS and Wayland)
|
||||
bool use_backingstore_;
|
||||
///
|
||||
QImage screen_;
|
||||
#endif
|
||||
|
||||
///
|
||||
CaretWidget * caret_;
|
||||
/// is the caret currently displayed
|
||||
|
Loading…
Reference in New Issue
Block a user