blob: 2c4c653afe5724c3d3a7ab440123a1d18c44b180 [file] [log] [blame]
/*
* Copyright (C) 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#import "PlatformCALayerRemote.h"
#import "PlatformCALayerRemoteCustom.h"
#import "PlatformCALayerRemoteTiledBacking.h"
#import "RemoteLayerBackingStore.h"
#import "RemoteLayerTreeContext.h"
#import "RemoteLayerTreePropertyApplier.h"
#import <WebCore/AnimationUtilities.h>
#import <WebCore/EventRegion.h>
#import <WebCore/GraphicsContext.h>
#import <WebCore/GraphicsLayerCA.h>
#import <WebCore/LengthFunctions.h>
#import <WebCore/PlatformCAFilters.h>
#import <WebCore/PlatformCALayerCocoa.h>
#import <WebCore/TiledBacking.h>
#import <wtf/PointerComparison.h>
namespace WebKit {
using namespace WebCore;
Ref<PlatformCALayerRemote> PlatformCALayerRemote::create(LayerType layerType, PlatformCALayerClient* owner, RemoteLayerTreeContext& context)
{
RefPtr<PlatformCALayerRemote> layer;
if (layerType == LayerTypeTiledBackingLayer || layerType == LayerTypePageTiledBackingLayer)
layer = adoptRef(new PlatformCALayerRemoteTiledBacking(layerType, owner, context));
else
layer = adoptRef(new PlatformCALayerRemote(layerType, owner, context));
context.layerDidEnterContext(*layer, layerType);
return layer.releaseNonNull();
}
Ref<PlatformCALayerRemote> PlatformCALayerRemote::create(PlatformLayer *platformLayer, PlatformCALayerClient* owner, RemoteLayerTreeContext& context)
{
return PlatformCALayerRemoteCustom::create(platformLayer, owner, context);
}
Ref<PlatformCALayerRemote> PlatformCALayerRemote::createForEmbeddedView(LayerType layerType, GraphicsLayer::EmbeddedViewID embeddedViewID, PlatformCALayerClient* owner, RemoteLayerTreeContext& context)
{
RefPtr<PlatformCALayerRemote> layer = adoptRef(new PlatformCALayerRemote(layerType, embeddedViewID, owner, context));
context.layerDidEnterContext(*layer, layerType);
return layer.releaseNonNull();
}
Ref<PlatformCALayerRemote> PlatformCALayerRemote::create(const PlatformCALayerRemote& other, WebCore::PlatformCALayerClient* owner, RemoteLayerTreeContext& context)
{
auto layer = adoptRef(*new PlatformCALayerRemote(other, owner, context));
context.layerDidEnterContext(layer.get(), other.layerType());
return layer;
}
PlatformCALayerRemote::PlatformCALayerRemote(LayerType layerType, PlatformCALayerClient* owner, RemoteLayerTreeContext& context)
: PlatformCALayer(layerType, owner)
, m_context(&context)
{
if (owner && layerType != LayerTypeContentsProvidedLayer && layerType != LayerTypeTransformLayer) {
m_properties.contentsScale = owner->platformCALayerDeviceScaleFactor();
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ContentsScaleChanged);
}
}
PlatformCALayerRemote::PlatformCALayerRemote(LayerType layerType, GraphicsLayer::EmbeddedViewID embeddedViewID, PlatformCALayerClient* owner, RemoteLayerTreeContext& context)
: PlatformCALayerRemote(layerType, owner, context)
{
m_embeddedViewID = embeddedViewID;
}
PlatformCALayerRemote::PlatformCALayerRemote(const PlatformCALayerRemote& other, PlatformCALayerClient* owner, RemoteLayerTreeContext& context)
: PlatformCALayer(other.layerType(), owner)
, m_acceleratesDrawing(other.acceleratesDrawing())
, m_context(&context)
{
}
Ref<PlatformCALayer> PlatformCALayerRemote::clone(PlatformCALayerClient* owner) const
{
auto clone = PlatformCALayerRemote::create(*this, owner, *m_context);
updateClonedLayerProperties(clone);
clone->setClonedLayer(this);
return WTFMove(clone);
}
PlatformCALayerRemote::~PlatformCALayerRemote()
{
for (const auto& layer : m_children)
downcast<PlatformCALayerRemote>(*layer).m_superlayer = nullptr;
if (m_context)
m_context->layerWillLeaveContext(*this);
}
void PlatformCALayerRemote::moveToContext(RemoteLayerTreeContext& context)
{
if (m_context)
m_context->layerWillLeaveContext(*this);
m_context = &context;
context.layerDidEnterContext(*this, layerType());
m_properties.notePropertiesChanged(m_properties.everChangedProperties);
}
void PlatformCALayerRemote::updateClonedLayerProperties(PlatformCALayerRemote& clone, bool copyContents) const
{
clone.setPosition(position());
clone.setBounds(bounds());
clone.setAnchorPoint(anchorPoint());
if (m_properties.transform)
clone.setTransform(*m_properties.transform);
if (m_properties.sublayerTransform)
clone.setSublayerTransform(*m_properties.sublayerTransform);
if (copyContents)
clone.setContents(contents());
clone.setMasksToBounds(masksToBounds());
clone.setDoubleSided(isDoubleSided());
clone.setOpaque(isOpaque());
clone.setBackgroundColor(backgroundColor());
clone.setContentsScale(contentsScale());
clone.setCornerRadius(cornerRadius());
if (!m_properties.shapePath.isNull())
clone.setShapePath(m_properties.shapePath);
if (m_properties.shapeRoundedRect)
clone.setShapeRoundedRect(*m_properties.shapeRoundedRect);
if (m_properties.filters)
clone.copyFiltersFrom(*this);
clone.updateCustomAppearance(customAppearance());
}
void PlatformCALayerRemote::recursiveBuildTransaction(RemoteLayerTreeContext& context, RemoteLayerTreeTransaction& transaction)
{
ASSERT(!m_properties.backingStore || owner());
RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(&context == m_context);
if (m_properties.backingStore && (!owner() || !owner()->platformCALayerDrawsContent())) {
m_properties.backingStore = nullptr;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::BackingStoreChanged);
}
if (m_properties.backingStore && m_properties.backingStoreAttached && m_properties.backingStore->display())
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::BackingStoreChanged);
if (m_properties.changedProperties) {
if (m_properties.changedProperties & RemoteLayerTreeTransaction::ChildrenChanged) {
m_properties.children.resize(m_children.size());
for (size_t i = 0; i < m_children.size(); ++i)
m_properties.children[i] = m_children[i]->layerID();
}
if (isPlatformCALayerRemoteCustom()) {
RemoteLayerTreePropertyApplier::applyPropertiesToLayer(platformLayer(), nullptr, m_properties, RemoteLayerBackingStore::LayerContentsType::CAMachPort);
didCommit();
return;
}
transaction.layerPropertiesChanged(*this);
}
for (size_t i = 0; i < m_children.size(); ++i) {
PlatformCALayerRemote& child = downcast<PlatformCALayerRemote>(*m_children[i]);
ASSERT(child.superlayer() == this);
child.recursiveBuildTransaction(context, transaction);
}
if (m_maskLayer)
m_maskLayer->recursiveBuildTransaction(context, transaction);
}
void PlatformCALayerRemote::didCommit()
{
m_properties.addedAnimations.clear();
m_properties.keyPathsOfAnimationsToRemove.clear();
m_properties.resetChangedProperties();
}
void PlatformCALayerRemote::ensureBackingStore()
{
ASSERT(owner());
ASSERT(m_properties.backingStoreAttached);
if (!m_properties.backingStore)
m_properties.backingStore = makeUnique<RemoteLayerBackingStore>(this);
updateBackingStore();
}
void PlatformCALayerRemote::updateBackingStore()
{
if (!m_properties.backingStore)
return;
ASSERT(m_properties.backingStoreAttached);
m_properties.backingStore->ensureBackingStore(m_properties.bounds.size(), m_properties.contentsScale, m_acceleratesDrawing, m_wantsDeepColorBackingStore, m_properties.opaque);
}
void PlatformCALayerRemote::setNeedsDisplayInRect(const FloatRect& rect)
{
if (!m_properties.backingStoreAttached)
return;
ensureBackingStore();
// FIXME: Need to map this through contentsRect/etc.
m_properties.backingStore->setNeedsDisplay(enclosingIntRect(rect));
}
void PlatformCALayerRemote::setNeedsDisplay()
{
if (!m_properties.backingStoreAttached)
return;
ensureBackingStore();
m_properties.backingStore->setNeedsDisplay();
}
void PlatformCALayerRemote::copyContentsFromLayer(PlatformCALayer* layer)
{
ASSERT(m_properties.clonedLayerID == layer->layerID());
if (!m_properties.changedProperties)
m_context->layerPropertyChangedWhileBuildingTransaction(*this);
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ClonedContentsChanged);
}
PlatformCALayer* PlatformCALayerRemote::superlayer() const
{
return m_superlayer;
}
void PlatformCALayerRemote::removeFromSuperlayer()
{
if (!m_superlayer)
return;
m_superlayer->removeSublayer(this);
}
void PlatformCALayerRemote::removeSublayer(PlatformCALayerRemote* layer)
{
size_t childIndex = m_children.find(layer);
if (childIndex != notFound)
m_children.remove(childIndex);
layer->m_superlayer = nullptr;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ChildrenChanged);
}
void PlatformCALayerRemote::setSublayers(const PlatformCALayerList& list)
{
removeAllSublayers();
m_children = list;
for (const auto& layer : list) {
layer->removeFromSuperlayer();
downcast<PlatformCALayerRemote>(*layer).m_superlayer = this;
}
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ChildrenChanged);
}
void PlatformCALayerRemote::removeAllSublayers()
{
PlatformCALayerList layersToRemove = m_children;
for (const auto& layer : layersToRemove)
layer->removeFromSuperlayer();
ASSERT(m_children.isEmpty());
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ChildrenChanged);
}
void PlatformCALayerRemote::appendSublayer(PlatformCALayer& layer)
{
Ref<PlatformCALayer> protectedLayer(layer);
layer.removeFromSuperlayer();
m_children.append(&layer);
downcast<PlatformCALayerRemote>(layer).m_superlayer = this;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ChildrenChanged);
}
void PlatformCALayerRemote::insertSublayer(PlatformCALayer& layer, size_t index)
{
Ref<PlatformCALayer> protectedLayer(layer);
layer.removeFromSuperlayer();
m_children.insert(index, &layer);
downcast<PlatformCALayerRemote>(layer).m_superlayer = this;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ChildrenChanged);
}
void PlatformCALayerRemote::replaceSublayer(PlatformCALayer& reference, PlatformCALayer& layer)
{
ASSERT(reference.superlayer() == this);
Ref<PlatformCALayer> protectedLayer(layer);
layer.removeFromSuperlayer();
size_t referenceIndex = m_children.find(&reference);
if (referenceIndex != notFound) {
m_children[referenceIndex]->removeFromSuperlayer();
m_children.insert(referenceIndex, &layer);
downcast<PlatformCALayerRemote>(layer).m_superlayer = this;
}
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ChildrenChanged);
}
void PlatformCALayerRemote::adoptSublayers(PlatformCALayer& source)
{
PlatformCALayerList layersToMove = downcast<PlatformCALayerRemote>(source).m_children;
if (const PlatformCALayerList* customLayers = source.customSublayers()) {
for (const auto& layer : *customLayers) {
size_t layerIndex = layersToMove.find(layer);
if (layerIndex != notFound)
layersToMove.remove(layerIndex);
}
}
setSublayers(layersToMove);
}
void PlatformCALayerRemote::addAnimationForKey(const String& key, PlatformCAAnimation& animation)
{
auto addResult = m_animations.set(key, &animation);
bool appendToAddedAnimations = true;
if (!addResult.isNewEntry) {
// There is already an animation for this key. If the animation has not been sent to the UI
// process yet, we update the key properties before it happens. Otherwise, we just append it
// to the list of animations to be added: PlatformCAAnimationRemote::updateLayerAnimations
// will actually take care of replacing the existing animation.
for (auto& keyAnimationPair : m_properties.addedAnimations) {
if (keyAnimationPair.first == key) {
keyAnimationPair.second = downcast<PlatformCAAnimationRemote>(animation).properties();
appendToAddedAnimations = false;
break;
}
}
}
if (appendToAddedAnimations)
m_properties.addedAnimations.append(std::pair<String, PlatformCAAnimationRemote::Properties>(key, downcast<PlatformCAAnimationRemote>(animation).properties()));
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::AnimationsChanged);
if (m_context)
m_context->willStartAnimationOnLayer(*this);
}
void PlatformCALayerRemote::removeAnimationForKey(const String& key)
{
if (m_animations.remove(key)) {
m_properties.addedAnimations.removeFirstMatching([&key](auto& pair) {
return pair.first == key;
});
}
m_properties.keyPathsOfAnimationsToRemove.add(key);
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::AnimationsChanged);
}
RefPtr<PlatformCAAnimation> PlatformCALayerRemote::animationForKey(const String& key)
{
return m_animations.get(key);
}
static inline bool isEquivalentLayer(const PlatformCALayer* layer, GraphicsLayer::PlatformLayerID layerID)
{
GraphicsLayer::PlatformLayerID newLayerID = layer ? layer->layerID() : 0;
return layerID == newLayerID;
}
void PlatformCALayerRemote::animationStarted(const String& key, MonotonicTime beginTime)
{
auto it = m_animations.find(key);
if (it != m_animations.end())
downcast<PlatformCAAnimationRemote>(*it->value).didStart(currentTimeToMediaTime(beginTime));
if (m_owner)
m_owner->platformCALayerAnimationStarted(key, beginTime);
}
void PlatformCALayerRemote::animationEnded(const String& key)
{
if (m_owner)
m_owner->platformCALayerAnimationEnded(key);
}
void PlatformCALayerRemote::setMask(PlatformCALayer* layer)
{
if (isEquivalentLayer(layer, m_properties.maskLayerID))
return;
if (layer) {
m_maskLayer = downcast<PlatformCALayerRemote>(layer);
m_properties.maskLayerID = m_maskLayer->layerID();
} else {
m_maskLayer = nullptr;
m_properties.maskLayerID = 0;
}
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::MaskLayerChanged);
}
void PlatformCALayerRemote::setClonedLayer(const PlatformCALayer* layer)
{
if (isEquivalentLayer(layer, m_properties.clonedLayerID))
return;
if (layer)
m_properties.clonedLayerID = layer->layerID();
else
m_properties.clonedLayerID = 0;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ClonedContentsChanged);
}
bool PlatformCALayerRemote::isOpaque() const
{
return m_properties.opaque;
}
void PlatformCALayerRemote::setOpaque(bool value)
{
m_properties.opaque = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::OpaqueChanged);
updateBackingStore();
}
FloatRect PlatformCALayerRemote::bounds() const
{
return m_properties.bounds;
}
void PlatformCALayerRemote::setBounds(const FloatRect& value)
{
if (value == m_properties.bounds)
return;
m_properties.bounds = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::BoundsChanged);
if (requiresCustomAppearanceUpdateOnBoundsChange())
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::CustomAppearanceChanged);
updateBackingStore();
}
FloatPoint3D PlatformCALayerRemote::position() const
{
return m_properties.position;
}
void PlatformCALayerRemote::setPosition(const FloatPoint3D& value)
{
// We can't early return here if the position has not changed, since GraphicsLayerCA::syncPosition() may have changed
// the GraphicsLayer position (which doesn't force a geometry update) but we want a subsequent GraphicsLayerCA::setPosition()
// to push a new position to the UI process, even though our m_properties.position hasn't changed.
m_properties.position = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::PositionChanged);
}
FloatPoint3D PlatformCALayerRemote::anchorPoint() const
{
return m_properties.anchorPoint;
}
void PlatformCALayerRemote::setAnchorPoint(const FloatPoint3D& value)
{
if (value == m_properties.anchorPoint)
return;
m_properties.anchorPoint = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::AnchorPointChanged);
}
TransformationMatrix PlatformCALayerRemote::transform() const
{
return m_properties.transform ? *m_properties.transform : TransformationMatrix();
}
void PlatformCALayerRemote::setTransform(const TransformationMatrix& value)
{
m_properties.transform = makeUnique<TransformationMatrix>(value);
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::TransformChanged);
}
TransformationMatrix PlatformCALayerRemote::sublayerTransform() const
{
return m_properties.sublayerTransform ? *m_properties.sublayerTransform : TransformationMatrix();
}
void PlatformCALayerRemote::setSublayerTransform(const TransformationMatrix& value)
{
m_properties.sublayerTransform = makeUnique<TransformationMatrix>(value);
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::SublayerTransformChanged);
}
bool PlatformCALayerRemote::isHidden() const
{
return m_properties.hidden;
}
void PlatformCALayerRemote::setHidden(bool value)
{
if (m_properties.hidden == value)
return;
m_properties.hidden = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::HiddenChanged);
}
bool PlatformCALayerRemote::contentsHidden() const
{
return m_properties.contentsHidden;
}
void PlatformCALayerRemote::setContentsHidden(bool value)
{
if (m_properties.contentsHidden == value)
return;
m_properties.contentsHidden = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ContentsHiddenChanged);
}
bool PlatformCALayerRemote::userInteractionEnabled() const
{
return m_properties.userInteractionEnabled;
}
void PlatformCALayerRemote::setUserInteractionEnabled(bool value)
{
if (m_properties.userInteractionEnabled == value)
return;
m_properties.userInteractionEnabled = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::UserInteractionEnabledChanged);
}
void PlatformCALayerRemote::setBackingStoreAttached(bool attached)
{
if (m_properties.backingStoreAttached == attached)
return;
m_properties.backingStoreAttached = attached;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::BackingStoreAttachmentChanged);
if (attached)
setNeedsDisplay();
else
m_properties.backingStore = nullptr;
}
bool PlatformCALayerRemote::backingStoreAttached() const
{
return m_properties.backingStoreAttached;
}
void PlatformCALayerRemote::setGeometryFlipped(bool value)
{
m_properties.geometryFlipped = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::GeometryFlippedChanged);
}
bool PlatformCALayerRemote::geometryFlipped() const
{
return m_properties.geometryFlipped;
}
bool PlatformCALayerRemote::isDoubleSided() const
{
return m_properties.doubleSided;
}
void PlatformCALayerRemote::setDoubleSided(bool value)
{
m_properties.doubleSided = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::DoubleSidedChanged);
}
bool PlatformCALayerRemote::masksToBounds() const
{
return m_properties.masksToBounds;
}
void PlatformCALayerRemote::setMasksToBounds(bool value)
{
if (value == m_properties.masksToBounds)
return;
m_properties.masksToBounds = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::MasksToBoundsChanged);
}
bool PlatformCALayerRemote::acceleratesDrawing() const
{
return m_acceleratesDrawing;
}
void PlatformCALayerRemote::setAcceleratesDrawing(bool acceleratesDrawing)
{
m_acceleratesDrawing = acceleratesDrawing;
updateBackingStore();
}
bool PlatformCALayerRemote::wantsDeepColorBackingStore() const
{
return m_wantsDeepColorBackingStore;
}
void PlatformCALayerRemote::setWantsDeepColorBackingStore(bool wantsDeepColorBackingStore)
{
m_wantsDeepColorBackingStore = wantsDeepColorBackingStore;
updateBackingStore();
}
bool PlatformCALayerRemote::supportsSubpixelAntialiasedText() const
{
return false;
}
void PlatformCALayerRemote::setSupportsSubpixelAntialiasedText(bool)
{
}
bool PlatformCALayerRemote::hasContents() const
{
return !!m_properties.backingStore;
}
CFTypeRef PlatformCALayerRemote::contents() const
{
return nullptr;
}
void PlatformCALayerRemote::setContents(CFTypeRef value)
{
}
void PlatformCALayerRemote::setContentsRect(const FloatRect& value)
{
m_properties.contentsRect = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ContentsRectChanged);
}
void PlatformCALayerRemote::setMinificationFilter(FilterType value)
{
m_properties.minificationFilter = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::MinificationFilterChanged);
}
void PlatformCALayerRemote::setMagnificationFilter(FilterType value)
{
m_properties.magnificationFilter = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::MagnificationFilterChanged);
}
Color PlatformCALayerRemote::backgroundColor() const
{
return m_properties.backgroundColor;
}
void PlatformCALayerRemote::setBackgroundColor(const Color& value)
{
m_properties.backgroundColor = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::BackgroundColorChanged);
}
void PlatformCALayerRemote::setBorderWidth(float value)
{
if (value == m_properties.borderWidth)
return;
m_properties.borderWidth = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::BorderWidthChanged);
}
void PlatformCALayerRemote::setBorderColor(const Color& value)
{
if (value == m_properties.borderColor)
return;
m_properties.borderColor = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::BorderColorChanged);
}
float PlatformCALayerRemote::opacity() const
{
return m_properties.opacity;
}
void PlatformCALayerRemote::setOpacity(float value)
{
m_properties.opacity = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::OpacityChanged);
}
void PlatformCALayerRemote::setFilters(const FilterOperations& filters)
{
m_properties.filters = makeUnique<FilterOperations>(filters);
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::FiltersChanged);
}
void PlatformCALayerRemote::copyFiltersFrom(const PlatformCALayer& sourceLayer)
{
if (const FilterOperations* filters = downcast<PlatformCALayerRemote>(sourceLayer).m_properties.filters.get())
setFilters(*filters);
else if (m_properties.filters)
m_properties.filters = nullptr;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::FiltersChanged);
}
#if ENABLE(CSS_COMPOSITING)
void PlatformCALayerRemote::setBlendMode(BlendMode blendMode)
{
m_properties.blendMode = blendMode;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::BlendModeChanged);
}
#endif
bool PlatformCALayerRemote::filtersCanBeComposited(const FilterOperations& filters)
{
return PlatformCALayerCocoa::filtersCanBeComposited(filters);
}
void PlatformCALayerRemote::setName(const String& value)
{
m_properties.name = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::NameChanged);
}
void PlatformCALayerRemote::setSpeed(float value)
{
m_properties.speed = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::SpeedChanged);
}
void PlatformCALayerRemote::setTimeOffset(CFTimeInterval value)
{
m_properties.timeOffset = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::TimeOffsetChanged);
}
float PlatformCALayerRemote::contentsScale() const
{
return m_properties.contentsScale;
}
void PlatformCALayerRemote::setContentsScale(float value)
{
m_properties.contentsScale = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ContentsScaleChanged);
updateBackingStore();
}
float PlatformCALayerRemote::cornerRadius() const
{
return m_properties.cornerRadius;
}
void PlatformCALayerRemote::setCornerRadius(float value)
{
if (m_properties.cornerRadius == value)
return;
m_properties.cornerRadius = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::CornerRadiusChanged);
}
void PlatformCALayerRemote::setEdgeAntialiasingMask(unsigned value)
{
m_properties.edgeAntialiasingMask = value;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::EdgeAntialiasingMaskChanged);
}
FloatRoundedRect PlatformCALayerRemote::shapeRoundedRect() const
{
return m_properties.shapeRoundedRect ? *m_properties.shapeRoundedRect : FloatRoundedRect(FloatRect());
}
void PlatformCALayerRemote::setShapeRoundedRect(const FloatRoundedRect& roundedRect)
{
if (m_properties.shapeRoundedRect && *m_properties.shapeRoundedRect == roundedRect)
return;
m_properties.shapeRoundedRect = makeUnique<FloatRoundedRect>(roundedRect);
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ShapeRoundedRectChanged);
}
Path PlatformCALayerRemote::shapePath() const
{
ASSERT(m_layerType == LayerTypeShapeLayer);
return m_properties.shapePath;
}
void PlatformCALayerRemote::setShapePath(const Path& path)
{
ASSERT(m_layerType == LayerTypeShapeLayer);
m_properties.shapePath = path;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::ShapePathChanged);
}
WindRule PlatformCALayerRemote::shapeWindRule() const
{
ASSERT(m_layerType == LayerTypeShapeLayer);
return m_properties.windRule;
}
void PlatformCALayerRemote::setShapeWindRule(WindRule windRule)
{
ASSERT(m_layerType == LayerTypeShapeLayer);
m_properties.windRule = windRule;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::WindRuleChanged);
}
bool PlatformCALayerRemote::requiresCustomAppearanceUpdateOnBoundsChange() const
{
return m_properties.customAppearance == GraphicsLayer::CustomAppearance::ScrollingShadow;
}
GraphicsLayer::CustomAppearance PlatformCALayerRemote::customAppearance() const
{
return m_properties.customAppearance;
}
void PlatformCALayerRemote::updateCustomAppearance(GraphicsLayer::CustomAppearance customAppearance)
{
m_properties.customAppearance = customAppearance;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::CustomAppearanceChanged);
}
void PlatformCALayerRemote::setEventRegion(const WebCore::EventRegion& eventRegion)
{
if (m_properties.eventRegion == eventRegion)
return;
m_properties.eventRegion = eventRegion;
m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::EventRegionChanged);
}
GraphicsLayer::EmbeddedViewID PlatformCALayerRemote::embeddedViewID() const
{
return m_embeddedViewID;
}
Ref<PlatformCALayer> PlatformCALayerRemote::createCompatibleLayer(PlatformCALayer::LayerType layerType, PlatformCALayerClient* client) const
{
return PlatformCALayerRemote::create(layerType, client, *m_context);
}
void PlatformCALayerRemote::enumerateRectsBeingDrawn(WebCore::GraphicsContext& context, void (^block)(WebCore::FloatRect))
{
m_properties.backingStore->enumerateRectsBeingDrawn(context, block);
}
uint32_t PlatformCALayerRemote::hostingContextID()
{
ASSERT_NOT_REACHED();
return 0;
}
unsigned PlatformCALayerRemote::backingStoreBytesPerPixel() const
{
if (!m_properties.backingStore)
return 4;
return m_properties.backingStore->bytesPerPixel();
}
LayerPool& PlatformCALayerRemote::layerPool()
{
return m_context->layerPool();
}
} // namespace WebKit