MS RFC 32:支持反粒度几何(agg)渲染引擎¶
- 日期
2007/07/09
- 作者
史蒂夫·莱姆,约翰·诺瓦克
- 联系方式
明尼苏达州第纳尔的史蒂夫·莱姆
- 状态
悬而未决的
概述¶
目前,mapserver支持gd(www.libgd.org)作为其主要的栅格渲染后端。虽然GD在许多情况下是足够的,但它不能提供高质量的输出,特别是在消除混叠的行工作方面。MapServer确实支持使用可变不透明度“模糊”缓冲区的伪消除混叠宽行,但结果不如它们可能的好。
AGG已经成为主要的软件渲染解决方案之一,它拥有卓越的输出质量和很少或没有明显的性能损失的承诺。事实上,在某些情况下,即使具有更高的质量输出,agg也可能比gd快。
也就是说,我们在很多方面仍然大量地归属于GD。文本定位和栅格渲染特别是直接使用gd函数。另一方面,agg没有内置的函数来读取或写入流行的图形格式,如gif、jpeg或png。然后考虑一个混合解决方案是有意义的,其中我们可以利用gd的一些方面,比如缓冲区管理和I/O功能,让agg担心呈现特性。这正是所提议的——将agg呈现到gd管理的图像缓冲区中。第二个好处是,随着时间和资源的允许,可以增加agg功能。例如,由于一个agg imageobj实际上只是一个gdmimageptr,所以我们可以使用当前代码,该代码沿着任何agg例程呈现给一个gd映像。
注解
见 AGG 渲染细节 更多信息。
技术解决方案¶
这个初始实现的目标是能够以与gd相同的方式呈现符号和样式定义。也就是说,agg渲染器应该生成类似于gd但质量更高的输出。除非另有说明,否则在此阶段不尝试引入特定于agg的呈现功能。因此,此时不需要添加mapserver symbolobj或styleobj。
在大多数情况下,agg渲染器可以像gd一样接收处理过的shapeobj、styleobj和symbolobj。也就是说,因为agg使用子像素计算来呈现特征,所以它不希望特征坐标被舍入为整数值,所以一个特殊的agg只映射到图像坐标转换函数mstransformshapeagg。注意,可能gd也可以利用非圆特征,当将x和y传递给gd时(实际上代码已经这样做了),可以将double强制转换为int,但需要进一步的测试。
C API更改¶
实际上,添加一个新的渲染器对MapServer核心几乎没有或根本没有影响。要修改以下文件以添加AGG特定的处理块,这些处理块基本上是GD支持的直接副本:
mapdraw.c
mapdrawgdal.c
maperror.c
maplegend.c
mapoutput.c
mapraster.c
mapresample.c
maputil.c
不会向这些文件添加新功能,而只会添加其他if块。
在新的源文件mapagg.cpp中可以找到大部分agg功能。更好或更糟的是,它模拟了在mapgd.c.中找到的呈现API,因此,例如msdrawlinesymbolgd在msdrawlinesymbolagg中有一个计数器部分。在该文件中还可以找到各种帮助器函数/方法。
MapScript¶
没有变化。
问题和注意事项¶
agg驱动程序此时只支持rgb输出。gd和agg如何解释alpha通道值(gd向后)的一个基本区别意味着agg无法写入gd alpha通道并正确解释输出。不过,这真的不应该成为一个破坏协议的因素,因为mapserver中的向量渲染不会写入alpha通道,除非处理层透明性,否则会发生alpha混合。此外,GD又回到了积极的开发阶段,并计划定义一个合适的rgba缓冲区。
使用gd绘制文本和栅格图层。虽然文本放置当然可以从亚像素放置中受益,但目前没有足够的资源来完成该支持。希望能尽快解决。栅格层渲染似乎没有从agg中受益,此时仍将是gd函数。
以下符号、样式组合不适用于agg:todo
agg许可证在版本2.4(BSD样式)和2.5(GPL)之间进行了更改(http://www.antigring.com/license/index.html)。mapserver应该使用库的2.4版本,直到澄清了此更改的所有含义。
臭虫识别码¶
未指定
投票历史¶
没有