gpt4 book ai didi

c++ - DirectWrite 中的 RTL 文本宽度

转载 作者:行者123 更新时间:2023-11-30 04:08:20 24 4
gpt4 key购买 nike

我使用 IDWriteTextAnalysisSink/AnalyzeScript 在 DirectWrite (C++) 中显示混合的 LTR(英语)和 RTL(希伯来语)文本,并根据以下公式计算文本宽度:

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

使用从 GetGlyphPlacements 返回的 glyphAdvances

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

谢谢。

最佳答案

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

    HRESULT hr = S_OK;
ComPtr<IDWriteTextFormat> textFormat;
ComPtr<IDWriteTextLayout> textLayout;

// Error checking omitted for brevity
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 的复杂性。

关于c++ - DirectWrite 中的 RTL 文本宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21888900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com