1 /*
2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * Copyright (C) 2009 Apple Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
14 * distribution.
15 * * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32
33 /** FIXME
34 * This file borrows code heavily from platform/graphics/win/GraphicsLayerCACF.cpp
35 * (and hence it includes both copyrights)
36 * Ideally the common code (mostly the code that keeps track of the layer hierarchy)
37 * should be kept separate and shared between platforms. It would be a well worthwhile
38 * effort once the Windows implementation (binaries and headers) of CoreAnimation is
39 * checked in to the WebKit repository. Until then only Apple can make this happen.
40 */
41
42 #include "config.h"
43
44 #if USE(ACCELERATED_COMPOSITING)
45
46 #include "GraphicsLayerChromium.h"
47
48 #include "Canvas2DLayerChromium.h"
49 #include "ContentLayerChromium.h"
50 #include "DrawingBuffer.h"
51 #include "FloatConversion.h"
52 #include "FloatRect.h"
53 #include "Image.h"
54 #include "ImageLayerChromium.h"
55 #include "LayerChromium.h"
56 #include "PlatformString.h"
57 #include "SystemTime.h"
58
59 #include <wtf/CurrentTime.h>
60 #include <wtf/StringExtras.h>
61 #include <wtf/text/CString.h>
62
63 using namespace std;
64
65 namespace WebCore {
66
setLayerBorderColor(LayerChromium & layer,const Color & color)67 static void setLayerBorderColor(LayerChromium& layer, const Color& color)
68 {
69 layer.setBorderColor(color);
70 }
71
clearBorderColor(LayerChromium & layer)72 static void clearBorderColor(LayerChromium& layer)
73 {
74 layer.setBorderColor(static_cast<RGBA32>(0));
75 }
76
setLayerBackgroundColor(LayerChromium & layer,const Color & color)77 static void setLayerBackgroundColor(LayerChromium& layer, const Color& color)
78 {
79 layer.setBackgroundColor(color);
80 }
81
clearLayerBackgroundColor(LayerChromium & layer)82 static void clearLayerBackgroundColor(LayerChromium& layer)
83 {
84 layer.setBackgroundColor(static_cast<RGBA32>(0));
85 }
86
create(GraphicsLayerClient * client)87 PassOwnPtr<GraphicsLayer> GraphicsLayer::create(GraphicsLayerClient* client)
88 {
89 return new GraphicsLayerChromium(client);
90 }
91
GraphicsLayerChromium(GraphicsLayerClient * client)92 GraphicsLayerChromium::GraphicsLayerChromium(GraphicsLayerClient* client)
93 : GraphicsLayer(client)
94 , m_contentsLayerPurpose(NoContentsLayer)
95 , m_contentsLayerHasBackgroundColor(false)
96 {
97 m_layer = ContentLayerChromium::create(this);
98
99 updateDebugIndicators();
100 }
101
~GraphicsLayerChromium()102 GraphicsLayerChromium::~GraphicsLayerChromium()
103 {
104 if (m_layer)
105 m_layer->setOwner(0);
106 if (m_contentsLayer)
107 m_contentsLayer->setOwner(0);
108 if (m_transformLayer)
109 m_transformLayer->setOwner(0);
110 }
111
setName(const String & inName)112 void GraphicsLayerChromium::setName(const String& inName)
113 {
114 m_nameBase = inName;
115 String name = String::format("GraphicsLayerChromium(%p) GraphicsLayer(%p) ", m_layer.get(), this) + inName;
116 GraphicsLayer::setName(name);
117 updateNames();
118 }
119
updateNames()120 void GraphicsLayerChromium::updateNames()
121 {
122 if (m_layer)
123 m_layer->setName("Layer for " + m_nameBase);
124 if (m_transformLayer)
125 m_transformLayer->setName("TransformLayer for " + m_nameBase);
126 if (m_contentsLayer)
127 m_contentsLayer->setName("ContentsLayer for " + m_nameBase);
128 }
129
setChildren(const Vector<GraphicsLayer * > & children)130 bool GraphicsLayerChromium::setChildren(const Vector<GraphicsLayer*>& children)
131 {
132 bool childrenChanged = GraphicsLayer::setChildren(children);
133 // FIXME: GraphicsLayer::setChildren calls addChild() for each sublayer, which
134 // will end up calling updateSublayerList() N times.
135 if (childrenChanged)
136 updateSublayerList();
137
138 return childrenChanged;
139 }
140
addChild(GraphicsLayer * childLayer)141 void GraphicsLayerChromium::addChild(GraphicsLayer* childLayer)
142 {
143 GraphicsLayer::addChild(childLayer);
144 updateSublayerList();
145 }
146
addChildAtIndex(GraphicsLayer * childLayer,int index)147 void GraphicsLayerChromium::addChildAtIndex(GraphicsLayer* childLayer, int index)
148 {
149 GraphicsLayer::addChildAtIndex(childLayer, index);
150 updateSublayerList();
151 }
152
addChildBelow(GraphicsLayer * childLayer,GraphicsLayer * sibling)153 void GraphicsLayerChromium::addChildBelow(GraphicsLayer* childLayer, GraphicsLayer* sibling)
154 {
155 GraphicsLayer::addChildBelow(childLayer, sibling);
156 updateSublayerList();
157 }
158
addChildAbove(GraphicsLayer * childLayer,GraphicsLayer * sibling)159 void GraphicsLayerChromium::addChildAbove(GraphicsLayer* childLayer, GraphicsLayer *sibling)
160 {
161 GraphicsLayer::addChildAbove(childLayer, sibling);
162 updateSublayerList();
163 }
164
replaceChild(GraphicsLayer * oldChild,GraphicsLayer * newChild)165 bool GraphicsLayerChromium::replaceChild(GraphicsLayer* oldChild, GraphicsLayer* newChild)
166 {
167 if (GraphicsLayer::replaceChild(oldChild, newChild)) {
168 updateSublayerList();
169 return true;
170 }
171 return false;
172 }
173
removeFromParent()174 void GraphicsLayerChromium::removeFromParent()
175 {
176 GraphicsLayer::removeFromParent();
177 layerForSuperlayer()->removeFromSuperlayer();
178 }
179
setPosition(const FloatPoint & point)180 void GraphicsLayerChromium::setPosition(const FloatPoint& point)
181 {
182 GraphicsLayer::setPosition(point);
183 updateLayerPosition();
184 }
185
setAnchorPoint(const FloatPoint3D & point)186 void GraphicsLayerChromium::setAnchorPoint(const FloatPoint3D& point)
187 {
188 if (point == m_anchorPoint)
189 return;
190
191 GraphicsLayer::setAnchorPoint(point);
192 updateAnchorPoint();
193 }
194
setSize(const FloatSize & size)195 void GraphicsLayerChromium::setSize(const FloatSize& size)
196 {
197 if (size == m_size)
198 return;
199
200 GraphicsLayer::setSize(size);
201 updateLayerSize();
202 }
203
setTransform(const TransformationMatrix & transform)204 void GraphicsLayerChromium::setTransform(const TransformationMatrix& transform)
205 {
206 if (transform == m_transform)
207 return;
208
209 GraphicsLayer::setTransform(transform);
210 updateTransform();
211 }
212
setChildrenTransform(const TransformationMatrix & transform)213 void GraphicsLayerChromium::setChildrenTransform(const TransformationMatrix& transform)
214 {
215 if (transform == m_childrenTransform)
216 return;
217
218 GraphicsLayer::setChildrenTransform(transform);
219 updateChildrenTransform();
220 }
221
setPreserves3D(bool preserves3D)222 void GraphicsLayerChromium::setPreserves3D(bool preserves3D)
223 {
224 if (preserves3D == m_preserves3D)
225 return;
226
227 GraphicsLayer::setPreserves3D(preserves3D);
228 updateLayerPreserves3D();
229 }
230
setMasksToBounds(bool masksToBounds)231 void GraphicsLayerChromium::setMasksToBounds(bool masksToBounds)
232 {
233 if (masksToBounds == m_masksToBounds)
234 return;
235
236 GraphicsLayer::setMasksToBounds(masksToBounds);
237 updateMasksToBounds();
238 }
239
setDrawsContent(bool drawsContent)240 void GraphicsLayerChromium::setDrawsContent(bool drawsContent)
241 {
242 if (drawsContent == m_drawsContent)
243 return;
244
245 GraphicsLayer::setDrawsContent(drawsContent);
246 updateLayerDrawsContent();
247 }
248
setBackgroundColor(const Color & color)249 void GraphicsLayerChromium::setBackgroundColor(const Color& color)
250 {
251 if (m_backgroundColorSet && m_backgroundColor == color)
252 return;
253
254 GraphicsLayer::setBackgroundColor(color);
255
256 m_contentsLayerHasBackgroundColor = true;
257 updateLayerBackgroundColor();
258 }
259
clearBackgroundColor()260 void GraphicsLayerChromium::clearBackgroundColor()
261 {
262 if (!m_backgroundColorSet)
263 return;
264
265 GraphicsLayer::clearBackgroundColor();
266 clearLayerBackgroundColor(*m_contentsLayer);
267 }
268
setContentsOpaque(bool opaque)269 void GraphicsLayerChromium::setContentsOpaque(bool opaque)
270 {
271 if (m_contentsOpaque == opaque)
272 return;
273
274 GraphicsLayer::setContentsOpaque(opaque);
275 updateContentsOpaque();
276 }
277
setMaskLayer(GraphicsLayer * maskLayer)278 void GraphicsLayerChromium::setMaskLayer(GraphicsLayer* maskLayer)
279 {
280 if (maskLayer == m_maskLayer)
281 return;
282
283 GraphicsLayer::setMaskLayer(maskLayer);
284
285 LayerChromium* maskLayerChromium = m_maskLayer ? m_maskLayer->platformLayer() : 0;
286 if (maskLayerChromium)
287 maskLayerChromium->setIsMask(true);
288 m_layer->setMaskLayer(maskLayerChromium);
289 }
290
setBackfaceVisibility(bool visible)291 void GraphicsLayerChromium::setBackfaceVisibility(bool visible)
292 {
293 if (m_backfaceVisibility == visible)
294 return;
295
296 GraphicsLayer::setBackfaceVisibility(visible);
297 updateBackfaceVisibility();
298 }
299
setOpacity(float opacity)300 void GraphicsLayerChromium::setOpacity(float opacity)
301 {
302 float clampedOpacity = max(min(opacity, 1.0f), 0.0f);
303
304 if (m_opacity == clampedOpacity)
305 return;
306
307 GraphicsLayer::setOpacity(clampedOpacity);
308 primaryLayer()->setOpacity(opacity);
309 }
310
setReplicatedByLayer(GraphicsLayer * layer)311 void GraphicsLayerChromium::setReplicatedByLayer(GraphicsLayer* layer)
312 {
313 GraphicsLayerChromium* layerChromium = static_cast<GraphicsLayerChromium*>(layer);
314 GraphicsLayer::setReplicatedByLayer(layer);
315 LayerChromium* replicaLayer = layerChromium ? layerChromium->primaryLayer() : 0;
316 primaryLayer()->setReplicaLayer(replicaLayer);
317 }
318
319
setContentsNeedsDisplay()320 void GraphicsLayerChromium::setContentsNeedsDisplay()
321 {
322 if (m_contentsLayer)
323 m_contentsLayer->setNeedsDisplay();
324 }
325
setNeedsDisplay()326 void GraphicsLayerChromium::setNeedsDisplay()
327 {
328 if (drawsContent())
329 m_layer->setNeedsDisplay();
330 }
331
setNeedsDisplayInRect(const FloatRect & rect)332 void GraphicsLayerChromium::setNeedsDisplayInRect(const FloatRect& rect)
333 {
334 if (drawsContent())
335 m_layer->setNeedsDisplay(rect);
336 }
337
setContentsRect(const IntRect & rect)338 void GraphicsLayerChromium::setContentsRect(const IntRect& rect)
339 {
340 if (rect == m_contentsRect)
341 return;
342
343 GraphicsLayer::setContentsRect(rect);
344 updateContentsRect();
345 }
346
setContentsToImage(Image * image)347 void GraphicsLayerChromium::setContentsToImage(Image* image)
348 {
349 bool childrenChanged = false;
350 if (image) {
351 if (!m_contentsLayer.get() || m_contentsLayerPurpose != ContentsLayerForImage) {
352 RefPtr<ImageLayerChromium> imageLayer = ImageLayerChromium::create(this);
353 setupContentsLayer(imageLayer.get());
354 m_contentsLayer = imageLayer;
355 m_contentsLayerPurpose = ContentsLayerForImage;
356 childrenChanged = true;
357 }
358 ImageLayerChromium* imageLayer = static_cast<ImageLayerChromium*>(m_contentsLayer.get());
359 imageLayer->setContents(image);
360 updateContentsRect();
361 } else {
362 if (m_contentsLayer) {
363 childrenChanged = true;
364
365 // The old contents layer will be removed via updateSublayerList.
366 m_contentsLayer = 0;
367 }
368 }
369
370 if (childrenChanged)
371 updateSublayerList();
372 }
373
setContentsToCanvas(PlatformLayer * platformLayer)374 void GraphicsLayerChromium::setContentsToCanvas(PlatformLayer* platformLayer)
375 {
376 bool childrenChanged = false;
377 if (platformLayer) {
378 platformLayer->setOwner(this);
379 if (m_contentsLayer.get() != platformLayer) {
380 setupContentsLayer(platformLayer);
381 m_contentsLayer = platformLayer;
382 m_contentsLayerPurpose = ContentsLayerForCanvas;
383 childrenChanged = true;
384 }
385 m_contentsLayer->setNeedsDisplay();
386 updateContentsRect();
387 } else {
388 if (m_contentsLayer) {
389 childrenChanged = true;
390
391 // The old contents layer will be removed via updateSublayerList.
392 m_contentsLayer = 0;
393 }
394 }
395
396 if (childrenChanged)
397 updateSublayerList();
398 }
399
setContentsToMedia(PlatformLayer * layer)400 void GraphicsLayerChromium::setContentsToMedia(PlatformLayer* layer)
401 {
402 bool childrenChanged = false;
403 if (layer) {
404 if (!m_contentsLayer.get() || m_contentsLayerPurpose != ContentsLayerForVideo) {
405 setupContentsLayer(layer);
406 m_contentsLayer = layer;
407 m_contentsLayerPurpose = ContentsLayerForVideo;
408 childrenChanged = true;
409 }
410 layer->setOwner(this);
411 layer->setNeedsDisplay();
412 updateContentsRect();
413 } else {
414 if (m_contentsLayer) {
415 childrenChanged = true;
416
417 // The old contents layer will be removed via updateSublayerList.
418 m_contentsLayer = 0;
419 }
420 }
421
422 if (childrenChanged)
423 updateSublayerList();
424 }
425
hostLayerForSublayers() const426 PlatformLayer* GraphicsLayerChromium::hostLayerForSublayers() const
427 {
428 return m_transformLayer ? m_transformLayer.get() : m_layer.get();
429 }
430
layerForSuperlayer() const431 PlatformLayer* GraphicsLayerChromium::layerForSuperlayer() const
432 {
433 return m_transformLayer ? m_transformLayer.get() : m_layer.get();
434 }
435
platformLayer() const436 PlatformLayer* GraphicsLayerChromium::platformLayer() const
437 {
438 return primaryLayer();
439 }
440
setDebugBackgroundColor(const Color & color)441 void GraphicsLayerChromium::setDebugBackgroundColor(const Color& color)
442 {
443 if (color.isValid())
444 setLayerBackgroundColor(*m_layer, color);
445 else
446 clearLayerBackgroundColor(*m_layer);
447 }
448
setDebugBorder(const Color & color,float borderWidth)449 void GraphicsLayerChromium::setDebugBorder(const Color& color, float borderWidth)
450 {
451 if (color.isValid()) {
452 setLayerBorderColor(*m_layer, color);
453 m_layer->setBorderWidth(borderWidth);
454 } else {
455 clearBorderColor(*m_layer);
456 m_layer->setBorderWidth(0);
457 }
458 }
459
updateSublayerList()460 void GraphicsLayerChromium::updateSublayerList()
461 {
462 Vector<RefPtr<LayerChromium> > newSublayers;
463
464 if (m_transformLayer) {
465 // Add the primary layer first. Even if we have negative z-order children, the primary layer always comes behind.
466 newSublayers.append(m_layer.get());
467 } else if (m_contentsLayer) {
468 // FIXME: add the contents layer in the correct order with negative z-order children.
469 // This does not cause visible rendering issues because currently contents layers are only used
470 // for replaced elements that don't have children.
471 newSublayers.append(m_contentsLayer.get());
472 }
473
474 const Vector<GraphicsLayer*>& childLayers = children();
475 size_t numChildren = childLayers.size();
476 for (size_t i = 0; i < numChildren; ++i) {
477 GraphicsLayerChromium* curChild = static_cast<GraphicsLayerChromium*>(childLayers[i]);
478
479 LayerChromium* childLayer = curChild->layerForSuperlayer();
480 newSublayers.append(childLayer);
481 }
482
483 for (size_t i = 0; i < newSublayers.size(); ++i)
484 newSublayers[i]->removeFromSuperlayer();
485
486 if (m_transformLayer) {
487 m_transformLayer->setSublayers(newSublayers);
488
489 if (m_contentsLayer) {
490 // If we have a transform layer, then the contents layer is parented in the
491 // primary layer (which is itself a child of the transform layer).
492 m_layer->removeAllSublayers();
493 m_layer->addSublayer(m_contentsLayer);
494 }
495 } else
496 m_layer->setSublayers(newSublayers);
497 }
498
updateLayerPosition()499 void GraphicsLayerChromium::updateLayerPosition()
500 {
501 // Position is offset on the layer by the layer anchor point.
502 FloatPoint layerPosition(m_position.x() + m_anchorPoint.x() * m_size.width(),
503 m_position.y() + m_anchorPoint.y() * m_size.height());
504
505 primaryLayer()->setPosition(layerPosition);
506 }
507
updateLayerSize()508 void GraphicsLayerChromium::updateLayerSize()
509 {
510 IntSize layerSize(m_size.width(), m_size.height());
511 if (m_transformLayer) {
512 m_transformLayer->setBounds(layerSize);
513 // The anchor of the contents layer is always at 0.5, 0.5, so the position is center-relative.
514 FloatPoint centerPoint(m_size.width() / 2, m_size.height() / 2);
515 m_layer->setPosition(centerPoint);
516 }
517
518 m_layer->setBounds(layerSize);
519
520 // Note that we don't resize m_contentsLayer. It's up the caller to do that.
521
522 // If we've changed the bounds, we need to recalculate the position
523 // of the layer, taking anchor point into account.
524 updateLayerPosition();
525 }
526
updateAnchorPoint()527 void GraphicsLayerChromium::updateAnchorPoint()
528 {
529 primaryLayer()->setAnchorPoint(FloatPoint(m_anchorPoint.x(), m_anchorPoint.y()));
530 primaryLayer()->setAnchorPointZ(m_anchorPoint.z());
531
532 updateLayerPosition();
533 }
534
updateTransform()535 void GraphicsLayerChromium::updateTransform()
536 {
537 primaryLayer()->setTransform(m_transform);
538 }
539
updateChildrenTransform()540 void GraphicsLayerChromium::updateChildrenTransform()
541 {
542 primaryLayer()->setSublayerTransform(m_childrenTransform);
543 }
544
updateMasksToBounds()545 void GraphicsLayerChromium::updateMasksToBounds()
546 {
547 m_layer->setMasksToBounds(m_masksToBounds);
548 updateDebugIndicators();
549 }
550
updateContentsOpaque()551 void GraphicsLayerChromium::updateContentsOpaque()
552 {
553 m_layer->setOpaque(m_contentsOpaque);
554 }
555
updateBackfaceVisibility()556 void GraphicsLayerChromium::updateBackfaceVisibility()
557 {
558 m_layer->setDoubleSided(m_backfaceVisibility);
559 }
560
updateLayerPreserves3D()561 void GraphicsLayerChromium::updateLayerPreserves3D()
562 {
563 if (m_preserves3D && !m_transformLayer) {
564 // Create the transform layer.
565 m_transformLayer = LayerChromium::create(this);
566
567 // Copy the position from this layer.
568 updateLayerPosition();
569 updateLayerSize();
570 updateAnchorPoint();
571 updateTransform();
572 updateChildrenTransform();
573
574 m_layer->setPosition(FloatPoint(m_size.width() / 2.0f, m_size.height() / 2.0f));
575
576 m_layer->setAnchorPoint(FloatPoint(0.5f, 0.5f));
577 TransformationMatrix identity;
578 m_layer->setTransform(identity);
579
580 // Set the old layer to opacity of 1. Further down we will set the opacity on the transform layer.
581 m_layer->setOpacity(1);
582
583 // Move this layer to be a child of the transform layer.
584 if (m_layer->superlayer())
585 m_layer->superlayer()->replaceSublayer(m_layer.get(), m_transformLayer.get());
586 m_transformLayer->addSublayer(m_layer.get());
587
588 updateSublayerList();
589 } else if (!m_preserves3D && m_transformLayer) {
590 // Relace the transformLayer in the parent with this layer.
591 m_layer->removeFromSuperlayer();
592 m_transformLayer->superlayer()->replaceSublayer(m_transformLayer.get(), m_layer.get());
593
594 // Release the transform layer.
595 m_transformLayer = 0;
596
597 updateLayerPosition();
598 updateLayerSize();
599 updateAnchorPoint();
600 updateTransform();
601 updateChildrenTransform();
602
603 updateSublayerList();
604 }
605
606 updateOpacityOnLayer();
607 updateNames();
608 }
609
updateLayerDrawsContent()610 void GraphicsLayerChromium::updateLayerDrawsContent()
611 {
612 if (m_drawsContent)
613 m_layer->setNeedsDisplay();
614
615 updateDebugIndicators();
616 }
617
updateLayerBackgroundColor()618 void GraphicsLayerChromium::updateLayerBackgroundColor()
619 {
620 if (!m_contentsLayer)
621 return;
622
623 // We never create the contents layer just for background color yet.
624 if (m_backgroundColorSet)
625 setLayerBackgroundColor(*m_contentsLayer, m_backgroundColor);
626 else
627 clearLayerBackgroundColor(*m_contentsLayer);
628 }
629
updateContentsVideo()630 void GraphicsLayerChromium::updateContentsVideo()
631 {
632 // FIXME: Implement
633 }
634
updateContentsRect()635 void GraphicsLayerChromium::updateContentsRect()
636 {
637 if (!m_contentsLayer)
638 return;
639
640 m_contentsLayer->setPosition(FloatPoint(m_contentsRect.x(), m_contentsRect.y()));
641 m_contentsLayer->setBounds(IntSize(m_contentsRect.width(), m_contentsRect.height()));
642 }
643
setupContentsLayer(LayerChromium * contentsLayer)644 void GraphicsLayerChromium::setupContentsLayer(LayerChromium* contentsLayer)
645 {
646 if (contentsLayer == m_contentsLayer)
647 return;
648
649 if (m_contentsLayer) {
650 m_contentsLayer->removeFromSuperlayer();
651 m_contentsLayer = 0;
652 }
653
654 if (contentsLayer) {
655 m_contentsLayer = contentsLayer;
656
657 m_contentsLayer->setAnchorPoint(FloatPoint(0, 0));
658
659 // Insert the content layer first. Video elements require this, because they have
660 // shadow content that must display in front of the video.
661 m_layer->insertSublayer(m_contentsLayer.get(), 0);
662
663 updateContentsRect();
664
665 if (showDebugBorders()) {
666 setLayerBorderColor(*m_contentsLayer, Color(0, 0, 128, 180));
667 m_contentsLayer->setBorderWidth(1);
668 }
669 }
670 updateDebugIndicators();
671 updateNames();
672 }
673
674 // This function simply mimics the operation of GraphicsLayerCA
updateOpacityOnLayer()675 void GraphicsLayerChromium::updateOpacityOnLayer()
676 {
677 primaryLayer()->setOpacity(m_opacity);
678 }
679
680 } // namespace WebCore
681
682 #endif // USE(ACCELERATED_COMPOSITING)
683