1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*
2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Apple Inc. All rights reserved.
3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without
5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions
6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * are met:
7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 1. Redistributions of source code must retain the above copyright
8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *    notice, this list of conditions and the following disclaimer.
9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 2. Redistributions in binary form must reproduce the above copyright
10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *    notice, this list of conditions and the following disclaimer in the
11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *    documentation and/or other materials provided with the distribution.
12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */
25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "config.h"
27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(ACCELERATED_COMPOSITING)
29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "GraphicsLayerCACF.h"
31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FloatConversion.h"
33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FloatRect.h"
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Font.h"
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FontSelector.h"
36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Image.h"
37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "PlatformString.h"
38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "SystemTime.h"
39e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "WebLayer.h"
40e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "WebTiledLayer.h"
41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wtf/CurrentTime.h>
42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wtf/StringExtras.h>
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/text/CString.h>
44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
45643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing namespace std;
46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
47643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebCore {
48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
49e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// The threshold width or height above which a tiled layer will be used. This should be
50e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// large enough to avoid tiled layers for most GraphicsLayers, but less than the D3D
51e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// texture size limit on all supported hardware.
52e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockstatic const int cMaxPixelDimension = 2000;
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
54e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// The width and height of a single tile in a tiled layer. Should be large enough to
55e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// avoid lots of small tiles (and therefore lots of drawing callbacks), but small enough
56e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// to keep the overall tile cost low.
57e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockstatic const int cTiledLayerTileSize = 512;
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
59643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic inline void copyTransform(CATransform3D& toT3D, const TransformationMatrix& t)
60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m11 = narrowPrecisionToFloat(t.m11());
62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m12 = narrowPrecisionToFloat(t.m12());
63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m13 = narrowPrecisionToFloat(t.m13());
64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m14 = narrowPrecisionToFloat(t.m14());
65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m21 = narrowPrecisionToFloat(t.m21());
66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m22 = narrowPrecisionToFloat(t.m22());
67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m23 = narrowPrecisionToFloat(t.m23());
68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m24 = narrowPrecisionToFloat(t.m24());
69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m31 = narrowPrecisionToFloat(t.m31());
70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m32 = narrowPrecisionToFloat(t.m32());
71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m33 = narrowPrecisionToFloat(t.m33());
72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m34 = narrowPrecisionToFloat(t.m34());
73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m41 = narrowPrecisionToFloat(t.m41());
74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m42 = narrowPrecisionToFloat(t.m42());
75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m43 = narrowPrecisionToFloat(t.m43());
76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    toT3D.m44 = narrowPrecisionToFloat(t.m44());
77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
78643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
79643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockTransformationMatrix CAToTransform3D(const CATransform3D& fromT3D)
80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return TransformationMatrix(
82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m11,
83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m12,
84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m13,
85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m14,
86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m21,
87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m22,
88643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m23,
89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m24,
90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m31,
91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m32,
92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m33,
93643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m34,
94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m41,
95643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m42,
96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m43,
97643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        fromT3D.m44);
98643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
100643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void setLayerBorderColor(WKCACFLayer* layer, const Color& color)
101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
102a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    layer->setBorderColor(cachedCGColor(color, ColorSpaceDeviceRGB));
103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
105643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void clearBorderColor(WKCACFLayer* layer)
106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    layer->setBorderColor(0);
108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
110643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void setLayerBackgroundColor(WKCACFLayer* layer, const Color& color)
111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
112a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    layer->setBackgroundColor(cachedCGColor(color, ColorSpaceDeviceRGB));
113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
115643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void clearLayerBackgroundColor(WKCACFLayer* layer)
116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    layer->setBackgroundColor(0);
118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
120643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPassOwnPtr<GraphicsLayer> GraphicsLayer::create(GraphicsLayerClient* client)
121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return new GraphicsLayerCACF(client);
123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
125643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockGraphicsLayerCACF::GraphicsLayerCACF(GraphicsLayerClient* client)
126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    : GraphicsLayer(client)
127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_contentsLayerPurpose(NoContentsLayer)
128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_contentsLayerHasBackgroundColor(false)
129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_layer = WebLayer::create(WKCACFLayer::Layer, this);
131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateDebugIndicators();
133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
134643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
135643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockGraphicsLayerCACF::~GraphicsLayerCACF()
136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // clean up the WK layer
138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_layer)
139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_layer->removeFromSuperlayer();
140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (m_contentsLayer)
1428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        m_contentsLayer->removeFromSuperlayer();
1438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_transformLayer)
145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_transformLayer->removeFromSuperlayer();
146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
147643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid GraphicsLayerCACF::setName(const String& name)
149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    String longName = String::format("CALayer(%p) GraphicsLayer(%p) ", m_layer.get(), this) + name;
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    GraphicsLayer::setName(longName);
152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_layer->setName(longName);
154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
156643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool GraphicsLayerCACF::setChildren(const Vector<GraphicsLayer*>& children)
157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool childrenChanged = GraphicsLayer::setChildren(children);
159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // FIXME: GraphicsLayer::setChildren calls addChild() for each sublayer, which
160643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // will end up calling updateSublayerList() N times.
161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (childrenChanged)
162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateSublayerList();
163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return childrenChanged;
165643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
166643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
167643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::addChild(GraphicsLayer* childLayer)
168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::addChild(childLayer);
170643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateSublayerList();
171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
173643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::addChildAtIndex(GraphicsLayer* childLayer, int index)
174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
175643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::addChildAtIndex(childLayer, index);
176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateSublayerList();
177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
179643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::addChildBelow(GraphicsLayer* childLayer, GraphicsLayer* sibling)
180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::addChildBelow(childLayer, sibling);
182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateSublayerList();
183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
185643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::addChildAbove(GraphicsLayer* childLayer, GraphicsLayer *sibling)
186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::addChildAbove(childLayer, sibling);
188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateSublayerList();
189643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
190643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
191643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool GraphicsLayerCACF::replaceChild(GraphicsLayer* oldChild, GraphicsLayer* newChild)
192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (GraphicsLayer::replaceChild(oldChild, newChild)) {
194643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateSublayerList();
195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return true;
196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return false;
198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
200643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::removeFromParent()
201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::removeFromParent();
203643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    layerForSuperlayer()->removeFromSuperlayer();
204643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
206643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setPosition(const FloatPoint& point)
207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setPosition(point);
209643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateLayerPosition();
210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
211643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
212643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setAnchorPoint(const FloatPoint3D& point)
213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (point == m_anchorPoint)
215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
216643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setAnchorPoint(point);
218643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateAnchorPoint();
219643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
221643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setSize(const FloatSize& size)
222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (size == m_size)
224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setSize(size);
227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateLayerSize();
228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
230643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setTransform(const TransformationMatrix& t)
231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (t == m_transform)
233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setTransform(t);
236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateTransform();
237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
239643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setChildrenTransform(const TransformationMatrix& t)
240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
241643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (t == m_childrenTransform)
242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
244643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setChildrenTransform(t);
245643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateChildrenTransform();
246643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
248643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setPreserves3D(bool preserves3D)
249643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
250643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (preserves3D == m_preserves3D)
251643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
252643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
253643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setPreserves3D(preserves3D);
254643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateLayerPreserves3D();
255643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
256643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
257643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setMasksToBounds(bool masksToBounds)
258643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
259643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (masksToBounds == m_masksToBounds)
260643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
262643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setMasksToBounds(masksToBounds);
263643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateMasksToBounds();
264643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
265643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
266643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setDrawsContent(bool drawsContent)
267643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
268643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (drawsContent == m_drawsContent)
269643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
270643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setDrawsContent(drawsContent);
272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateLayerDrawsContent();
273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
275643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setBackgroundColor(const Color& color)
276643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_backgroundColorSet && m_backgroundColor == color)
278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
280643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setBackgroundColor(color);
281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
282643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_contentsLayerHasBackgroundColor = true;
283643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateLayerBackgroundColor();
284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
286643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::clearBackgroundColor()
287643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
288643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_backgroundColorSet)
289643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
291643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::clearBackgroundColor();
292643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    clearLayerBackgroundColor(m_contentsLayer.get());
293643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
294643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
295643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setContentsOpaque(bool opaque)
296643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
297643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_contentsOpaque == opaque)
298643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
299643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
300643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setContentsOpaque(opaque);
301643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateContentsOpaque();
302643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
303643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
304643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setBackfaceVisibility(bool visible)
305643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
306643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_backfaceVisibility == visible)
307643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
308643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
309643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setBackfaceVisibility(visible);
310643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateBackfaceVisibility();
311643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
312643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
313643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setOpacity(float opacity)
314643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
315643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    float clampedOpacity = max(min(opacity, 1.0f), 0.0f);
316643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
317643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_opacity == clampedOpacity)
318643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
319643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
320643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setOpacity(clampedOpacity);
321643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    primaryLayer()->setOpacity(opacity);
322643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
323643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
324643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setNeedsDisplay()
325643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
326643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (drawsContent())
327643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_layer->setNeedsDisplay();
328643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
329643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
330643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setNeedsDisplayInRect(const FloatRect& rect)
331643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (drawsContent()) {
333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        CGRect cgRect = rect;
334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_layer->setNeedsDisplay(&cgRect);
335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
336643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
337643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
338643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setContentsRect(const IntRect& rect)
339643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
340643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (rect == m_contentsRect)
341643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
342643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
343643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    GraphicsLayer::setContentsRect(rect);
344643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateContentsRect();
345643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
346643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
347643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setContentsToImage(Image* image)
348643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
349643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool childrenChanged = false;
350643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
351643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (image) {
352643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_pendingContentsImage = image->nativeImageForCurrentFrame();
353643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_contentsLayerPurpose = ContentsLayerForImage;
354643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!m_contentsLayer)
355643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            childrenChanged = true;
356643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else {
357643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_pendingContentsImage = 0;
358643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_contentsLayerPurpose = NoContentsLayer;
359643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (m_contentsLayer)
360643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            childrenChanged = true;
361643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
362643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
363643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateContentsImage();
364643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
365643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // This has to happen after updateContentsImage
366643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (childrenChanged)
367643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateSublayerList();
368643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
369643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockvoid GraphicsLayerCACF::setContentsToMedia(PlatformLayer* mediaLayer)
371643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
3728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (mediaLayer == m_contentsLayer)
3738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return;
374643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    m_contentsLayer = mediaLayer;
3768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    m_contentsLayerPurpose = mediaLayer ? ContentsLayerForMedia : NoContentsLayer;
377643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    updateContentsMedia();
379643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // This has to happen after updateContentsMedia
3818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    updateSublayerList();
382643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
383643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
384643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPlatformLayer* GraphicsLayerCACF::hostLayerForSublayers() const
385643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
386643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return m_transformLayer ? m_transformLayer.get() : m_layer.get();
387643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
388643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
389643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPlatformLayer* GraphicsLayerCACF::layerForSuperlayer() const
390643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
391643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return m_transformLayer ? m_transformLayer.get() : m_layer.get();
392643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
393643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
394643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPlatformLayer* GraphicsLayerCACF::platformLayer() const
395643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
396643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return primaryLayer();
397643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
398643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
399643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setDebugBackgroundColor(const Color& color)
400643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
401643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (color.isValid())
402643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        setLayerBackgroundColor(m_layer.get(), color);
403643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
404643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        clearLayerBackgroundColor(m_layer.get());
405643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
406643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
407643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setDebugBorder(const Color& color, float borderWidth)
408643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
409643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (color.isValid()) {
410643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        setLayerBorderColor(m_layer.get(), color);
411643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_layer->setBorderWidth(borderWidth);
412643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else {
413643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        clearBorderColor(m_layer.get());
414643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_layer->setBorderWidth(0);
415643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
416643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
417643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
418e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockbool GraphicsLayerCACF::requiresTiledLayer(const FloatSize& size) const
419e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
420e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (!m_drawsContent)
421e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return false;
422e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
423e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // FIXME: catch zero-size height or width here (or earlier)?
424e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    return size.width() > cMaxPixelDimension || size.height() > cMaxPixelDimension;
425e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
426e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
427e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid GraphicsLayerCACF::swapFromOrToTiledLayer(bool useTiledLayer)
428e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
429e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (useTiledLayer == m_usingTiledLayer)
430e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return;
431e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
432e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    CGSize tileSize = CGSizeMake(cTiledLayerTileSize, cTiledLayerTileSize);
433e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
434e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    RefPtr<WKCACFLayer> oldLayer = m_layer;
435e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (useTiledLayer)
436e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        m_layer = WebTiledLayer::create(tileSize, this);
437e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    else
438e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        m_layer = WebLayer::create(WKCACFLayer::Layer, this);
439e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
440e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_usingTiledLayer = useTiledLayer;
441e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
442e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_layer->adoptSublayers(oldLayer.get());
443e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (oldLayer->superlayer())
444e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        oldLayer->superlayer()->replaceSublayer(oldLayer.get(), m_layer.get());
445e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
446e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    updateLayerPosition();
447e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    updateLayerSize();
448e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    updateAnchorPoint();
449e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    updateTransform();
450e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    updateChildrenTransform();
451e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    updateMasksToBounds();
452e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    updateContentsOpaque();
453e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    updateBackfaceVisibility();
454e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    updateLayerBackgroundColor();
455e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
456e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    updateOpacityOnLayer();
457e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
458e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#ifndef NDEBUG
459e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    String name = String::format("CALayer(%p) GraphicsLayer(%p) %s", m_layer.get(), this, m_usingTiledLayer ? "[Tiled Layer] " : "") + m_name;
460e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_layer->setName(name);
461e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#endif
462e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
463e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // need to tell new layer to draw itself
464e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    setNeedsDisplay();
465e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
466e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    updateDebugIndicators();
467e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
468e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
469643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockGraphicsLayer::CompositingCoordinatesOrientation GraphicsLayerCACF::defaultContentsOrientation() const
470643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
471643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return CompositingCoordinatesTopDown;
472643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
473643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
474643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateSublayerList()
475643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
476643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Vector<RefPtr<WKCACFLayer> > newSublayers;
477643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
478643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_transformLayer) {
479643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Add the primary layer first. Even if we have negative z-order children, the primary layer always comes behind.
480643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        newSublayers.append(m_layer.get());
481643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else if (m_contentsLayer) {
482643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // FIXME: add the contents layer in the correct order with negative z-order children.
483643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // This does not cause visible rendering issues because currently contents layers are only used
484643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // for replaced elements that don't have children.
485643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        newSublayers.append(m_contentsLayer.get());
486643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
487643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
488643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const Vector<GraphicsLayer*>& childLayers = children();
489643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    size_t numChildren = childLayers.size();
490643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    for (size_t i = 0; i < numChildren; ++i) {
491643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        GraphicsLayerCACF* curChild = static_cast<GraphicsLayerCACF*>(childLayers[i]);
492643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
493643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        WKCACFLayer* childLayer = curChild->layerForSuperlayer();
494643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        newSublayers.append(childLayer);
495643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
496643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
497643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    for (int i = 0; i < newSublayers.size(); ++i)
498643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        newSublayers[i]->removeFromSuperlayer();
499643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
500643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_transformLayer) {
501643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_transformLayer->setSublayers(newSublayers);
502643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
503643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (m_contentsLayer) {
504643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // If we have a transform layer, then the contents layer is parented in the
505643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // primary layer (which is itself a child of the transform layer).
506643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_layer->removeAllSublayers();
507643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_layer->addSublayer(m_contentsLayer);
508643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
509643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else
510643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_layer->setSublayers(newSublayers);
511643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
512643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
513643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateLayerPosition()
514643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
515643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Position is offset on the layer by the layer anchor point.
516643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    CGPoint posPoint = CGPointMake(m_position.x() + m_anchorPoint.x() * m_size.width(),
517643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                   m_position.y() + m_anchorPoint.y() * m_size.height());
518643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
519643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    primaryLayer()->setPosition(posPoint);
520643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
521643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
522643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateLayerSize()
523643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
524643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    CGRect rect = CGRectMake(0, 0, m_size.width(), m_size.height());
525643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_transformLayer) {
526643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_transformLayer->setBounds(rect);
527643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // The anchor of the contents layer is always at 0.5, 0.5, so the position is center-relative.
528643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        CGPoint centerPoint = CGPointMake(m_size.width() / 2.0f, m_size.height() / 2.0f);
529643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_layer->setPosition(centerPoint);
530643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
531643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
532e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    bool needTiledLayer = requiresTiledLayer(m_size);
533e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (needTiledLayer != m_usingTiledLayer)
534e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        swapFromOrToTiledLayer(needTiledLayer);
535e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
536643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_layer->setBounds(rect);
537643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
538643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Note that we don't resize m_contentsLayer. It's up the caller to do that.
539643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
540643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // if we've changed the bounds, we need to recalculate the position
541643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // of the layer, taking anchor point into account.
542643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateLayerPosition();
543643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
544643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
545643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateAnchorPoint()
546643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
547643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    primaryLayer()->setAnchorPoint(FloatPoint(m_anchorPoint.x(), m_anchorPoint.y()));
548643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    primaryLayer()->setAnchorPointZ(m_anchorPoint.z());
549643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateLayerPosition();
550643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
551643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
552643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateTransform()
553643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
554643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    CATransform3D transform;
555643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    copyTransform(transform, m_transform);
556643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    primaryLayer()->setTransform(transform);
557643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
558643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
559643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateChildrenTransform()
560643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
561643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    CATransform3D transform;
562643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    copyTransform(transform, m_childrenTransform);
563643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    primaryLayer()->setSublayerTransform(transform);
564643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
565643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
566643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateMasksToBounds()
567643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
568643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_layer->setMasksToBounds(m_masksToBounds);
569643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateDebugIndicators();
570643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
571643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
572643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateContentsOpaque()
573643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
574643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_layer->setOpaque(m_contentsOpaque);
575643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
576643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
577643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateBackfaceVisibility()
578643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
579643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_layer->setDoubleSided(m_backfaceVisibility);
580643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
581643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
582643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateLayerPreserves3D()
583643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
584643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_preserves3D && !m_transformLayer) {
585643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Create the transform layer.
586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_transformLayer = WebLayer::create(WKCACFLayer::TransformLayer, this);
587643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
588643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#ifndef NDEBUG
589643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_transformLayer->setName(String().format("Transform Layer CATransformLayer(%p) GraphicsLayer(%p)", m_transformLayer.get(), this));
590643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
591643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Copy the position from this layer.
592643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateLayerPosition();
593643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateLayerSize();
594643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateAnchorPoint();
595643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateTransform();
596643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateChildrenTransform();
597643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
598643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        CGPoint point = CGPointMake(m_size.width() / 2.0f, m_size.height() / 2.0f);
599643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_layer->setPosition(point);
600643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
601643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_layer->setAnchorPoint(CGPointMake(0.5f, 0.5f));
602dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_layer->setTransform(CATransform3DIdentity);
603643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
604643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Set the old layer to opacity of 1. Further down we will set the opacity on the transform layer.
605643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_layer->setOpacity(1);
606643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
607643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Move this layer to be a child of the transform layer.
608643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (m_layer->superlayer())
609643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_layer->superlayer()->replaceSublayer(m_layer.get(), m_transformLayer.get());
610643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_transformLayer->addSublayer(m_layer.get());
611643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
612643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateSublayerList();
613643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else if (!m_preserves3D && m_transformLayer) {
614643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Relace the transformLayer in the parent with this layer.
615643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_layer->removeFromSuperlayer();
616643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_transformLayer->superlayer()->replaceSublayer(m_transformLayer.get(), m_layer.get());
617643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
618643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Release the transform layer.
619643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_transformLayer = 0;
620643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
621643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateLayerPosition();
622643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateLayerSize();
623643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateAnchorPoint();
624643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateTransform();
625643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateChildrenTransform();
626643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
627643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateSublayerList();
628643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
629643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
630643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateOpacityOnLayer();
631643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
632643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
633643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateLayerDrawsContent()
634643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
635e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    bool needTiledLayer = requiresTiledLayer(m_size);
636e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (needTiledLayer != m_usingTiledLayer)
637e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        swapFromOrToTiledLayer(needTiledLayer);
638e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
639643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_drawsContent)
640643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_layer->setNeedsDisplay();
641643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
642967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        m_layer->setContents(0);
643643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
644643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateDebugIndicators();
645643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
646643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
647643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateLayerBackgroundColor()
648643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
649643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_contentsLayer)
650643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
651643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
652643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // We never create the contents layer just for background color yet.
653643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_backgroundColorSet)
654643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        setLayerBackgroundColor(m_contentsLayer.get(), m_backgroundColor);
655643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
656643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        clearLayerBackgroundColor(m_contentsLayer.get());
657643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
658643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
659643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateContentsImage()
660643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
661643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_pendingContentsImage) {
662643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!m_contentsLayer.get()) {
663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            RefPtr<WKCACFLayer> imageLayer = WebLayer::create(WKCACFLayer::Layer, this);
664643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#ifndef NDEBUG
665643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            imageLayer->setName("Image Layer");
666643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
667643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            setupContentsLayer(imageLayer.get());
668643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_contentsLayer = imageLayer;
669643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // m_contentsLayer will be parented by updateSublayerList
670643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
671643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
672643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // FIXME: maybe only do trilinear if the image is being scaled down,
673643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // but then what if the layer size changes?
674d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_contentsLayer->setMinificationFilter(WKCACFLayer::Trilinear);
675643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_contentsLayer->setContents(m_pendingContentsImage.get());
676643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_pendingContentsImage = 0;
677643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
678643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateContentsRect();
679643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else {
680643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // No image.
681643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // m_contentsLayer will be removed via updateSublayerList.
682643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_contentsLayer = 0;
683643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
684643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
685643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
6868a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockvoid GraphicsLayerCACF::updateContentsMedia()
687643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
6888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    // Media layer was set as m_contentsLayer, and will get parented in updateSublayerList().
689643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_contentsLayer) {
690643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        setupContentsLayer(m_contentsLayer.get());
691643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateContentsRect();
692643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
693643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
694643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
695643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateContentsRect()
696643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
697643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_contentsLayer)
698643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
699643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
700643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    CGPoint point = CGPointMake(m_contentsRect.x(),
701643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                m_contentsRect.y());
702643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    CGRect rect = CGRectMake(0.0f,
703643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                             0.0f,
704643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                             m_contentsRect.width(),
705643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                             m_contentsRect.height());
706643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
707643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_contentsLayer->setPosition(point);
708643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_contentsLayer->setBounds(rect);
709643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
710643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
711643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::setupContentsLayer(WKCACFLayer* contentsLayer)
712643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
713643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (contentsLayer == m_contentsLayer)
714643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
715643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
716643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_contentsLayer) {
717643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_contentsLayer->removeFromSuperlayer();
718643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_contentsLayer = 0;
719643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
720643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
721643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (contentsLayer) {
722643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_contentsLayer = contentsLayer;
723643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
724643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (defaultContentsOrientation() == CompositingCoordinatesBottomUp) {
725643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            CATransform3D flipper = {
726643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                1.0f, 0.0f, 0.0f, 0.0f,
727643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                0.0f, -1.0f, 0.0f, 0.0f,
728643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                0.0f, 0.0f, 1.0f, 0.0f,
729643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                0.0f, 0.0f, 0.0f, 1.0f};
730643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_contentsLayer->setTransform(flipper);
731643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_contentsLayer->setAnchorPoint(CGPointMake(0.0f, 1.0f));
732643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        } else
733643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_contentsLayer->setAnchorPoint(CGPointMake(0.0f, 0.0f));
734643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
735643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Insert the content layer first. Video elements require this, because they have
736643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // shadow content that must display in front of the video.
737643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_layer->insertSublayer(m_contentsLayer.get(), 0);
738643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
739643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        updateContentsRect();
740643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
741643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (showDebugBorders()) {
742643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            setLayerBorderColor(m_contentsLayer.get(), Color(0, 0, 128, 180));
743643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_contentsLayer->setBorderWidth(1.0f);
744643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
745643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
746643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    updateDebugIndicators();
747643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
748643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
749643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// This function simply mimics the operation of GraphicsLayerCA
750643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsLayerCACF::updateOpacityOnLayer()
751643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
752643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    primaryLayer()->setOpacity(m_opacity);
753643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
754643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
755643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebCore
756643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
757643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif // USE(ACCELERATED_COMPOSITING)
758