2014-02-19 5 views
1

Я использую IDWriteTextAnalysisSink/AnalyzeScript для отображения смешанных L (на английском языке) и РТЛИ (иврит) текст в DirectWrite (C++), и я вычислить ширину текста от:РТЛ в DirectWrite

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

с glyphAdvances вернулся из GetGlyphPlacements.

Однако для текста справа налево это часто неточно, что приводит к перекрывающемуся тексту и т. Д. Правильный ли это метод?

Спасибо.

ответ

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

(Примечание: Мое решение основано на выборке из Кенни Керр) Я понимаю, что вы смешиваете LTR и RTL, однако я не уверен, что гарантирует дополнительную сложность IDWriteTextAnalysisSink/AnalyzeScript.

+0

Отлично, я преобразовал часть своего кода в IDWriteTextFormat/IDWriteTextLayout, сделаю все остальное позже, я не заметил, что функции GetLineMetrics и GetClusterMetrics предоставляют всю необходимую измерительную информацию, поэтому в моем случае нет необходимости чтобы реализовать IDWriteTextAnalysisSink. Благодарю. – BanK

+0

Да, если вы рисуете IDWriteTextLayout, тогда лучше всего измерить его, чтобы они были согласованы, а не использовались функции более низкого уровня, которые фактически используются для создания макетов. В противном случае существует целый ряд вещей, которые вы должны дублировать, что макет прозрачно делает для вас, например, анализ bidi и резерв шрифта, где недостаток отслоения шрифта, вероятно, является причиной того, что вы получаете неверные результаты для иврита. –

 Смежные вопросы

  • Нет связанных вопросов^_^