diff --git a/src/LyXRC.cpp b/src/LyXRC.cpp index 6f5a19e607..4a06584632 100644 --- a/src/LyXRC.cpp +++ b/src/LyXRC.cpp @@ -199,6 +199,7 @@ LexerKeyword lyxrcTags[] = { { "\\use_converter_cache", LyXRC::RC_USE_CONVERTER_CACHE }, { "\\use_lastfilepos", LyXRC::RC_USELASTFILEPOS }, { "\\use_pixmap_cache", LyXRC::RC_USE_PIXMAP_CACHE }, + { "\\use_qimage", LyXRC::RC_USE_QIMAGE }, // compatibility with versions older than 1.4.0 only { "\\use_system_colors", LyXRC::RC_USE_SYSTEM_COLORS }, { "\\use_tooltip", LyXRC::RC_USE_TOOLTIP }, @@ -337,6 +338,7 @@ void LyXRC::setDefaults() use_system_colors = false; use_tooltip = true; use_pixmap_cache = false; + use_qimage = true; converter_cache_maxage = 6 * 30 * 24 * 3600; // 6 months user_name = to_utf8(support::user_name()); user_email = to_utf8(support::user_email()); @@ -951,6 +953,9 @@ LyXRC::ReturnValues LyXRC::read(Lexer & lexrc, bool check_format) case RC_USE_PIXMAP_CACHE: lexrc >> use_pixmap_cache; break; + case RC_USE_QIMAGE: + lexrc >> use_qimage; + break; case RC_SPELLCHECKER: lexrc >> spellchecker; break; @@ -2439,6 +2444,15 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c } if (tag != RC_LAST) break; + case RC_USE_QIMAGE: + if (ignore_system_lyxrc || + use_qimage != system_lyxrc.use_qimage) { + os << "\\use_qimage " + << convert(use_qimage) + << '\n'; + } + if (tag != RC_LAST) + break; os << "\n#\n" << "# LANGUAGE SUPPORT SECTION ##########################\n" @@ -2993,6 +3007,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new) case LyXRC::RC_USE_SYSTEM_COLORS: case LyXRC::RC_USE_TOOLTIP: case LyXRC::RC_USE_PIXMAP_CACHE: + case LyXRC::RC_USE_QIMAGE: case LyXRC::RC_VIEWDVI_PAPEROPTION: case LyXRC::RC_SINGLE_CLOSE_TAB_BUTTON: case LyXRC::RC_SINGLE_INSTANCE: diff --git a/src/LyXRC.h b/src/LyXRC.h index f80c7b5f51..182fdf7aab 100644 --- a/src/LyXRC.h +++ b/src/LyXRC.h @@ -185,6 +185,7 @@ public: RC_USE_SYSTEM_COLORS, RC_USE_TOOLTIP, RC_USE_PIXMAP_CACHE, + RC_USE_QIMAGE, RC_VIEWDVI_PAPEROPTION, RC_VIEWER, RC_VIEWER_ALTERNATIVES, @@ -361,6 +362,8 @@ public: bool use_system_colors; /// Use pixmap cache? bool use_pixmap_cache; + /// Use QImage backend? + bool use_qimage; /// Spellchecker engine: aspell, hunspell, etc std::string spellchecker; /// Alternate language for spellchecker diff --git a/src/frontends/qt4/GuiWorkArea.cpp b/src/frontends/qt4/GuiWorkArea.cpp index 563d00b738..e0c651f17a 100644 --- a/src/frontends/qt4/GuiWorkArea.cpp +++ b/src/frontends/qt4/GuiWorkArea.cpp @@ -237,7 +237,7 @@ SyntheticMouseEvent::SyntheticMouseEvent() GuiWorkArea::Private::Private(GuiWorkArea * parent) -: p(parent), buffer_view_(0), lyx_view_(0), cursor_visible_(false), +: p(parent), screen_(0), buffer_view_(0), lyx_view_(0), cursor_visible_(false), need_resize_(false), schedule_redraw_(false), preedit_lines_(1), completer_(new GuiCompleter(p, p)) { @@ -319,6 +319,7 @@ void GuiWorkArea::init() GuiWorkArea::~GuiWorkArea() { d->buffer_view_->buffer().workAreaManager().remove(this); + delete d->screen_; delete d->buffer_view_; delete d->cursor_; // Completer has a QObject parent and is thus automatically destroyed. @@ -1120,11 +1121,11 @@ void GuiWorkArea::paintEvent(QPaintEvent * ev) } QPainter pain(viewport()); -#ifdef USE_QIMAGE - pain.drawImage(rc, d->screen_, rc); -#else - pain.drawPixmap(rc, d->screen_, rc); -#endif + if (lyxrc.use_qimage) { + pain.drawImage(rc, static_cast(*d->screen_), rc); + } else { + pain.drawPixmap(rc, static_cast(*d->screen_), rc); + } d->cursor_->draw(pain); ev->accept(); } @@ -1132,7 +1133,7 @@ void GuiWorkArea::paintEvent(QPaintEvent * ev) void GuiWorkArea::Private::updateScreen() { - GuiPainter pain(&screen_); + GuiPainter pain(screen_); buffer_view_->draw(pain); } @@ -1204,7 +1205,7 @@ void GuiWorkArea::inputMethodEvent(QInputMethodEvent * e) return; } - GuiPainter pain(&d->screen_); + GuiPainter pain(d->screen_); d->buffer_view_->updateMetrics(); d->buffer_view_->draw(pain); FontInfo font = d->buffer_view_->cursor().getFont().fontInfo(); diff --git a/src/frontends/qt4/GuiWorkArea_Private.h b/src/frontends/qt4/GuiWorkArea_Private.h index 133a6cdbec..9b339d060e 100644 --- a/src/frontends/qt4/GuiWorkArea_Private.h +++ b/src/frontends/qt4/GuiWorkArea_Private.h @@ -12,24 +12,17 @@ #ifndef WORKAREA_PRIVATE_H #define WORKAREA_PRIVATE_H -// Comment out to use QImage backend instead of QPixmap. This won't have any -// effect on Windows, MacOSX and most X11 environment when running locally. -// When running remotely on X11, this may have a big performance penalty. -//#define USE_QIMAGE - #include "FuncRequest.h" #include "qt_helpers.h" +#include "LyXRC.h" #include "support/docstring.h" #include "support/Timeout.h" #include #include -#ifdef USE_QIMAGE #include -#else #include -#endif #include class QContextMenuEvent; @@ -109,11 +102,11 @@ struct GuiWorkArea::Private void resizeBufferView(); /// paint the cursor and store the background - virtual void showCursor(int x, int y, int h, + void showCursor(int x, int y, int h, bool l_shape, bool rtl, bool completable); /// hide the cursor - virtual void removeCursor(); + void removeCursor(); /// void dispatch(FuncRequest const & cmd0, KeyModifier = NoModifier); /// hide the visible cursor, if it is visible @@ -127,25 +120,20 @@ struct GuiWorkArea::Private /// void setCursorShape(Qt::CursorShape shape); -#ifdef USE_QIMAGE void resetScreen() { - screen_ = QImage(p->viewport()->width(), p->viewport()->height(), - QImage::Format_ARGB32_Premultiplied); + delete screen_; + if (lyxrc.use_qimage) { + screen_ = new QImage(p->viewport()->width(), p->viewport()->height(), + QImage::Format_ARGB32_Premultiplied); + } else { + screen_ = new QPixmap(p->viewport()->width(), p->viewport()->height()); + } } - - QImage screen_; -#else - void resetScreen() - { - screen_ = QPixmap(p->viewport()->width(), p->viewport()->height()); - } - - QPixmap screen_; -#endif /// GuiWorkArea * p; - + /// + QPaintDevice * screen_; /// BufferView * buffer_view_; /// Read only Buffer status cache.