1 /*
2 Copyright (C) 2009 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 #include "GraphicsLayerTextureMapper.h"
22
23 #include "TextureMapperNode.h"
24
25 namespace WebCore {
26
GraphicsLayerTextureMapper(GraphicsLayerClient * client)27 GraphicsLayerTextureMapper::GraphicsLayerTextureMapper(GraphicsLayerClient* client)
28 : GraphicsLayer(client)
29 , m_node(new TextureMapperNode())
30 , m_changeMask(0)
31 {
32 }
33
notifyChange(TextureMapperNode::ChangeMask changeMask)34 void GraphicsLayerTextureMapper::notifyChange(TextureMapperNode::ChangeMask changeMask)
35 {
36 m_changeMask |= changeMask;
37 if (!client())
38 return;
39 client()->notifySyncRequired(this);
40 }
41
didSynchronize()42 void GraphicsLayerTextureMapper::didSynchronize()
43 {
44 m_syncQueued = false;
45 m_changeMask = 0;
46 m_pendingContent.needsDisplay = false;
47 m_pendingContent.needsDisplayRect = IntRect();
48 }
49
setName(const String & name)50 void GraphicsLayerTextureMapper::setName(const String& name)
51 {
52 GraphicsLayer::setName(name);
53 }
54
~GraphicsLayerTextureMapper()55 GraphicsLayerTextureMapper::~GraphicsLayerTextureMapper()
56 {
57 }
58
59 /* \reimp (GraphicsLayer.h): The current size might change, thus we need to update the whole display.
60 */
setNeedsDisplay()61 void GraphicsLayerTextureMapper::setNeedsDisplay()
62 {
63 m_pendingContent.needsDisplay = true;
64 notifyChange(TextureMapperNode::DisplayChange);
65 }
66
67 /* \reimp (GraphicsLayer.h)
68 */
setNeedsDisplayInRect(const FloatRect & rect)69 void GraphicsLayerTextureMapper::setNeedsDisplayInRect(const FloatRect& rect)
70 {
71 if (m_pendingContent.needsDisplay)
72 return;
73 m_pendingContent.needsDisplayRect.unite(IntRect(rect));
74 notifyChange(TextureMapperNode::DisplayChange);
75 }
76
77 /* \reimp (GraphicsLayer.h)
78 */
setParent(GraphicsLayer * layer)79 void GraphicsLayerTextureMapper::setParent(GraphicsLayer* layer)
80 {
81 notifyChange(TextureMapperNode::ParentChange);
82 GraphicsLayer::setParent(layer);
83 }
84
85 /* \reimp (GraphicsLayer.h)
86 */
setChildren(const Vector<GraphicsLayer * > & children)87 bool GraphicsLayerTextureMapper::setChildren(const Vector<GraphicsLayer*>& children)
88 {
89 notifyChange(TextureMapperNode::ChildrenChange);
90 return GraphicsLayer::setChildren(children);
91 }
92
93 /* \reimp (GraphicsLayer.h)
94 */
addChild(GraphicsLayer * layer)95 void GraphicsLayerTextureMapper::addChild(GraphicsLayer* layer)
96 {
97 notifyChange(TextureMapperNode::ChildrenChange);
98 GraphicsLayer::addChild(layer);
99 }
100
101 /* \reimp (GraphicsLayer.h)
102 */
addChildAtIndex(GraphicsLayer * layer,int index)103 void GraphicsLayerTextureMapper::addChildAtIndex(GraphicsLayer* layer, int index)
104 {
105 GraphicsLayer::addChildAtIndex(layer, index);
106 notifyChange(TextureMapperNode::ChildrenChange);
107 }
108
109 /* \reimp (GraphicsLayer.h)
110 */
addChildAbove(GraphicsLayer * layer,GraphicsLayer * sibling)111 void GraphicsLayerTextureMapper::addChildAbove(GraphicsLayer* layer, GraphicsLayer* sibling)
112 {
113 GraphicsLayer::addChildAbove(layer, sibling);
114 notifyChange(TextureMapperNode::ChildrenChange);
115 }
116
117 /* \reimp (GraphicsLayer.h)
118 */
addChildBelow(GraphicsLayer * layer,GraphicsLayer * sibling)119 void GraphicsLayerTextureMapper::addChildBelow(GraphicsLayer* layer, GraphicsLayer* sibling)
120 {
121
122 GraphicsLayer::addChildBelow(layer, sibling);
123 notifyChange(TextureMapperNode::ChildrenChange);
124 }
125
126 /* \reimp (GraphicsLayer.h)
127 */
replaceChild(GraphicsLayer * oldChild,GraphicsLayer * newChild)128 bool GraphicsLayerTextureMapper::replaceChild(GraphicsLayer* oldChild, GraphicsLayer* newChild)
129 {
130 if (GraphicsLayer::replaceChild(oldChild, newChild)) {
131 notifyChange(TextureMapperNode::ChildrenChange);
132 return true;
133 }
134 return false;
135 }
136
137 /* \reimp (GraphicsLayer.h)
138 */
removeFromParent()139 void GraphicsLayerTextureMapper::removeFromParent()
140 {
141 if (!parent())
142 return;
143 notifyChange(TextureMapperNode::ParentChange);
144 GraphicsLayer::removeFromParent();
145 }
146
147 /* \reimp (GraphicsLayer.h)
148 */
setMaskLayer(GraphicsLayer * value)149 void GraphicsLayerTextureMapper::setMaskLayer(GraphicsLayer* value)
150 {
151 if (value == maskLayer())
152 return;
153 GraphicsLayer::setMaskLayer(value);
154 notifyChange(TextureMapperNode::MaskLayerChange);
155 }
156
157
158 /* \reimp (GraphicsLayer.h)
159 */
setReplicatedByLayer(GraphicsLayer * value)160 void GraphicsLayerTextureMapper::setReplicatedByLayer(GraphicsLayer* value)
161 {
162 if (value == replicaLayer())
163 return;
164 GraphicsLayer::setReplicatedByLayer(value);
165 notifyChange(TextureMapperNode::ReplicaLayerChange);
166 }
167
168 /* \reimp (GraphicsLayer.h)
169 */
setPosition(const FloatPoint & value)170 void GraphicsLayerTextureMapper::setPosition(const FloatPoint& value)
171 {
172 if (value == position())
173 return;
174 GraphicsLayer::setPosition(value);
175 notifyChange(TextureMapperNode::PositionChange);
176 }
177
178 /* \reimp (GraphicsLayer.h)
179 */
setAnchorPoint(const FloatPoint3D & value)180 void GraphicsLayerTextureMapper::setAnchorPoint(const FloatPoint3D& value)
181 {
182 if (value == anchorPoint())
183 return;
184 GraphicsLayer::setAnchorPoint(value);
185 notifyChange(TextureMapperNode::AnchorPointChange);
186 }
187
188 /* \reimp (GraphicsLayer.h)
189 */
setSize(const FloatSize & value)190 void GraphicsLayerTextureMapper::setSize(const FloatSize& value)
191 {
192 if (value == size())
193 return;
194
195 GraphicsLayer::setSize(value);
196 notifyChange(TextureMapperNode::SizeChange);
197 }
198
199 /* \reimp (GraphicsLayer.h)
200 */
setTransform(const TransformationMatrix & value)201 void GraphicsLayerTextureMapper::setTransform(const TransformationMatrix& value)
202 {
203 if (value == transform())
204 return;
205
206 GraphicsLayer::setTransform(value);
207 notifyChange(TextureMapperNode::TransformChange);
208 }
209
210 /* \reimp (GraphicsLayer.h)
211 */
setChildrenTransform(const TransformationMatrix & value)212 void GraphicsLayerTextureMapper::setChildrenTransform(const TransformationMatrix& value)
213 {
214 if (value == childrenTransform())
215 return;
216 GraphicsLayer::setChildrenTransform(value);
217 notifyChange(TextureMapperNode::ChildrenTransformChange);
218 }
219
220 /* \reimp (GraphicsLayer.h)
221 */
setPreserves3D(bool value)222 void GraphicsLayerTextureMapper::setPreserves3D(bool value)
223 {
224 if (value == preserves3D())
225 return;
226 GraphicsLayer::setPreserves3D(value);
227 notifyChange(TextureMapperNode::Preserves3DChange);
228 }
229
230 /* \reimp (GraphicsLayer.h)
231 */
setMasksToBounds(bool value)232 void GraphicsLayerTextureMapper::setMasksToBounds(bool value)
233 {
234 if (value == masksToBounds())
235 return;
236 GraphicsLayer::setMasksToBounds(value);
237 notifyChange(TextureMapperNode::MasksToBoundsChange);
238 }
239
240 /* \reimp (GraphicsLayer.h)
241 */
setDrawsContent(bool value)242 void GraphicsLayerTextureMapper::setDrawsContent(bool value)
243 {
244 if (value == drawsContent())
245 return;
246 notifyChange(TextureMapperNode::DrawsContentChange);
247 GraphicsLayer::setDrawsContent(value);
248 }
249
250 /* \reimp (GraphicsLayer.h)
251 */
setBackgroundColor(const Color & value)252 void GraphicsLayerTextureMapper::setBackgroundColor(const Color& value)
253 {
254 if (value == m_pendingContent.backgroundColor)
255 return;
256 m_pendingContent.backgroundColor = value;
257 GraphicsLayer::setBackgroundColor(value);
258 notifyChange(TextureMapperNode::BackgroundColorChange);
259 }
260
261 /* \reimp (GraphicsLayer.h)
262 */
clearBackgroundColor()263 void GraphicsLayerTextureMapper::clearBackgroundColor()
264 {
265 if (!m_pendingContent.backgroundColor.isValid())
266 return;
267 m_pendingContent.backgroundColor = Color();
268 GraphicsLayer::clearBackgroundColor();
269 notifyChange(TextureMapperNode::BackgroundColorChange);
270 }
271
272 /* \reimp (GraphicsLayer.h)
273 */
setContentsOpaque(bool value)274 void GraphicsLayerTextureMapper::setContentsOpaque(bool value)
275 {
276 if (value == contentsOpaque())
277 return;
278 notifyChange(TextureMapperNode::ContentsOpaqueChange);
279 GraphicsLayer::setContentsOpaque(value);
280 }
281
282 /* \reimp (GraphicsLayer.h)
283 */
setBackfaceVisibility(bool value)284 void GraphicsLayerTextureMapper::setBackfaceVisibility(bool value)
285 {
286 if (value == backfaceVisibility())
287 return;
288 GraphicsLayer::setBackfaceVisibility(value);
289 notifyChange(TextureMapperNode::BackfaceVisibilityChange);
290 }
291
292 /* \reimp (GraphicsLayer.h)
293 */
setOpacity(float value)294 void GraphicsLayerTextureMapper::setOpacity(float value)
295 {
296 if (value == opacity())
297 return;
298 GraphicsLayer::setOpacity(value);
299 notifyChange(TextureMapperNode::OpacityChange);
300 }
301
302 /* \reimp (GraphicsLayer.h)
303 */
setContentsRect(const IntRect & value)304 void GraphicsLayerTextureMapper::setContentsRect(const IntRect& value)
305 {
306 if (value == contentsRect())
307 return;
308 GraphicsLayer::setContentsRect(value);
309 notifyChange(TextureMapperNode::ContentsRectChange);
310 }
311
312 /* \reimp (GraphicsLayer.h)
313 */
setContentsToImage(Image * image)314 void GraphicsLayerTextureMapper::setContentsToImage(Image* image)
315 {
316 notifyChange(TextureMapperNode::ContentChange);
317 m_pendingContent.contentType = image ? TextureMapperNode::DirectImageContentType : TextureMapperNode::HTMLContentType;
318 m_pendingContent.image = image;
319 GraphicsLayer::setContentsToImage(image);
320 }
321
322 /* \reimp (GraphicsLayer.h)
323 */
setContentsBackgroundColor(const Color & color)324 void GraphicsLayerTextureMapper::setContentsBackgroundColor(const Color& color)
325 {
326 notifyChange(TextureMapperNode::ContentChange);
327 m_pendingContent.contentType = TextureMapperNode::ColorContentType;
328 m_pendingContent.backgroundColor = color;
329 GraphicsLayer::setContentsBackgroundColor(color);
330 }
331
332
setContentsToMedia(PlatformLayer * media)333 void GraphicsLayerTextureMapper::setContentsToMedia(PlatformLayer* media)
334 {
335 GraphicsLayer::setContentsToMedia(media);
336 notifyChange(TextureMapperNode::ContentChange);
337 m_pendingContent.contentType = media ? TextureMapperNode::MediaContentType : TextureMapperNode::HTMLContentType;
338 if (media)
339 m_pendingContent.media = static_cast<TextureMapperMediaLayer*>(media);
340 else
341 m_pendingContent.media = 0;
342 }
343
344 /* \reimp (GraphicsLayer.h)
345 */
setContentsOrientation(CompositingCoordinatesOrientation orientation)346 void GraphicsLayerTextureMapper::setContentsOrientation(CompositingCoordinatesOrientation orientation)
347 {
348 if (contentsOrientation() == orientation)
349 return;
350 notifyChange(TextureMapperNode::ContentsOrientationChange);
351 GraphicsLayer::setContentsOrientation(orientation);
352 }
353
354 /* \reimp (GraphicsLayer.h)
355 */
syncCompositingStateForThisLayerOnly()356 void GraphicsLayerTextureMapper::syncCompositingStateForThisLayerOnly()
357 {
358 m_node->syncCompositingState(this, false);
359 }
360
361 /* \reimp (GraphicsLayer.h)
362 */
syncCompositingState()363 void GraphicsLayerTextureMapper::syncCompositingState()
364 {
365 m_node->syncCompositingState(this, true);
366 }
367
368 /* \reimp (GraphicsLayer.h)
369 */
platformLayer() const370 PlatformLayer* GraphicsLayerTextureMapper::platformLayer() const
371 {
372 return m_node.get();
373 }
374
create(GraphicsLayerClient * client)375 PassOwnPtr<GraphicsLayer> GraphicsLayer::create(GraphicsLayerClient* client)
376 {
377 return new GraphicsLayerTextureMapper(client);
378 }
379
380 }
381