【问题标题】:DirectWrite ligature substitution featureDirectWrite 连字替换功能
【发布时间】:2020-10-27 04:14:59
【问题描述】:

我正在尝试使用 DirectWrite 获取给定字符串的正确字形。我正在尝试启用 OpenType 功能进行测试,在这种情况下是字体连字替换。我正在使用包含 OpenType 'liga' 标记的字体有一个单独的 ll 字形。

这是我的代码:

        text = 'Hello'

        analyze = IDWriteTextAnalyzer()
        self.font.write_factory.CreateTextAnalyzer(byref(analyze))

        tags = [DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES]

        num_feature = len(tags)
        if num_feature:
            typo_features = DWRITE_TYPOGRAPHIC_FEATURES()
            typo_features.featureCount = num_feature

            typo_features.features = (DWRITE_FONT_FEATURE * num_feature)()
            for i in range(num_feature):
                typo_features.features[i] = DWRITE_FONT_FEATURE(tags[i], 1)

            feature_range = (UINT32 * num_feature)(len(text))
        else:
            typo_features = None
            feature_range = None

        max_count = int(3 * len(text) / 2 + 16)

        length = len(text)
        clusters = (UINT16 * length)()
        text_props = (DWRITE_SHAPING_TEXT_PROPERTIES * length)()
        indices = (UINT16 * max_count)()
        glyph_props = (DWRITE_SHAPING_GLYPH_PROPERTIES * max_count)()
        actual_count = UINT32()

        analyze.GetGlyphs(text,
                          len(text),
                          self.font.font_face,
                          False,  # sideways
                          False,  # righttoleft
                          script,  # scriptAnalysis
                          None,  # localName
                          None,  # numberSub
                          typo_features,  # typo features
                          feature_range,  # feature range
                          1,  # count
                          max_count,
                          clusters, # cluster map
                          text_props, # text props
                          indices, # glyph indices
                          glyph_props, #glyph pops
                          byref(actual_count)#glyph count
                          )

但是,在检查返回值时,它总共有 5 个字形,并且字形索引中没有显示连字索引,只显示了原来的两个 l:[43, 72, 79, 79, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

我不确定我是否理解正确。我认为它将用字符串中的两个 l 代替 ll 字形是不正确的吗?或者是否有另一个过程使这个索引成为真正的连字?任何输入都是有帮助的,因为我是新手。谢谢

【问题讨论】:

    标签: fonts directwrite ligature


    【解决方案1】:

    有很多事情需要检查:

    • 字体如何定义“liga”,预期使用哪种脚本/语言对,使用哪种查找方式;
    • 尝试使用具有相同字体的 IDirectWriteTextLayout 的简单测试程序,看看您是否默认获得此连字。如果这样做,则意味着“liga”默认已启用,您无需将其指定为用户功能;
    • 首先检查您在更传统的环境中测试代码,例如 C/C++。

    【讨论】:

    • 1) 这会影响分析器解析信息的方式吗? 2) 使用 TextLayout 使用正确的连字产生正确的结果。不幸的是,我不相信 TextLayout 实际上会为您提供我需要的所有字形信息。我试图在不先渲染的情况下只获得形状的字形索引和进步。 3)我将在另一个环境中尝试这个,看看实际的字形输出是否发生变化,但想在重新编码之前确保我在正确的轨道上。
    • 我想我找到了,这是分析脚本中的一个问题,我认为这不会影响连字的选择方式,但确实如此。
    • 布局本身不执行渲染,它使用回调接口告诉您要渲染的内容,以及所有字形和位置信息,这些信息来自分析器提供的内容。但可以肯定的是,脚本分析结构从我提到的那个脚本/语言对中指定了脚本 ID。语言源自语言环境。
    • 有道理,谢谢。经过调查,某处存在一个错误,SetScriptAnalysis 以某种方式从 DirectWrite 中被回调两次。第一次调用获得了正确的脚本 id (49),但第二次调用用不正确的 (1) 覆盖了正确的脚本。我不确定是什么触发了这种情况,但可能是我在想的某个地方的不正确实现。
    • @Charlie:顺便说一句:你用什么语言写作? (我只尝试过使用 C++ 调用 DWrite。)缺少“;” if...else... 使用 ":" 就像 Python,但我不知道如何使用 Python 调用 DWrite。
    猜你喜欢
    • 2010-10-22
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多