linux通过xrander添加分辨率,c – 使用X11,XDamage,XRender和其他技巧保留屏幕内容的QPixmap副本...

我试图解决我以为是一个非常简单的问题.我想保持一个QPixmap更新与整个屏幕内容.你可以通过这样做获得这样的像素图:

QDesktopWidget *w = QApplication::desktop();

if (w)

{

QRect r = w->screenGeometry();

QPixmap p = QPixmap::grabWindow(w->winId(), 0, 0, r.width(), r.height())

QByteArray bitmap;

}

这样做的问题是,QDesktopWidget最终会在每次请求时从X11服务器重新获取整个屏幕像素图,即使没有任何变化.

我需要这个代码才能快,所以我想自己做这个.我的起点是qx11mirror demo,但是,基本上做同样的事情.它使用XDamage扩展来解决某些事情发生变化,而不是使用损坏的矩形信息来更新缓存的pixmap的那部分,它只是设置一个“脏”标志,这将触发整个刷新.

所以我试图修改qx11mirror的例子,只是更新损坏的窗口部分,但我似乎无法做任何工作 – 我所得到的只是一个空白(黑色)像素图.我使用的代码是:

void QX11Mirror::x11Event(XEvent *event)

{

if (event->type == m_damageEvent + XDamageNotify)

{

XDamageNotifyEvent *e = reinterpret_cast(event);

XWindowAttributes attr;

XGetWindowAttributes(QX11Info::display(), m_window, &attr);

XRenderPictFormat *format = XRenderFindVisualFormat(QX11Info::display(), attr.visual);

bool hasAlpha = ( format->type == PictTypeDirect && format->direct.alphaMask );

int x = attr.x;

int y = attr.y;

int width = attr.width;

int height = attr.height;

// debug output so I can see the window pos vs the damaged area:

qDebug() << "repainting dirty area:" << x << y << width << height << "vs" << e->area.x << e->area.y << e->area.width << e->area.height;

XRenderPictureAttributes pa;

pa.subwindow_mode = IncludeInferiors; // Don't clip child widgets

Picture picture = XRenderCreatePicture(QX11Info::display(),

m_window,

format,

CPSubwindowMode,

&pa);

XserverRegion region = XFixesCreateRegionFromWindow(QX11Info::display(),

m_window, WindowRegionBounding);

XFixesTranslateRegion(QX11Info::display(), region, -x, -y);

XFixesSetPictureClipRegion(QX11Info::display(), picture, 0, 0, region);

XFixesDestroyRegion(QX11Info::display(), region);

//QPixmap dest(width, height);

XRenderComposite(QX11Info::display(), // display

hasAlpha ? PictOpOver : PictOpSrc, // operation mode

picture, // src drawable

None, // src mask

dest.x11PictureHandle(), // dest drawable

e->area.x, // src X

e->area.y, // src Y

0, // mask X

0, // mask Y

e->area.x, // dest X

e->area.y, // dest Y

e->area.width, // width

e->area.height); // height

m_px = dest;

XDamageSubtract(QX11Info::display(), e->damage, None, None);

emit windowChanged();

}

else if (event->type == ConfigureNotify)

{

XConfigureEvent *e = &event->xconfigure;

m_position = QRect(e->x, e->y, e->width, e->height);

emit positionChanged(m_position);

}

}

任何人都可以指向正确的方向吗? XRender,XDamage和其他X11扩展的文档是非常糟糕的.

在XCopyArea上使用XRender的原因

以下文字摘自here.

如果要使用核心协议,则可以创建一个窗口的GC,并使用XCopyArea()来复制窗口的内容,但由于Composite扩展公开了新的视觉效果(例如Alpha通道),因此没有保证source drawable的格式与目标的格式一致.使用核心协议,情况将导致匹配错误,这将不会发生在Xrender扩展.

另外核心协议还没有了解Alpha通道,这意味着它不能复合使用新的ARGB视觉的窗口.当源和目的地具有相同的格式时,与X11R6.8一样使用核心协议也没有性能优势.该版本也是第一个支持新的Composite扩展.

因此,总而言之,没有缺点,只有在这些操作的核心协议上选择Xrender才有优势.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf.tar.xz交叉编译qt4.8.7的流程: 1. 下载并解压gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf.tar.xz和qt-everywhere-opensource-src-4.8.7.tar.gz 2. 配置环境变量,将交叉编译工具链的路径添加到PATH中: ``` export PATH=/path/to/gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf/bin:$PATH ``` 3. 进入qt-everywhere-opensource-src-4.8.7目录,运行./configure命令,配置Qt的编译选项: ``` ./configure -embedded arm -xplatform qws/linux-arm-gnueabi-g++ -prefix /usr/local/qt4.8.7-arm -no-gfx-linuxfb -no-gfx-multiscreen -no-gfx-transformed -depths all -no-qt3support -no-scripttools -no-openssl -no-nis -no-cups -no-iconv -no-pch -no-dbus -no-phonon -no-opengl -no-javascript-jit -no-webkit -no-qml-debug -no-separate-debug-info -no-exceptions -no-accessibility -no-script -no-stl -no-xmlpatterns -no-multimedia -no-audio-backend -no-phonon-backend -no-webkit-qml-plugin -no-declarative -no-declarative-debug -no-gif -no-libtiff -no-mng -no-openssl -no-glib -no-pulseaudio -no-gstreamer -no-alsa -no-sm -no-xinerama -no-xkb -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-xshape -no-xinput -no-xkbcommon -no-xcb -no-xlib -no-kms -no-linuxfb -no-directfb -no-gfx-qvfb -no-largefile -no-nas-sound -no-webkitwidgets -no-javascriptcore -no-script -no-scripttools -no-xmlpatterns -no-svg -no-webkit -no-qml-debug -no-separate-debug-info -no-icu -no-openssl -no-sql-sqlite -no-sql-mysql -no-sql-odbc -no-sql-psql -no-sql-tds -no-tls ``` 参数说明: -embedded arm:选择Qt的嵌入式编译模式。 -xplatform qws/linux-arm-gnueabi-g++:指定交叉编译器和Qt平台的路径。 -prefix /usr/local/qt4.8.7-arm:指定Qt的安装路径。 其他参数是为了禁用不需要的模块和功能。 4. 运行make命令进行编译: ``` make ``` 5. 编译完成后,运行make install命令进行安装: ``` make install ``` 6. 将交叉编译后的Qt库拷贝到目标设备上,将头文件和库文件添加到交叉编译环境的搜索路径中。 7. 在交叉编译环境中使用qmake编译Qt应用程序: ``` /path/to/qt4.8.7-arm/bin/qmake make ``` 以上就是使用gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf.tar.xz交叉编译qt4.8.7的流程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值