X 中的混成器与Composite 扩展.PDF
文本预览下载声明
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的混成
显示全部