📄 qwindowsurface_qws.cpp
字号:
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(); } if (img.size() != size) { QImage::Format imageFormat = preferredImageFormat(win); const int bytesPerPixel = imageFormat == QImage::Format_RGB16 ? 2 : 4; const int bpl = (size.width() * bytesPerPixel + 3) & ~3; memsize = bpl * size.height(); delete[] mem; if (memsize == 0) { mem = 0; img = QImage(); } else { mem = new uchar[memsize]; img = QImage(mem, size.width(), size.height(), imageFormat); setImageMetrics(img, win); } } QWSWindowSurface::setGeometry(rect);}QByteArray QWSLocalMemSurface::permanentState() const{ QByteArray array; array.resize(sizeof(uchar*) + 3 * sizeof(int) + sizeof(SurfaceFlags)); char *ptr = array.data(); *reinterpret_cast<uchar**>(ptr) = mem; ptr += sizeof(uchar*); reinterpret_cast<int*>(ptr)[0] = img.width(); reinterpret_cast<int*>(ptr)[1] = img.height(); ptr += 2 * sizeof(int); *reinterpret_cast<int *>(ptr) = img.format(); ptr += sizeof(int); *reinterpret_cast<SurfaceFlags*>(ptr) = surfaceFlags(); return array;}void QWSLocalMemSurface::setPermanentState(const QByteArray &data){ int width; int height; QImage::Format format; SurfaceFlags flags; const char *ptr = data.constData(); mem = *reinterpret_cast<uchar* const*>(ptr); ptr += sizeof(uchar*); width = reinterpret_cast<const int*>(ptr)[0]; height = reinterpret_cast<const int*>(ptr)[1]; ptr += 2 * sizeof(int); format = QImage::Format(*reinterpret_cast<const int*>(ptr)); ptr += sizeof(int); flags = *reinterpret_cast<const SurfaceFlags*>(ptr); QWSMemorySurface::img = QImage(mem, width, height, format); setSurfaceFlags(flags);}#ifndef QT_NO_QWS_MULTIPROCESSQWSSharedMemSurface::QWSSharedMemSurface() : QWSMemorySurface(){}QWSSharedMemSurface::QWSSharedMemSurface(QWidget *widget) : QWSMemorySurface(widget){}QWSSharedMemSurface::~QWSSharedMemSurface(){ // mem.detach() is done automatically by ~QSharedMemory}bool QWSSharedMemSurface::setMemory(int memId){ if (mem.id() == memId) return true; mem.detach(); if (!mem.attach(memId)) { perror("QWSSharedMemSurface: attaching to shared memory"); qCritical("QWSSharedMemSurface: Error attaching to" " shared memory 0x%x", memId); return false; } return true;}void QWSSharedMemSurface::setPermanentState(const QByteArray &data){ int memId; int width; int height; int lockId; QImage::Format format; SurfaceFlags flags; const char *ptr = data.constData(); memId = reinterpret_cast<const int*>(ptr)[0]; width = reinterpret_cast<const int*>(ptr)[1]; height = reinterpret_cast<const int*>(ptr)[2]; lockId = reinterpret_cast<const int*>(ptr)[3]; ptr += 4 * sizeof(int); format = *reinterpret_cast<const QImage::Format*>(ptr); ptr += sizeof(QImage::Format); flags = *reinterpret_cast<const SurfaceFlags*>(ptr); setSurfaceFlags(flags); setMemory(memId); setLock(lockId); uchar *base = static_cast<uchar*>(mem.address()); QWSMemorySurface::img = QImage(base, width, height, format);}void QWSSharedMemSurface::setGeometry(const QRect &rect){ const QSize size = rect.size(); if (img.size() != size) { QWidget *win = window(); QImage::Format imageFormat = preferredImageFormat(win); const int bytesPerPixel = imageFormat == QImage::Format_RGB16 ? 2 : 4; const int bpl = (size.width() * bytesPerPixel + 3) & ~3; const int imagesize = bpl * size.height(); if (imagesize == 0) { mem.detach(); img = QImage(); } else { mem.detach(); if (!mem.create(imagesize)) { perror("QWSSharedMemSurface::setGeometry allocating shared memory"); qFatal("Error creating shared memory of size %d", imagesize); } uchar *base = static_cast<uchar*>(mem.address()); img = QImage(base, size.width(), size.height(), imageFormat); setImageMetrics(img, win); } } QWSWindowSurface::setGeometry(rect);}QByteArray QWSSharedMemSurface::permanentState() const{ QByteArray array; array.resize(4 * sizeof(int) + sizeof(QImage::Format) + sizeof(SurfaceFlags)); char *ptr = array.data(); reinterpret_cast<int*>(ptr)[0] = mem.id(); reinterpret_cast<int*>(ptr)[1] = img.width(); reinterpret_cast<int*>(ptr)[2] = img.height(); reinterpret_cast<int*>(ptr)[3] = (memlock ? memlock->id() : -1); ptr += 4 * sizeof(int); *reinterpret_cast<QImage::Format*>(ptr) = img.format(); ptr += sizeof(QImage::Format); *reinterpret_cast<SurfaceFlags*>(ptr) = surfaceFlags(); return array;}#endif // QT_NO_QWS_MULTIPROCESS#ifndef QT_NO_PAINTONSCREENQWSOnScreenSurface::QWSOnScreenSurface(QWidget *w) : QWSMemorySurface(w){ attachToScreen(getScreen(w)); setSurfaceFlags(Opaque);}QWSOnScreenSurface::QWSOnScreenSurface() : QWSMemorySurface(){ setSurfaceFlags(Opaque);}void QWSOnScreenSurface::attachToScreen(const QScreen *s){ screen = s; uchar *base = screen->base(); QImage::Format format = screen->pixelFormat(); if (format == QImage::Format_Invalid || format == QImage::Format_Indexed8) { //### currently we have no paint engine for indexed image formats qFatal("QWSOnScreenSurface::attachToScreen(): screen depth %d " "not implemented", screen->depth()); return; } QWSMemorySurface::img = QImage(base, screen->width(), screen->height(), screen->linestep(), format );}QWSOnScreenSurface::~QWSOnScreenSurface(){}QPoint QWSOnScreenSurface::painterOffset() const{ return geometry().topLeft() + QWSWindowSurface::painterOffset();}bool QWSOnScreenSurface::isValid() const{ const QWidget *win = window(); if (screen != getScreen(win)) return false; if (img.isNull()) return false; return QScreen::isWidgetPaintOnScreen(win);}QByteArray QWSOnScreenSurface::permanentState() const{ QByteArray array; array.resize(sizeof(int)); int *ptr = reinterpret_cast<int*>(array.data()); ptr[0] = QApplication::desktop()->screenNumber(window()); return array;}void QWSOnScreenSurface::setPermanentState(const QByteArray &data){ const int *ptr = reinterpret_cast<const int*>(data.constData()); const int screenNo = ptr[0]; QScreen *screen = qt_screen; if (screenNo > 0) screen = qt_screen->subScreens().at(screenNo); attachToScreen(screen);}#endif // QT_NO_PAINTONSCREEN#ifndef QT_NO_PAINT_DEBUGQWSYellowSurface::QWSYellowSurface(bool isClient) : QWSWindowSurface(), delay(10){ if (isClient) { setWinId(QWidget::qwsDisplay()->takeId()); QWidget::qwsDisplay()->nameRegion(winId(), QLatin1String("Debug flush paint"), QLatin1String("Silly yellow thing")); QWidget::qwsDisplay()->setAltitude(winId(), 1, true); } setSurfaceFlags(Buffered);}QWSYellowSurface::~QWSYellowSurface(){}QByteArray QWSYellowSurface::permanentState() const{ QByteArray array; array.resize(2 * sizeof(int)); int *ptr = reinterpret_cast<int*>(array.data()); ptr[0] = surfaceSize.width(); ptr[1] = surfaceSize.height(); return array;}void QWSYellowSurface::setPermanentState(const QByteArray &data){ const int *ptr = reinterpret_cast<const int*>(data.constData()); const int width = ptr[0]; const int height = ptr[1]; img = QImage(width, height, QImage::Format_ARGB32); img.fill(qRgba(255,255,31,127));}void QWSYellowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset){ Q_UNUSED(offset); QWSDisplay *display = QWidget::qwsDisplay(); QRegion rgn = region; if (widget) rgn.translate(widget->mapToGlobal(QPoint(0, 0))); surfaceSize = region.boundingRect().size(); const int id = winId(); display->requestRegion(id, key(), permanentState(), rgn); display->setAltitude(id, 1, true); display->repaintRegion(id, 0, false, rgn); ::usleep(500 * delay); display->requestRegion(id, key(), permanentState(), QRegion()); ::usleep(500 * delay);}#endif // QT_NO_PAINT_DEBUG#ifndef QT_NO_DIRECTPAINTERstatic inline QScreen *getPrimaryScreen(){ QScreen *screen = QScreen::instance(); if (!screen->base()) { QList<QScreen*> subScreens = screen->subScreens(); if (subScreens.size() < 1) return 0; screen = subScreens.at(0); } return screen;}QWSDirectPainterSurface::QWSDirectPainterSurface(bool isClient, QDirectPainter::SurfaceFlag flags) : QWSWindowSurface(), flushingRegionEvents(false){ setSurfaceFlags(Opaque); synchronous = (flags == QDirectPainter::ReservedSynchronous); if (isClient) { setWinId(QWidget::qwsDisplay()->takeId()); QWidget::qwsDisplay()->nameRegion(winId(), QLatin1String("QDirectPainter reserved space"), QLatin1String("reserved")); } else { setWinId(0); } _screen = QScreen::instance(); if (!_screen->base()) { QList<QScreen*> subScreens = _screen->subScreens(); if (subScreens.size() < 1) _screen = 0; else _screen = subScreens.at(0); }}QWSDirectPainterSurface::~QWSDirectPainterSurface(){ if (winId() && QWSDisplay::instance()) // make sure not in QApplication destructor QWidget::qwsDisplay()->destroyRegion(winId());}void QWSDirectPainterSurface::setRegion(const QRegion ®ion){ QRegion reg = region; if (_screen->isTransformed()) { const QSize devSize(_screen->deviceWidth(), _screen->deviceHeight()); reg = _screen->mapFromDevice(region, devSize); } const int id = winId(); QWidget::qwsDisplay()->requestRegion(id, key(), permanentState(), reg);#ifndef QT_NO_QWS_MULTIPROCESS if (synchronous) QWSDisplay::instance()->d->waitForRegionAck(id);#endif}void QWSDirectPainterSurface::flush(QWidget *, const QRegion &r, const QPoint &){ QWSDisplay::instance()->repaintRegion(winId(), 0, true, r);}QByteArray QWSDirectPainterSurface::permanentState() const{ QByteArray res; if (isRegionReserved()) res.append( 'r'); return res;}void QWSDirectPainterSurface::setPermanentState(const QByteArray &ba){ if (ba.size() > 0 && ba.at(0) == 'r') setReserved(); setSurfaceFlags(surfaceFlags() | Opaque);}void QWSDirectPainterSurface::beginPaint(const QRegion ®ion){ QWSWindowSurface::beginPaint(region);#ifndef QT_NO_QWS_MULTIPROCESS if (!synchronous) { flushingRegionEvents = true; QWSDisplay::instance()->d->waitForRegionEvents(winId()); flushingRegionEvents = false; }#endif}bool QWSDirectPainterSurface::lock(int timeout){ Q_UNUSED(timeout); if (QApplication::type() == QApplication::GuiClient) QWSDisplay::grab(true); return true;}void QWSDirectPainterSurface::unlock(){ if (QApplication::type() == QApplication::GuiClient) QWSDisplay::ungrab();}#endif // QT_NO_DIRECTPAINTER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -