OSDN Git Service

Revert "QWindowSurface cleanup"
authorIvailo Monev <xakepa10@laimg.moc>
Fri, 7 Jun 2019 21:33:01 +0000 (21:33 +0000)
committerIvailo Monev <xakepa10@laimg.moc>
Fri, 7 Jun 2019 21:33:01 +0000 (21:33 +0000)
This reverts commit ad066182f7a19689ccfcb88f49cc0925275f948d.

src/gui/painting/qwindowsurface.cpp

index 059ec0c..e0043be 100644 (file)
@@ -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<QWindowSurface *>(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<uchar*>(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<uchar*>(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
+
+
+
+