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.
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();
来源:https://stackoverflow.com/questions/13587532/determine-text-boundary-box-with-direct2d-directwrite