6c4dea8e7b9b6af2119f7fb24328f99154522c98
[framework/web/webkit-efl.git] / Source / WebKit2 / UIProcess / LayerTreeHostProxy.cpp
1 /*
2     Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
3
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Library General Public
6     License as published by the Free Software Foundation; either
7     version 2 of the License, or (at your option) any later version.
8
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12     Library General Public License for more details.
13
14     You should have received a copy of the GNU Library General Public License
15     along with this library; see the file COPYING.LIB.  If not, write to
16     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17     Boston, MA 02110-1301, USA.
18 */
19
20 #include "config.h"
21
22 #if USE(UI_SIDE_COMPOSITING)
23 #include "LayerTreeHostProxy.h"
24
25 #include "LayerTreeHostMessages.h"
26 #include "UpdateInfo.h"
27 #include "WebCoreArgumentCoders.h"
28 #include "WebLayerTreeInfo.h"
29 #include "WebLayerTreeRenderer.h"
30 #include "WebPageProxy.h"
31 #include "WebProcessProxy.h"
32
33 namespace WebKit {
34
35 using namespace WebCore;
36
37 LayerTreeHostProxy::LayerTreeHostProxy(DrawingAreaProxy* drawingAreaProxy)
38     : m_drawingAreaProxy(drawingAreaProxy)
39 #if !ENABLE(TIZEN_WEBKIT2_TILED_AC)
40     , m_renderer(adoptRef(new WebLayerTreeRenderer(this)))
41 #else
42     , m_renderer(adoptRef(new WebLayerTreeRenderer(this, drawingAreaProxy)))
43 #endif
44 {
45 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
46     m_renderer->setActive(true);
47 #endif
48 }
49
50 LayerTreeHostProxy::~LayerTreeHostProxy()
51 {
52     m_renderer->detach();
53 }
54
55 void LayerTreeHostProxy::updateViewport()
56 {
57     m_drawingAreaProxy->updateViewport();
58 }
59
60 void LayerTreeHostProxy::dispatchUpdate(const Function<void()>& function)
61 {
62     m_renderer->appendUpdate(function);
63 }
64
65 void LayerTreeHostProxy::createTileForLayer(int layerID, int tileID, const IntRect& targetRect, const WebKit::SurfaceUpdateInfo& updateInfo)
66 {
67     dispatchUpdate(bind(&WebLayerTreeRenderer::createTile, m_renderer.get(), layerID, tileID, updateInfo.scaleFactor));
68     updateTileForLayer(layerID, tileID, targetRect, updateInfo);
69 }
70
71 void LayerTreeHostProxy::updateTileForLayer(int layerID, int tileID, const IntRect& targetRect, const WebKit::SurfaceUpdateInfo& updateInfo)
72 {
73     RefPtr<ShareableSurface> surface = ShareableSurface::create(updateInfo.surfaceHandle);
74     dispatchUpdate(bind(&WebLayerTreeRenderer::updateTile, m_renderer.get(), layerID, tileID, WebLayerTreeRenderer::TileUpdate(updateInfo.updateRect, targetRect, surface, updateInfo.surfaceOffset)));
75 }
76
77 void LayerTreeHostProxy::removeTileForLayer(int layerID, int tileID)
78 {
79     dispatchUpdate(bind(&WebLayerTreeRenderer::removeTile, m_renderer.get(), layerID, tileID));
80 }
81
82 void LayerTreeHostProxy::deleteCompositingLayer(WebLayerID id)
83 {
84     dispatchUpdate(bind(&WebLayerTreeRenderer::deleteLayer, m_renderer.get(), id));
85 #if !ENABLE(TIZEN_WEBKIT2_TILED_AC)
86     // For efl port, we should not call updateViewport here immediately.
87     // This may trigger rendering with broken LayerTreeHost.
88     // And actually, we don't need to call this here, because it will be called by didRenderFrame for each update of LayerTreeHost.
89     updateViewport();
90 #endif
91 }
92
93 void LayerTreeHostProxy::setRootCompositingLayer(WebLayerID id)
94 {
95     dispatchUpdate(bind(&WebLayerTreeRenderer::setRootLayerID, m_renderer.get(), id));
96     updateViewport();
97 }
98
99 void LayerTreeHostProxy::setCompositingLayerState(WebLayerID id, const WebLayerInfo& info)
100 {
101     dispatchUpdate(bind(&WebLayerTreeRenderer::setLayerState, m_renderer.get(), id, info));
102 }
103
104 void LayerTreeHostProxy::setCompositingLayerChildren(WebLayerID id, const Vector<WebLayerID>& children)
105 {
106     dispatchUpdate(bind(&WebLayerTreeRenderer::setLayerChildren, m_renderer.get(), id, children));
107 }
108
109 #if ENABLE(CSS_FILTERS)
110 void LayerTreeHostProxy::setCompositingLayerFilters(WebLayerID id, const FilterOperations& filters)
111 {
112     dispatchUpdate(bind(&WebLayerTreeRenderer::setLayerFilters, m_renderer.get(), id, filters));
113 }
114 #endif
115
116 void LayerTreeHostProxy::didRenderFrame()
117 {
118 #if ENABLE(TIZEN_ONESHOT_DRAWING_SYNCHRONIZATION)
119     m_renderer->doOneShotDrawingSynchronization();
120 #endif
121 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
122     m_drawingAreaProxy->page()->updateLayoutAndScaleIfNeeded();
123 #endif
124 #if OS(TIZEN)
125     m_drawingAreaProxy->page()->didRenderFrame();
126 #endif
127     dispatchUpdate(bind(&WebLayerTreeRenderer::flushLayerChanges, m_renderer.get()));
128     updateViewport();
129 }
130
131 void LayerTreeHostProxy::createDirectlyCompositedImage(int64_t key, const WebKit::ShareableBitmap::Handle& handle)
132 {
133     RefPtr<ShareableBitmap> bitmap = ShareableBitmap::create(handle);
134     dispatchUpdate(bind(&WebLayerTreeRenderer::createImage, m_renderer.get(), key, bitmap));
135 }
136
137 void LayerTreeHostProxy::destroyDirectlyCompositedImage(int64_t key)
138 {
139     dispatchUpdate(bind(&WebLayerTreeRenderer::destroyImage, m_renderer.get(), key));
140 }
141
142 void LayerTreeHostProxy::setContentsSize(const FloatSize& contentsSize)
143 {
144     dispatchUpdate(bind(&WebLayerTreeRenderer::setContentsSize, m_renderer.get(), contentsSize));
145 }
146
147 void LayerTreeHostProxy::setVisibleContentsRect(const IntRect& rect, float scale, const FloatPoint& trajectoryVector, const WebCore::FloatPoint& accurateVisibleContentsPosition)
148 {
149     dispatchUpdate(bind(&WebLayerTreeRenderer::setVisibleContentsRect, m_renderer.get(), rect, scale, accurateVisibleContentsPosition));
150     m_drawingAreaProxy->page()->process()->send(Messages::LayerTreeHost::SetVisibleContentsRect(rect, scale, trajectoryVector), m_drawingAreaProxy->page()->pageID());
151 }
152
153 void LayerTreeHostProxy::renderNextFrame()
154 {
155     m_drawingAreaProxy->page()->process()->send(Messages::LayerTreeHost::RenderNextFrame(), m_drawingAreaProxy->page()->pageID());
156 }
157
158 void LayerTreeHostProxy::didChangeScrollPosition(const IntPoint& position)
159 {
160     dispatchUpdate(bind(&WebLayerTreeRenderer::didChangeScrollPosition, m_renderer.get(), position));
161 }
162
163 void LayerTreeHostProxy::purgeBackingStores()
164 {
165     m_renderer->setActive(false);
166     m_drawingAreaProxy->page()->process()->send(Messages::LayerTreeHost::PurgeBackingStores(), m_drawingAreaProxy->page()->pageID());
167 }
168
169 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
170 void LayerTreeHostProxy::clearBackingStores()
171 {
172     m_renderer->syncRemoteContent();
173     m_renderer->clearBackingStores();
174     purgeBackingStores();
175 }
176
177 void LayerTreeHostProxy::restoreBackingStores()
178 {
179     m_renderer->setActive(true);
180     renderNextFrame();
181 }
182 #endif
183
184 #if ENABLE(TIZEN_ONESHOT_DRAWING_SYNCHRONIZATION)
185 void LayerTreeHostProxy::setNeedsOneShotDrawingSynchronization()
186 {
187     m_renderer->setNeedsOneShotDrawingSynchronization();
188 }
189
190 void LayerTreeHostProxy::doOneShotDrawingSynchronization()
191 {
192     m_renderer->doOneShotDrawingSynchronization();
193 }
194 #endif
195
196 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION)
197 bool LayerTreeHostProxy::hasOverflowLayer() const
198 {
199     return m_renderer->scrollingContentsLayerCounts() ? true : false;
200 }
201 #endif
202
203 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION_ON_UI_SIDE)
204 bool LayerTreeHostProxy::setOffsetForFocusedScrollingContentsLayer(const WebCore::FloatPoint& offset)
205 {
206     return m_renderer && m_renderer->setOffset(m_renderer->focusedLayerID(), offset);
207 }
208
209 void LayerTreeHostProxy::setVisibleContentsRectForScrollingContentsLayers(const WebCore::IntRect& visibleRect)
210 {
211     if (m_renderer)
212         m_renderer->setVisibleContentsRectForScrollingContentsLayers(visibleRect);
213 }
214 #endif
215 }
216 #endif // USE(UI_SIDE_COMPOSITING)