DirectWrite中的RTL文本宽度

时间:2014-02-19 18:13:36

标签: c++ directwrite

我使用IDWriteTextAnalysisSink / AnalyzeScript在DirectWrite(C ++)中显示混合LTR(英语)和RTL(希伯来语)文本,我从以下位置计算文本宽度:

textwidth = 0;
for (UINT glyph=0; glyph<actualGlyphCount; glyph++) 
  textwidth += glyphAdvances[glyph];

glyphAdvances返回GetGlyphPlacements

然而,对于右到左文本,这通常是不准确的,导致文本重叠等。这是正确的方法吗?

感谢。

1 个答案:

答案 0 :(得分:2)

您可能不需要使用IDWriteTextAnalysisSink / AnalyzeScript做太多工作。

    HRESULT hr = S_OK;
    ComPtr<IDWriteTextFormat> _textFormat;
    ComPtr<IDWriteTextLayout> _textLayout;
    hr = textFactory->CreateTextFormat(L"Arial", nullptr, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 30.0f, L"", _textFormat.GetAddressOf());
    hr = textFormat->SetReadingDirection(DWRITE_READING_DIRECTION_RIGHT_TO_LEFT);
    hr = textFactory->CreateTextLayout(L"[HEBREW TEXT HERE]", textsize, textFormat.Get(), 0.0f, 0.0f, _textLayout.GetAddressOf());

呈现代码:

    _renderTarget->Clear(BG_COLOR);
    auto size = _renderTarget->GetSize();

    auto margin = 50.0f;
    size.width -= margin * 2.0f;
    size.height -= margin * 2.0f;

    if (S_OK == _textLayout->SetMaxWidth(size.width) &&
        S_OK == _textLayout->SetMaxHeight(size.height))
    {
        _renderTarget->DrawTextLayout(Point2F(margin, margin), _textLayout.Get(), _brush.Get(), D2D1_DRAW_TEXT_OPTIONS_NONE);
    }

阅读希伯来文件的屏幕截图: enter image description here

(注意:我的解决方案基于Kenny Kerr的样本) 我意识到你正在混合使用LTR和RTL,但我不确定这会增加IDWriteTextAnalysisSink / AnalyzeScript的复杂性。