文档详情

X 中的混成器与Composite 扩展.PDF

发布:2017-08-02约7.24千字共12页下载文档
文本预览下载声明
X中的混成器与 Composite扩展 ⽬录 原始的X的绘图模型 通过Composite扩展重定向 ⼝输出 输⼊事件的重定向,这可能做到么? Composite扩展的不⾜ 附录 :扩展阅读 在上篇⽂章 「桌⾯系统的混成器简史」中我介绍了 其它桌⾯系统中的混成器的发展史和⼯作原理,话题回 到我们的正题Linux系统上,来说说⽬前X中混成器是 如何⼯作的。这篇⽂章将⽐上⼀篇深⼊更多技术细节, 不想看太多细节的可以直接跳过看结论。 原始的X的绘图模型 ⾸先,没有混成器的时候X是这样画图的 : X的应⽤程序没有统⼀的绘图API。GTK+在3.0之 后统⼀⽤Cairo绘图,⽽Cairo则是基于PDF1.4的绘 图模型构建的,GTK的2.0和之前的版本中也有很⼤⼀ 部分的绘图是⽤Cairo进⾏,其余则通过xlib或者xcb 调⽤X核⼼协议提供的绘图原语绘图。QT的情况也是类 似,基本上⽤QPaint⼦系统绘制成位图然后交给X的显 ⽰服务器。显⽰服务器拿到这些绘制请求之后,再在屏 幕上的相应位置绘制整个屏幕。当然还有很多⽼旧的不 ⽤GTK或者QT的程序,他们则直接调⽤X核⼼协议提 供的绘图原语。 值得注意⼀点是X上除了没有统⼀的绘图模型,也 没有统⼀的⽮量图格式。X核⼼协议的绘图原语提供的 是像素单位的绘图操作,没有类似GDI+或者Quartz提 DeviceIndependence 供的 设备⽆关的 「点」的抽象。所以只⽤X的绘图原 语的话,我们可以把(1,1)这个像素点涂⿊,但是不能把 (0.5,0.5)这个点涂⿊,这⼀设计缺陷在UnixHaters Handbook中已经被吐槽过了。因为这个缺陷,所以直 接⽤X绘图原语绘制的图像不能像⽮量图那样进⾏⽆损 缩放。同样的缺陷导致X绘图原语绘制的字符不能做到 subpixel-level anti-aliasing ⼦像素级抗锯⻮ (这解释了默认配置下的xterm和 urxvt中的字体渲染为什么难看)。相⽐之下GDI有对 应的WMF⽮量图格式,Quartz有对应的PDF⽮量图格 式,⽽X中没有这样的格式对应。因为没有统⼀的⽮量 图格式,所以⽆论是Cairo、QPaint还是没有⽤这些绘 图库但是同样在意字体和曲线渲染效果的程序 (⽐如 Firefox和Chromium)都需要⾸先渲染到内部的 XPixMap位图格式,做好⼦像素渲染和⽮量缩放,然后 再把渲染好的位图转交给X图形服务器。 通过Composite扩展重定 向 ⼝输出 2004年发布的X11R6.8版本的Xorg引⼊了 Composite扩展。这个扩展背后的动机以及前因后果在 ⼀篇⽂章The(Re)ArchitectureoftheXWindow System中有详细的表述。Composite扩展允许某个X 程序做这⼏件事情 : 1. 通过 RedirectSubwindows 调⽤将⼀个 ⼝树 off-screenstorage 中的所有 ⼝渲染重定向到内部存储。重定向的 时候可以指定让X⾃动更新 ⼝的内容到屏幕上或 者由混成器⼿动更新。 2. 通过 NameWindowPixmap 取得某个 ⼝的内部 存储。 3. 通过GetOverlayWindow 获得⼀个特殊的⽤于 绘图的 ⼝,在这个 ⼝上绘制的图像将覆盖在 屏幕的最上⾯。 4. 通过 CreateRegionFromBorderClip 取得某个 ⼝的边界剪裁区域 (不⼀定是矩形)。 有了Composite扩展,⼀个X程序就可以调⽤这些 API实现混成器。这⾥有篇教学解释如何使⽤ Composite扩展。开启了混成的X是这样绘图的 : 整个X的混成器模型与MacOSX的混成
显示全部
相似文档