From 57b7c82560088149010b000bc78a3a6d8f2f8834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Fri, 29 Apr 2011 15:45:30 +0200 Subject: Add QWidgetWindow to bridge events from QWindow to QWidget. Gets rid of QWidget dependencies in QWindow and QWindowSurface. Events are not delivered to the correct child widget yet. --- src/gui/painting/qwindowsurface.cpp | 96 +++++++++++++------------------------ 1 file changed, 32 insertions(+), 64 deletions(-) (limited to 'src/gui/painting/qwindowsurface.cpp') diff --git a/src/gui/painting/qwindowsurface.cpp b/src/gui/painting/qwindowsurface.cpp index 0fb9bf78a9..97fb7a9972 100644 --- a/src/gui/painting/qwindowsurface.cpp +++ b/src/gui/painting/qwindowsurface.cpp @@ -40,8 +40,8 @@ ****************************************************************************/ #include -#include -#include +#include +#include #include #include @@ -50,19 +50,18 @@ QT_BEGIN_NAMESPACE class QWindowSurfacePrivate { public: - QWindowSurfacePrivate(QWidget *w) + QWindowSurfacePrivate(QWindow *w) : window(w) { } - QWidget *window; + QWindow *window; #if !defined(Q_WS_QPA) QRect geometry; #else QSize size; #endif //Q_WS_QPA QRegion staticContents; - QList bufferImages; }; /*! @@ -96,10 +95,10 @@ public: */ /*! - \fn void QWindowSurface::flush(QWidget *widget, const QRegion ®ion, + \fn void QWindowSurface::flush(QWindow *window, const QRegion ®ion, const QPoint &offset) - Flushes the given \a region from the specified \a widget onto the + Flushes the given \a region from the specified \a window onto the screen. Note that the \a offset parameter is currently unused. @@ -114,13 +113,15 @@ public: /*! Constructs an empty surface for the given top-level \a window. */ -QWindowSurface::QWindowSurface(QWidget *window, bool setDefaultSurface) +QWindowSurface::QWindowSurface(QWindow *window, bool /*setDefaultSurface*/) : d_ptr(new QWindowSurfacePrivate(window)) { +#if 0 if (!QApplicationPrivate::runtime_graphics_system) { - if(setDefaultSurface && window) + if (setDefaultSurface && window) window->setWindowSurface(this); } +#endif } /*! @@ -128,8 +129,8 @@ QWindowSurface::QWindowSurface(QWidget *window, bool setDefaultSurface) */ QWindowSurface::~QWindowSurface() { - if (d_ptr->window) - d_ptr->window->d_func()->extra->topextra->windowSurface = 0; +// if (d_ptr->window) +// d_ptr->window->d_func()->extra->topextra->windowSurface = 0; delete d_ptr; } @@ -137,7 +138,7 @@ QWindowSurface::~QWindowSurface() Returns a pointer to the top-level window associated with this surface. */ -QWidget* QWindowSurface::window() const +QWindow* QWindowSurface::window() const { return d_ptr->window; } @@ -149,8 +150,6 @@ void QWindowSurface::beginPaint(const QRegion &) void QWindowSurface::endPaint(const QRegion &) { // QApplication::syncX(); - qDeleteAll(d_ptr->bufferImages); - d_ptr->bufferImages.clear(); } #if !defined(Q_WS_QPA) @@ -210,68 +209,36 @@ bool QWindowSurface::scroll(const QRegion &area, int dx, int dy) return false; } -/*! - Returns a QImage pointer which represents the actual buffer the \a widget - is drawn into or 0 if this is unavailable. - - You must call beginPaint() before you call this function and the returned - pointer is only valid until endPaint() is called. -*/ -QImage* QWindowSurface::buffer(const QWidget *widget) -{ - if (widget->window() != window()) - return 0; - - QPaintDevice *pdev = paintDevice(); - if (!pdev || pdev->devType() != QInternal::Image) - return 0; - - const QPoint off = offset(widget); - QImage *img = static_cast(pdev); - - QRect rect(off, widget->size()); - rect &= QRect(QPoint(), img->size()); - - if (rect.isEmpty()) - return 0; - - img = new QImage(img->scanLine(rect.y()) + rect.x() * img->depth() / 8, - rect.width(), rect.height(), - img->bytesPerLine(), img->format()); - d_ptr->bufferImages.append(img); - - return img; -} - /*! Returns a QPixmap generated from the part of the backing store - corresponding to \a widget. Returns a null QPixmap if an error + corresponding to \a window. Returns a null QPixmap if an error occurs. The contents of the pixmap are only defined for the regions - of \a widget that have received paint events since the last resize + of \a window that have received paint events since the last resize of the backing store. - If \a rectangle is a null rectangle (the default), the entire widget + If \a rectangle is a null rectangle (the default), the entire window is grabbed. Otherwise, the grabbed area is limited to \a rectangle. The default implementation uses QWindowSurface::buffer(). - \sa QPixmap::grabWidget() + \sa QPixmap::grabWindow() */ -QPixmap QWindowSurface::grabWidget(const QWidget *widget, const QRect &rectangle) const +QPixmap QWindowSurface::grabWindow(const QWindow *, const QRect &) const { QPixmap result; - if (widget->window() != window()) +#if 0 + if (window->window() != window()) return result; - const QImage *img = const_cast(this)->buffer(widget->window()); + const QImage *img = const_cast(this)->buffer(window->window()); if (!img || img->isNull()) return result; - QRect rect = rectangle.isEmpty() ? widget->rect() : (widget->rect() & rectangle); + QRect rect = rectangle.isEmpty() ? window->rect() : (window->rect() & rectangle); - rect.translate(offset(widget) - offset(widget->window())); + rect.translate(offset(window) - offset(window->window())); rect &= QRect(QPoint(), img->size()); if (rect.isEmpty()) @@ -283,27 +250,28 @@ QPixmap QWindowSurface::grabWidget(const QWidget *widget, const QRect &rectangle subimg.detach(); //### expensive -- maybe we should have a real SubImage that shares reference count result = QPixmap::fromImage(subimg); +#endif return result; } /*! - Returns the offset of \a widget in the coordinates of this + Returns the offset of \a window in the coordinates of this window surface. */ -QPoint QWindowSurface::offset(const QWidget *widget) const +QPoint QWindowSurface::offset(const QWindow *) const { - QWidget *window = d_ptr->window; - QPoint offset = widget->mapTo(window, QPoint()); -#ifdef Q_WS_QWS - offset += window->geometry().topLeft() - window->frameGeometry().topLeft(); + QPoint offset; +#if 0 + QWindow *window = d_ptr->window; + QPoint offset = window->mapTo(window, QPoint()); #endif return offset; } /*! - \fn QRect QWindowSurface::rect(const QWidget *widget) const + \fn QRect QWindowSurface::rect(const QWindow *window) const - Returns the rectangle for \a widget in the coordinates of this + Returns the rectangle for \a window in the coordinates of this window surface. */ -- cgit v1.2.3 From 3edff16c872fe7abe87007ba2ec78467f35430a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Mon, 2 May 2011 10:52:15 +0200 Subject: Properly handle the expose event for QWindow. --- src/gui/painting/qwindowsurface.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/gui/painting/qwindowsurface.cpp') diff --git a/src/gui/painting/qwindowsurface.cpp b/src/gui/painting/qwindowsurface.cpp index 97fb7a9972..eea3e60514 100644 --- a/src/gui/painting/qwindowsurface.cpp +++ b/src/gui/painting/qwindowsurface.cpp @@ -116,6 +116,8 @@ public: QWindowSurface::QWindowSurface(QWindow *window, bool /*setDefaultSurface*/) : d_ptr(new QWindowSurfacePrivate(window)) { + if (window) + window->d_func()->surface = this; #if 0 if (!QApplicationPrivate::runtime_graphics_system) { if (setDefaultSurface && window) -- cgit v1.2.3 From 2ce57e22d0c8d68a98463bf7ea6a97c6bd2b7742 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 3 May 2011 14:47:35 +0200 Subject: remove a unneeded reference to qbackingstore --- src/gui/painting/qwindowsurface.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/gui/painting/qwindowsurface.cpp') diff --git a/src/gui/painting/qwindowsurface.cpp b/src/gui/painting/qwindowsurface.cpp index eea3e60514..fe97d4a2f2 100644 --- a/src/gui/painting/qwindowsurface.cpp +++ b/src/gui/painting/qwindowsurface.cpp @@ -42,7 +42,6 @@ #include #include #include -#include #include QT_BEGIN_NAMESPACE -- cgit v1.2.3 From ac6878a2f1c988475aa626e82f2ed1adf671b99f Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 3 May 2011 20:30:20 +0200 Subject: rename qwindow_qpa to qwindow --- src/gui/painting/qwindowsurface.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/gui/painting/qwindowsurface.cpp') diff --git a/src/gui/painting/qwindowsurface.cpp b/src/gui/painting/qwindowsurface.cpp index fe97d4a2f2..c8659a1fac 100644 --- a/src/gui/painting/qwindowsurface.cpp +++ b/src/gui/painting/qwindowsurface.cpp @@ -40,8 +40,8 @@ ****************************************************************************/ #include -#include -#include +#include +#include #include QT_BEGIN_NAMESPACE -- cgit v1.2.3 From 91d2b267f166b1ff229746bfdc3643a824b3566b Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 3 May 2011 21:05:50 +0200 Subject: remove a few qapplication includes --- src/gui/painting/qwindowsurface.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/gui/painting/qwindowsurface.cpp') diff --git a/src/gui/painting/qwindowsurface.cpp b/src/gui/painting/qwindowsurface.cpp index c8659a1fac..f6167696ac 100644 --- a/src/gui/painting/qwindowsurface.cpp +++ b/src/gui/painting/qwindowsurface.cpp @@ -42,7 +42,6 @@ #include #include #include -#include QT_BEGIN_NAMESPACE -- cgit v1.2.3 From f169264b7b27c4ada295c1a250162c6bed6ca06b Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 3 May 2011 21:14:05 +0200 Subject: remove more QApplication dependencies --- src/gui/painting/qwindowsurface.cpp | 7 ------- 1 file changed, 7 deletions(-) (limited to 'src/gui/painting/qwindowsurface.cpp') diff --git a/src/gui/painting/qwindowsurface.cpp b/src/gui/painting/qwindowsurface.cpp index f6167696ac..13d152175d 100644 --- a/src/gui/painting/qwindowsurface.cpp +++ b/src/gui/painting/qwindowsurface.cpp @@ -116,12 +116,6 @@ QWindowSurface::QWindowSurface(QWindow *window, bool /*setDefaultSurface*/) { if (window) window->d_func()->surface = this; -#if 0 - if (!QApplicationPrivate::runtime_graphics_system) { - if (setDefaultSurface && window) - window->setWindowSurface(this); - } -#endif } /*! @@ -149,7 +143,6 @@ void QWindowSurface::beginPaint(const QRegion &) void QWindowSurface::endPaint(const QRegion &) { -// QApplication::syncX(); } #if !defined(Q_WS_QPA) -- cgit v1.2.3 From dcffd9c25ffb275a7ea9c594d9b4c7515db5eac3 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 23 May 2011 13:52:38 +0200 Subject: Compile fix for -qpa/Linux. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Samuel Rødal --- src/gui/painting/qwindowsurface.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/gui/painting/qwindowsurface.cpp') diff --git a/src/gui/painting/qwindowsurface.cpp b/src/gui/painting/qwindowsurface.cpp index 13d152175d..d51a2a21c4 100644 --- a/src/gui/painting/qwindowsurface.cpp +++ b/src/gui/painting/qwindowsurface.cpp @@ -41,6 +41,7 @@ #include #include +#include #include QT_BEGIN_NAMESPACE -- cgit v1.2.3 From 6ce6b8a378b0d97ba950240ffb048a4b7e485235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Mon, 20 Jun 2011 13:29:26 +0200 Subject: Rename QWindowSurface -> QBackingStore and split into platform / public. Also get rid of GL window surface and related classes. --- src/gui/painting/qwindowsurface.cpp | 345 ------------------------------------ 1 file changed, 345 deletions(-) delete mode 100644 src/gui/painting/qwindowsurface.cpp (limited to 'src/gui/painting/qwindowsurface.cpp') diff --git a/src/gui/painting/qwindowsurface.cpp b/src/gui/painting/qwindowsurface.cpp deleted file mode 100644 index 743621be7b..0000000000 --- a/src/gui/painting/qwindowsurface.cpp +++ /dev/null @@ -1,345 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include -#include - -QT_BEGIN_NAMESPACE - -class QWindowSurfacePrivate -{ -public: - QWindowSurfacePrivate(QWindow *w) - : window(w) - { - } - - QWindow *window; -#if !defined(Q_WS_QPA) - QRect geometry; -#else - QSize size; -#endif //Q_WS_QPA - QRegion staticContents; -}; - -/*! - \class QWindowSurface - \since 4.3 - \internal - \preliminary - \ingroup qws qpa - - \brief The QWindowSurface class provides the drawing area for top-level - windows. -*/ - - -/*! - \fn void QWindowSurface::beginPaint(const QRegion ®ion) - - This function is called before painting onto the surface begins, - with the \a region in which the painting will occur. - - \sa endPaint(), paintDevice() -*/ - -/*! - \fn void QWindowSurface::endPaint(const QRegion ®ion) - - This function is called after painting onto the surface has ended, - with the \a region in which the painting was performed. - - \sa beginPaint(), paintDevice() -*/ - -/*! - \fn void QWindowSurface::flush(QWindow *window, const QRegion ®ion, - const QPoint &offset) - - Flushes the given \a region from the specified \a window onto the - screen. - - Note that the \a offset parameter is currently unused. -*/ - -/*! - \fn QPaintDevice* QWindowSurface::paintDevice() - - Implement this function to return the appropriate paint device. -*/ - -/*! - Constructs an empty surface for the given top-level \a window. -*/ -QWindowSurface::QWindowSurface(QWindow *window, bool /*setDefaultSurface*/) - : d_ptr(new QWindowSurfacePrivate(window)) -{ - if (window) - window->d_func()->surface = this; -} - -/*! - Destroys this surface. -*/ -QWindowSurface::~QWindowSurface() -{ -// if (d_ptr->window) -// d_ptr->window->d_func()->extra->topextra->windowSurface = 0; - delete d_ptr; -} - -/*! - Returns a pointer to the top-level window associated with this - surface. -*/ -QWindow* QWindowSurface::window() const -{ - return d_ptr->window; -} - -void QWindowSurface::beginPaint(const QRegion &) -{ -} - -void QWindowSurface::endPaint(const QRegion &) -{ -} - -#if !defined(Q_WS_QPA) -/*! - Sets the currently allocated area to be the given \a rect. - - This function is called whenever area covered by the top-level - window changes. - - \sa geometry() -*/ -void QWindowSurface::setGeometry(const QRect &rect) -{ - d_ptr->geometry = rect; -} - -/*! - Returns the currently allocated area on the screen. -*/ -QRect QWindowSurface::geometry() const -{ - return d_ptr->geometry; -} -#else - -/*! - Sets the size of the windowsurface to be \a size. - - \sa size() -*/ -void QWindowSurface::resize(const QSize &size) -{ - d_ptr->size = size; -} - -/*! - Returns the current size of the windowsurface. -*/ -QSize QWindowSurface::size() const -{ - return d_ptr->size; -} -#endif //Q_WS_QPA - -/*! - Scrolls the given \a area \a dx pixels to the right and \a dy - downward; both \a dx and \a dy may be negative. - - Returns true if the area was scrolled successfully; false otherwise. -*/ -bool QWindowSurface::scroll(const QRegion &area, int dx, int dy) -{ - Q_UNUSED(area); - Q_UNUSED(dx); - Q_UNUSED(dy); - - return false; -} - -/*! - Returns a QPixmap generated from the part of the backing store - corresponding to \a window. Returns a null QPixmap if an error - occurs. The contents of the pixmap are only defined for the regions - of \a window that have received paint events since the last resize - of the backing store. - - If \a rectangle is a null rectangle (the default), the entire window - is grabbed. Otherwise, the grabbed area is limited to \a rectangle. - - The default implementation uses QWindowSurface::buffer(). - - \sa QPixmap::grabWindow() -*/ -QPixmap QWindowSurface::grabWindow(const QWindow *, const QRect &) const -{ - QPixmap result; - -#if 0 - if (window->window() != window()) - return result; - - const QImage *img = const_cast(this)->buffer(window->window()); - - if (!img || img->isNull()) - return result; - - QRect rect = rectangle.isEmpty() ? window->rect() : (window->rect() & rectangle); - - rect.translate(offset(window) - offset(window->window())); - rect &= QRect(QPoint(), img->size()); - - if (rect.isEmpty()) - return result; - - QImage subimg(img->scanLine(rect.y()) + rect.x() * img->depth() / 8, - rect.width(), rect.height(), - img->bytesPerLine(), img->format()); - subimg.detach(); //### expensive -- maybe we should have a real SubImage that shares reference count - - result = QPixmap::fromImage(subimg); -#endif - return result; -} - -/*! - Returns the offset of \a window in the coordinates of this - window surface. - */ -QPoint QWindowSurface::offset(const QWindow *) const -{ - QPoint offset; -#if 0 - QWindow *window = d_ptr->window; - QPoint offset = window->mapTo(window, QPoint()); -#endif - return offset; -} - -/*! - \fn QRect QWindowSurface::rect(const QWindow *window) const - - Returns the rectangle for \a window in the coordinates of this - window surface. -*/ - -void QWindowSurface::setStaticContents(const QRegion ®ion) -{ - d_ptr->staticContents = region; -} - -QRegion QWindowSurface::staticContents() const -{ - return d_ptr->staticContents; -} - -bool QWindowSurface::hasStaticContents() const -{ - return hasFeature(QWindowSurface::StaticContents) && !d_ptr->staticContents.isEmpty(); -} - -QWindowSurface::WindowSurfaceFeatures QWindowSurface::features() const -{ - return PartialUpdates | PreservedContents; -} - -#ifdef Q_WS_QPA -#define Q_EXPORT_SCROLLRECT Q_GUI_EXPORT -#else -#define Q_EXPORT_SCROLLRECT -#endif - -void Q_EXPORT_SCROLLRECT qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset) -{ - // make sure we don't detach - uchar *mem = const_cast(const_cast(img).bits()); - - int lineskip = img.bytesPerLine(); - int depth = img.depth() >> 3; - - const QRect imageRect(0, 0, img.width(), img.height()); - const QRect r = rect & imageRect & imageRect.translated(-offset); - const QPoint p = rect.topLeft() + offset; - - if (r.isEmpty()) - return; - - const uchar *src; - uchar *dest; - - if (r.top() < p.y()) { - src = mem + r.bottom() * lineskip + r.left() * depth; - dest = mem + (p.y() + r.height() - 1) * lineskip + p.x() * depth; - lineskip = -lineskip; - } else { - src = mem + r.top() * lineskip + r.left() * depth; - dest = mem + p.y() * lineskip + p.x() * depth; - } - - const int w = r.width(); - int h = r.height(); - const int bytes = w * depth; - - // overlapping segments? - if (offset.y() == 0 && qAbs(offset.x()) < w) { - do { - ::memmove(dest, src, bytes); - dest += lineskip; - src += lineskip; - } while (--h); - } else { - do { - ::memcpy(dest, src, bytes); - dest += lineskip; - src += lineskip; - } while (--h); - } -} - -QT_END_NAMESPACE -- cgit v1.2.3