Russian Qt Forum
Май 22, 2024, 18:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QtWebKit и text-align. Ошибка отрисовки.  (Прочитано 6987 раз)
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>
 

Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Апрель 15, 2009, 12:29 »

пиши баг репорт
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Vd
Гость
« Ответ #2 : Апрель 15, 2009, 19:49 »

Написал. Пока пришел только автоответ.
Записан
Vd
Гость
« Ответ #3 : Апрель 16, 2009, 18:40 »

Завели багу:
http://www.qtsoftware.com/developer/task-tracker/index_html?id=251319+&method=entry
Записан
mugabe
Гость
« Ответ #4 : Апрель 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). Думаю сами они быстрее с ним разберутся Улыбающийся
Записан
mugabe
Гость
« Ответ #5 : Август 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);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 20.