3

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

出力グリフを含む最小のrectを見つけようとしています。

これは私が持っているすべてのデータです。私は1つのポイントを持っていることに注意してください。これは、を使用して、およびからbaselineOrigin幅を計算できる可能性があります。問題は、高さをどのように決定するかです。glyphAdvancesglyphOffsetsDWRITE_GLYPH_RUN

ありがとう。

4

1 に答える 1

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();
于 2012-11-28T01:37:34.770 に答える