summaryrefslogtreecommitdiff
path: root/Source/WebKit2/WebProcess/WebPage/qt/LayerTreeHostQt.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-02-24 16:36:50 +0100
committerSimon Hausmann <simon.hausmann@nokia.com>2012-02-24 16:36:50 +0100
commitad0d549d4cc13433f77c1ac8f0ab379c83d93f28 (patch)
treeb34b0daceb7c8e7fdde4b4ec43650ab7caadb0a9 /Source/WebKit2/WebProcess/WebPage/qt/LayerTreeHostQt.cpp
parent03e12282df9aa1e1fb05a8b90f1cfc2e08764cec (diff)
downloadqtwebkit-ad0d549d4cc13433f77c1ac8f0ab379c83d93f28.tar.gz
Imported WebKit commit bb52bf3c0119e8a128cd93afe5572413a8617de9 (http://svn.webkit.org/repository/webkit/trunk@108790)
Diffstat (limited to 'Source/WebKit2/WebProcess/WebPage/qt/LayerTreeHostQt.cpp')
-rw-r--r--Source/WebKit2/WebProcess/WebPage/qt/LayerTreeHostQt.cpp72
1 files changed, 44 insertions, 28 deletions
diff --git a/Source/WebKit2/WebProcess/WebPage/qt/LayerTreeHostQt.cpp b/Source/WebKit2/WebProcess/WebPage/qt/LayerTreeHostQt.cpp
index fc1e85b21..0005ce8ee 100644
--- a/Source/WebKit2/WebProcess/WebPage/qt/LayerTreeHostQt.cpp
+++ b/Source/WebKit2/WebProcess/WebPage/qt/LayerTreeHostQt.cpp
@@ -52,8 +52,13 @@ PassRefPtr<LayerTreeHostQt> LayerTreeHostQt::create(WebPage* webPage)
LayerTreeHostQt::~LayerTreeHostQt()
{
- if (m_rootLayer)
- toWebGraphicsLayer(m_rootLayer.get())->setLayerTreeTileClient(0);
+ // Prevent setWebGraphicsLayerClient(0) -> detachLayer() from modifying the set while we iterate it.
+ HashSet<WebCore::WebGraphicsLayer*> registeredLayers;
+ registeredLayers.swap(m_registeredLayers);
+
+ HashSet<WebCore::WebGraphicsLayer*>::iterator end = registeredLayers.end();
+ for (HashSet<WebCore::WebGraphicsLayer*>::iterator it = registeredLayers.begin(); it != end; ++it)
+ (*it)->setWebGraphicsLayerClient(0);
}
LayerTreeHostQt::LayerTreeHostQt(WebPage* webPage)
@@ -63,12 +68,12 @@ LayerTreeHostQt::LayerTreeHostQt(WebPage* webPage)
#if USE(TILED_BACKING_STORE)
, m_waitingForUIProcess(false)
, m_isSuspended(false)
+ , m_contentsScale(1)
#endif
, m_shouldSyncFrame(false)
, m_shouldSyncRootLayer(true)
, m_layerFlushTimer(this, &LayerTreeHostQt::layerFlushTimerFired)
, m_layerFlushSchedulingEnabled(true)
- , m_shouldRecreateBackingStore(false)
{
// Create a root layer.
m_rootLayer = GraphicsLayer::create(this);
@@ -83,7 +88,7 @@ LayerTreeHostQt::LayerTreeHostQt(WebPage* webPage)
m_nonCompositedContentLayer = GraphicsLayer::create(this);
#if USE(TILED_BACKING_STORE)
- toWebGraphicsLayer(m_rootLayer.get())->setLayerTreeTileClient(this);
+ toWebGraphicsLayer(m_rootLayer.get())->setWebGraphicsLayerClient(this);
#endif
#ifndef NDEBUG
m_nonCompositedContentLayer->setName("LayerTreeHostQt non-composited content");
@@ -215,8 +220,6 @@ void LayerTreeHostQt::setPageOverlayNeedsDisplay(const WebCore::IntRect& rect)
bool LayerTreeHostQt::flushPendingLayerChanges()
{
- recreateBackingStoreIfNeeded();
-
bool didSync = m_webPage->corePage()->mainFrame()->view()->syncCompositingStateIncludingSubframes();
m_nonCompositedContentLayer->syncCompositingStateForThisLayerOnly();
if (m_pageOverlayLayer)
@@ -232,10 +235,20 @@ void LayerTreeHostQt::didSyncCompositingStateForLayer(const WebLayerInfo& info)
m_webPage->send(Messages::LayerTreeHostProxy::SyncCompositingLayerState(info));
}
-void LayerTreeHostQt::didDeleteLayer(WebLayerID id)
+void LayerTreeHostQt::attachLayer(WebGraphicsLayer* layer)
+{
+ ASSERT(!m_registeredLayers.contains(layer));
+ m_registeredLayers.add(layer);
+
+ layer->setContentsScale(m_contentsScale);
+ layer->adjustVisibleRect();
+}
+
+void LayerTreeHostQt::detachLayer(WebGraphicsLayer* layer)
{
+ m_registeredLayers.remove(layer);
m_shouldSyncFrame = true;
- m_webPage->send(Messages::LayerTreeHostProxy::DeleteCompositingLayer(id));
+ m_webPage->send(Messages::LayerTreeHostProxy::DeleteCompositingLayer(layer->id()));
}
void LayerTreeHostQt::performScheduledLayerFlush()
@@ -321,8 +334,6 @@ int64_t LayerTreeHostQt::adoptImageBackingStore(Image* image)
graphicsContext->drawImage(image, ColorSpaceDeviceRGB, IntPoint::zero());
}
- // Qt uses BGRA internally, we swizzle to RGBA for OpenGL.
- bitmap->swizzleRGB();
ShareableBitmap::Handle handle;
bitmap->createHandle(handle);
m_webPage->send(Messages::LayerTreeHostProxy::CreateDirectlyCompositedImage(key, handle));
@@ -396,22 +407,37 @@ void LayerTreeHostQt::updateTile(WebLayerID layerID, int tileID, const UpdateInf
{
m_webPage->send(Messages::LayerTreeHostProxy::UpdateTileForLayer(layerID, tileID, updateInfo));
}
+
void LayerTreeHostQt::removeTile(WebLayerID layerID, int tileID)
{
m_webPage->send(Messages::LayerTreeHostProxy::RemoveTileForLayer(layerID, tileID));
}
-void LayerTreeHostQt::setVisibleContentRectAndScale(const IntRect& rect, float scale)
+WebCore::IntRect LayerTreeHostQt::visibleContentsRect() const
{
- if (m_rootLayer) {
- toWebGraphicsLayer(m_rootLayer.get())->setVisibleContentRectAndScale(rect, scale);
- scheduleLayerFlush();
+ return m_visibleContentsRect;
+}
+
+void LayerTreeHostQt::setVisibleContentsRectForScaling(const IntRect& rect, float scale)
+{
+ m_visibleContentsRect = rect;
+ m_contentsScale = scale;
+
+ HashSet<WebCore::WebGraphicsLayer*>::iterator end = m_registeredLayers.end();
+ for (HashSet<WebCore::WebGraphicsLayer*>::iterator it = m_registeredLayers.begin(); it != end; ++it) {
+ (*it)->setContentsScale(scale);
+ (*it)->adjustVisibleRect();
}
+ scheduleLayerFlush();
}
-void LayerTreeHostQt::setVisibleContentRectTrajectoryVector(const FloatPoint& trajectoryVector)
+void LayerTreeHostQt::setVisibleContentsRectForPanning(const IntRect& rect, const FloatPoint& trajectoryVector)
{
+ m_visibleContentsRect = rect;
+
toWebGraphicsLayer(m_nonCompositedContentLayer.get())->setVisibleContentRectTrajectoryVector(trajectoryVector);
+
+ scheduleLayerFlush();
}
void LayerTreeHostQt::renderNextFrame()
@@ -427,22 +453,12 @@ bool LayerTreeHostQt::layerTreeTileUpdatesAllowed() const
void LayerTreeHostQt::purgeBackingStores()
{
- m_shouldRecreateBackingStore = true;
- WebGraphicsLayer* webRootLayer = toWebGraphicsLayer(m_rootLayer.get());
- webRootLayer->purgeBackingStores();
+ HashSet<WebCore::WebGraphicsLayer*>::iterator end = m_registeredLayers.end();
+ for (HashSet<WebCore::WebGraphicsLayer*>::iterator it = m_registeredLayers.begin(); it != end; ++it)
+ (*it)->purgeBackingStores();
ASSERT(!m_directlyCompositedImageRefCounts.size());
}
-
-void LayerTreeHostQt::recreateBackingStoreIfNeeded()
-{
- if (!m_shouldRecreateBackingStore)
- return;
-
- m_shouldRecreateBackingStore = false;
- WebGraphicsLayer* webRootLayer = toWebGraphicsLayer(m_rootLayer.get());
- webRootLayer->recreateBackingStoreIfNeeded();
-}
#endif
} // namespace WebKit