Mercurial > hg > svgui
changeset 952:b1aa74ce697e osx-retina
Always render to a buffer, then from that to the widget
author | Chris Cannam |
---|---|
date | Mon, 27 Apr 2015 11:38:01 +0100 |
parents | 53e039d99b5d |
children | fe46201414c8 |
files | view/View.cpp view/View.h |
diffstat | 2 files changed, 39 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/view/View.cpp Mon Apr 20 15:59:03 2015 +0100 +++ b/view/View.cpp Mon Apr 27 11:38:01 2015 +0100 @@ -60,6 +60,7 @@ m_playPointerFrame(0), m_showProgress(showProgress), m_cache(0), + m_buffer(0), m_cacheCentreFrame(0), m_cacheZoomLevel(1024), m_selectionCached(false), @@ -1752,10 +1753,14 @@ int dpratio = devicePixelRatio(); - QSize scaledCacheSize(width() * dpratio, height() * dpratio); - QRect scaledCacheRect(cacheRect.x() * dpratio, cacheRect.y() * dpratio, - cacheRect.width() * dpratio, cacheRect.height() * dpratio); - + QSize scaledCacheSize(scaledSize(size(), dpratio)); + QRect scaledCacheRect(scaledRect(cacheRect, dpratio)); + + if (!m_buffer || scaledCacheSize != m_buffer->size()) { + delete m_buffer; + m_buffer = new QPixmap(scaledCacheSize); + } + if (!scrollables.empty()) { #ifdef DEBUG_VIEW_WIDGET_PAINT @@ -1823,8 +1828,8 @@ #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "View(" << this << ")::paintEvent: cache is good" << endl; #endif - paint.begin(this); - paint.drawPixmap(cacheRect, *m_cache, scaledCacheRect); + paint.begin(m_buffer); + paint.drawPixmap(scaledCacheRect, *m_cache, scaledCacheRect); paint.end(); QFrame::paintEvent(e); paintedCacheRect = true; @@ -1850,8 +1855,8 @@ paint.begin(m_cache); rectToPaint = scaledCacheRect; } else { - paint.begin(this); - rectToPaint = cacheRect; + paint.begin(m_buffer); + rectToPaint = scaledCacheRect; } setPaintFont(paint); @@ -1883,8 +1888,9 @@ if (repaintCache) { cacheRect |= (e ? e->rect() : rect()); - paint.begin(this); - paint.drawPixmap(cacheRect, *m_cache, scaledCacheRect); + scaledCacheRect = scaledRect(cacheRect, dpratio); + paint.begin(m_buffer); + paint.drawPixmap(scaledCacheRect, *m_cache, scaledCacheRect); paint.end(); } } @@ -1895,13 +1901,15 @@ nonCacheRect |= cacheRect; - paint.begin(this); - paint.setClipRect(nonCacheRect); + QRect scaledNonCacheRect = scaledRect(nonCacheRect, dpratio); + + paint.begin(m_buffer); + paint.setClipRect(scaledNonCacheRect); setPaintFont(paint); if (scrollables.empty()) { paint.setPen(getBackground()); paint.setBrush(getBackground()); - paint.drawRect(nonCacheRect); + paint.drawRect(scaledNonCacheRect); } paint.setPen(getForeground()); @@ -1912,14 +1920,14 @@ #ifdef DEBUG_VIEW_WIDGET_PAINT cerr << "Painting non-scrollable layer " << *i << " without proxy with repaintCache = " << repaintCache << ", dpratio = " << dpratio << ", rectToPaint = " << nonCacheRect.x() << "," << nonCacheRect.y() << " " << nonCacheRect.width() << "x" << nonCacheRect.height() << endl; #endif - (*i)->paint(this, paint, nonCacheRect); + (*i)->paint(&proxy, paint, scaledNonCacheRect); } paint.end(); - paint.begin(this); + paint.begin(m_buffer); setPaintFont(paint); - if (e) paint.setClipRect(e->rect()); + if (e) paint.setClipRect(scaledRect(e->rect(), dpratio)); if (!m_selectionCached) { drawSelections(paint); } @@ -1940,7 +1948,12 @@ showPlayPointer = false; } } - + + paint.begin(this); + QRect finalPaintRect = e ? e->rect() : rect(); + paint.drawPixmap(finalPaintRect, *m_buffer, scaledRect(finalPaintRect, dpratio)); + paint.end(); + if (showPlayPointer) { paint.begin(this);
--- a/view/View.h Mon Apr 20 15:59:03 2015 +0100 +++ b/view/View.h Mon Apr 27 11:38:01 2015 +0100 @@ -389,6 +389,14 @@ virtual bool shouldLabelSelections() const { return true; } virtual bool render(QPainter &paint, int x0, sv_frame_t f0, sv_frame_t f1); virtual void setPaintFont(QPainter &paint); + + QSize scaledSize(const QSize &s, int factor) { + return QSize(s.width() * factor, s.height() * factor); + } + QRect scaledRect(const QRect &r, int factor) { + return QRect(r.x() * factor, r.y() * factor, + r.width() * factor, r.height() * factor); + } typedef std::vector<Layer *> LayerList; @@ -429,6 +437,7 @@ bool m_showProgress; QPixmap *m_cache; + QPixmap *m_buffer; sv_frame_t m_cacheCentreFrame; int m_cacheZoomLevel; bool m_selectionCached;