diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-07 11:21:11 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-07 11:21:11 +0200 |
commit | 2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (patch) | |
tree | 988e8c5b116dd0466244ae2fe5af8ee9be926d76 /Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp | |
parent | dd91e772430dc294e3bf478c119ef8d43c0a3358 (diff) | |
download | qtwebkit-2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47.tar.gz |
Imported WebKit commit 7e538425aa020340619e927792f3d895061fb54b (http://svn.webkit.org/repository/webkit/trunk@116286)
Diffstat (limited to 'Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp | 125 |
1 files changed, 20 insertions, 105 deletions
diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp b/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp index 9293c972f..203c72b7e 100644 --- a/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp +++ b/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp @@ -23,18 +23,18 @@ #include "LayerTreeHostProxy.h" #include "QtWebPageEventHandler.h" +#include "QtWebPageSGNode.h" #include "TransformationMatrix.h" #include "WebLayerTreeRenderer.h" +#include "WebPageProxy.h" #include "qquickwebpage_p_p.h" #include "qquickwebview_p.h" -#include <QPolygonF> #include <QtQuick/QQuickCanvas> -#include <QtQuick/QSGGeometryNode> -#include <QtQuick/QSGMaterial> -#include <private/qsgrendernode_p.h> + +using namespace WebKit; QQuickWebPage::QQuickWebPage(QQuickWebView* viewportItem) - : QQuickItem(viewportItem) + : QQuickItem(viewportItem->contentItem()) , d(new QQuickWebPagePrivate(this, viewportItem)) { setFlag(ItemHasContents); @@ -66,98 +66,16 @@ void QQuickWebPagePrivate::initialize(WebKit::WebPageProxy* webPageProxy) eventHandler.reset(new QtWebPageEventHandler(toAPI(webPageProxy), q, viewportItem)); } -void QQuickWebPagePrivate::setDrawingAreaSize(const QSize& size) +void QQuickWebPagePrivate::paint(QPainter* painter) { - DrawingAreaProxy* drawingArea = webPageProxy->drawingArea(); - if (!drawingArea) + if (!webPageProxy->drawingArea()) return; - drawingArea->setSize(WebCore::IntSize(size), WebCore::IntSize()); -} -void QQuickWebPagePrivate::paint(QPainter* painter) -{ - if (webPageProxy->drawingArea()) - webPageProxy->drawingArea()->paintLayerTree(painter); + LayerTreeHostProxy* layerTreeHostProxy = webPageProxy->drawingArea()->layerTreeHostProxy(); + if (layerTreeHostProxy->layerTreeRenderer()) + layerTreeHostProxy->layerTreeRenderer()->paintToGraphicsContext(painter); } -struct PageProxyNode : public QSGRenderNode { - PageProxyNode(PassRefPtr<WebLayerTreeRenderer> renderer) - : m_renderer(renderer) - , m_scale(1) - { - } - - virtual StateFlags changedStates() - { - return StateFlags(StencilState) | ColorState | BlendState; - } - - virtual void render(const RenderState&) - { - QMatrix4x4 renderMatrix = matrix() ? *matrix() : QMatrix4x4(); - - // Have to apply render scale manualy because it is not applied on page item. - // http://trac.webkit.org/changeset/104450 - renderMatrix.scale(m_scale); - - // FIXME: Support non-rectangular clippings. - layerTreeRenderer()->paintToCurrentGLContext(renderMatrix, inheritedOpacity(), clipRect()); - } - - ~PageProxyNode() - { - layerTreeRenderer()->purgeGLResources(); - } - - WebLayerTreeRenderer* layerTreeRenderer() const { return m_renderer.get(); } - void setScale(float scale) { m_scale = scale; } - -private: - QRectF clipRect() const - { - // Start with an invalid rect. - QRectF resultRect(0, 0, -1, -1); - - for (const QSGClipNode* clip = clipList(); clip; clip = clip->clipList()) { - QMatrix4x4 clipMatrix; - if (clip->matrix()) - clipMatrix = *clip->matrix(); - QRectF currentClip; - - if (clip->isRectangular()) - currentClip = clipMatrix.mapRect(clip->clipRect()); - else { - const QSGGeometry* geometry = clip->geometry(); - // Assume here that clipNode has only coordinate data. - const QSGGeometry::Point2D* geometryPoints = geometry->vertexDataAsPoint2D(); - - // Clip region should be at least triangle to make valid clip. - if (geometry->vertexCount() < 3) - continue; - - QPolygonF polygon; - - for (int i = 0; i < geometry->vertexCount(); i++) - polygon.append(clipMatrix.map(QPoint(geometryPoints[i].x, geometryPoints[i].y))); - currentClip = polygon.boundingRect(); - } - - if (currentClip.isEmpty()) - continue; - - if (resultRect.isValid()) - resultRect &= currentClip; - else - resultRect = currentClip; - } - - return resultRect; - } - - RefPtr<WebLayerTreeRenderer> m_renderer; - float m_scale; -}; - QSGNode* QQuickWebPage::updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData*) { if (!d->webPageProxy->drawingArea()) @@ -166,21 +84,16 @@ QSGNode* QQuickWebPage::updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData*) LayerTreeHostProxy* layerTreeHostProxy = d->webPageProxy->drawingArea()->layerTreeHostProxy(); WebLayerTreeRenderer* renderer = layerTreeHostProxy->layerTreeRenderer(); - PageProxyNode* node = static_cast<PageProxyNode*>(oldNode); - - if (node && node->layerTreeRenderer() != renderer) { - // This means that LayerTreeHostProxy was deleted and recreated while old paint node survived. - // This could happen if web process have crashed. In this case we have to recreate paint node. - delete node; - node = 0; - } - - renderer->syncRemoteContent(); - + QtWebPageSGNode* node = static_cast<QtWebPageSGNode*>(oldNode); if (!node) - node = new PageProxyNode(renderer); + node = new QtWebPageSGNode(); + node->setRenderer(renderer); + renderer->syncRemoteContent(); node->setScale(d->contentsScale); + QColor backgroundColor = d->webPageProxy->drawsTransparentBackground() ? Qt::transparent : Qt::white; + QRectF backgroundRect(QPointF(0, 0), d->contentsSize); + node->setBackground(backgroundRect, backgroundColor); return node; } @@ -197,7 +110,6 @@ void QQuickWebPage::setContentsSize(const QSizeF& size) d->contentsSize = size; d->updateSize(); - d->setDrawingAreaSize(d->contentsSize.toSize()); } const QSizeF& QQuickWebPage::contentsSize() const @@ -234,6 +146,9 @@ void QQuickWebPagePrivate::updateSize() QSizeF scaledSize = contentsSize * contentsScale; q->setSize(scaledSize); viewportItem->updateContentsSize(scaledSize); + DrawingAreaProxy* drawingArea = webPageProxy->drawingArea(); + if (drawingArea && drawingArea->layerTreeHostProxy()) + drawingArea->layerTreeHostProxy()->setContentsSize(WebCore::FloatSize(contentsSize.width(), contentsSize.height())); } QQuickWebPagePrivate::~QQuickWebPagePrivate() |