⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qwindowsurface_qws.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
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 &region,                             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 &region){    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 &region){    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 + -