blob: 0aa4fb1569964b53948da2b532d3d6b322bfa28f [file] [log] [blame]
/*
* Copyright (C) 2012 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. AND ITS CONTRIBUTORS ``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 ITS 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.
*/
#ifndef RemoteLayerTreeTransaction_h
#define RemoteLayerTreeTransaction_h
#include "PlatformCAAnimationRemote.h"
#include "RemoteLayerBackingStore.h"
#include <WebCore/Color.h>
#include <WebCore/FilterOperations.h>
#include <WebCore/FloatPoint3D.h>
#include <WebCore/FloatSize.h>
#include <WebCore/LayoutMilestones.h>
#include <WebCore/PlatformCALayer.h>
#include <WebCore/TransformationMatrix.h>
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
#include <wtf/text/StringHash.h>
#include <wtf/text/WTFString.h>
namespace IPC {
class Decoder;
class Encoder;
}
namespace WebKit {
class PlatformCALayerRemote;
class RemoteLayerTreeTransaction {
public:
enum LayerChanges {
NoChange = 0,
NameChanged = 1LLU << 1,
ChildrenChanged = 1LLU << 2,
PositionChanged = 1LLU << 3,
BoundsChanged = 1LLU << 4,
BackgroundColorChanged = 1LLU << 5,
AnchorPointChanged = 1LLU << 6,
BorderWidthChanged = 1LLU << 7,
BorderColorChanged = 1LLU << 8,
OpacityChanged = 1LLU << 9,
TransformChanged = 1LLU << 10,
SublayerTransformChanged = 1LLU << 11,
HiddenChanged = 1LLU << 12,
GeometryFlippedChanged = 1LLU << 13,
DoubleSidedChanged = 1LLU << 14,
MasksToBoundsChanged = 1LLU << 15,
OpaqueChanged = 1LLU << 16,
ContentsHiddenChanged = 1LLU << 17,
MaskLayerChanged = 1LLU << 18,
ClonedContentsChanged = 1LLU << 19,
ContentsRectChanged = 1LLU << 20,
ContentsScaleChanged = 1LLU << 21,
CornerRadiusChanged = 1LLU << 22,
ShapeRoundedRectChanged = 1LLU << 23,
ShapePathChanged = 1LLU << 24,
MinificationFilterChanged = 1LLU << 25,
MagnificationFilterChanged = 1LLU << 26,
BlendModeChanged = 1LLU << 27,
WindRuleChanged = 1LLU << 28,
SpeedChanged = 1LLU << 29,
TimeOffsetChanged = 1LLU << 30,
BackingStoreChanged = 1LLU << 31,
BackingStoreAttachmentChanged = 1LLU << 32,
FiltersChanged = 1LLU << 33,
AnimationsChanged = 1LLU << 34,
EdgeAntialiasingMaskChanged = 1LLU << 35,
CustomAppearanceChanged = 1LLU << 36,
UserInteractionEnabledChanged = 1LLU << 37,
};
typedef uint64_t LayerChange;
struct LayerCreationProperties {
LayerCreationProperties();
void encode(IPC::Encoder&) const;
static bool decode(IPC::Decoder&, LayerCreationProperties&);
WebCore::GraphicsLayer::PlatformLayerID layerID;
WebCore::PlatformCALayer::LayerType type;
uint32_t hostingContextID;
float hostingDeviceScaleFactor;
};
struct LayerProperties {
LayerProperties();
LayerProperties(const LayerProperties& other);
void encode(IPC::Encoder&) const;
static bool decode(IPC::Decoder&, LayerProperties&);
void notePropertiesChanged(LayerChange changeFlags)
{
changedProperties |= changeFlags;
everChangedProperties |= changeFlags;
}
void resetChangedProperties()
{
changedProperties = RemoteLayerTreeTransaction::NoChange;
}
LayerChange changedProperties;
LayerChange everChangedProperties;
String name;
std::unique_ptr<WebCore::TransformationMatrix> transform;
std::unique_ptr<WebCore::TransformationMatrix> sublayerTransform;
std::unique_ptr<WebCore::FloatRoundedRect> shapeRoundedRect;
Vector<WebCore::GraphicsLayer::PlatformLayerID> children;
Vector<std::pair<String, PlatformCAAnimationRemote::Properties>> addedAnimations;
HashSet<String> keyPathsOfAnimationsToRemove;
WebCore::FloatPoint3D position;
WebCore::FloatPoint3D anchorPoint;
WebCore::FloatRect bounds;
WebCore::FloatRect contentsRect;
std::unique_ptr<RemoteLayerBackingStore> backingStore;
std::unique_ptr<WebCore::FilterOperations> filters;
WebCore::Path shapePath;
WebCore::GraphicsLayer::PlatformLayerID maskLayerID;
WebCore::GraphicsLayer::PlatformLayerID clonedLayerID;
double timeOffset;
float speed;
float contentsScale;
float cornerRadius;
float borderWidth;
float opacity;
WebCore::Color backgroundColor;
WebCore::Color borderColor;
unsigned edgeAntialiasingMask;
WebCore::GraphicsLayer::CustomAppearance customAppearance;
WebCore::PlatformCALayer::FilterType minificationFilter;
WebCore::PlatformCALayer::FilterType magnificationFilter;
WebCore::BlendMode blendMode;
WebCore::WindRule windRule;
bool hidden;
bool backingStoreAttached;
bool geometryFlipped;
bool doubleSided;
bool masksToBounds;
bool opaque;
bool contentsHidden;
bool userInteractionEnabled;
};
explicit RemoteLayerTreeTransaction();
~RemoteLayerTreeTransaction();
void encode(IPC::Encoder&) const;
static bool decode(IPC::Decoder&, RemoteLayerTreeTransaction&);
WebCore::GraphicsLayer::PlatformLayerID rootLayerID() const { return m_rootLayerID; }
void setRootLayerID(WebCore::GraphicsLayer::PlatformLayerID);
void layerPropertiesChanged(PlatformCALayerRemote&);
void setCreatedLayers(Vector<LayerCreationProperties>);
void setDestroyedLayerIDs(Vector<WebCore::GraphicsLayer::PlatformLayerID>);
void setLayerIDsWithNewlyUnreachableBackingStore(Vector<WebCore::GraphicsLayer::PlatformLayerID>);
#if !defined(NDEBUG) || !LOG_DISABLED
WTF::CString description() const;
void dump() const;
#endif
typedef HashMap<WebCore::GraphicsLayer::PlatformLayerID, std::unique_ptr<LayerProperties>> LayerPropertiesMap;
Vector<LayerCreationProperties> createdLayers() const { return m_createdLayers; }
Vector<WebCore::GraphicsLayer::PlatformLayerID> destroyedLayers() const { return m_destroyedLayerIDs; }
Vector<WebCore::GraphicsLayer::PlatformLayerID> layerIDsWithNewlyUnreachableBackingStore() const { return m_layerIDsWithNewlyUnreachableBackingStore; }
Vector<RefPtr<PlatformCALayerRemote>>& changedLayers() { return m_changedLayers; }
const LayerPropertiesMap& changedLayerProperties() const { return m_changedLayerProperties; }
LayerPropertiesMap& changedLayerProperties() { return m_changedLayerProperties; }
WebCore::IntSize contentsSize() const { return m_contentsSize; }
void setContentsSize(const WebCore::IntSize& size) { m_contentsSize = size; };
WebCore::IntPoint scrollOrigin() const { return m_scrollOrigin; }
void setScrollOrigin(const WebCore::IntPoint& origin) { m_scrollOrigin = origin; };
WebCore::LayoutSize baseLayoutViewportSize() const { return m_baseLayoutViewportSize; }
void setBaseLayoutViewportSize(const WebCore::LayoutSize& size) { m_baseLayoutViewportSize = size; };
WebCore::LayoutPoint minStableLayoutViewportOrigin() const { return m_minStableLayoutViewportOrigin; }
void setMinStableLayoutViewportOrigin(const WebCore::LayoutPoint& point) { m_minStableLayoutViewportOrigin = point; };
WebCore::LayoutPoint maxStableLayoutViewportOrigin() const { return m_maxStableLayoutViewportOrigin; }
void setMaxStableLayoutViewportOrigin(const WebCore::LayoutPoint& point) { m_maxStableLayoutViewportOrigin = point; };
WebCore::Color pageExtendedBackgroundColor() const { return m_pageExtendedBackgroundColor; }
void setPageExtendedBackgroundColor(WebCore::Color color) { m_pageExtendedBackgroundColor = color; }
#if PLATFORM(MAC)
WebCore::IntPoint scrollPosition() const { return m_scrollPosition; }
void setScrollPosition(WebCore::IntPoint p) { m_scrollPosition = p; }
#endif
double pageScaleFactor() const { return m_pageScaleFactor; }
void setPageScaleFactor(double pageScaleFactor) { m_pageScaleFactor = pageScaleFactor; }
bool scaleWasSetByUIProcess() const { return m_scaleWasSetByUIProcess; }
void setScaleWasSetByUIProcess(bool scaleWasSetByUIProcess) { m_scaleWasSetByUIProcess = scaleWasSetByUIProcess; }
uint64_t renderTreeSize() const { return m_renderTreeSize; }
void setRenderTreeSize(uint64_t renderTreeSize) { m_renderTreeSize = renderTreeSize; }
double minimumScaleFactor() const { return m_minimumScaleFactor; }
void setMinimumScaleFactor(double scale) { m_minimumScaleFactor = scale; }
double maximumScaleFactor() const { return m_maximumScaleFactor; }
void setMaximumScaleFactor(double scale) { m_maximumScaleFactor = scale; }
double initialScaleFactor() const { return m_initialScaleFactor; }
void setInitialScaleFactor(double scale) { m_initialScaleFactor = scale; }
double viewportMetaTagWidth() const { return m_viewportMetaTagWidth; }
void setViewportMetaTagWidth(double width) { m_viewportMetaTagWidth = width; }
bool viewportMetaTagWidthWasExplicit() const { return m_viewportMetaTagWidthWasExplicit; }
void setViewportMetaTagWidthWasExplicit(bool widthWasExplicit) { m_viewportMetaTagWidthWasExplicit = widthWasExplicit; }
bool viewportMetaTagCameFromImageDocument() const { return m_viewportMetaTagCameFromImageDocument; }
void setViewportMetaTagCameFromImageDocument(bool cameFromImageDocument) { m_viewportMetaTagCameFromImageDocument = cameFromImageDocument; }
bool isInStableState() const { return m_isInStableState; }
void setIsInStableState(bool isInStableState) { m_isInStableState = isInStableState; }
bool allowsUserScaling() const { return m_allowsUserScaling; }
void setAllowsUserScaling(bool allowsUserScaling) { m_allowsUserScaling = allowsUserScaling; }
bool avoidsUnsafeArea() const { return m_avoidsUnsafeArea; }
void setAvoidsUnsafeArea(bool avoidsUnsafeArea) { m_avoidsUnsafeArea = avoidsUnsafeArea; }
uint64_t transactionID() const { return m_transactionID; }
void setTransactionID(uint64_t transactionID) { m_transactionID = transactionID; }
typedef uint64_t TransactionCallbackID;
const Vector<TransactionCallbackID>& callbackIDs() const { return m_callbackIDs; }
void setCallbackIDs(Vector<TransactionCallbackID>&& callbackIDs) { m_callbackIDs = WTFMove(callbackIDs); }
WebCore::LayoutMilestones newlyReachedLayoutMilestones() const { return m_newlyReachedLayoutMilestones; }
void setNewlyReachedLayoutMilestones(WebCore::LayoutMilestones milestones) { m_newlyReachedLayoutMilestones = milestones; }
private:
WebCore::GraphicsLayer::PlatformLayerID m_rootLayerID;
Vector<RefPtr<PlatformCALayerRemote>> m_changedLayers; // Only used in the Web process.
LayerPropertiesMap m_changedLayerProperties; // Only used in the UI process.
Vector<LayerCreationProperties> m_createdLayers;
Vector<WebCore::GraphicsLayer::PlatformLayerID> m_destroyedLayerIDs;
Vector<WebCore::GraphicsLayer::PlatformLayerID> m_videoLayerIDsPendingFullscreen;
Vector<WebCore::GraphicsLayer::PlatformLayerID> m_layerIDsWithNewlyUnreachableBackingStore;
Vector<TransactionCallbackID> m_callbackIDs;
WebCore::IntSize m_contentsSize;
WebCore::IntPoint m_scrollOrigin;
WebCore::LayoutSize m_baseLayoutViewportSize;
WebCore::LayoutPoint m_minStableLayoutViewportOrigin;
WebCore::LayoutPoint m_maxStableLayoutViewportOrigin;
#if PLATFORM(MAC)
WebCore::IntPoint m_scrollPosition;
#endif
WebCore::Color m_pageExtendedBackgroundColor;
double m_pageScaleFactor { 1 };
double m_minimumScaleFactor { 1 };
double m_maximumScaleFactor { 1 };
double m_initialScaleFactor { 1 };
double m_viewportMetaTagWidth { -1 };
uint64_t m_renderTreeSize { 0 };
uint64_t m_transactionID { 0 };
WebCore::LayoutMilestones m_newlyReachedLayoutMilestones { 0 };
bool m_scaleWasSetByUIProcess { false };
bool m_allowsUserScaling { false };
bool m_avoidsUnsafeArea { true };
bool m_viewportMetaTagWidthWasExplicit { false };
bool m_viewportMetaTagCameFromImageDocument { false };
bool m_isInStableState { false };
};
} // namespace WebKit
#endif // RemoteLayerTreeTransaction_h