/ / RTL ширина на текста в DirectWrite - c ++, directwrite

RTL ширина на текста в DirectWrite - c ++, directwrite

използвам IDWriteTextAnalysisSink / AnalyzeScript за показване на смесен LTR (английски) и RTL (иврит) текст в DirectWrite (C ++), и изчислявам ширината на текста от:

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

с glyphAdvances върнати от GetGlyphPlacements.

Но за текст отдясно наляво това често е неточно, което води до припокриване на текст и т.н. Това правилен метод ли е?

Благодаря.

Отговори:

2 за отговор № 1

Може да не е нужно да вършите толкова много работа с 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);
}

Снимка на екрана от четене на иврит: въведете описанието на изображението тук

(Забележка: Моето решение се основава на извадка от Кени Кер) Разбрах, че смесвате LTR и RTL, но не съм сигурен, че това гарантира допълнителната сложност на IDWriteTextAnalysisSink / AnalyzeScript.