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

没有变化。

Mapfile

这样的输出块将触发agg呈现:

OUTPUTFORMAT
  NAME 'AGG_PNG24'
  DRIVER AGG/PNG
  IMAGEMODE RGB
END

问题和注意事项

  • 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版本,直到澄清了此更改的所有含义。

臭虫识别码

未指定

投票历史

没有