Форум программистов, компьютерный форум CyberForum.ru

Движок WebKit. Алгоритм рендеринга страниц - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 5.00
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
25.08.2011, 11:25     Движок WebKit. Алгоритм рендеринга страниц #1
Привет) Может кто знаком с этим движком для браузеров. Подскажите, где там происходит рендеринг страниц. Разбор кода страницы и вывод всего этого на экран.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2011, 11:25     Движок WebKit. Алгоритм рендеринга страниц
Посмотрите здесь:

C++ 3d движок
C++ речевой движок!
голосовой движок C++
C++ Физический движок
Алгоритм замещения страниц LRU с помощью методов библиотеки STL C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
25.08.2011, 12:50     Движок WebKit. Алгоритм рендеринга страниц #2
[progeR], документация на офф. сайте движка: http://trac.webkit.org/wiki
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,215
Завершенные тесты: 1
26.08.2011, 00:35     Движок WebKit. Алгоритм рендеринга страниц #3
где там происходит рендеринг страниц
Ну поковыряйте
QWebFramePrivate
C++
1
void QWebFramePrivate::renderPrivate(QPainter *painter, QWebFrame::RenderLayer layer, const QRegion &clip)
%QT_SOURCES_PATH%/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp
, ну и
WebCore::FrameView
C++
1
void WebCore::FrameView::paintContents(GraphicsContext* paintContents, const QRect & rect)
.

Хотя, сомневаюсь, что Вам нужно в такие потроха лезть, вот
пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 class Thumbnailer : public QObject
 {
     Q_OBJECT
 
 public:
     Thumbnailer(const QUrl &url);
 
 signals:
     void finished();
 
 private slots:
     void render();
 
 private:
     QWebPage page;
 
 };
 Thumbnailer::Thumbnailer(const QUrl &url)
 {
     page.mainFrame()->load(url);
     connect(&page, SIGNAL(loadFinished(bool)),
         this, SLOT(render()));
 }
 
 void Thumbnailer::render()
 {
     page.setViewportSize(page.mainFrame()->contentsSize());
     QImage image(page.viewportSize(), QImage::Format_ARGB32);
     QPainter painter(&image);
 
     page.mainFrame()->render(&painter);
     painter.end();
 
     QImage thumbnail = image.scaled(400, 400);
     thumbnail.save("thumbnail.png");
 
     emit finished();
 }
рендеринга страницы в png изображение (из оф. документации).
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
26.08.2011, 10:42  [ТС]     Движок WebKit. Алгоритм рендеринга страниц #4
Спасибо. Но под рендерингом имелось ввиду вывод содержимого страницы на экран. В конечном итоге мне нужен алгоритм (а лучше, если есть готовые методы), чтобы рассчитать высоту страницы (не выводя ее на экран!). Наверника в WebKit это где-то зашито.
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,215
Завершенные тесты: 1
26.08.2011, 17:40     Движок WebKit. Алгоритм рендеринга страниц #5
Но под рендерингом имелось ввиду вывод содержимого страницы на экран
Ну а это что по вашему?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//...
void QWebView::paintEvent(QPaintEvent *ev)
{
    if (!d->page)
        return;
#ifdef QWEBKIT_TIME_RENDERING
    QTime time;
    time.start();
#endif
 
    QWebFrame *frame = d->page->mainFrame();
    QPainter p(this);
    p.setRenderHints(d->renderHints);
 
    frame->render(&p, ev->region());
 
#ifdef    QWEBKIT_TIME_RENDERING
    int elapsed = time.elapsed();
    qDebug() << "paint event on " << ev->region() << ", took to render =  " << elapsed;
#endif
}
//...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//...
/*!
  \since 4.6
  Render the \a layer of the frame using \a painter clipping to \a clip.
 
  \sa print()
*/
 
void QWebFrame::render(QPainter* painter, RenderLayer layer, const QRegion& clip)
{
    if (!clip.isEmpty())
        d->renderPrivate(painter, layer, clip);
    else if (d->frame->view())
        d->renderPrivate(painter, layer, QRegion(d->frame->view()->frameRect()));
}
 
/*!
  Render the frame into \a painter clipping to \a clip.
*/
void QWebFrame::render(QPainter *painter, const QRegion &clip)
{
    d->renderPrivate(painter, AllLayers, clip);
}
//...
и т.д.

чтобы рассчитать высоту страницы (не выводя ее на экран!)
возможно поможет
C++
1
QSize QWebFrame::contentsSize() const
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
27.08.2011, 17:20  [ТС]     Движок WebKit. Алгоритм рендеринга страниц #6
Цитата Сообщение от schdub Посмотреть сообщение
возможно поможет
C++
1
QSize QWebFrame::contentsSize() const
Нет, не помогло. Выдает 0. Он работает только после отображения страницы.
Эх, нужен алгоритм. Где ж идет предъобработка-то?...

Добавлено через 19 часов 56 минут
Может этим чувакам написать, они -то должны знать. Только вот не форума, не электронной почты у них нет...
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,215
Завершенные тесты: 1
27.08.2011, 19:29     Движок WebKit. Алгоритм рендеринга страниц #7
Нет, не помогло. Выдает 0. Он работает только после отображения страницы.
Хз, как Вы проверяли, код показывайте.

У меня почему-то работает.

Пример:

showcontents.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#ifndef __SHOWCONTENTSIZE_H__
#define __SHOWCONTENTSIZE_H__
 
#include <QWebPage>
#include <QWebFrame>
#include <QUrl>
#include <QDebug>
 
class ShowContentSize : public QObject
{
    Q_OBJECT
 
public:
 
    ShowContentSize(const QString & url)
        : url_(url)
    {
        QObject::connect(page_.mainFrame(), SIGNAL(loadFinished(bool)),
                         this, SLOT(onLoaded(bool)));
        page_.mainFrame()->load(url_);
    }
 
public slots:
 
    void onLoaded(bool ok)
    {
 
        qDebug() << page_.mainFrame()->contentsSize();
 
    }
 
private:
    QWebPage page_;
    QUrl     url_;
};
 
#endif // __SHOWCONTENTSIZE_H__


main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "showcontentsize.h"
 
#include <QApplication>
 
int main(int argc, char * argv[])
{
    QApplication app(argc, argv);
 
    ShowContentSize * g = new ShowContentSize("http://google.com/");
 
    return app.exec();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2011, 21:42     Движок WebKit. Алгоритм рендеринга страниц
Еще ссылки по теме:

C++ Игровой движок!
Движок для платформеров C++
C++ Игровой движок

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
27.08.2011, 21:42  [ТС]     Движок WebKit. Алгоритм рендеринга страниц #8
Хм, получилось. Но ооочень долго. Даже без вывода на экран, расчет layout оказался таким же долгим. В то время как все браузеры открывают мою страницу фактически в миг.


Сам Webkit я скачал, посмотрел, он оказался большим. Поэтому и спрашиваю.

Добавлено через 11 минут
Не знаю, может долго оттого, что я работаю в режиме debug, а не realise...
Yandex
Объявления
27.08.2011, 21:42     Движок WebKit. Алгоритм рендеринга страниц
Ответ Создать тему
Опции темы

Текущее время: 06:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru