summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-05-07 11:21:11 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-05-07 11:21:11 +0200
commit2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (patch)
tree988e8c5b116dd0466244ae2fe5af8ee9be926d76 /Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp
parentdd91e772430dc294e3bf478c119ef8d43c0a3358 (diff)
downloadqtwebkit-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.cpp125
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()