使用字体回退

注意

在本主题中,有关 ScriptShape 的所有备注同样适用于 ScriptShapeOpenType

 

如果字体不支持字符串中的某些字符,或者应用程序使用字体不支持 的复杂脚本 ,则应用程序必须在文本显示期间使用字体回退。 当应用程序调用 ScriptShape 函数时,在文本布局过程中检测到字体回退的要求。 有关文本显示的信息,请参阅 使用 Uniscribe 显示文本

确定不受支持的字符的字体回退需求

如果请求的字体不支持字符串中的某些字符,则应用程序对 ScriptShape 的调用会成功。 但是,应用程序必须扫描字形输出缓冲区中是否存在缺失的字形。 可以通过调用 ScriptGetFontProperties 来确定特定字体缺失字形的字形索引。 如果特定字形不可用,应用程序必须回退到字形的其他字体,或者呈现指示没有可用的字形的图形符号。

确定不受支持的复杂脚本的字体回退需求

应用程序首选显示的字体可能不支持文本所需的复杂脚本。 在这种情况下,应用程序对 ScriptShape 的调用失败,错误代码E_SCRIPT_NOT_IN_FONT。

分配回退字体

确定需要字体回退后,应用程序必须分配回退字体。 应用程序可以尝试以下方法:

  • 为字体列表中的每种字体调用 ScriptShape ,直到一个调用具有可接受的返回。
  • 使用列表中的每种字体调用 ScriptShape ,直到确定没有字体成功。 如果始终E_SCRIPT_NOT_IN_FONT错误代码,则字体不支持复杂脚本。 呈现指示没有字形的图形符号,或将脚本重新指定为未定义 (没有脚本处理) ,然后重新开始。 若要将脚本设置为未定义,请将 SCRIPT_ANALYSIS 结构的 eScript 成员设置为SCRIPT_UNDEFINED。
  • 使用列表中的每种字体调用 ScriptShape ,直到确定没有字体成功。 如果错误代码指示某些字符映射到缺少的字形,请将字符串分解为较小的范围。 可以为子范围分配不同的字体,以便可以呈现更多字符。

生成字形信息

应用程序分配的字体成功调用 ScriptShape 后,它可以调用 ScriptPlace ,以从 ScriptShape 的输出生成字形前移宽度和二维偏移量信息。 字体在这些调用中应成功。 ScriptShape 调用成功后,调用 ScriptPlace 时字体失败表示字体损坏。

使用 Uniscribe