void QWSSharedMemSurface::setGeometry(const QRect &rect) { const QSize size = rect.size(); if (img.size() != size) { if (size.isEmpty()) { mem.detach(); img = QImage(); } else { mem.detach(); QWidget *win = window(); const QImage::Format format = preferredImageFormat(win); const int bpl = nextMulOf4(bytesPerPixel(format) * size.width()); #ifdef QT_QWS_CLIENTBLIT const int imagesize = bpl * size.height() + sizeof(uint); #else const int imagesize = bpl * size.height(); #endif if (!mem.create(imagesize)) { perror("QWSSharedMemSurface::setGeometry allocating shared memory"); qFatal("Error creating shared memory of size %d", imagesize); } #ifdef QT_QWS_CLIENTBLIT *((uint *)mem.address()) = 0; uchar *base = static_cast<uchar*>(mem.address()) + sizeof(uint); #else uchar *base = static_cast<uchar*>(mem.address()); #endif img = QImage(base, size.width(), size.height(), bpl, format); setImageMetrics(img, win); } } QWSWindowSurface::setGeometry(rect); }
void QWSLocalMemSurface::setGeometry(const QRect &rect) { QSize size = rect.size(); QWidget *win = window(); if (win && !win->mask().isEmpty()) { const QRegion region = win->mask() & rect.translated(-win->geometry().topLeft()); size = region.boundingRect().size(); } uchar *deleteLater = 0; if (img.size() != size) { if (size.isEmpty()) { if (memsize) { // In case of a Hide event we need to delete the memory after sending the // event to the server in order to let the server animate the event. deleteLater = mem; memsize = 0; } mem = 0; img = QImage(); } else { const QImage::Format format = preferredImageFormat(win); const int bpl = nextMulOf4(bytesPerPixel(format) * size.width()); const int imagesize = bpl * size.height(); if (memsize < imagesize) { delete[] mem; memsize = imagesize; mem = new uchar[memsize]; } img = QImage(mem, size.width(), size.height(), bpl, format); setImageMetrics(img, win); } } QWSWindowSurface::setGeometry(rect); delete[] deleteLater; }