MS RFC 113:层合成管道

日期

2015年2月

作者

托马斯堡

联系

thomas.bonfort@gmail.com

状态

实施

版本

MAPServer 7

1。动机

一些制图渲染将受益于高级混合模式的添加,如http://en.wikipedia.org/wiki/blend_models中详细解释的那样。特别是,此功能对于在矢量曲面上更愉快地渲染栅格阴影至关重要。

2。建议的增强

图层->不透明度功能将替换为一个或多个图层->复合块,用于定义应使用哪种合成模式将当前图层混合到现有的基础地图上。与使用实际的图层->不透明机制类似,添加图层->复合块将指示MapServer在临时图像缓冲区中渲染当前图层,并在最后一步将其合成回基础图像。

LAYER
  COMPOSITE
    COMPOP "multiply"
    OPACITY 70
    COMPFILTER "foo" #reserved for future use
  END
END

compfilter关键字还允许在将像素合成到基础图像之前对像素应用某种过滤器(这通常用于将模糊过滤器应用到层以获得几何体周围的光环效果)。这些特性的语法和实现将在未来的版本和RFC中确定。在一个层中支持多个复合块只有在确定了这些compfilters之后才有意义。

2.1支持的合成操作

相当于当前层合成操作符的默认合成操作符是“SRC over”。可以使用的compop值应该是明确的,并在下面列出:

  • 清楚的

  • 颜色烧伤

  • 彩色道奇

  • 对比度*

  • 变暗

  • 差异

  • 夏令时

  • 反坦克导弹

  • DST

  • DST输出

  • DST过

  • 排除

  • 强光

  • 反转*

  • 反相RGB

  • 减轻

  • 减去*

  • 覆盖

  • 屏幕

  • 柔光

  • SRC

  • SRC顶

  • SRC输入

  • SRC输出

  • SRC过

  • 异或

只有在使用agg后端时,才支持用星号(*)标记的运算符 and 如果Pixman支持未启用,则在未启用时将返回“SRC over”。

2.2向后兼容性

图层->不透明度将被弃用,应替换为

LAYER
  COMPOSITE
    OPACITY 70
  END

在新映射文件中。mapfile解析器和mapscript setters/getter将被更新以使用层->不透明度,但如果与复合块一起使用,将产生未指定的结果。

2.3性能影响

如果未显式启用,则无。根据所选的合成运算符,与使用“SRC over”时相比,性能可能略有下降。

2.4个局限性

  • 合成管道仅由像素渲染器支持,因此对于PDF和SVG后端来说将不起作用。

  • cairo后端或启用pixman支持时不支持某些合成运算符。

三。实施细节

3.1建筑

  • 渲染器将更新其vtable签名,以便在请求合成时包含要使用的compositerasterbuffer()函数。

  • 将修改msdrawmap()以创建临时图像,然后在层渲染结束后调用compositerasterbuffer()。

  • tbd:当前的实现可以配置为使用pixman作为外部依赖项,以便在agg渲染器内使用SSE优化操作。根据成本/效益比(性能、功能、依赖性)决定是否长期保持这一点。

3.1受影响的文件

  • mapfile.c,maplexer.l:解析器,关键字。

  • mapagg.cpp,mapcairo.c:实际合成操作

  • mapcontext.c mapcopy.c,mapkml.c,maplegend.c,mapogcsld.c,maputil.c,mapscripts:内务管理和向后兼容性

  • mapdraw.c:调用在绘图操作中合成后端

3.2跟踪问题

第四章。投票历史

+1人来自托马斯布、斯蒂芬、米克斯、史蒂文、丹尼尔、汤克和佩林。