使用 Direct2D/DirectWrite 确定文本边界框

2024-03-02

ID2D1RenderTarget::DrawGlyphRun采用以下参数:

D2D1_POINT_2F baselineOrigin,
__in CONST DWRITE_GLYPH_RUN *glyphRun,
__in ID2D1Brush *foregroundBrush,
DWRITE_MEASURING_MODE measuringMode /*= DWRITE_MEASURING_MODE_NATURAL */

其中 DWRITE_GLYPH_RUN 是

struct DWRITE_GLYPH_RUN
{
    __notnull IDWriteFontFace* fontFace;
    FLOAT fontEmSize;
    UINT32 glyphCount;
    __field_ecount(glyphCount) UINT16 const* glyphIndices;
    __field_ecount_opt(glyphCount) FLOAT const* glyphAdvances;
    __field_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets;
    BOOL isSideways;
    UINT32 bidiLevel;
};

我试图找出包含输出字形的最小矩形。

这是我所有的数据。请注意,我有 1 点,即baselineOrigin我可以使用计算宽度glyphAdvances and glyphOffsets来自DWRITE_GLYPH_RUN。问题是如何确定高度?

Thanks.


我之前使用另一种方法来做到这一点:

  1. 创建路径几何体
  2. 打开路径几何体,获取几何体sink
  3. 调用 GetGlyphRunOutline 将文本转换为几何图形
  4. 调用转换后的几何体的GetBounds获取边界矩形

将文本转换为几何图形后,您可以平移/旋转/缩放它,并执行几何图形可以执行的所有操作。您也可以在获取边界矩形并使用自己的方法绘制后删除几何图形。

一些代码供大家参考

// Create path geometry
hr = pD2DFactory->CreatePathGeometry(&pPathGeometry);
if(FAILED(hr))
{
        MessageBox(NULL, L"Create path geometry failed!", L"Error", 0);
        return;
}

// Open sink
hr = pPathGeometry->Open(&pGeometrySink);
if(FAILED(hr))
{
        MessageBox(NULL, L"Open geometry sink failed!", L"Error", 0);
        return;
}

// Get glyph run outline
hr = pFontFace->GetGlyphRunOutline(
        fontSize_,                              // font size
        pGlyphIndices,
        NULL,
        NULL,
        textLength,
        FALSE,
        FALSE,
        pGeometrySink
        );
if(FAILED(hr))
{
        MessageBox(NULL, L"Get glyph run outline failed!", L"Error", 0);
        return;
}

// Close sink
pGeometrySink->Close();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Direct2D/DirectWrite 确定文本边界框 的相关文章

随机推荐

  • 是否可以从 TabBarView 内容区域滑动到相邻的 PageView 页面?

    我想将选项卡放置在水平 PageView 内 并且能够滑出选项卡 在内容区域中 我可以从一个页面滑入选项卡 但不能从选项卡滑出到另一个页面 如果我在 TabBar 上滑动 那么我可以离开选项卡并转到相邻页面 有没有办法让我从 TabView
  • 如何在 Java 中递归地从 N 元素集中生成所有 k 元素子集

    所以我陷入了试图从给定的 N 元素集中找到所有 k 元素子集的问题 我知道使用公式 C n k C n 1 k 1 C n 1 k 的 k 子集总数是多少 我也知道如何做到这一点以迭代的方式 但是当我尝试思考递归解决方案时 我陷入了困境 谁
  • Mongo查询子文档多个字段

    假设我有一个这样的集合 arr name a num 1 name a num 2 arr name b num 1 name a num 2 arr name b num 1 name b num 2 我想找到所有文件arr包含一个子文档
  • 如何使用链接表在 Hibernate 中映射多对多列表

    我想使用链接表在 Hibernate 中映射多对多 我有两个课程 父级和子级 例如 public class Parent private List
  • HashMap 反向排序? [复制]

    这个问题在这里已经有答案了 所以我遇到了这个方法 它能够按值对 HashMap 进行排序 public static
  • 如何将 Selenium 连接到现有的 Firefox 浏览器? (Python)

    有谁知道如何将现有的 Firefox 浏览器与 Selenium 连接 我尝试了 Chrome 方式 没有运气 在调试模式下启动 Firefox start firefox exe marionette foreground no remo
  • 在 R 中追加数据

    我正在生成一个脚本 在其中对一堆数据进行了许多操作 并且对另一个数据集进行了相同的操作 两个数据集具有相同的行 列和标题 我希望能够将两个数据集连接在一起 将数据集 A 放置在数据集 B 之上 我不需要数据集 B 的标题 而是将所有数据聚集
  • 如何使表格中的整行可作为链接点击?

    我正在使用 Bootstrap 但以下内容不起作用 tbody a href tr td Blah Blah td td 1234567 td td 158 000 td tr a tbody 作者注一 请查看下面的其他答案 尤其是那些不使
  • Python 中的按位运算是如何进行的?

    我今天一直在学习按位运算 我了解到Not 反转所有位 例如 01010 to 10101 这意味着 10应该是 5 但我看到它是 11 每个python命令行 这是 01010 to 11011 只有两位被反转 谁能解释一下为什么不是101
  • UVa 的 3n+1 挑战

    我在运行 编程挑战 中的 3n 1 问题 时遇到问题 我已经尝试了在 google 上找到的所有 Java 解决方案 甚至是 Stack Overflow 上的解决方案 但没有一个有效 它们都报告 错误答案 我还找到了一个可行的 C 解决方
  • Android EditText 输入类型 textShortMessage

    inputType 的目的是什么textShortMessage https developer android com reference android text InputType html TYPE TEXT VARIATION S
  • 如何在列表中的任意位置插入元素?

    我有这个 gt gt gt a 1 4 7 11 17 有什么办法可以增加4个字符吗 随机地在其他元素之间实现 例如 1 4 7 11 17 你可以简单地这样做 import random for in range 4 a insert r
  • NSMutableArray 属性初始化和更新

    假设我有一个 property 它是一个 NSMutablearray 其中包含四个对象使用的分数 它们将被初始化为零 然后在 viewDidLoad 期间和应用程序的整个操作过程中更新 由于某种原因 我无法全神贯注于需要做什么 特别是在声
  • 删除其他工作表上的列中*不*存在值的行

    我有一个包含两张纸的 LibreOffice Calc 文件 表 2 只有一列 A 其中有很多数字 在工作表 1 中 每行的 A 列也包含一个数字 我想从工作表 1 中删除 A 列中具有值的所有行not appear anywhere在表
  • 在 json 模式中定义键值对的正确方法是什么

    如何在 json 模式中定义键值对对象 正确 方式 我想定义这个 id 99 info name somename href someUrl 以下两项是否准确 1 type object name MyObj properties id t
  • 运算符 ++ 中的 Int 参数

    class myClass public void operator myInstance void operator int myInstance 除了让编译器区分myInstance and myInstance 是可选的int论证中o
  • App Engine (Python) 数据存储区预调用 API 挂钩

    背景 假设我正在为 GAE 制作应用程序 并且我想使用API 钩子 http code google com appengine articles hooks html BIG EDIT 在这个问题的原始版本中 我描述了我的用例 但有些人正
  • 为什么有时 jQuery 选择器会返回类似“a.fn.init”的内容? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我不知道我的 Chrome 浏览器发生了什么 但突然出现了这样的行为 div my 控制台中的内容与以前完全不同 我曾经经历过一次 但后来又
  • NSOpenPanel 无法获得焦点

    首先 我对 Swift 完全陌生 如果我的问题看起来微不足道 我很抱歉 我想要一个非常简单的命令行程序 它打开一个对话框来选择文件或文件夹 该工具不得运行带有在 Dock 中弹跳的图标的实际完整应用程序 而是运行一些微妙的东西 就是这样 我
  • 使用 Direct2D/DirectWrite 确定文本边界框

    ID2D1RenderTarget DrawGlyphRun采用以下参数 D2D1 POINT 2F baselineOrigin in CONST DWRITE GLYPH RUN glyphRun in ID2D1Brush foreg