Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Vd от Апрель 15, 2009, 12:07



Название: QtWebKit и text-align. Ошибка отрисовки.
Отправлено: Vd от Апрель 15, 2009, 12:07
День добрый всем.

Обнаружил странность при работе QWebView с установленным атрибутом "text-align: justify".
Выравнивания не происходит, при этом образуется большое количество артефактов рейдринга. Ошибка проявляется только если в абзаце присутствует кириллица.
Проверено: Qt 4.5 c MSVC8, Qt SDK v2009.01 и снапшот QtCreator v1.0.90.

Нашел в оригинальном webkit аналогичную ошибку, но она исправлена в 2005м году:
https://bugs.webkit.org/show_bug.cgi?id=5461

Что можно в дальнейшем предпринять?

Вот проверочный код:
Код
HTML
<html><head>
<style>
p { text-align: justify; }
</style>
</head>a
<body>
<p>This text will rendered ok. This text will rendered ok. This text will rendered ok. This text will rendered ok. This text will rendered ok. This text will rendered ok. This text will rendered ok. This text will rendered ok. This text will rendered ok. This text will rendered ok. This text will rendered ok. This text will rendered ok. This text will rendered ok. This text will rendered ok. </p>
 
<p>А это текст отображается с артефактами и не выравнивается. А это текст отображается с артефактами и не выравнивается. А это текст отображается с артефактами и не выравнивается. А это текст отображается с артефактами и не выравнивается. А это текст отображается с артефактами и не выравнивается. А это текст отображается с артефактами и не выравнивается. А это текст отображается с артефактами и не выравнивается. </p>
 
<p>Этот текст так же отображается не верно. This text will rendered with error. Этот текст так же отображается не верно. This text will rendered with error. Этот текст так же отображается не верно. This text will rendered with error. Этот текст так же отображается не верно. This text will rendered with error. Этот текст так же отображается не верно. This text will rendered with error. </p>
</body>
</html>
 



Название: Re: QtWebKit и text-align. Ошибка отрисовки.
Отправлено: pastor от Апрель 15, 2009, 12:29
пиши баг репорт


Название: Re: QtWebKit и text-align. Ошибка отрисовки.
Отправлено: Vd от Апрель 15, 2009, 19:49
Написал. Пока пришел только автоответ.


Название: Re: QtWebKit и text-align. Ошибка отрисовки.
Отправлено: Vd от Апрель 16, 2009, 18:40
Завели багу:
http://www.qtsoftware.com/developer/task-tracker/index_html?id=251319+&method=entry


Название: Re: QtWebKit и text-align. Ошибка отрисовки.
Отправлено: mugabe от Апрель 30, 2009, 10:53
Столкнулся с подобной проблемой. По-скольку в троллевском баг-трекере стоит "Priority: No Priority, Scheduled for: Not scheduled", решил побороть проблему самостоятельно.

На сколько смог понять баг кроется в QPainter::drawText(const QPointF &p, const QString &str, int tf, int justificationPadding), который, кстати, не смотря на публичность не документирован.
В его дебри решил не лезть, вместо этого сделал следующие исправления:

/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontQt.cpp

было:
Код
C++ (Qt)
QPointF pt(point.x(), point.y());
   int flags = run.rtl() ? Qt::TextForceRightToLeft : Qt::TextForceLeftToRight;
   if (hasShadow) {
       // TODO: text shadow blur support
       p->save();
       p->setPen(QColor(shadowColor));
       p->translate(shadowSize.width(), shadowSize.height());
       p->drawText(pt, string, flags, run.padding());
       p->restore();
   }
   p->drawText(pt, string, flags, run.padding());

стало:
Код
C++ (Qt)
QTextLayout layout(string, font());
   QTextLine line = setupLayout(&layout, run);
 
   QPointF pt(point.x(), point.y());
   int flags = run.rtl() ? Qt::TextForceRightToLeft : Qt::TextForceLeftToRight;
   if (hasShadow) {
       // TODO: text shadow blur support
       p->save();
       p->setPen(QColor(shadowColor));
       p->translate(shadowSize.width(), shadowSize.height());
       line.draw(p, pt);
       p->restore();
   }
   line.draw(p, pt);

Т.е. строки отрисовываются через QTextLine::draw(...), который работает корректно (было замечено по строкам с выделением).

Не уверен в корректности этого решения, т.к. QTextLine::draw(...) внутри выглядит пугающе :) Думаю может сказаться на производительности, но лично я визуально потерь не заметил.


Но в любом случае, можете пользоваться и отписать об этом решении троллям (самому лениво на инглиш переводить) :) Если не поленитесь Вы, то не забудьте упоминуть, что баг кроется именно в QPainter::drawText(..., int justificationPadding). Думаю сами они быстрее с ним разберутся :)


Название: Re: QtWebKit и text-align. Ошибка отрисовки.
Отправлено: mugabe от Август 11, 2009, 09:05
Только что применяя свой же патч обнаружил его неработоспособность :)

Правильный код:
Код
C++ (Qt)
   QTextLayout layout(string, font());
   QTextLine line = setupLayout(&layout, run);
   QFontMetrics fm(font());
   int ascent = fm.ascent();
   QPointF pt(point.x(), point.y() - ascent);
   int flags = run.rtl() ? Qt::TextForceRightToLeft : Qt::TextForceLeftToRight;
   if (hasShadow) {
       // TODO: text shadow blur support
       p->save();
       p->setPen(QColor(shadowColor));
       p->translate(shadowSize.width(), shadowSize.height());
       line.draw(p, pt);
       p->restore();
   }
   line.draw(p, pt);