QByteArray QWSHtml5CanvasSurface::permanentState() const { #ifdef QT_DEBUG_SURFACE qDebug() << "QWSHtml5CanvasSurface::permanentState()"<< "(" << (void*)this << ")"; #endif Q_ASSERT(!m_isServerSide); QByteArray array(sizeof(CanvasHandle) + 3 * sizeof(int) + sizeof(SurfaceFlags), Qt::Uninitialized); char *ptr = array.data(); CanvasHandle backingCanvasHandle = static_cast<QHtml5CanvasPixmapData*>(pixmap.data_ptr().data())->canvasHandle(); reinterpret_cast<CanvasHandle*>(ptr)[0] = backingCanvasHandle; ptr += sizeof(CanvasHandle); 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 QDirectFBWindowSurface::createWindow(const QRect &rect) { IDirectFBDisplayLayer *layer = screen->dfbDisplayLayer(); if (!layer) qFatal("QDirectFBWindowSurface: Unable to get primary display layer!"); updateIsOpaque(); DFBWindowDescription description; memset(&description, 0, sizeof(DFBWindowDescription)); description.flags = DWDESC_CAPS|DWDESC_HEIGHT|DWDESC_WIDTH|DWDESC_POSX|DWDESC_POSY|DWDESC_SURFACE_CAPS|DWDESC_PIXELFORMAT; description.caps = DWCAPS_NODECORATION; description.surface_caps = DSCAPS_NONE; imageFormat = screen->pixelFormat(); if (!(surfaceFlags() & Opaque)) { imageFormat = screen->alphaPixmapFormat(); description.caps |= DWCAPS_ALPHACHANNEL; #if (Q_DIRECTFB_VERSION >= 0x010200) description.flags |= DWDESC_OPTIONS; description.options |= DWOP_ALPHACHANNEL; #endif } description.pixelformat = QDirectFBScreen::getSurfacePixelFormat(imageFormat); description.posx = rect.x(); description.posy = rect.y(); description.width = rect.width(); description.height = rect.height(); if (QDirectFBScreen::isPremultiplied(imageFormat)) description.surface_caps = DSCAPS_PREMULTIPLIED; if (screen->directFBFlags() & QDirectFBScreen::VideoOnly) description.surface_caps |= DSCAPS_VIDEOONLY; DFBResult result = layer->CreateWindow(layer, &description, &dfbWindow); if (result != DFB_OK) DirectFBErrorFatal("QDirectFBWindowSurface::createWindow", result); if (window()) { if (window()->windowFlags() & Qt::WindowStaysOnTopHint) { dfbWindow->SetStackingClass(dfbWindow, DWSC_UPPER); } DFBWindowID winid; result = dfbWindow->GetID(dfbWindow, &winid); if (result != DFB_OK) { DirectFBError("QDirectFBWindowSurface::createWindow. Can't get ID", result); } else { window()->setProperty("_q_DirectFBWindowID", winid); } } Q_ASSERT(!dfbSurface); dfbWindow->GetSurface(dfbWindow, &dfbSurface); }
void QDirectFBWindowSurface::setOpaque(bool opaque) { SurfaceFlags flags = surfaceFlags(); if (opaque != (flags & Opaque)) { if (opaque) { flags |= Opaque; } else { flags &= ~Opaque; } setSurfaceFlags(flags); } }
QByteArray QDirectFBWindowSurface::permanentState() const { QByteArray state(sizeof(SurfaceFlags) + sizeof(DFBWindowID), 0); char *ptr = state.data(); SurfaceFlags flags = surfaceFlags(); memcpy(ptr, &flags, sizeof(SurfaceFlags)); ptr += sizeof(SurfaceFlags); DFBWindowID did = (DFBWindowID)(-1); if (dfbWindow) dfbWindow->GetID(dfbWindow, &did); memcpy(ptr, &did, sizeof(DFBWindowID)); return state; }
QByteArray QWSSharedMemSurface::permanentState() const { QByteArray array(6 * sizeof(int), Qt::Uninitialized); int *ptr = reinterpret_cast<int*>(array.data()); ptr[0] = mem.id(); ptr[1] = img.width(); ptr[2] = img.height(); ptr[3] = (memlock ? memlock->id() : -1); ptr[4] = int(img.format()); ptr[5] = int(surfaceFlags()); return array; }
QByteArray QWSLocalMemSurface::permanentState() const { QByteArray array(sizeof(uchar*) + 3 * sizeof(int) + sizeof(SurfaceFlags), Qt::Uninitialized); 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; }
QByteArray HybridSurface::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; }
void QDirectFBWindowSurface::setGeometry(const QRect &rect) { const QRect oldRect = geometry(); if (oldRect == rect) return; IDirectFBSurface *oldSurface = dfbSurface; const bool sizeChanged = oldRect.size() != rect.size(); if (sizeChanged) { delete engine; engine = 0; releaseSurface(); Q_ASSERT(!dfbSurface); } if (rect.isNull()) { #ifndef QT_NO_DIRECTFB_WM if (dfbWindow) { if (window()) window()->setProperty("_q_DirectFBWindowID", QVariant()); dfbWindow->Release(dfbWindow); dfbWindow = 0; } #endif Q_ASSERT(!dfbSurface); #ifdef QT_DIRECTFB_SUBSURFACE Q_ASSERT(!subSurface); #endif } else { #ifdef QT_DIRECTFB_WM if (!dfbWindow) { createWindow(rect); } else { setWindowGeometry(dfbWindow, oldRect, rect); Q_ASSERT(!sizeChanged || !dfbSurface); if (sizeChanged) dfbWindow->GetSurface(dfbWindow, &dfbSurface); } #else IDirectFBSurface *primarySurface = screen->primarySurface(); DFBResult result = DFB_OK; if (mode == Primary) { Q_ASSERT(primarySurface); if (rect == screen->region().boundingRect()) { dfbSurface = primarySurface; } else { const DFBRectangle r = { rect.x(), rect.y(), rect.width(), rect.height() }; result = primarySurface->GetSubSurface(primarySurface, &r, &dfbSurface); } } else { // mode == Offscreen if (!dfbSurface) { dfbSurface = screen->createDFBSurface(rect.size(), surfaceFlags() & Opaque ? screen->pixelFormat() : screen->alphaPixmapFormat(), QDirectFBScreen::DontTrackSurface); } } if (result != DFB_OK) DirectFBErrorFatal("QDirectFBWindowSurface::setGeometry()", result); #endif } if (oldSurface != dfbSurface) { imageFormat = dfbSurface ? QDirectFBScreen::getImageFormat(dfbSurface) : QImage::Format_Invalid; } if (oldRect.size() != rect.size()) { QWSWindowSurface::setGeometry(rect); } else { QWindowSurface::setGeometry(rect); } }
void QWSDirectPainterSurface::setPermanentState(const QByteArray &ba) { if (ba.size() > 0 && ba.at(0) == 'r') setReserved(); setSurfaceFlags(surfaceFlags() | Opaque); }