确定使用Direct2D / DirectWrite的文本边界框(Determine text bo

2019-08-03 06:19发布

ID2D1RenderTarget::DrawGlyphRun采取以下PARAMS:

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 ,我可以使用潜在地计算宽度glyphAdvancesglyphOffsetsDWRITE_GLYPH_RUN 。 现在的问题是如何确定的高度?

谢谢。

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


文章来源: Determine text boundary box with Direct2D/DirectWrite