【问题标题】:Direct2D: How to convert fallback to SystemLink mode?Direct2D:如何将回退转换为 SystemLink 模式?
【发布时间】:2023-03-08 10:50:01
【问题描述】:

我现在正在将项目的渲染引擎从 GDI 转换为 D2D。 GDI 使用“CreateFontIndirect”分配字体大小“-13”,字体系列“Segeo UI”。 D2D 使用“CreateTextFormat”分配字体大小“13”,字体系列“Segeo UI”。效果如下图:

在GDI的情况下,系统在“Segeo UI”中没有找到汉字,它会在regedit“SystemLink”中找到中文字体,在我的机器上是“YaHei”。但是在D2D的情况下,系统没有找到“雅黑”,它会选择绘制哪种中文字体,它是如何工作的?

【问题讨论】:

  • 对不起,不,有什么方法可以将 SystemLink 转换为后备?我现在正在做一个 GDI 项目。 SystemLink 已经存在,并且在不同的机器上,有不同的 SystemLink 列表。我不能使用后备来自定义我的选择字体列表。
  • 您说“我现在正在从事 GDI 项目”,但您的问题是关于 Direct2D。 Direct2D 不是 GDI,它使用另一种机制。
  • 我认为@zhufachang 要求的是使用 DirectWrite 实现相同的后备行为,即 SystemLink 用于为 GDI 提供的行为。没有办法在它们之间自动转换,你必须自己发明一些东西。例如,您可以读取 SystemLink 数据,并在可能的情况下使用它填充您的自定义后备实例。
  • @bunglehead 好的,谢谢

标签: direct2d directwrite


【解决方案1】:

它根据 DirectWrite 布局逻辑工作。请参阅 IDWriteTextLayout2::SetFontFallback(),如果默认配置不令人满意,您将能够提供自己的后备实现。

基本上,布局对象会调用您的自定义后备方法来将字符映射到字体,然后您可以检测您想要将哪些字符映射到哪种字体,可能会在您不关心的情况下重用系统后备实现。

【讨论】:

  • 有什么方法可以将 SystemLink 转换为后备?我现在正在做一个 GDI 项目。 SystemLink 已经存在,并且在不同的机器上,有不同的 SystemLink 列表。我不能使用后备来自定义我的选择字体列表。
  • 就像我说的,你必须为你的自定义 IDWriteFontFallback 实现手动构建映射,你如何做取决于你,也许你可以使用 SystemLink 条目以某种方式。
猜你喜欢
  • 2015-09-16
  • 2015-04-15
  • 2020-01-17
  • 1970-01-01
  • 2017-07-08
  • 2020-02-23
  • 1970-01-01
  • 2019-01-29
  • 2020-07-12
相关资源
最近更新 更多