【问题标题】:Determine text boundary box with Direct2D/DirectWrite使用 Direct2D/DirectWrite 确定文本边界框
【发布时间】:2012-11-15 06:27:01
【问题描述】:

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,我可以使用 DWRITE_GLYPH_RUN 中的 glyphAdvancesglyphOffsets 计算宽度。问题是如何确定高度?

谢谢。

【问题讨论】:

    标签: direct2d directwrite


    【解决方案1】:

    我之前使用了另一种方法:

    1. 创建路径几何
    2. 打开路径几何以获取几何接收器
    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();
    

    【讨论】:

    • 这种方法工作得几乎完美,但并不完全。我得到了边界,但在某些区域它们似乎偏离了 1-2 像素。当我后来使用生成的几何体与使用DrawGlyphRun 使用不同的颜色渲染字形时,它们并不完全匹配。知道为什么会这样吗?我使用所有 GetGlyphRunOutline 参数,如下所示: glyphRun->fontFace->GetGlyphRunOutline( glyphRun->fontEmSize, glyphRun->glyphIndices, glyphRun->glyphAdvances, glyphRun->glyphOffsets, glyphRun->glyphCount, glyphRun->isSideways, glyphRun->bidiLevel %2, pGeometrySink); glyphRun 与传递给 DrawGlyphRun 的相同。
    • 我稍后会调查。
    • @vt,边界不必匹配。当您执行 GetGlyphRunOutline() 时,您基本上强制执行轮廓模式渲染,而 DrawGlyphRun() 可能是位图渲染器。
    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 2021-06-26
    • 2013-12-12
    • 2015-03-29
    • 2010-10-22
    • 2014-01-08
    • 2020-12-16
    • 2020-09-21
    相关资源
    最近更新 更多