[[design_and_implementation_of_the_x_rendering_extension]] Modern X Tech. Chinese Translation Project

Route:

原文链接:link http://keithp.com/~keithp/talks/usenix2001/
翻译人员:gogoliu

X渲染扩展的设计与实现

Keith Packard
XFree86 Core Team, SuSE Inc.
keithp@keithp.com

概述

2000年Usenix技术会议中有一个演示文稿概述了X渲染环境的现状以及把X带入现代领域所需的能力。在过去的一年里,一个作为标准XFree86分发的一部分的新扩展被设计和实现。

X渲染扩展应付了很多核心X渲染体系的内在缺点,并且没有对协议解析增加显著的困难,也没有对服务器实现带来很大的负担。X渲染扩展从Plan9窗口系统中借用了基本图像混合思想,提供了精致且可扩展的字体渲染。由此现在XFree86在更有能力支持现存的应用软件的同时促进了用户界面上新的发展。某些方面最好的实现还没有很好确立,更多的工作还留待完成,这些领域包括精确的多边形光栅化和图像变换。

1 介绍

本文作者在2000年Usenix会议上面发表了一篇论文[Pac00a],该论文论述了核心X渲染体系的内在问题,并且给出了一些解决方案的提议。根本的问题是,渲染系统被设计成那样,后来认识到那样的设计会很快被废弃。仓促地发布最初的X11标准导致没有时间做研究,这些研究本来可以解决一些技术问题。或许最重大的问题就是那个年代的硬件不够快,不足以让窗口系统为交互应用程序提供更复杂的模型。

去年的论文中的一些提议--alpha混合,抗锯齿,子象素定位和不规则四边形--都在这个新的扩展中包含了。这个扩展的其他部分,最显著的--客户端字体管理,在设计这个扩展时被开发出来。

这个扩展的开发以一个完全开放的方式进行,贡献来自窗口系统各方面的团体。XFree86,KDE,Qt,Gdk,Gnome和OpenGL的人们对最后的体系结构作出了贡献。

这个规范的某些方面尚未完成,该扩展的实现还在进行之中,但是Render已经成为XFree86分发的一个重要部分,同时toolkit和应用程序开始使用它。它带来了一个很强的信息:XFree86已经准备好,并且有能力把X窗口系统的发展推向未来。

2 渲染模型

X渲染扩展(Render)[Pac00b]与核心X[SG92]渲染系统的不同在于它用RGB模型代替基于象素值(pixel-value)的模型。同时象素值对客户应用程序来说仍然是可见的,每一个象素值(存储于象素位图中)有一个关联的颜色值。这提供了一个天然的基于颜色的成像基础,同时当需要时依然让应用程序看到象素值。

由这个改变所产生的一个折衷是伪彩色值。最好的方法是动态分配最接近显示色彩的颜色。但是,伪彩色桌面的数目正在减少,所以改为使用静态彩色模型。这个改变在很大程度上减少了实现的负担,同时,依然允许应用程序运行在伪彩色硬件环境中。(事实上,当前XFree86的实现甚至没有对此进行简单的支持,并且至今也没有错误报告)

随同以颜色值来显示图像数据一起,Render还以Porter和Duff在1984年正式定义的图像混合操作[PD84]代替了核心协议中的光栅操作。该操作以一个天然的途径来处理颜色数据--引入透明度并且允许颜色数据如图像般渲染到另一个的上面进行混合。

Porter-Duff混合模型统一了通常的半透明概念(一个象素中包含透明值)和部分覆盖概念(象素的一部分为半透明,而剩下的部分非透明)。Render使用部分覆盖逼近抗锯齿(anti-aliasing);几何对象边缘的部分覆盖象素被渲染成看上去它们是半透明的。

Render中的全部运算都以初等的混合算符规定,服从一致的模型并且允许一个最小的实现。渲染模型被设计为与现代toolkit和应用程序一起良好地工作,它以一个尽量简单的方式提供必要的服务器端常驻操作来实现。

2.1 图像混合

从物理上讲,半透明物体吸收了某部分而不是全部通过它们的光。半透明物体所影响的颜色的波长被强烈吸收。从视觉上面讲,半透明物体影响你所看到的它们的颜色和亮度外的颜色和亮度。

不透明物体使视野部分变暗的效果与之是相似的。在有足够高的分辨率的情况下,靠近物体边缘的点的颜色取样看上去是上面物体和下面物体颜色的混合。Porter和Duff使用这个特性来把部分覆盖转变为半透明。

半透明物体上的光线效果可以通过混和半透明物体和它后面的物体的颜色来模仿。当处理计算机图像时,半透明可以描述为一堆图像的颜色数据上面的一个数学运算。Porter和Duff混合模型由公式组成,它使用颜色数据和半透明值"alpha"。根据那些公式,可以完成很多直觉的图像处理。

2.1.1 图像混合运算符

Porter和Duff的每一个运算符都独立地对每一个点的每一个通道进行操作。方程式被缩写为只在一个点的一个通道上面进行操作。

一个通用混合运算是把一个图像放于另一个之上。上面的图像的透明区域允许下面的图像完全显示。不透明区域隐藏了下面的图像,而半透明区域把两个图像混合起来。定义一个象素的"alpha"值为一个从0到1的数字来表示其不透明度,一个简单的方程式把两个象素的颜色组合起来:

C result = C under * ( 1 - a over ) + C over * a over

Porter和Duff称其为"over"运算符。

另一个通用的运算符是用一个图像掩盖另一个图像。掩盖中的透明区域所对应的图像区域将被去除,而掩盖的不透明区域

2.1.2 目的Alpha

2.1.3 自左乘Alpha

2.2 渲染混合原语

3 基础渲染对象

3.1 PictFormat

3.2 图片

3.3 混合需求

3.4 客户提供直接的数据

4 文字渲染

4.1 字形管理

4.2 字形绘制

4.3 网络传输分析

5 Xft库

5.1 字体名

6 Render仍然在开发中

7 多边形渲染

7.1 精确的和非精确的

7.2 非精确多边形

7.3 精确多边形

7.4 多边形需求

8 图像变换

9 历史和现状

10 结论

致谢

参考文献

design_and_implementation_of_the_x_rendering_extension, Rev. 4, Last changed on 2006-05-08 05:30, 933 page hits
Share/Save/Bookmark
Wiki hosted for free at wikihost.org || RSS-Feed