/* Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies) Copyright (C) 2013 Company 100, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #if USE(COORDINATED_GRAPHICS) #include "CoordinatedLayerTreeHostProxy.h" #include "CoordinatedDrawingAreaProxy.h" #include "CoordinatedLayerTreeHostMessages.h" #include "CoordinatedLayerTreeHostProxyMessages.h" #include "WebPageProxy.h" #include "WebProcessProxy.h" #include namespace WebKit { using namespace WebCore; CoordinatedLayerTreeHostProxy::CoordinatedLayerTreeHostProxy(CoordinatedDrawingAreaProxy* drawingAreaProxy) : m_drawingAreaProxy(drawingAreaProxy) , m_scene(adoptRef(new CoordinatedGraphicsScene(this))) { m_drawingAreaProxy->page()->process().addMessageReceiver(Messages::CoordinatedLayerTreeHostProxy::messageReceiverName(), m_drawingAreaProxy->page()->pageID(), *this); } CoordinatedLayerTreeHostProxy::~CoordinatedLayerTreeHostProxy() { m_drawingAreaProxy->page()->process().removeMessageReceiver(Messages::CoordinatedLayerTreeHostProxy::messageReceiverName(), m_drawingAreaProxy->page()->pageID()); m_scene->detach(); } void CoordinatedLayerTreeHostProxy::updateViewport() { m_drawingAreaProxy->updateViewport(); } void CoordinatedLayerTreeHostProxy::dispatchUpdate(std::function function) { m_scene->appendUpdate(WTF::move(function)); } void CoordinatedLayerTreeHostProxy::commitCoordinatedGraphicsState(const CoordinatedGraphicsState& graphicsState) { RefPtr sceneProtector(m_scene); dispatchUpdate([=] { sceneProtector->commitSceneState(graphicsState); }); updateViewport(); #if USE(TILED_BACKING_STORE) m_drawingAreaProxy->page()->didRenderFrame(graphicsState.contentsSize, graphicsState.coveredRect); #endif } void CoordinatedLayerTreeHostProxy::setVisibleContentsRect(const FloatRect& rect, const FloatPoint& trajectoryVector) { // Inform the renderer to adjust viewport-fixed layers. RefPtr sceneProtector(m_scene); const FloatPoint& scrollPosition = rect.location(); dispatchUpdate([=] { sceneProtector->setScrollPosition(scrollPosition); }); if (rect == m_lastSentVisibleRect && trajectoryVector == m_lastSentTrajectoryVector) return; m_drawingAreaProxy->page()->process().send(Messages::CoordinatedLayerTreeHost::SetVisibleContentsRect(rect, trajectoryVector), m_drawingAreaProxy->page()->pageID()); m_lastSentVisibleRect = rect; m_lastSentTrajectoryVector = trajectoryVector; } void CoordinatedLayerTreeHostProxy::renderNextFrame() { m_drawingAreaProxy->page()->process().send(Messages::CoordinatedLayerTreeHost::RenderNextFrame(), m_drawingAreaProxy->page()->pageID()); } void CoordinatedLayerTreeHostProxy::purgeBackingStores() { m_drawingAreaProxy->page()->process().send(Messages::CoordinatedLayerTreeHost::PurgeBackingStores(), m_drawingAreaProxy->page()->pageID()); } void CoordinatedLayerTreeHostProxy::setBackgroundColor(const Color& color) { RefPtr sceneProtector(m_scene); dispatchUpdate([=] { sceneProtector->setBackgroundColor(color); }); } void CoordinatedLayerTreeHostProxy::commitScrollOffset(uint32_t layerID, const IntSize& offset) { m_drawingAreaProxy->page()->process().send(Messages::CoordinatedLayerTreeHost::CommitScrollOffset(layerID, offset), m_drawingAreaProxy->page()->pageID()); } } #endif // USE(COORDINATED_GRAPHICS)