2 * Copyright (C) 2012 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
27 #import "RemoteLayerTreeTransaction.h"
29 #import "ArgumentCoders.h"
30 #import "MessageDecoder.h"
31 #import "MessageEncoder.h"
32 #import "PlatformCAAnimationRemote.h"
33 #import "PlatformCALayerRemote.h"
34 #import "WebCoreArgumentCoders.h"
35 #import <QuartzCore/QuartzCore.h>
36 #import <WebCore/LengthFunctions.h>
37 #import <WebCore/TextStream.h>
38 #import <WebCore/TimingFunction.h>
39 #import <wtf/text/CString.h>
40 #import <wtf/text/StringBuilder.h>
42 using namespace WebCore;
46 RemoteLayerTreeTransaction::LayerCreationProperties::LayerCreationProperties()
48 , type(PlatformCALayer::LayerTypeLayer)
53 void RemoteLayerTreeTransaction::LayerCreationProperties::encode(IPC::ArgumentEncoder& encoder) const
56 encoder.encodeEnum(type);
58 if (type == PlatformCALayer::LayerTypeCustom)
59 encoder << hostingContextID;
62 bool RemoteLayerTreeTransaction::LayerCreationProperties::decode(IPC::ArgumentDecoder& decoder, LayerCreationProperties& result)
64 if (!decoder.decode(result.layerID))
67 if (!decoder.decodeEnum(result.type))
70 if (result.type == PlatformCALayer::LayerTypeCustom) {
71 if (!decoder.decode(result.hostingContextID))
78 RemoteLayerTreeTransaction::LayerProperties::LayerProperties()
79 : changedProperties(NoChange)
80 , everChangedProperties(NoChange)
81 , anchorPoint(0.5, 0.5, 0)
82 , contentsRect(FloatPoint(), FloatSize(1, 1))
89 , backgroundColor(Color::transparent)
90 , borderColor(Color::black)
91 , edgeAntialiasingMask(kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge)
92 , customAppearance(GraphicsLayer::NoCustomAppearance)
93 , customBehavior(GraphicsLayer::NoCustomBehavior)
94 , minificationFilter(PlatformCALayer::FilterType::Linear)
95 , magnificationFilter(PlatformCALayer::FilterType::Linear)
96 , blendMode(BlendModeNormal)
98 , geometryFlipped(false)
100 , masksToBounds(false)
105 RemoteLayerTreeTransaction::LayerProperties::LayerProperties(const LayerProperties& other)
106 : changedProperties(other.changedProperties)
107 , everChangedProperties(other.everChangedProperties)
109 , children(other.children)
110 , addedAnimations(other.addedAnimations)
111 , keyPathsOfAnimationsToRemove(other.keyPathsOfAnimationsToRemove)
112 , position(other.position)
113 , anchorPoint(other.anchorPoint)
114 , bounds(other.bounds)
115 , contentsRect(other.contentsRect)
116 , maskLayerID(other.maskLayerID)
117 , timeOffset(other.timeOffset)
119 , contentsScale(other.contentsScale)
120 , borderWidth(other.borderWidth)
121 , opacity(other.opacity)
122 , backgroundColor(other.backgroundColor)
123 , borderColor(other.borderColor)
124 , edgeAntialiasingMask(other.edgeAntialiasingMask)
125 , customAppearance(other.customAppearance)
126 , customBehavior(other.customBehavior)
127 , minificationFilter(other.minificationFilter)
128 , magnificationFilter(other.magnificationFilter)
129 , blendMode(other.blendMode)
130 , hidden(other.hidden)
131 , geometryFlipped(other.geometryFlipped)
132 , doubleSided(other.doubleSided)
133 , masksToBounds(other.masksToBounds)
134 , opaque(other.opaque)
136 // FIXME: LayerProperties should reference backing store by ID, so that two layers can have the same backing store (for clones).
137 // FIXME: LayerProperties shouldn't be copyable; PlatformCALayerRemote::clone should copy the relevant properties.
140 transform = std::make_unique<TransformationMatrix>(*other.transform);
142 if (other.sublayerTransform)
143 sublayerTransform = std::make_unique<TransformationMatrix>(*other.sublayerTransform);
146 filters = std::make_unique<FilterOperations>(*other.filters);
149 void RemoteLayerTreeTransaction::LayerProperties::encode(IPC::ArgumentEncoder& encoder) const
151 encoder.encodeEnum(changedProperties);
153 if (changedProperties & NameChanged)
156 if (changedProperties & ChildrenChanged)
159 if (changedProperties & AnimationsChanged) {
160 encoder << addedAnimations;
161 encoder << keyPathsOfAnimationsToRemove;
164 if (changedProperties & PositionChanged)
167 if (changedProperties & BoundsChanged)
170 if (changedProperties & BackgroundColorChanged)
171 encoder << backgroundColor;
173 if (changedProperties & AnchorPointChanged)
174 encoder << anchorPoint;
176 if (changedProperties & BorderWidthChanged)
177 encoder << borderWidth;
179 if (changedProperties & BorderColorChanged)
180 encoder << borderColor;
182 if (changedProperties & OpacityChanged)
185 if (changedProperties & TransformChanged)
186 encoder << *transform;
188 if (changedProperties & SublayerTransformChanged)
189 encoder << *sublayerTransform;
191 if (changedProperties & HiddenChanged)
194 if (changedProperties & GeometryFlippedChanged)
195 encoder << geometryFlipped;
197 if (changedProperties & DoubleSidedChanged)
198 encoder << doubleSided;
200 if (changedProperties & MasksToBoundsChanged)
201 encoder << masksToBounds;
203 if (changedProperties & OpaqueChanged)
206 if (changedProperties & MaskLayerChanged)
207 encoder << maskLayerID;
209 if (changedProperties & ContentsRectChanged)
210 encoder << contentsRect;
212 if (changedProperties & ContentsScaleChanged)
213 encoder << contentsScale;
215 if (changedProperties & MinificationFilterChanged)
216 encoder.encodeEnum(minificationFilter);
218 if (changedProperties & MagnificationFilterChanged)
219 encoder.encodeEnum(magnificationFilter);
221 if (changedProperties & BlendModeChanged)
222 encoder.encodeEnum(blendMode);
224 if (changedProperties & SpeedChanged)
227 if (changedProperties & TimeOffsetChanged)
228 encoder << timeOffset;
230 if (changedProperties & BackingStoreChanged) {
231 bool hasFrontBuffer = backingStore && backingStore->hasFrontBuffer();
232 encoder << hasFrontBuffer;
234 encoder << *backingStore;
237 if (changedProperties & FiltersChanged)
240 if (changedProperties & EdgeAntialiasingMaskChanged)
241 encoder << edgeAntialiasingMask;
243 if (changedProperties & CustomAppearanceChanged)
244 encoder.encodeEnum(customAppearance);
246 if (changedProperties & CustomBehaviorChanged)
247 encoder.encodeEnum(customBehavior);
250 bool RemoteLayerTreeTransaction::LayerProperties::decode(IPC::ArgumentDecoder& decoder, LayerProperties& result)
252 if (!decoder.decodeEnum(result.changedProperties))
255 if (result.changedProperties & NameChanged) {
256 if (!decoder.decode(result.name))
260 if (result.changedProperties & ChildrenChanged) {
261 if (!decoder.decode(result.children))
264 for (auto& layerID : result.children) {
270 if (result.changedProperties & AnimationsChanged) {
271 if (!decoder.decode(result.addedAnimations))
274 if (!decoder.decode(result.keyPathsOfAnimationsToRemove))
278 if (result.changedProperties & PositionChanged) {
279 if (!decoder.decode(result.position))
283 if (result.changedProperties & BoundsChanged) {
284 if (!decoder.decode(result.bounds))
288 if (result.changedProperties & BackgroundColorChanged) {
289 if (!decoder.decode(result.backgroundColor))
293 if (result.changedProperties & AnchorPointChanged) {
294 if (!decoder.decode(result.anchorPoint))
298 if (result.changedProperties & BorderWidthChanged) {
299 if (!decoder.decode(result.borderWidth))
303 if (result.changedProperties & BorderColorChanged) {
304 if (!decoder.decode(result.borderColor))
308 if (result.changedProperties & OpacityChanged) {
309 if (!decoder.decode(result.opacity))
313 if (result.changedProperties & TransformChanged) {
314 TransformationMatrix transform;
315 if (!decoder.decode(transform))
318 result.transform = std::make_unique<TransformationMatrix>(transform);
321 if (result.changedProperties & SublayerTransformChanged) {
322 TransformationMatrix transform;
323 if (!decoder.decode(transform))
326 result.sublayerTransform = std::make_unique<TransformationMatrix>(transform);
329 if (result.changedProperties & HiddenChanged) {
330 if (!decoder.decode(result.hidden))
334 if (result.changedProperties & GeometryFlippedChanged) {
335 if (!decoder.decode(result.geometryFlipped))
339 if (result.changedProperties & DoubleSidedChanged) {
340 if (!decoder.decode(result.doubleSided))
344 if (result.changedProperties & MasksToBoundsChanged) {
345 if (!decoder.decode(result.masksToBounds))
349 if (result.changedProperties & OpaqueChanged) {
350 if (!decoder.decode(result.opaque))
354 if (result.changedProperties & MaskLayerChanged) {
355 if (!decoder.decode(result.maskLayerID))
359 if (result.changedProperties & ContentsRectChanged) {
360 if (!decoder.decode(result.contentsRect))
364 if (result.changedProperties & ContentsScaleChanged) {
365 if (!decoder.decode(result.contentsScale))
369 if (result.changedProperties & MinificationFilterChanged) {
370 if (!decoder.decodeEnum(result.minificationFilter))
374 if (result.changedProperties & MagnificationFilterChanged) {
375 if (!decoder.decodeEnum(result.magnificationFilter))
379 if (result.changedProperties & BlendModeChanged) {
380 if (!decoder.decodeEnum(result.blendMode))
384 if (result.changedProperties & SpeedChanged) {
385 if (!decoder.decode(result.speed))
389 if (result.changedProperties & TimeOffsetChanged) {
390 if (!decoder.decode(result.timeOffset))
394 if (result.changedProperties & BackingStoreChanged) {
395 bool hasFrontBuffer = false;
396 if (!decoder.decode(hasFrontBuffer))
398 if (hasFrontBuffer) {
399 std::unique_ptr<RemoteLayerBackingStore> backingStore = std::make_unique<RemoteLayerBackingStore>(nullptr);
400 if (!decoder.decode(*backingStore))
403 result.backingStore = std::move(backingStore);
405 result.backingStore = nullptr;
408 if (result.changedProperties & FiltersChanged) {
409 std::unique_ptr<FilterOperations> filters = std::make_unique<FilterOperations>();
410 if (!decoder.decode(*filters))
412 result.filters = std::move(filters);
415 if (result.changedProperties & EdgeAntialiasingMaskChanged) {
416 if (!decoder.decode(result.edgeAntialiasingMask))
420 if (result.changedProperties & CustomAppearanceChanged) {
421 if (!decoder.decodeEnum(result.customAppearance))
425 if (result.changedProperties & CustomBehaviorChanged) {
426 if (!decoder.decodeEnum(result.customBehavior))
433 RemoteLayerTreeTransaction::RemoteLayerTreeTransaction()
437 RemoteLayerTreeTransaction::~RemoteLayerTreeTransaction()
441 void RemoteLayerTreeTransaction::encode(IPC::ArgumentEncoder& encoder) const
443 encoder << m_rootLayerID;
444 encoder << m_createdLayers;
446 encoder << static_cast<uint64_t>(m_changedLayers.size());
448 for (RefPtr<PlatformCALayerRemote> layer : m_changedLayers) {
449 encoder << layer->layerID();
450 encoder << layer->properties();
453 encoder << m_destroyedLayerIDs;
454 encoder << m_videoLayerIDsPendingFullscreen;
456 encoder << m_contentsSize;
457 encoder << m_pageExtendedBackgroundColor;
458 encoder << m_pageScaleFactor;
459 encoder << m_minimumScaleFactor;
460 encoder << m_maximumScaleFactor;
462 encoder << m_lastVisibleContentRectUpdateID;
463 encoder << m_renderTreeSize;
465 encoder << m_scaleWasSetByUIProcess;
466 encoder << m_allowsUserScaling;
469 bool RemoteLayerTreeTransaction::decode(IPC::ArgumentDecoder& decoder, RemoteLayerTreeTransaction& result)
471 if (!decoder.decode(result.m_rootLayerID))
473 if (!result.m_rootLayerID)
476 if (!decoder.decode(result.m_createdLayers))
479 uint64_t numChangedLayerProperties;
480 if (!decoder.decode(numChangedLayerProperties))
483 for (uint64_t i = 0; i < numChangedLayerProperties; ++i) {
484 GraphicsLayer::PlatformLayerID layerID;
485 if (!decoder.decode(layerID))
488 std::unique_ptr<LayerProperties> layerProperties = std::make_unique<LayerProperties>();
489 if (!decoder.decode(*layerProperties))
492 result.changedLayerProperties().set(layerID, std::move(layerProperties));
495 if (!decoder.decode(result.m_destroyedLayerIDs))
498 for (auto& layerID : result.m_destroyedLayerIDs) {
503 if (!decoder.decode(result.m_videoLayerIDsPendingFullscreen))
506 if (!decoder.decode(result.m_contentsSize))
509 if (!decoder.decode(result.m_pageExtendedBackgroundColor))
512 if (!decoder.decode(result.m_pageScaleFactor))
515 if (!decoder.decode(result.m_minimumScaleFactor))
518 if (!decoder.decode(result.m_maximumScaleFactor))
521 if (!decoder.decode(result.m_lastVisibleContentRectUpdateID))
524 if (!decoder.decode(result.m_renderTreeSize))
527 if (!decoder.decode(result.m_scaleWasSetByUIProcess))
530 if (!decoder.decode(result.m_allowsUserScaling))
536 void RemoteLayerTreeTransaction::setRootLayerID(GraphicsLayer::PlatformLayerID rootLayerID)
538 ASSERT_ARG(rootLayerID, rootLayerID);
540 m_rootLayerID = rootLayerID;
543 void RemoteLayerTreeTransaction::layerPropertiesChanged(PlatformCALayerRemote* remoteLayer, RemoteLayerTreeTransaction::LayerProperties& properties)
545 m_changedLayers.append(remoteLayer);
548 void RemoteLayerTreeTransaction::setCreatedLayers(Vector<LayerCreationProperties> createdLayers)
550 m_createdLayers = std::move(createdLayers);
553 void RemoteLayerTreeTransaction::setDestroyedLayerIDs(Vector<GraphicsLayer::PlatformLayerID> destroyedLayerIDs)
555 m_destroyedLayerIDs = std::move(destroyedLayerIDs);
558 #if !defined(NDEBUG) || !LOG_DISABLED
560 class RemoteLayerTreeTextStream : public TextStream
563 using TextStream::operator<<;
565 RemoteLayerTreeTextStream()
570 RemoteLayerTreeTextStream& operator<<(const TransformationMatrix&);
571 RemoteLayerTreeTextStream& operator<<(PlatformCALayer::FilterType);
572 RemoteLayerTreeTextStream& operator<<(FloatPoint3D);
573 RemoteLayerTreeTextStream& operator<<(Color);
574 RemoteLayerTreeTextStream& operator<<(FloatRect);
575 RemoteLayerTreeTextStream& operator<<(const Vector<WebCore::GraphicsLayer::PlatformLayerID>&);
576 RemoteLayerTreeTextStream& operator<<(const FilterOperation&);
577 RemoteLayerTreeTextStream& operator<<(const FilterOperations&);
578 RemoteLayerTreeTextStream& operator<<(const PlatformCAAnimationRemote::Properties&);
579 RemoteLayerTreeTextStream& operator<<(const RemoteLayerBackingStore&);
580 RemoteLayerTreeTextStream& operator<<(BlendMode);
581 RemoteLayerTreeTextStream& operator<<(PlatformCAAnimation::AnimationType);
582 RemoteLayerTreeTextStream& operator<<(PlatformCAAnimation::FillModeType);
583 RemoteLayerTreeTextStream& operator<<(PlatformCAAnimation::ValueFunctionType);
584 RemoteLayerTreeTextStream& operator<<(const TimingFunction&);
585 RemoteLayerTreeTextStream& operator<<(const PlatformCAAnimationRemote::KeyframeValue&);
587 void increaseIndent() { ++m_indent; }
588 void decreaseIndent() { --m_indent; ASSERT(m_indent >= 0); }
597 static void dumpProperty(RemoteLayerTreeTextStream& ts, String name, T value)
602 ts << "(" << name << " ";
607 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(const TransformationMatrix& transform)
609 RemoteLayerTreeTextStream& ts = *this;
613 ts << "[" << transform.m11() << " " << transform.m12() << " " << transform.m13() << " " << transform.m14() << "]\n";
615 ts << "[" << transform.m21() << " " << transform.m22() << " " << transform.m23() << " " << transform.m24() << "]\n";
617 ts << "[" << transform.m31() << " " << transform.m32() << " " << transform.m33() << " " << transform.m34() << "]\n";
619 ts << "[" << transform.m41() << " " << transform.m42() << " " << transform.m43() << " " << transform.m44() << "]";
624 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(PlatformCALayer::FilterType filterType)
626 RemoteLayerTreeTextStream& ts = *this;
627 switch (filterType) {
628 case PlatformCALayer::Linear:
631 case PlatformCALayer::Nearest:
634 case PlatformCALayer::Trilinear:
638 ASSERT_NOT_REACHED();
644 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(const FilterOperations& filters)
646 RemoteLayerTreeTextStream& ts = *this;
647 for (size_t i = 0; i < filters.size(); ++i) {
648 const auto filter = filters.at(i);
650 if (i < filters.size() - 1)
656 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(const FilterOperation& filter)
658 RemoteLayerTreeTextStream& ts = *this;
659 switch (filter.type()) {
660 case FilterOperation::REFERENCE:
663 case FilterOperation::GRAYSCALE: {
664 const BasicColorMatrixFilterOperation& colorMatrixFilter = toBasicColorMatrixFilterOperation(filter);
665 ts << "grayscale(" << colorMatrixFilter.amount() << ")";
668 case FilterOperation::SEPIA: {
669 const BasicColorMatrixFilterOperation& colorMatrixFilter = toBasicColorMatrixFilterOperation(filter);
670 ts << "sepia(" << colorMatrixFilter.amount() << ")";
673 case FilterOperation::SATURATE: {
674 const BasicColorMatrixFilterOperation& colorMatrixFilter = toBasicColorMatrixFilterOperation(filter);
675 ts << "saturate(" << colorMatrixFilter.amount() << ")";
678 case FilterOperation::HUE_ROTATE: {
679 const BasicColorMatrixFilterOperation& colorMatrixFilter = toBasicColorMatrixFilterOperation(filter);
680 ts << "hue-rotate(" << colorMatrixFilter.amount() << ")";
683 case FilterOperation::INVERT: {
684 const BasicComponentTransferFilterOperation& componentTransferFilter = toBasicComponentTransferFilterOperation(filter);
685 ts << "invert(" << componentTransferFilter.amount() << ")";
688 case FilterOperation::OPACITY: {
689 const BasicComponentTransferFilterOperation& componentTransferFilter = toBasicComponentTransferFilterOperation(filter);
690 ts << "opacity(" << componentTransferFilter.amount() << ")";
693 case FilterOperation::BRIGHTNESS: {
694 const BasicComponentTransferFilterOperation& componentTransferFilter = toBasicComponentTransferFilterOperation(filter);
695 ts << "brightness(" << componentTransferFilter.amount() << ")";
698 case FilterOperation::CONTRAST: {
699 const BasicComponentTransferFilterOperation& componentTransferFilter = toBasicComponentTransferFilterOperation(filter);
700 ts << "contrast(" << componentTransferFilter.amount() << ")";
703 case FilterOperation::BLUR: {
704 const BlurFilterOperation& blurFilter = toBlurFilterOperation(filter);
705 ts << "blur(" << floatValueForLength(blurFilter.stdDeviation(), 0) << ")";
708 case FilterOperation::DROP_SHADOW: {
709 const DropShadowFilterOperation& dropShadowFilter = toDropShadowFilterOperation(filter);
710 ts << "drop-shadow(" << dropShadowFilter.x() << " " << dropShadowFilter.y() << " " << dropShadowFilter.location() << " ";
711 ts << dropShadowFilter.color() << ")";
714 case FilterOperation::PASSTHROUGH:
717 case FilterOperation::DEFAULT: {
718 const DefaultFilterOperation& defaultFilter = toDefaultFilterOperation(filter);
719 ts << "default type=" << (int)defaultFilter.representedType();
722 case FilterOperation::NONE:
729 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(BlendMode blendMode)
731 RemoteLayerTreeTextStream& ts = *this;
733 case BlendModeNormal: ts << "normal"; break;
734 case BlendModeMultiply: ts << "multiply"; break;
735 case BlendModeScreen: ts << "screen"; break;
736 case BlendModeOverlay: ts << "overlay"; break;
737 case BlendModeDarken: ts << "darken"; break;
738 case BlendModeLighten: ts << "lighten"; break;
739 case BlendModeColorDodge: ts << "color-dodge"; break;
740 case BlendModeColorBurn: ts << "color-burn"; break;
741 case BlendModeHardLight: ts << "hard-light"; break;
742 case BlendModeSoftLight: ts << "soft-light"; break;
743 case BlendModeDifference: ts << "difference"; break;
744 case BlendModeExclusion: ts << "exclusion"; break;
745 case BlendModeHue: ts << "hue"; break;
746 case BlendModeSaturation: ts << "saturation"; break;
747 case BlendModeColor: ts << "color"; break;
748 case BlendModeLuminosity: ts << "luminosity"; break;
753 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(PlatformCAAnimation::AnimationType type)
755 RemoteLayerTreeTextStream& ts = *this;
757 case PlatformCAAnimation::Basic: ts << "basic"; break;
758 case PlatformCAAnimation::Keyframe: ts << "keyframe"; break;
763 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(PlatformCAAnimation::FillModeType type)
765 RemoteLayerTreeTextStream& ts = *this;
767 case PlatformCAAnimation::NoFillMode: ts << "none"; break;
768 case PlatformCAAnimation::Forwards: ts << "forwards"; break;
769 case PlatformCAAnimation::Backwards: ts << "backwards"; break;
770 case PlatformCAAnimation::Both: ts << "both"; break;
775 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(PlatformCAAnimation::ValueFunctionType type)
777 RemoteLayerTreeTextStream& ts = *this;
779 case PlatformCAAnimation::NoValueFunction: ts << "none"; break;
780 case PlatformCAAnimation::RotateX: ts << "rotateX"; break;
781 case PlatformCAAnimation::RotateY: ts << "rotateY"; break;
782 case PlatformCAAnimation::RotateZ: ts << "rotateX"; break;
783 case PlatformCAAnimation::ScaleX: ts << "scaleX"; break;
784 case PlatformCAAnimation::ScaleY: ts << "scaleY"; break;
785 case PlatformCAAnimation::ScaleZ: ts << "scaleX"; break;
786 case PlatformCAAnimation::Scale: ts << "scale"; break;
787 case PlatformCAAnimation::TranslateX: ts << "translateX"; break;
788 case PlatformCAAnimation::TranslateY: ts << "translateY"; break;
789 case PlatformCAAnimation::TranslateZ: ts << "translateZ"; break;
790 case PlatformCAAnimation::Translate: ts << "translate"; break;
795 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(const PlatformCAAnimationRemote::KeyframeValue& value)
797 RemoteLayerTreeTextStream& ts = *this;
799 switch (value.keyframeType()) {
800 case PlatformCAAnimationRemote::KeyframeValue::NumberKeyType:
801 ts << "number=" << value.numberValue();
803 case PlatformCAAnimationRemote::KeyframeValue::ColorKeyType:
805 ts << value.colorValue();
807 case PlatformCAAnimationRemote::KeyframeValue::PointKeyType:
809 ts << value.pointValue();
811 case PlatformCAAnimationRemote::KeyframeValue::TransformKeyType:
813 ts << value.transformValue();
815 case PlatformCAAnimationRemote::KeyframeValue::FilterKeyType:
817 if (value.filterValue())
818 ts << *value.filterValue();
826 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(const TimingFunction& timingFunction)
828 RemoteLayerTreeTextStream& ts = *this;
829 switch (timingFunction.type()) {
830 case TimingFunction::LinearFunction:
833 case TimingFunction::CubicBezierFunction: {
834 const CubicBezierTimingFunction& cubicBezierFunction = static_cast<const CubicBezierTimingFunction&>(timingFunction);
835 ts << "cubic-bezier(" << cubicBezierFunction.x1() << ", " << cubicBezierFunction.y1() << ", " << cubicBezierFunction.x2() << ", " << cubicBezierFunction.y2() << ")";
838 case TimingFunction::StepsFunction: {
839 const StepsTimingFunction& stepsFunction = static_cast<const StepsTimingFunction&>(timingFunction);
840 ts << "steps(" << stepsFunction.numberOfSteps() << ", " << (stepsFunction.stepAtStart() ? "start" : "end") << ")";
847 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(const PlatformCAAnimationRemote::Properties& animation)
849 RemoteLayerTreeTextStream& ts = *this;
852 ts << animation.animationType;
854 ts << animation.keyPath;
856 if (animation.beginTime)
857 dumpProperty(ts, "beginTime", animation.beginTime);
859 if (animation.duration)
860 dumpProperty(ts, "duration", animation.duration);
862 if (animation.timeOffset)
863 dumpProperty(ts, "timeOffset", animation.timeOffset);
865 dumpProperty(ts, "repeatCount", animation.repeatCount);
867 if (animation.speed != 1)
868 dumpProperty(ts, "speed", animation.speed);
870 dumpProperty(ts, "fillMode", animation.fillMode);
871 dumpProperty(ts, "valueFunction", animation.valueFunction);
873 if (animation.autoReverses)
874 dumpProperty(ts, "autoReverses", animation.autoReverses);
876 if (!animation.removedOnCompletion)
877 dumpProperty(ts, "removedOnCompletion", animation.removedOnCompletion);
879 if (animation.additive)
880 dumpProperty(ts, "additive", animation.additive);
882 if (animation.reverseTimingFunctions)
883 dumpProperty(ts, "reverseTimingFunctions", animation.reverseTimingFunctions);
885 if (animation.hasNonZeroBeginTime)
886 dumpProperty(ts, "hasNonZeroBeginTime", animation.hasNonZeroBeginTime);
891 ts << "(" << "keyframes";
894 size_t maxFrames = std::max(animation.keyValues.size(), animation.keyTimes.size());
895 maxFrames = std::max(maxFrames, animation.timingFunctions.size());
897 for (size_t i = 0; i < maxFrames; ++i) {
900 ts << "(keyframe " << unsigned(i);
901 if (i < animation.keyTimes.size())
902 dumpProperty(ts, "time", animation.keyTimes[i]);
904 if (i < animation.timingFunctions.size() && animation.timingFunctions[i])
905 dumpProperty<const TimingFunction&>(ts, "timing function", *animation.timingFunctions[i]);
907 if (i < animation.keyValues.size())
908 dumpProperty(ts, "value", animation.keyValues[i]);
919 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(FloatPoint3D point)
921 RemoteLayerTreeTextStream& ts = *this;
922 ts << point.x() << " " << point.y() << " " << point.z();
926 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(Color color)
928 RemoteLayerTreeTextStream& ts = *this;
929 ts << color.serialized();
933 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(FloatRect rect)
935 RemoteLayerTreeTextStream& ts = *this;
936 ts << rect.x() << " " << rect.y() << " " << rect.width() << " " << rect.height();
940 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(const Vector<GraphicsLayer::PlatformLayerID>& layers)
942 RemoteLayerTreeTextStream& ts = *this;
944 for (size_t i = 0; i < layers.size(); ++i) {
953 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(const RemoteLayerBackingStore& backingStore)
955 RemoteLayerTreeTextStream& ts = *this;
956 ts << backingStore.size();
957 ts << " scale=" << backingStore.scale();
958 if (backingStore.isOpaque())
960 if (backingStore.acceleratesDrawing())
961 ts << " accelerated";
965 void RemoteLayerTreeTextStream::writeIndent()
967 for (int i = 0; i < m_indent; ++i)
971 static void dumpChangedLayers(RemoteLayerTreeTextStream& ts, const RemoteLayerTreeTransaction::LayerPropertiesMap& changedLayerProperties)
973 if (changedLayerProperties.isEmpty())
978 ts << "(changed-layers";
980 // Dump the layer properties sorted by layer ID.
981 Vector<GraphicsLayer::PlatformLayerID> layerIDs;
982 copyKeysToVector(changedLayerProperties, layerIDs);
983 std::sort(layerIDs.begin(), layerIDs.end());
985 for (auto& layerID : layerIDs) {
986 const RemoteLayerTreeTransaction::LayerProperties& layerProperties = *changedLayerProperties.get(layerID);
991 ts << "(layer " << layerID;
993 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::NameChanged)
994 dumpProperty(ts, "name", layerProperties.name);
996 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::ChildrenChanged)
997 dumpProperty<Vector<GraphicsLayer::PlatformLayerID>>(ts, "children", layerProperties.children);
999 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::PositionChanged)
1000 dumpProperty(ts, "position", layerProperties.position);
1002 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::BoundsChanged)
1003 dumpProperty(ts, "bounds", layerProperties.bounds);
1005 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::AnchorPointChanged)
1006 dumpProperty(ts, "anchorPoint", layerProperties.anchorPoint);
1008 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::BackgroundColorChanged)
1009 dumpProperty(ts, "backgroundColor", layerProperties.backgroundColor);
1011 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::BorderColorChanged)
1012 dumpProperty(ts, "borderColor", layerProperties.borderColor);
1014 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::BorderWidthChanged)
1015 dumpProperty(ts, "borderWidth", layerProperties.borderWidth);
1017 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::OpacityChanged)
1018 dumpProperty(ts, "opacity", layerProperties.opacity);
1020 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::TransformChanged)
1021 dumpProperty(ts, "transform", layerProperties.transform ? *layerProperties.transform : TransformationMatrix());
1023 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::SublayerTransformChanged)
1024 dumpProperty(ts, "sublayerTransform", layerProperties.sublayerTransform ? *layerProperties.sublayerTransform : TransformationMatrix());
1026 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::HiddenChanged)
1027 dumpProperty(ts, "hidden", layerProperties.hidden);
1029 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::GeometryFlippedChanged)
1030 dumpProperty(ts, "geometryFlipped", layerProperties.geometryFlipped);
1032 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::DoubleSidedChanged)
1033 dumpProperty(ts, "doubleSided", layerProperties.doubleSided);
1035 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::MasksToBoundsChanged)
1036 dumpProperty(ts, "masksToBounds", layerProperties.masksToBounds);
1038 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::OpaqueChanged)
1039 dumpProperty(ts, "opaque", layerProperties.opaque);
1041 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::MaskLayerChanged)
1042 dumpProperty(ts, "maskLayer", layerProperties.maskLayerID);
1044 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::ContentsRectChanged)
1045 dumpProperty(ts, "contentsRect", layerProperties.contentsRect);
1047 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::ContentsScaleChanged)
1048 dumpProperty(ts, "contentsScale", layerProperties.contentsScale);
1050 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::MinificationFilterChanged)
1051 dumpProperty(ts, "minificationFilter", layerProperties.minificationFilter);
1053 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::MagnificationFilterChanged)
1054 dumpProperty(ts, "magnificationFilter", layerProperties.magnificationFilter);
1056 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::BlendModeChanged)
1057 dumpProperty(ts, "blendMode", layerProperties.blendMode);
1059 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::SpeedChanged)
1060 dumpProperty(ts, "speed", layerProperties.speed);
1062 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::TimeOffsetChanged)
1063 dumpProperty(ts, "timeOffset", layerProperties.timeOffset);
1065 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::BackingStoreChanged) {
1066 if (const RemoteLayerBackingStore* backingStore = layerProperties.backingStore.get())
1067 dumpProperty<const RemoteLayerBackingStore&>(ts, "backingStore", *backingStore);
1069 dumpProperty(ts, "backingStore", "removed");
1072 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::FiltersChanged)
1073 dumpProperty(ts, "filters", layerProperties.filters ? *layerProperties.filters : FilterOperations());
1075 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::AnimationsChanged) {
1076 for (const auto& keyValuePair : layerProperties.addedAnimations)
1077 dumpProperty(ts, "animation " + keyValuePair.key, keyValuePair.value);
1079 for (const auto& name : layerProperties.keyPathsOfAnimationsToRemove)
1080 dumpProperty(ts, "removed animation", name);
1083 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::EdgeAntialiasingMaskChanged)
1084 dumpProperty(ts, "edgeAntialiasingMask", layerProperties.edgeAntialiasingMask);
1086 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::CustomAppearanceChanged)
1087 dumpProperty(ts, "customAppearance", layerProperties.customAppearance);
1089 if (layerProperties.changedProperties & RemoteLayerTreeTransaction::CustomBehaviorChanged)
1090 dumpProperty(ts, "customBehavior", layerProperties.customBehavior);
1094 ts.decreaseIndent();
1097 ts.decreaseIndent();
1100 void RemoteLayerTreeTransaction::dump() const
1102 fprintf(stderr, "%s", description().data());
1105 CString RemoteLayerTreeTransaction::description() const
1107 RemoteLayerTreeTextStream ts;
1110 ts.increaseIndent();
1112 ts << "(root-layer " << m_rootLayerID << ")";
1114 if (!m_createdLayers.isEmpty()) {
1117 ts << "(created-layers";
1118 ts.increaseIndent();
1119 for (const auto& createdLayer : m_createdLayers) {
1123 switch (createdLayer.type) {
1124 case PlatformCALayer::LayerTypeLayer:
1125 case PlatformCALayer::LayerTypeWebLayer:
1126 case PlatformCALayer::LayerTypeSimpleLayer:
1129 case PlatformCALayer::LayerTypeTransformLayer:
1130 ts << "transform-layer";
1132 case PlatformCALayer::LayerTypeWebTiledLayer:
1133 ts << "tiled-layer";
1135 case PlatformCALayer::LayerTypeTiledBackingLayer:
1136 ts << "tiled-backing-layer";
1138 case PlatformCALayer::LayerTypePageTiledBackingLayer:
1139 ts << "page-tiled-backing-layer";
1141 case PlatformCALayer::LayerTypeTiledBackingTileLayer:
1142 ts << "tiled-backing-tile";
1144 case PlatformCALayer::LayerTypeRootLayer:
1147 case PlatformCALayer::LayerTypeAVPlayerLayer:
1148 ts << "av-player-layer";
1150 case PlatformCALayer::LayerTypeCustom:
1151 ts << "custom-layer (context-id " << createdLayer.hostingContextID << ")";
1154 ts << " " << createdLayer.layerID << ")";
1157 ts.decreaseIndent();
1160 dumpChangedLayers(ts, m_changedLayerProperties);
1162 if (!m_destroyedLayerIDs.isEmpty())
1163 dumpProperty<Vector<GraphicsLayer::PlatformLayerID>>(ts, "destroyed-layers", m_destroyedLayerIDs);
1167 return ts.release().utf8();
1170 #endif // !defined(NDEBUG) || !LOG_DISABLED
1172 } // namespace WebKit