42 if (m_pixmap.isNull())
45 QSize pixmapSize = m_pixmap.size();
47 QRegion clipped = region;
48 clipped &= QRect(QPoint(), QHighDpi::toNativePixels(window->size(), window));
49 clipped &= QRect(0, 0, pixmapSize.width(), pixmapSize.height()).translated(-offset);
51 QRect br = clipped.boundingRect();
55 QXcbWindow *platformWindow =
static_cast<QXcbWindow *>(window->handle());
56 if (!platformWindow) {
57 qWarning(
"QXcbBackingStore::flush: QWindow has no platform window (QTBUG-32681)");
61 Window wid = platformWindow->xcb_window();
62 Pixmap pid = qt_x11PixmapHandle(m_pixmap);
64 QList<XRectangle> clipRects = qt_region_to_xrectangles(clipped);
67 if (m_translucentBackground)
69 XWindowAttributes attrib;
70 XGetWindowAttributes(display(), wid, &attrib);
71 XRenderPictFormat *format = XRenderFindVisualFormat(display(), attrib.visual);
73 Picture srcPic = qt_x11PictureHandle(m_pixmap);
74 Picture dstPic = XRenderCreatePicture(display(), wid, format, 0, 0);
76 XRenderSetPictureClipRectangles(display(), dstPic, 0, 0, clipRects.constData(), clipRects.size());
78 XRenderComposite(display(), PictOpSrc, srcPic, 0L , dstPic, br.x() + offset.x(),
79 br.y() + offset.y(), 0, 0, br.x(), br.y(), br.width(), br.height());
81 XRenderFreePicture(display(), dstPic);
86 GC gc = XCreateGC(display(), wid, 0,
nullptr);
88 if (clipRects.size() != 1)
89 XSetClipRectangles(display(), gc, 0, 0, clipRects.data(), clipRects.size(), YXBanded);
91 XCopyArea(display(), pid, wid, gc, br.x() + offset.x(), br.y() + offset.y(), br.width(), br.height(), br.x(), br.y());
92 XFreeGC(display(), gc);
96 if (platformWindow->needsSync()) {
97 platformWindow->updateSyncRequestCounter();
110 if (size == m_pixmap.size())
113 QPixmap newPixmap(size);
115#if QT_CONFIG(xrender)
116 if (m_translucentBackground && newPixmap.depth() != 32)
117 qt_x11Pixmap(newPixmap)->convertToARGB32();
120 if (!m_pixmap.isNull()) {
121 Pixmap from = qt_x11PixmapHandle(m_pixmap);
122 Pixmap to = qt_x11PixmapHandle(newPixmap);
123 QRect br = staticContents.boundingRect().intersected(QRect(QPoint(0, 0), size));
126 GC gc = XCreateGC(display(), to, 0,
nullptr);
127 XCopyArea(display(), from, to, gc, br.x(), br.y(), br.width(), br.height(), br.x(), br.y());
128 XFreeGC(display(), gc);
132 m_pixmap = newPixmap;
137 if (m_pixmap.isNull())
140 QRect rect = area.boundingRect();
141 Pixmap pix = qt_x11PixmapHandle(m_pixmap);
143 GC gc = XCreateGC(display(), pix, 0,
nullptr);
144 XCopyArea(display(), pix, pix, gc,
145 rect.x(), rect.y(), rect.width(), rect.height(),
146 rect.x()+dx, rect.y()+dy);
147 XFreeGC(display(), gc);
157#if QT_CONFIG(xrender)
158 if (m_translucentBackground) {
159 const QList<XRectangle> xrects = qt_region_to_xrectangles(region);
160 const XRenderColor color = { 0, 0, 0, 0 };
161 XRenderFillRectangles(display(), PictOpSrc,
162 qt_x11PictureHandle(m_pixmap), &color,
163 xrects.constData(), xrects.size());