QNativeImage::QNativeImage(int width, int height, QImage::Format format,bool /* isTextBuffer */, QWidget *widget) : xshmimg(0), xshmpm(0) { if (!X11->use_mitshm) { image = QImage(width, height, format); // follow good coding practice and set xshminfo attributes, though values not used in this case xshminfo.readOnly = true; xshminfo.shmaddr = 0; xshminfo.shmid = 0; xshminfo.shmseg = 0; return; } QX11Info info = widget->x11Info(); int dd = info.depth(); Visual *vis = (Visual*) info.visual(); xshmimg = XShmCreateImage(X11->display, vis, dd, ZPixmap, 0, &xshminfo, width, height); if (!xshmimg) { qWarning("QNativeImage: Unable to create shared XImage."); return; } bool ok; xshminfo.shmid = shmget(IPC_PRIVATE, xshmimg->bytes_per_line * xshmimg->height, IPC_CREAT | 0777); ok = xshminfo.shmid != -1; if (ok) { xshmimg->data = (char*)shmat(xshminfo.shmid, 0, 0); xshminfo.shmaddr = xshmimg->data; ok = (xshminfo.shmaddr != (char*)-1); if (ok) image = QImage((uchar *)xshmimg->data, width, height, systemFormat()); } xshminfo.readOnly = false; if (ok) ok = XShmAttach(X11->display, &xshminfo); if (!ok) { qWarning() << "QNativeImage: Unable to attach to shared memory segment."; if (xshmimg->data) { free(xshmimg->data); xshmimg->data = 0; } XDestroyImage(xshmimg); xshmimg = 0; if (xshminfo.shmaddr) shmdt(xshminfo.shmaddr); if (xshminfo.shmid != -1) shmctl(xshminfo.shmid, IPC_RMID, 0); return; } xshmpm = XShmCreatePixmap(X11->display, DefaultRootWindow(X11->display), xshmimg->data, &xshminfo, width, height, dd); if (!xshmpm) { qWarning() << "QNativeImage: Unable to create shared Pixmap."; } }
Ogre::NameValuePairList OgreWidget::getWinParams() { Ogre::NameValuePairList params; #if defined(Q_OS_MAC) || defined(Q_OS_WIN) params["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(this->winId())); #else #if QT_VERSION < 0x050000 const QX11Info info = this->x11Info(); Ogre::String winHandle; winHandle = Ogre::StringConverter::toString((unsigned long)(info.display())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned int)(info.screen())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned long)(this->winId())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned long)(info.visual())); params["externalWindowHandle"] = winHandle; #elif QT_VERSION >= 0x050100 && defined(Q_WS_X11) const QX11Info info = this->x11Info(); Ogre::String winHandle; winHandle = Ogre::StringConverter::toString((unsigned long)(info.display())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned int)(info.appScreen())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned long)(this->winId())); params["externalWindowHandle"] = winHandle; #else // only for the time between Qt 5.0 and Qt 5.1 when QX11Info was not included params["externalWindowHandle"] = Ogre::StringConverter::toString((unsigned long)(this->winId())); #endif #endif #if defined(Q_OS_MAC) params["macAPI"] = "cocoa"; params["macAPICocoaUseNSView"] = "true"; #endif return params; }
void CarioQImageMainWindow::on_create_image_by_xlib_button_clicked() { int height = ui->label->height(); int width = ui->label->width(); QPixmap *pixmap = new QPixmap(width, height); QPainter painter(pixmap); QPaintDevice *pd = painter.device(); if(pd->devType() == QInternal::Pixmap) { QPixmap *pixmap_inner = (QPixmap*) pd; Drawable d = (Drawable) pixmap_inner->handle(); QX11Info xinfo = pixmap_inner->x11Info(); int width = pixmap_inner->width(); int height = pixmap_inner->height(); cairo_surface_t * pCairoSurface = cairo_xlib_surface_create_with_xrender_format (xinfo.display(), d, ScreenOfDisplay(xinfo.display(), xinfo.screen()), XRenderFindVisualFormat (xinfo.display(), (Visual*) xinfo.visual()), width, height); cairo_t* pCairoContext = cairo_create(pCairoSurface); cairo_surface_destroy(pCairoSurface); if(pCairoContext) { cairo_set_source_rgb (pCairoContext, 0.627, 0, 0); cairo_set_font_size (pCairoContext, 24.0); cairo_move_to (pCairoContext, 10.0, 34.0); cairo_show_text (pCairoContext, "Hello, world\nUsing Image X11 Surface"); cairo_destroy(pCairoContext); } } ui->label->setPixmap(*pixmap); }