2012-11-27 25 views
3

ID2D1RenderTarget::DrawGlyphRun採取以下PARAMS:確定文本邊界框使用Direct2D/DirectWrite的

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; 
}; 

我試圖找出包含輸出字形的最小矩形。

這是我擁有的所有數據。請注意,我有一個點,它是baselineOrigin,我可以使用DWRITE_GLYPH_RUN中的glyphAdvancesglyphOffsets來計算寬度。問題是如何確定身高?

謝謝。

回答

2

我用另一種方式來做到這一點之前:

  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(); 
+0

謝謝 - 好主意。 –

+0

該方法幾乎完美,但不完全。我得到了界限,但在某些地區它們似乎有1-2個像素。當我稍後使用生成的幾何體渲染字形而不是使用使用不同顏色的「DrawGlyphRun」時,它們不完全匹配。任何想法爲什麼會這樣?我使用所有GetGlyphRunOutline參數是這樣的: glyphRun-> fontFace-> GetGlyphRunOutline( \t glyphRun-> fontEmSize, \t glyphRun-> glyphIndices, \t glyphRun-> glyphAdvances, \t glyphRun-> glyphOffsets, \t glyphRun-> glyphCount, \t glyphRun-> isSideways, \t glyphRun-> bidiLevel%2, \t pGeometrySink); glyphRun與傳遞給DrawGlyphRun相同。 –

+0

我會在稍後看看。 – zdd