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

时间:2012-11-27 15:31:03

标签: direct2d directwrite

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中的glyphOffsetsDWRITE_GLYPH_RUN计算宽度。问题是如何确定身高?

感谢。

1 个答案:

答案 0 :(得分:2)

我之前使用另一种方法:

  1. 创建路径几何
  2. 打开路径几何体以获取几何体接收器
  3. 调用GetGlyphRunOutline将文本转换为几何
  4. 调用已转换几何体的GetBounds以获取边界矩形
  5. 将文本转换为几何体后,您可以对其进行平移/旋转/缩放,并执行几何体可以执行的操作。您也可以在获取边界矩形并使用自己的方法绘制后删除几何体。

    参考的一些代码

    // 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();