Возможно, вам не нужно выполнять большую работу с 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.
Отлично, я преобразовал часть своего кода в IDWriteTextFormat/IDWriteTextLayout, сделаю все остальное позже, я не заметил, что функции GetLineMetrics и GetClusterMetrics предоставляют всю необходимую измерительную информацию, поэтому в моем случае нет необходимости чтобы реализовать IDWriteTextAnalysisSink. Благодарю. – BanK
Да, если вы рисуете IDWriteTextLayout, тогда лучше всего измерить его, чтобы они были согласованы, а не использовались функции более низкого уровня, которые фактически используются для создания макетов. В противном случае существует целый ряд вещей, которые вы должны дублировать, что макет прозрачно делает для вас, например, анализ bidi и резерв шрифта, где недостаток отслоения шрифта, вероятно, является причиной того, что вы получаете неверные результаты для иврита. –