MS RFC 80:字体回退支持

日期

2011年12月7日

作者

托马斯“假”杰克比

作者

托马斯堡

联系

托马斯在derfake.com

联系

t在terriscope.fr的端口

状态

通过

版本

地图服务器6.2

1。概述

此RFC建议允许为标签定义回退字体,以便在初始字体中没有字形时使用。

目前,如果标签的字体中没有字形,则会绘制字体的错误字形(通常为空框)。这在呈现国际数据时是有问题的,因为它可能包含大量的Unicode字符。到目前为止,这只能用(接近)完整的Unicode字体来修复。自由的“unifont”包含基本unicode集(~60.000)的所有字形,但作为默认字体,它看起来不太令人满意。

对于回退字体,glyph lookup将在接受错误glyph之前按给定顺序尝试一组字体。这样,像unifont这样的unicode字体只能作为逐个glyph基础上的“最后手段”。

在mapfile中,字体列表将以逗号分隔的字符串形式给出,如“font1,font2,font3”,其中每个字体通常都列在fonts.lst中。如果只指定了一种字体,则此功能无效。相同的fontlist支持可用于属性绑定。

2。拟议技术变更

2.1核心对象变更

标签样式对象需要支持多种字体。建议的实现使用字体数量的硬限制,以避免开销。字体数量可以使用ms_max_label_fonts define更改,建议的默认值为5。

2.2标签呈现变化

需要更改getRueTypeTextBBox的函数指针签名,以便能够接收多个字体及其计数。这需要对每个渲染器进行更改,LabelStyleObj的更改也是如此。

支持单个glyph操作(如cairo和agg)的渲染器可以使用传入的字体列表来实现glyph回退。在完整字符串上操作的渲染器可以使用字体[0]以不改变行为。

2.3MapScript

mapscript getter和setter保持不变,但是传递给labelobj->setfont()的字符串的语义被修改,因为它现在需要一个用逗号分隔的fontset键列表。

三。实施细节

建议的实现为cairo和agg renders添加了字体回退支持。

labelobj是不变的,但是它的“char*font”成员语义被更改为包含由逗号分隔的fontset键列表,而不是单个fontset键。这可以确保MAPScript应用程序和数据源绑定的向后不兼容性最小。

在调用标记渲染器特定函数之前调用一个新函数“msfontsetlookupfonts()”,并通过迭代labelobj->FONT键并调用msfontsetlookup,将逗号分隔的labelobj->FONT映射到一个完整的字体文件名数组中。

渲染器特定的标签功能签名会被修改为采用字体文件名列表,而不是像现在这样的单个文件名。还没有的渲染器?支持对多个字体的回退进行轻微修改,以使用字体数组的第一个条目,而其他渲染器使用某些特定代码来检测缺少的字符,并在需要时使用回退字体。

3.1。受影响的文件

  • C:

  • 添加msfontsetlookupfonts实现,该实现将输入字体拆分为逗号,并查找fontset中的每个字体键。

  • 在调用渲染器vtable boundingbox计算函数之前调用msfontsetlookupfonts。

  • maprendering.c:调用msfontsetlookupfonts以设置labelstyleobj中的字体列表

  • mapagg.cpp:glyph回退实现,特定于agg

  • mapcairo.c:glyph回退实现,cairo和freetype特定

  • mapgd.c、mapkml.c、mapogl.cpp:

  • 仅使用给定字体列表的第一个字体

  • GetTrueTypeTextBBox函数签名更新

  • MAPServer

  • 添加msfontsetlookupfonts函数和ms_max_label_fonts定义

  • 将labelstyleobj char*字体更改为char*字体[ms_max_label_字体]

  • mapsymbol.c:符号字体回退应用

  • maputil.c:如果形状不同,则只绑定形状中的字体

  • mapdummorenderer.c:GetTrueTypeTextBbox签名更改

3.2臭虫ID

4。向后兼容性问题

除非现有的fontset键包含逗号,否则不需要。我不确定这是否是有效的语法,而且绝对是不好的做法。

5。错误报告

允许的最大字体数的硬限制在msfontsetlookupfonts()中强制执行,它将停止处理并返回一条错误消息,说明最大字体数设置为ms_max_label_fonts。如果无法加载引用的字体之一(由于TTF文件不可访问或损坏),则渲染器本身将报告常见的错误消息。

6。示例用法

  • 请参阅msautotest条目http://trac.osgeo.org/mapserver/changeset/12863

7。投票历史

通过了托马斯布,史蒂文,迈克尔斯,史蒂文,佩林,丹尼尔的+1