Determine text boundary box with Direct2D/DirectWrite

direct2d, directwrite

Solution

I use an alternative way to do this before:

- Create a path geometry

- Open the path geometry to get the geometry sink

- Call GetGlyphRunOutline to convert to text to geometry

- Call GetBounds of the converted geometry to get the boundary rectangle

After converting the text to geometry, you can translate/rotate/scaling it, and do everything what a geometry can do. you can also just drop the geometry after getting the boundary rectangle and drawing with your own method.

Some codes for your references

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

Problem

`ID2D1RenderTarget::DrawGlyphRun` takes the following params: ``` D2D1_POINT_2F baselineOrigin, __in CONST DWRITE_GLYPH_RUN *glyphRun, __in ID2D1Brush *foregroundBrush, DWRITE_MEASURING_MODE measuringMode /*= DWRITE_MEASURING_MODE_NATURAL */ ``` Where DWRITE_GLYPH_RUN is ``` 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; }; ``` I am trying to find out the smallest rect that contains the output glyphs. This is all data I have. Note that I have 1 point which is `baselineOrigin` and I can potentially calculate the width using `glyphAdvances` and `glyphOffsets` from the `DWRITE_GLYPH_RUN`. The question is how to determine the height? Thanks.

Original source