diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-24 16:36:50 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-24 16:36:50 +0100 |
commit | ad0d549d4cc13433f77c1ac8f0ab379c83d93f28 (patch) | |
tree | b34b0daceb7c8e7fdde4b4ec43650ab7caadb0a9 /Source/WebKit2/WebProcess/WebPage/qt/LayerTreeHostQt.cpp | |
parent | 03e12282df9aa1e1fb05a8b90f1cfc2e08764cec (diff) | |
download | qtwebkit-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.cpp | 72 |
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 |