From c615935b00b07535d0974c201872d734085dff17 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Fri, 7 Jun 2019 21:33:01 +0000 Subject: [PATCH] Revert "QWindowSurface cleanup" This reverts commit ad066182f7a19689ccfcb88f49cc0925275f948d. --- src/gui/painting/qwindowsurface.cpp | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/gui/painting/qwindowsurface.cpp b/src/gui/painting/qwindowsurface.cpp index 059ec0cd7..e0043beb6 100644 --- a/src/gui/painting/qwindowsurface.cpp +++ b/src/gui/painting/qwindowsurface.cpp @@ -232,13 +232,15 @@ QImage* QWindowSurface::buffer(const QWidget *widget) */ QPixmap QWindowSurface::grabWidget(const QWidget *widget, const QRect &rectangle) const { + QPixmap result; + if (widget->window() != window()) - return QPixmap(); + return result; const QImage *img = const_cast(this)->buffer(widget->window()); if (!img || img->isNull()) - return QPixmap(); + return result; QRect rect = rectangle.isEmpty() ? widget->rect() : (widget->rect() & rectangle); @@ -246,12 +248,15 @@ QPixmap QWindowSurface::grabWidget(const QWidget *widget, const QRect &rectangle rect &= QRect(QPoint(), img->size()); if (rect.isEmpty()) - return QPixmap(); + return result; QImage subimg(img->scanLine(rect.y()) + rect.x() * img->depth() / 8, rect.width(), rect.height(), img->bytesPerLine(), img->format()); - return QPixmap::fromImage(subimg); + subimg.detach(); //### expensive -- maybe we should have a real SubImage that shares reference count + + result = QPixmap::fromImage(subimg); + return result; } /*! @@ -293,6 +298,11 @@ QWindowSurface::WindowSurfaceFeatures QWindowSurface::features() const void qt_scrollRectInImage(const QImage *img, const QRect &rect, const QPoint &offset) { + uchar *mem = 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; @@ -300,10 +310,6 @@ void qt_scrollRectInImage(const QImage *img, const QRect &rect, const QPoint &of if (r.isEmpty()) return; - uchar *mem = const_cast(img->bits()); - int lineskip = img->bytesPerLine(); - int depth = img->depth() >> 3; - const uchar *src; uchar *dest; @@ -322,18 +328,22 @@ void qt_scrollRectInImage(const QImage *img, const QRect &rect, const QPoint &of // overlapping segments? if (offset.y() == 0 && qAbs(offset.x()) < w) { - while (--h) { + do { ::memmove(dest, src, bytes); dest += lineskip; src += lineskip; - } + } while (--h); } else { - while (--h) { + do { ::memcpy(dest, src, bytes); dest += lineskip; src += lineskip; - } + } while (--h); } } QT_END_NAMESPACE + + + + -- 2.11.0