Run filter animations in the UI process with UI-side compositing
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 14 Apr 2014 20:46:26 +0000 (20:46 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 14 Apr 2014 20:46:26 +0000 (20:46 +0000)
https://bugs.webkit.org/show_bug.cgi?id=131199
<rdar://problem/16479487>

Source/WebCore:

Reviewed by Sam Weinig.

Add FilterOperation::clone() which is used during decoding.
Export some things.

* WebCore.exp.in:
* platform/graphics/filters/FilterOperation.h:

Source/WebKit2:

Reviewed by Sam Weinig.

* Shared/WebCoreArgumentCoders.cpp: Removed lots of WebCore::
(IPC::ArgumentCoder<SelectionRect>::decode):
(IPC::ArgumentCoder<PasteboardWebContent>::encode):
(IPC::ArgumentCoder<PasteboardWebContent>::decode):
(IPC::ArgumentCoder<PasteboardImage>::encode):
(IPC::ArgumentCoder<PasteboardImage>::decode):
(IPC::ArgumentCoder<URL>::decode):
(IPC::ArgumentCoder<UserStyleSheet>::encode):
(IPC::ArgumentCoder<UserStyleSheet>::decode):
(IPC::ArgumentCoder<UserScript>::encode):
(IPC::ArgumentCoder<UserScript>::decode):
(IPC::ArgumentCoder<ScrollableAreaParameters>::encode):
(IPC::ArgumentCoder<ScrollableAreaParameters>::decode):
(IPC::ArgumentCoder<FixedPositionViewportConstraints>::encode):
(IPC::ArgumentCoder<FixedPositionViewportConstraints>::decode):
(IPC::ArgumentCoder<StickyPositionViewportConstraints>::encode):
(IPC::ArgumentCoder<StickyPositionViewportConstraints>::decode):
(IPC::ArgumentCoder<FilterOperation>::encode):
(IPC::decodeFilterOperation):
(IPC::ArgumentCoder<FilterOperations>::encode):
(IPC::ArgumentCoder<WebCore::UserStyleSheet>::encode): Deleted.
(IPC::ArgumentCoder<WebCore::UserStyleSheet>::decode): Deleted.
(IPC::ArgumentCoder<WebCore::UserScript>::encode): Deleted.
(IPC::ArgumentCoder<WebCore::UserScript>::decode): Deleted.
(IPC::ArgumentCoder<WebCore::ScrollableAreaParameters>::encode): Deleted.
(IPC::ArgumentCoder<WebCore::ScrollableAreaParameters>::decode): Deleted.
(IPC::ArgumentCoder<WebCore::FixedPositionViewportConstraints>::encode): Deleted.
(IPC::ArgumentCoder<WebCore::FixedPositionViewportConstraints>::decode): Deleted.
(IPC::ArgumentCoder<WebCore::StickyPositionViewportConstraints>::encode): Deleted.
(IPC::ArgumentCoder<WebCore::StickyPositionViewportConstraints>::decode): Deleted.
(IPC::encodeFilterOperation): Deleted.
Add encoding/decoding support for FilterOperation.
decodeFilterOperation() has to be a bare function because of the RefPtr
out parameter.
REFERENCE filters should never be encoded, since they have CachedSVGDocumentReferences.

* Shared/WebCoreArgumentCoders.h:

* Shared/mac/RemoteLayerTreeTransaction.mm:
(WebKit::RemoteLayerTreeTextStream::operator<<):
Add logging for filter animations to the RemoteLayerTree log output.

* WebProcess/WebPage/mac/GraphicsLayerCARemote.h:
* WebProcess/WebPage/mac/GraphicsLayerCARemote.cpp:
(WebKit::GraphicsLayerCARemote::addAnimation): Deleted. We can run
filter animations now.

* WebProcess/WebPage/mac/PlatformCAAnimationRemote.h:
KeyValues have a RefPtr<WebCore::FilterOperation> now (which can't be part of
the union because we need its constructor to get called).
* WebProcess/WebPage/mac/PlatformCAAnimationRemote.mm:
(WebKit::PlatformCAAnimationRemote::KeyframeValue::encode): Encode the filter.
(WebKit::PlatformCAAnimationRemote::KeyframeValue::decode): Decode the filter.
(WebKit::PlatformCAAnimationRemote::setFromValue): Implement.
(WebKit::PlatformCAAnimationRemote::setToValue): Implement.
(WebKit::PlatformCAAnimationRemote::setValues): Implement.
(WebKit::animationValueFromKeyframeValue): Handle filters.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@167266 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/WebCore.exp.in
Source/WebCore/platform/graphics/filters/FilterOperation.h
Source/WebKit2/ChangeLog
Source/WebKit2/Shared/WebCoreArgumentCoders.cpp
Source/WebKit2/Shared/WebCoreArgumentCoders.h
Source/WebKit2/Shared/mac/RemoteLayerTreeTransaction.mm
Source/WebKit2/WebProcess/WebPage/mac/GraphicsLayerCARemote.cpp
Source/WebKit2/WebProcess/WebPage/mac/GraphicsLayerCARemote.h
Source/WebKit2/WebProcess/WebPage/mac/PlatformCAAnimationRemote.h
Source/WebKit2/WebProcess/WebPage/mac/PlatformCAAnimationRemote.mm

index 8e1d89d..1bafd1c 100644 (file)
@@ -1,3 +1,17 @@
+2014-04-14  Simon Fraser  <simon.fraser@apple.com>
+
+        Run filter animations in the UI process with UI-side compositing
+        https://bugs.webkit.org/show_bug.cgi?id=131199
+        <rdar://problem/16479487>
+
+        Reviewed by Sam Weinig.
+
+        Add FilterOperation::clone() which is used during decoding.
+        Export some things.
+
+        * WebCore.exp.in:
+        * platform/graphics/filters/FilterOperation.h:
+
 2014-04-14  Jer Noble  <jer.noble@apple.com>
 
         Use after free in WebCore::CachedResourceHandleBase::~CachedResourceHandleBase / WebCore::removeDetachedChildrenInContainer
index a50d186..7d600d8 100644 (file)
@@ -105,6 +105,7 @@ __ZN7WebCore10TextStream7releaseEv
 __ZN7WebCore10TextStreamlsEPKc
 __ZN7WebCore10TextStreamlsEPKv
 __ZN7WebCore10TextStreamlsERKN3WTF6StringE
+__ZN7WebCore10TextStreamlsERKNS_8IntPointE
 __ZN7WebCore10TextStreamlsERKNS_9FloatSizeE
 __ZN7WebCore10TextStreamlsEb
 __ZN7WebCore10TextStreamlsEd
@@ -735,6 +736,7 @@ __ZN7WebCore17JSDOMGlobalObject6s_infoE
 __ZN7WebCore17MouseRelatedEvent7offsetXEv
 __ZN7WebCore17MouseRelatedEvent7offsetYEv
 __ZN7WebCore17PlatformCAFilters17setFiltersOnLayerEP7CALayerRKNS_16FilterOperationsE
+__ZN7WebCore17PlatformCAFilters23filterValueForOperationEPKNS_15FilterOperationEi
 __ZN7WebCore17SQLiteTransaction5beginEv
 __ZN7WebCore17SQLiteTransaction6commitEv
 __ZN7WebCore17SQLiteTransaction8rollbackEv
@@ -814,6 +816,7 @@ __ZN7WebCore19TextResourceDecoder6decodeEPKcm
 __ZN7WebCore19TextResourceDecoderC1ERKN3WTF6StringERKNS_12TextEncodingEb
 __ZN7WebCore19TextResourceDecoderD1Ev
 __ZN7WebCore19enclosingLayoutRectERKNS_9FloatRectE
+__ZN7WebCore19floatValueForLengthERKNS_6LengthEfPNS_10RenderViewE
 __ZN7WebCore19getFileCreationTimeERKN3WTF6StringERl
 __ZN7WebCore19toInt32EnforceRangeEPN3JSC9ExecStateENS0_7JSValueE
 __ZN7WebCore20ApplicationCacheHost17maybeLoadResourceEPNS_14ResourceLoaderERKNS_15ResourceRequestERKNS_3URLE
@@ -962,7 +965,6 @@ __ZN7WebCore24FrameDestructionObserver14willDetachPageEv
 __ZN7WebCore24FrameDestructionObserverC2EPNS_5FrameE
 __ZN7WebCore24FrameDestructionObserverD2Ev
 __ZN7WebCore24ImmutableStylePropertiesD1Ev
-__ZN7WebCore24ReferenceFilterOperationC1ERKN3WTF6StringES4_
 __ZN7WebCore24createFragmentFromMarkupERNS_8DocumentERKN3WTF6StringES5_NS_19ParserContentPolicyE
 __ZN7WebCore24decodeURLEscapeSequencesERKN3WTF6StringE
 __ZN7WebCore24deleteCookiesForHostnameERKNS_21NetworkStorageSessionERKN3WTF6StringE
@@ -1968,6 +1970,7 @@ __ZTVN7WebCore16DatabaseStrategyE
 __ZTVN7WebCore16IconDatabaseBaseE
 __ZTVN7WebCore17FrameLoaderClientE
 __ZTVN7WebCore19BlurFilterOperationE
+__ZTVN7WebCore22DefaultFilterOperationE
 __ZTVN7WebCore25DropShadowFilterOperationE
 __ZTVN7WebCore28InspectorFrontendClientLocal8SettingsE
 __ZTVN7WebCore31BasicColorMatrixFilterOperationE
index 2306b7e..5f73f0a 100644 (file)
@@ -69,6 +69,8 @@ public:
 
     virtual ~FilterOperation() { }
 
+    virtual PassRefPtr<FilterOperation> clone() const = 0;
+
     virtual bool operator==(const FilterOperation&) const = 0;
     bool operator!=(const FilterOperation& o) const { return !(*this == o); }
 
@@ -124,6 +126,11 @@ public:
         return adoptRef(new DefaultFilterOperation(representedType));
     }
 
+    virtual PassRefPtr<FilterOperation> clone() const override
+    {
+        return adoptRef(new DefaultFilterOperation(representedType()));
+    }
+
     OperationType representedType() const { return m_representedType; }
 
 private:
@@ -148,6 +155,11 @@ public:
         return adoptRef(new PassthroughFilterOperation());
     }
 
+    virtual PassRefPtr<FilterOperation> clone() const override
+    {
+        return adoptRef(new PassthroughFilterOperation());
+    }
+
 private:
     virtual bool operator==(const FilterOperation& o) const override
     {
@@ -170,6 +182,13 @@ public:
     }
     virtual ~ReferenceFilterOperation();
 
+    virtual PassRefPtr<FilterOperation> clone() const override
+    {
+        // Reference filters cannot be cloned.
+        ASSERT_NOT_REACHED();
+        return nullptr;
+    }
+
     virtual bool affectsOpacity() const override { return true; }
     virtual bool movesPixels() const override { return true; }
 
@@ -204,6 +223,11 @@ public:
         return adoptRef(new BasicColorMatrixFilterOperation(amount, type));
     }
 
+    virtual PassRefPtr<FilterOperation> clone() const override
+    {
+        return adoptRef(new BasicColorMatrixFilterOperation(amount(), type()));
+    }
+
     double amount() const { return m_amount; }
 
     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress, bool blendToPassthrough = false) override;
@@ -232,6 +256,11 @@ public:
         return adoptRef(new BasicComponentTransferFilterOperation(amount, type));
     }
 
+    virtual PassRefPtr<FilterOperation> clone() const override
+    {
+        return adoptRef(new BasicComponentTransferFilterOperation(amount(), type()));
+    }
+
     double amount() const { return m_amount; }
 
     virtual bool affectsOpacity() const override { return m_type == OPACITY; }
@@ -261,6 +290,11 @@ public:
         return adoptRef(new BlurFilterOperation(std::move(stdDeviation)));
     }
 
+    virtual PassRefPtr<FilterOperation> clone() const override
+    {
+        return adoptRef(new BlurFilterOperation(stdDeviation()));
+    }
+
     const Length& stdDeviation() const { return m_stdDeviation; }
 
     virtual bool affectsOpacity() const override { return true; }
@@ -289,6 +323,11 @@ public:
         return adoptRef(new DropShadowFilterOperation(location, stdDeviation, color));
     }
 
+    virtual PassRefPtr<FilterOperation> clone() const override
+    {
+        return adoptRef(new DropShadowFilterOperation(location(), stdDeviation(), color()));
+    }
+
     int x() const { return m_location.x(); }
     int y() const { return m_location.y(); }
     IntPoint location() const { return m_location; }
index 3ef5a5a..88f9474 100644 (file)
@@ -1,5 +1,71 @@
 2014-04-14  Simon Fraser  <simon.fraser@apple.com>
 
+        Run filter animations in the UI process with UI-side compositing
+        https://bugs.webkit.org/show_bug.cgi?id=131199
+        <rdar://problem/16479487>
+
+        Reviewed by Sam Weinig.
+        
+        * Shared/WebCoreArgumentCoders.cpp: Removed lots of WebCore::
+        (IPC::ArgumentCoder<SelectionRect>::decode):
+        (IPC::ArgumentCoder<PasteboardWebContent>::encode):
+        (IPC::ArgumentCoder<PasteboardWebContent>::decode):
+        (IPC::ArgumentCoder<PasteboardImage>::encode):
+        (IPC::ArgumentCoder<PasteboardImage>::decode):
+        (IPC::ArgumentCoder<URL>::decode):
+        (IPC::ArgumentCoder<UserStyleSheet>::encode):
+        (IPC::ArgumentCoder<UserStyleSheet>::decode):
+        (IPC::ArgumentCoder<UserScript>::encode):
+        (IPC::ArgumentCoder<UserScript>::decode):
+        (IPC::ArgumentCoder<ScrollableAreaParameters>::encode):
+        (IPC::ArgumentCoder<ScrollableAreaParameters>::decode):
+        (IPC::ArgumentCoder<FixedPositionViewportConstraints>::encode):
+        (IPC::ArgumentCoder<FixedPositionViewportConstraints>::decode):
+        (IPC::ArgumentCoder<StickyPositionViewportConstraints>::encode):
+        (IPC::ArgumentCoder<StickyPositionViewportConstraints>::decode):
+        (IPC::ArgumentCoder<FilterOperation>::encode):
+        (IPC::decodeFilterOperation):
+        (IPC::ArgumentCoder<FilterOperations>::encode):
+        (IPC::ArgumentCoder<WebCore::UserStyleSheet>::encode): Deleted.
+        (IPC::ArgumentCoder<WebCore::UserStyleSheet>::decode): Deleted.
+        (IPC::ArgumentCoder<WebCore::UserScript>::encode): Deleted.
+        (IPC::ArgumentCoder<WebCore::UserScript>::decode): Deleted.
+        (IPC::ArgumentCoder<WebCore::ScrollableAreaParameters>::encode): Deleted.
+        (IPC::ArgumentCoder<WebCore::ScrollableAreaParameters>::decode): Deleted.
+        (IPC::ArgumentCoder<WebCore::FixedPositionViewportConstraints>::encode): Deleted.
+        (IPC::ArgumentCoder<WebCore::FixedPositionViewportConstraints>::decode): Deleted.
+        (IPC::ArgumentCoder<WebCore::StickyPositionViewportConstraints>::encode): Deleted.
+        (IPC::ArgumentCoder<WebCore::StickyPositionViewportConstraints>::decode): Deleted.
+        (IPC::encodeFilterOperation): Deleted.
+        Add encoding/decoding support for FilterOperation.
+        decodeFilterOperation() has to be a bare function because of the RefPtr
+        out parameter.
+        REFERENCE filters should never be encoded, since they have CachedSVGDocumentReferences.
+
+        * Shared/WebCoreArgumentCoders.h:
+
+        * Shared/mac/RemoteLayerTreeTransaction.mm:
+        (WebKit::RemoteLayerTreeTextStream::operator<<):
+        Add logging for filter animations to the RemoteLayerTree log output.
+
+        * WebProcess/WebPage/mac/GraphicsLayerCARemote.h:
+        * WebProcess/WebPage/mac/GraphicsLayerCARemote.cpp:
+        (WebKit::GraphicsLayerCARemote::addAnimation): Deleted. We can run
+        filter animations now.
+
+        * WebProcess/WebPage/mac/PlatformCAAnimationRemote.h:
+        KeyValues have a RefPtr<WebCore::FilterOperation> now (which can't be part of
+        the union because we need its constructor to get called).
+        * WebProcess/WebPage/mac/PlatformCAAnimationRemote.mm:
+        (WebKit::PlatformCAAnimationRemote::KeyframeValue::encode): Encode the filter.
+        (WebKit::PlatformCAAnimationRemote::KeyframeValue::decode): Decode the filter.
+        (WebKit::PlatformCAAnimationRemote::setFromValue): Implement.
+        (WebKit::PlatformCAAnimationRemote::setToValue): Implement.
+        (WebKit::PlatformCAAnimationRemote::setValues): Implement.
+        (WebKit::animationValueFromKeyframeValue): Handle filters.
+
+2014-04-14  Simon Fraser  <simon.fraser@apple.com>
+
         Fix the build.
 
         * UIProcess/mac/PageClientImpl.h:
index a7a3151..c5a1dbc 100644 (file)
@@ -276,9 +276,9 @@ bool ArgumentCoder<IntSize>::decode(ArgumentDecoder& decoder, IntSize& intSize)
     return SimpleArgumentCoder<IntSize>::decode(decoder, intSize);
 }
 
-template<> struct ArgumentCoder<WebCore::Region::Span> {
-    static void encode(ArgumentEncoder&, const WebCore::Region::Span&);
-    static bool decode(ArgumentDecoder&, WebCore::Region::Span&);
+template<> struct ArgumentCoder<Region::Span> {
+    static void encode(ArgumentEncoder&, const Region::Span&);
+    static bool decode(ArgumentDecoder&, Region::Span&);
 };
 
 void ArgumentCoder<Region::Span>::encode(ArgumentEncoder& encoder, const Region::Span& span)
@@ -842,7 +842,7 @@ void ArgumentCoder<SelectionRect>::encode(ArgumentEncoder& encoder, const Select
 
 bool ArgumentCoder<SelectionRect>::decode(ArgumentDecoder& decoder, SelectionRect& selectionRect)
 {
-    WebCore::IntRect rect;
+    IntRect rect;
     if (!decoder.decode(rect))
         return false;
     selectionRect.setRect(rect);
@@ -850,7 +850,7 @@ bool ArgumentCoder<SelectionRect>::decode(ArgumentDecoder& decoder, SelectionRec
     uint32_t direction;
     if (!decoder.decode(direction))
         return false;
-    selectionRect.setDirection((WebCore::TextDirection)direction);
+    selectionRect.setDirection((TextDirection)direction);
 
     int intValue;
     if (!decoder.decode(intValue))
@@ -1121,7 +1121,7 @@ static bool decodeSharedBuffer(ArgumentDecoder& decoder, RefPtr<SharedBuffer>& b
     return true;
 }
 
-void ArgumentCoder<PasteboardWebContent>::encode(ArgumentEncoder& encoder, const WebCore::PasteboardWebContent& content)
+void ArgumentCoder<PasteboardWebContent>::encode(ArgumentEncoder& encoder, const PasteboardWebContent& content)
 {
     encoder << content.canSmartCopyOrDelete;
     encoder << content.dataInStringFormat;
@@ -1136,7 +1136,7 @@ void ArgumentCoder<PasteboardWebContent>::encode(ArgumentEncoder& encoder, const
         encodeSharedBuffer(encoder, content.clientData[i].get());
 }
 
-bool ArgumentCoder<PasteboardWebContent>::decode(ArgumentDecoder& decoder, WebCore::PasteboardWebContent& content)
+bool ArgumentCoder<PasteboardWebContent>::decode(ArgumentDecoder& decoder, PasteboardWebContent& content)
 {
     if (!decoder.decode(content.canSmartCopyOrDelete))
         return false;
@@ -1160,7 +1160,7 @@ bool ArgumentCoder<PasteboardWebContent>::decode(ArgumentDecoder& decoder, WebCo
     return true;
 }
 
-void ArgumentCoder<PasteboardImage>::encode(ArgumentEncoder& encoder, const WebCore::PasteboardImage& pasteboardImage)
+void ArgumentCoder<PasteboardImage>::encode(ArgumentEncoder& encoder, const PasteboardImage& pasteboardImage)
 {
     encodeImage(encoder, pasteboardImage.image.get());
     encoder << pasteboardImage.url.url;
@@ -1170,7 +1170,7 @@ void ArgumentCoder<PasteboardImage>::encode(ArgumentEncoder& encoder, const WebC
         encodeSharedBuffer(encoder, pasteboardImage.resourceData.get());
 }
 
-bool ArgumentCoder<PasteboardImage>::decode(ArgumentDecoder& decoder, WebCore::PasteboardImage& pasteboardImage)
+bool ArgumentCoder<PasteboardImage>::decode(ArgumentDecoder& decoder, PasteboardImage& pasteboardImage)
 {
     if (!decodeImage(decoder, pasteboardImage.image))
         return false;
@@ -1319,11 +1319,11 @@ bool ArgumentCoder<URL>::decode(ArgumentDecoder& decoder, URL& result)
     String urlAsString;
     if (!decoder.decode(urlAsString))
         return false;
-    result = URL(WebCore::ParsedURLString, urlAsString);
+    result = URL(ParsedURLString, urlAsString);
     return true;
 }
 
-void ArgumentCoder<WebCore::UserStyleSheet>::encode(ArgumentEncoder& encoder, const WebCore::UserStyleSheet& userStyleSheet)
+void ArgumentCoder<UserStyleSheet>::encode(ArgumentEncoder& encoder, const UserStyleSheet& userStyleSheet)
 {
     encoder << userStyleSheet.source();
     encoder << userStyleSheet.url();
@@ -1333,7 +1333,7 @@ void ArgumentCoder<WebCore::UserStyleSheet>::encode(ArgumentEncoder& encoder, co
     encoder.encodeEnum(userStyleSheet.level());
 }
 
-bool ArgumentCoder<WebCore::UserStyleSheet>::decode(ArgumentDecoder& decoder, WebCore::UserStyleSheet& userStyleSheet)
+bool ArgumentCoder<UserStyleSheet>::decode(ArgumentDecoder& decoder, UserStyleSheet& userStyleSheet)
 {
     String source;
     if (!decoder.decode(source))
@@ -1351,19 +1351,19 @@ bool ArgumentCoder<WebCore::UserStyleSheet>::decode(ArgumentDecoder& decoder, We
     if (!decoder.decode(blacklist))
         return false;
 
-    WebCore::UserContentInjectedFrames injectedFrames;
+    UserContentInjectedFrames injectedFrames;
     if (!decoder.decodeEnum(injectedFrames))
         return false;
 
-    WebCore::UserStyleLevel level;
+    UserStyleLevel level;
     if (!decoder.decodeEnum(level))
         return false;
 
-    userStyleSheet = WebCore::UserStyleSheet(source, url, whitelist, blacklist, injectedFrames, level);
+    userStyleSheet = UserStyleSheet(source, url, whitelist, blacklist, injectedFrames, level);
     return true;
 }
 
-void ArgumentCoder<WebCore::UserScript>::encode(ArgumentEncoder& encoder, const WebCore::UserScript& userScript)
+void ArgumentCoder<UserScript>::encode(ArgumentEncoder& encoder, const UserScript& userScript)
 {
     encoder << userScript.source();
     encoder << userScript.url();
@@ -1373,7 +1373,7 @@ void ArgumentCoder<WebCore::UserScript>::encode(ArgumentEncoder& encoder, const
     encoder.encodeEnum(userScript.injectedFrames());
 }
 
-bool ArgumentCoder<WebCore::UserScript>::decode(ArgumentDecoder& decoder, WebCore::UserScript& userScript)
+bool ArgumentCoder<UserScript>::decode(ArgumentDecoder& decoder, UserScript& userScript)
 {
     String source;
     if (!decoder.decode(source))
@@ -1391,19 +1391,19 @@ bool ArgumentCoder<WebCore::UserScript>::decode(ArgumentDecoder& decoder, WebCor
     if (!decoder.decode(blacklist))
         return false;
 
-    WebCore::UserScriptInjectionTime injectionTime;
+    UserScriptInjectionTime injectionTime;
     if (!decoder.decodeEnum(injectionTime))
         return false;
 
-    WebCore::UserContentInjectedFrames injectedFrames;
+    UserContentInjectedFrames injectedFrames;
     if (!decoder.decodeEnum(injectedFrames))
         return false;
 
-    userScript = WebCore::UserScript(source, url, whitelist, blacklist, injectionTime, injectedFrames);
+    userScript = UserScript(source, url, whitelist, blacklist, injectionTime, injectedFrames);
     return true;
 }
 
-void ArgumentCoder<WebCore::ScrollableAreaParameters>::encode(ArgumentEncoder& encoder, const WebCore::ScrollableAreaParameters& parameters)
+void ArgumentCoder<ScrollableAreaParameters>::encode(ArgumentEncoder& encoder, const ScrollableAreaParameters& parameters)
 {
     encoder.encodeEnum(parameters.horizontalScrollElasticity);
     encoder.encodeEnum(parameters.verticalScrollElasticity);
@@ -1415,7 +1415,7 @@ void ArgumentCoder<WebCore::ScrollableAreaParameters>::encode(ArgumentEncoder& e
     encoder << parameters.hasEnabledVerticalScrollbar;
 }
 
-bool ArgumentCoder<WebCore::ScrollableAreaParameters>::decode(ArgumentDecoder& decoder, WebCore::ScrollableAreaParameters& params)
+bool ArgumentCoder<ScrollableAreaParameters>::decode(ArgumentDecoder& decoder, ScrollableAreaParameters& params)
 {
     if (!decoder.decodeEnum(params.horizontalScrollElasticity))
         return false;
@@ -1435,7 +1435,7 @@ bool ArgumentCoder<WebCore::ScrollableAreaParameters>::decode(ArgumentDecoder& d
     return true;
 }
 
-void ArgumentCoder<WebCore::FixedPositionViewportConstraints>::encode(ArgumentEncoder& encoder, const WebCore::FixedPositionViewportConstraints& viewportConstraints)
+void ArgumentCoder<FixedPositionViewportConstraints>::encode(ArgumentEncoder& encoder, const FixedPositionViewportConstraints& viewportConstraints)
 {
     encoder << viewportConstraints.alignmentOffset();
     encoder << viewportConstraints.anchorEdges();
@@ -1444,7 +1444,7 @@ void ArgumentCoder<WebCore::FixedPositionViewportConstraints>::encode(ArgumentEn
     encoder << viewportConstraints.layerPositionAtLastLayout();
 }
 
-bool ArgumentCoder<WebCore::FixedPositionViewportConstraints>::decode(ArgumentDecoder& decoder, WebCore::FixedPositionViewportConstraints& viewportConstraints)
+bool ArgumentCoder<FixedPositionViewportConstraints>::decode(ArgumentDecoder& decoder, FixedPositionViewportConstraints& viewportConstraints)
 {
     FloatSize alignmentOffset;
     if (!decoder.decode(alignmentOffset))
@@ -1462,7 +1462,7 @@ bool ArgumentCoder<WebCore::FixedPositionViewportConstraints>::decode(ArgumentDe
     if (!decoder.decode(layerPositionAtLastLayout))
         return false;
 
-    viewportConstraints = WebCore::FixedPositionViewportConstraints();
+    viewportConstraints = FixedPositionViewportConstraints();
     viewportConstraints.setAlignmentOffset(alignmentOffset);
     viewportConstraints.setAnchorEdges(anchorEdges);
 
@@ -1472,7 +1472,7 @@ bool ArgumentCoder<WebCore::FixedPositionViewportConstraints>::decode(ArgumentDe
     return true;
 }
 
-void ArgumentCoder<WebCore::StickyPositionViewportConstraints>::encode(ArgumentEncoder& encoder, const WebCore::StickyPositionViewportConstraints& viewportConstraints)
+void ArgumentCoder<StickyPositionViewportConstraints>::encode(ArgumentEncoder& encoder, const StickyPositionViewportConstraints& viewportConstraints)
 {
     encoder << viewportConstraints.alignmentOffset();
     encoder << viewportConstraints.anchorEdges();
@@ -1490,7 +1490,7 @@ void ArgumentCoder<WebCore::StickyPositionViewportConstraints>::encode(ArgumentE
     encoder << viewportConstraints.layerPositionAtLastLayout();
 }
 
-bool ArgumentCoder<WebCore::StickyPositionViewportConstraints>::decode(ArgumentDecoder& decoder, WebCore::StickyPositionViewportConstraints& viewportConstraints)
+bool ArgumentCoder<StickyPositionViewportConstraints>::decode(ArgumentDecoder& decoder, StickyPositionViewportConstraints& viewportConstraints)
 {
     FloatSize alignmentOffset;
     if (!decoder.decode(alignmentOffset))
@@ -1536,7 +1536,7 @@ bool ArgumentCoder<WebCore::StickyPositionViewportConstraints>::decode(ArgumentD
     if (!decoder.decode(layerPositionAtLastLayout))
         return false;
     
-    viewportConstraints = WebCore::StickyPositionViewportConstraints();
+    viewportConstraints = StickyPositionViewportConstraints();
     viewportConstraints.setAlignmentOffset(alignmentOffset);
     viewportConstraints.setAnchorEdges(anchorEdges);
 
@@ -1556,63 +1556,58 @@ bool ArgumentCoder<WebCore::StickyPositionViewportConstraints>::decode(ArgumentD
 }
 
 #if ENABLE(CSS_FILTERS) && !USE(COORDINATED_GRAPHICS)
-static void encodeFilterOperation(ArgumentEncoder& encoder, const FilterOperation& filter)
+void ArgumentCoder<FilterOperation>::encode(ArgumentEncoder& encoder, const FilterOperation& filter)
 {
     encoder.encodeEnum(filter.type());
 
     switch (filter.type()) {
     case FilterOperation::REFERENCE: {
-        const auto& referenceFilter = static_cast<const ReferenceFilterOperation&>(filter);
-        encoder << referenceFilter.url();
-        encoder << referenceFilter.fragment();
+        ASSERT_NOT_REACHED();
         break;
     }
     case FilterOperation::GRAYSCALE:
     case FilterOperation::SEPIA:
     case FilterOperation::SATURATE:
     case FilterOperation::HUE_ROTATE:
-        encoder << static_cast<const BasicColorMatrixFilterOperation&>(filter).amount();
+        encoder << toBasicColorMatrixFilterOperation(filter).amount();
         break;
     case FilterOperation::INVERT:
     case FilterOperation::OPACITY:
     case FilterOperation::BRIGHTNESS:
     case FilterOperation::CONTRAST:
-        encoder << static_cast<const BasicComponentTransferFilterOperation&>(filter).amount();
+        encoder << toBasicComponentTransferFilterOperation(filter).amount();
         break;
     case FilterOperation::BLUR:
-        encoder << static_cast<const BlurFilterOperation&>(filter).stdDeviation();
+        encoder << toBlurFilterOperation(filter).stdDeviation();
         break;
     case FilterOperation::DROP_SHADOW: {
-        const auto& dropShadowFilter = static_cast<const DropShadowFilterOperation&>(filter);
+        const auto& dropShadowFilter = toDropShadowFilterOperation(filter);
         encoder << dropShadowFilter.location();
         encoder << dropShadowFilter.stdDeviation();
         encoder << dropShadowFilter.color();
         break;
     }
     case FilterOperation::DEFAULT:
+        encoder.encodeEnum(toDefaultFilterOperation(filter).representedType());
+        break;
     case FilterOperation::PASSTHROUGH:
     case FilterOperation::NONE:
         break;
-    };
+    }
 }
 
-static bool decodeFilterOperation(ArgumentDecoder& decoder, RefPtr<FilterOperation>& filter)
+bool decodeFilterOperation(ArgumentDecoder& decoder, RefPtr<FilterOperation>& filter)
 {
     FilterOperation::OperationType type;
     if (!decoder.decodeEnum(type))
         return false;
 
     switch (type) {
-    case FilterOperation::REFERENCE: {
-        String url;
-        String fragment;
-        if (!decoder.decode(url))
-            return false;
-        if (!decoder.decode(fragment))
-            return false;
-        filter = ReferenceFilterOperation::create(url, fragment);
+    case FilterOperation::PASSTHROUGH:
+    case FilterOperation::NONE:
+    case FilterOperation::REFERENCE:
+        ASSERT_NOT_REACHED();
         break;
-    }
     case FilterOperation::GRAYSCALE:
     case FilterOperation::SEPIA:
     case FilterOperation::SATURATE:
@@ -1653,12 +1648,15 @@ static bool decodeFilterOperation(ArgumentDecoder& decoder, RefPtr<FilterOperati
         filter = DropShadowFilterOperation::create(location, stdDeviation, color);
         break;
     }
-    case FilterOperation::DEFAULT:
-    case FilterOperation::PASSTHROUGH:
-    case FilterOperation::NONE:
+    case FilterOperation::DEFAULT: {
+        FilterOperation::OperationType representedType;
+        if (!decoder.decodeEnum(representedType))
+            return false;
+        filter = DefaultFilterOperation::create(representedType);
         break;
-    };
-
+    }
+    }
+            
     return true;
 }
 
@@ -1668,7 +1666,7 @@ void ArgumentCoder<FilterOperations>::encode(ArgumentEncoder& encoder, const Fil
     encoder << static_cast<uint64_t>(filters.size());
 
     for (const auto& filter : filters.operations())
-        encodeFilterOperation(encoder, *filter);
+        encoder << *filter;
 }
 
 bool ArgumentCoder<FilterOperations>::decode(ArgumentDecoder& decoder, FilterOperations& filters)
index f61b1f8..cfa0ea1 100644 (file)
@@ -37,6 +37,7 @@ class Credential;
 class CubicBezierTimingFunction;
 class Cursor;
 class DatabaseDetails;
+class FilterOperation;
 class FilterOperations;
 class FloatPoint;
 class FloatPoint3D;
@@ -373,6 +374,11 @@ template<> struct ArgumentCoder<WebCore::FilterOperations> {
     static void encode(ArgumentEncoder&, const WebCore::FilterOperations&);
     static bool decode(ArgumentDecoder&, WebCore::FilterOperations&);
 };
+    
+template<> struct ArgumentCoder<WebCore::FilterOperation> {
+    static void encode(ArgumentEncoder&, const WebCore::FilterOperation&);
+};
+bool decodeFilterOperation(ArgumentDecoder&, RefPtr<WebCore::FilterOperation>&);
 #endif
 
 #if ENABLE(INDEXED_DATABASE)
index 581eca1..95ee921 100644 (file)
@@ -33,6 +33,7 @@
 #import "PlatformCALayerRemote.h"
 #import "WebCoreArgumentCoders.h"
 #import <QuartzCore/QuartzCore.h>
+#import <WebCore/LengthFunctions.h>
 #import <WebCore/TextStream.h>
 #import <WebCore/TimingFunction.h>
 #import <wtf/text/CString.h>
@@ -562,6 +563,7 @@ public:
     RemoteLayerTreeTextStream& operator<<(Color);
     RemoteLayerTreeTextStream& operator<<(FloatRect);
     RemoteLayerTreeTextStream& operator<<(const Vector<WebCore::GraphicsLayer::PlatformLayerID>&);
+    RemoteLayerTreeTextStream& operator<<(const FilterOperation&);
     RemoteLayerTreeTextStream& operator<<(const FilterOperations&);
     RemoteLayerTreeTextStream& operator<<(const PlatformCAAnimationRemote::Properties&);
     RemoteLayerTreeTextStream& operator<<(const RemoteLayerBackingStore&);
@@ -633,57 +635,86 @@ RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(const FilterOpe
     RemoteLayerTreeTextStream& ts = *this;
     for (size_t i = 0; i < filters.size(); ++i) {
         const auto filter = filters.at(i);
-        switch (filter->type()) {
-        case FilterOperation::DEFAULT:
-            ts << "default";
-            break;
-        case FilterOperation::REFERENCE:
-            ts << "reference";
-            break;
-        case FilterOperation::GRAYSCALE:
-            ts << "grayscale";
-            break;
-        case FilterOperation::SEPIA:
-            ts << "sepia";
-            break;
-        case FilterOperation::SATURATE:
-            ts << "saturate";
-            break;
-        case FilterOperation::HUE_ROTATE:
-            ts << "hue rotate";
-            break;
-        case FilterOperation::INVERT:
-            ts << "invert";
-            break;
-        case FilterOperation::OPACITY:
-            ts << "opacity";
-            break;
-        case FilterOperation::BRIGHTNESS:
-            ts << "brightness";
-            break;
-        case FilterOperation::CONTRAST:
-            ts << "contrast";
-            break;
-        case FilterOperation::BLUR:
-            ts << "blur";
-            break;
-        case FilterOperation::DROP_SHADOW:
-            ts << "drop shadow";
-            break;
-        case FilterOperation::PASSTHROUGH:
-            ts << "passthrough";
-            break;
-        case FilterOperation::NONE:
-            ts << "none";
-            break;
-        }
-
+        ts << *filter;
         if (i < filters.size() - 1)
             ts << " ";
     }
     return ts;
 }
-
+    
+RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(const FilterOperation& filter)
+{
+    RemoteLayerTreeTextStream& ts = *this;
+    switch (filter.type()) {
+    case FilterOperation::REFERENCE:
+        ts << "reference";
+        break;
+    case FilterOperation::GRAYSCALE: {
+        const BasicColorMatrixFilterOperation& colorMatrixFilter = toBasicColorMatrixFilterOperation(filter);
+        ts << "grayscale(" << colorMatrixFilter.amount() << ")";
+        break;
+    }
+    case FilterOperation::SEPIA: {
+        const BasicColorMatrixFilterOperation& colorMatrixFilter = toBasicColorMatrixFilterOperation(filter);
+        ts << "sepia(" << colorMatrixFilter.amount() << ")";
+        break;
+    }
+    case FilterOperation::SATURATE: {
+        const BasicColorMatrixFilterOperation& colorMatrixFilter = toBasicColorMatrixFilterOperation(filter);
+        ts << "saturate(" << colorMatrixFilter.amount() << ")";
+        break;
+    }
+    case FilterOperation::HUE_ROTATE: {
+        const BasicColorMatrixFilterOperation& colorMatrixFilter = toBasicColorMatrixFilterOperation(filter);
+        ts << "hue-rotate(" << colorMatrixFilter.amount() << ")";
+        break;
+    }
+    case FilterOperation::INVERT: {
+        const BasicComponentTransferFilterOperation& componentTransferFilter = toBasicComponentTransferFilterOperation(filter);
+        ts << "invert(" << componentTransferFilter.amount() << ")";
+        break;
+    }
+    case FilterOperation::OPACITY: {
+        const BasicComponentTransferFilterOperation& componentTransferFilter = toBasicComponentTransferFilterOperation(filter);
+        ts << "opacity(" << componentTransferFilter.amount() << ")";
+        break;
+    }
+    case FilterOperation::BRIGHTNESS: {
+        const BasicComponentTransferFilterOperation& componentTransferFilter = toBasicComponentTransferFilterOperation(filter);
+        ts << "brightness(" << componentTransferFilter.amount() << ")";
+        break;
+    }
+    case FilterOperation::CONTRAST: {
+        const BasicComponentTransferFilterOperation& componentTransferFilter = toBasicComponentTransferFilterOperation(filter);
+        ts << "contrast(" << componentTransferFilter.amount() << ")";
+        break;
+    }
+    case FilterOperation::BLUR: {
+        const BlurFilterOperation& blurFilter = toBlurFilterOperation(filter);
+        ts << "blur(" << floatValueForLength(blurFilter.stdDeviation(), 0) << ")";
+        break;
+    }
+    case FilterOperation::DROP_SHADOW: {
+        const DropShadowFilterOperation& dropShadowFilter = toDropShadowFilterOperation(filter);
+        ts << "drop-shadow(" << dropShadowFilter.x() << " " << dropShadowFilter.y() << " " << dropShadowFilter.location() << " ";
+        ts << dropShadowFilter.color() << ")";
+        break;
+    }
+    case FilterOperation::PASSTHROUGH:
+        ts << "passthrough";
+        break;
+    case FilterOperation::DEFAULT: {
+        const DefaultFilterOperation& defaultFilter = toDefaultFilterOperation(filter);
+        ts << "default type=" << (int)defaultFilter.representedType();
+        break;
+    }
+    case FilterOperation::NONE:
+        ts << "none";
+        break;
+    }
+    return ts;
+}
+    
 RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(PlatformCAAnimation::AnimationType type)
 {
     RemoteLayerTreeTextStream& ts = *this;
@@ -746,6 +777,13 @@ RemoteLayerTreeTextStream& RemoteLayerTreeTextStream::operator<<(const PlatformC
         ts << "transform=";
         ts << value.transformValue();
         break;
+    case PlatformCAAnimationRemote::KeyframeValue::FilterKeyType:
+        ts << "filter=";
+        if (value.filterValue())
+            ts << *value.filterValue();
+        else
+            ts << "null";
+        break;
     }
     return ts;
 }
index 98b1c63..f448093 100644 (file)
@@ -58,14 +58,4 @@ PassRefPtr<PlatformCAAnimation> GraphicsLayerCARemote::createPlatformCAAnimation
     return PlatformCAAnimationRemote::create(type, keyPath);
 }
 
-bool GraphicsLayerCARemote::addAnimation(const KeyframeValueList& valueList, const FloatSize& boxSize, const Animation* anim, const String& animationName, double timeOffset)
-{
-#if ENABLE(CSS_FILTERS)
-    if (valueList.property() == AnimatedPropertyWebkitFilter)
-        return false;
-#endif
-    
-    return GraphicsLayerCA::addAnimation(valueList, boxSize, anim, animationName, timeOffset);
-}
-
 } // namespace WebKit
index 6c9c448..b351b2e 100644 (file)
@@ -57,8 +57,6 @@ private:
     // PlatformCALayerRemote can't currently proxy directly composited image contents, so opt out of this optimization.
     virtual bool shouldDirectlyCompositeImage(WebCore::Image*) const override { return false; }
     
-    virtual bool addAnimation(const WebCore::KeyframeValueList&, const WebCore::FloatSize&, const WebCore::Animation*, const String&, double);
-    
     RemoteLayerTreeContext* m_context;
 };
 
index 227f0f7..877a3e9 100644 (file)
@@ -50,15 +50,15 @@ public:
     virtual bool isPlatformCAAnimationRemote() const override { return true; }
 
     virtual PassRefPtr<PlatformCAAnimation> copy() const override;
-    
+
     virtual String keyPath() const override;
-    
+
     virtual CFTimeInterval beginTime() const override;
     virtual void setBeginTime(CFTimeInterval) override;
-    
+
     virtual CFTimeInterval duration() const override;
     virtual void setDuration(CFTimeInterval) override;
-    
+
     virtual float speed() const override;
     virtual void setSpeed(float) override;
 
@@ -73,7 +73,7 @@ public:
 
     virtual FillModeType fillMode() const override;
     virtual void setFillMode(FillModeType) override;
-    
+
     virtual void setTimingFunction(const WebCore::TimingFunction*, bool reverse = false) override;
     void copyTimingFunctionFrom(const WebCore::PlatformCAAnimation*) override;
 
@@ -128,8 +128,13 @@ public:
             ColorKeyType,
             PointKeyType,
             TransformKeyType,
+            FilterKeyType,
         };
 
+        ~KeyframeValue()
+        {
+        }
+
         KeyframeValue(float value = 0)
             : keyType(NumberKeyType)
             , number(value)
@@ -153,7 +158,13 @@ public:
             , transform(value)
         {
         }
-        
+
+        KeyframeValue(PassRefPtr<WebCore::FilterOperation> value)
+            : keyType(FilterKeyType)
+            , filter(value)
+        {
+        }
+
         KeyframeValue(const KeyframeValue& other)
         {
             *this = other;
@@ -175,11 +186,14 @@ public:
             case TransformKeyType:
                 transform = other.transform;
                 break;
+            case FilterKeyType:
+                filter = other.filter;
+                break;
             }
-            
+
             return *this;
         }
-        
+
         KeyframeType keyframeType() const { return keyType; }
 
         float numberValue() const
@@ -206,6 +220,12 @@ public:
             return transform;
         }
 
+        const WebCore::FilterOperation* filterValue() const
+        {
+            ASSERT(keyType == FilterKeyType);
+            return filter.get();
+        }
+
         void encode(IPC::ArgumentEncoder&) const;
         static bool decode(IPC::ArgumentDecoder&, KeyframeValue&);
 
@@ -217,6 +237,7 @@ public:
             WebCore::FloatPoint3D point;
             WebCore::TransformationMatrix transform;
         };
+        RefPtr<WebCore::FilterOperation> filter;
     };
 
     struct Properties {
@@ -234,10 +255,9 @@ public:
             , additive(false)
             , reverseTimingFunctions(false)
             , hasNonZeroBeginTime(false)
-        
         {
         }
-        
+
         void encode(IPC::ArgumentEncoder&) const;
         static bool decode(IPC::ArgumentDecoder&, Properties&);
 
@@ -249,10 +269,10 @@ public:
         double timeOffset;
         float repeatCount;
         float speed;
-        
+
         PlatformCAAnimation::FillModeType fillMode;
         PlatformCAAnimation::ValueFunctionType valueFunction;
-        
+
         bool autoReverses;
         bool removedOnCompletion;
         bool additive;
index b533bdf..1a428b4 100644 (file)
@@ -32,6 +32,7 @@
 #import <WebCore/BlockExceptions.h>
 #import <WebCore/GraphicsLayer.h>
 #import <WebCore/PlatformCAAnimationMac.h>
+#import <WebCore/PlatformCAFilters.h>
 #import <WebCore/TimingFunction.h>
 #import <wtf/CurrentTime.h>
 #import <wtf/RetainPtr.h>
@@ -101,6 +102,9 @@ void PlatformCAAnimationRemote::KeyframeValue::encode(IPC::ArgumentEncoder& enco
     case TransformKeyType:
         encoder << transform;
         break;
+    case FilterKeyType:
+        encoder << *filter.get();
+        break;
     }
 }
 
@@ -126,6 +130,10 @@ bool PlatformCAAnimationRemote::KeyframeValue::decode(IPC::ArgumentDecoder& deco
         if (!decoder.decode(value.transform))
             return false;
         break;
+    case FilterKeyType:
+        if (!decodeFilterOperation(decoder, value.filter))
+            return false;
+        break;
     }
 
     return true;
@@ -446,7 +454,11 @@ void PlatformCAAnimationRemote::setFromValue(const Color& value)
 #if ENABLE(CSS_FILTERS)
 void PlatformCAAnimationRemote::setFromValue(const FilterOperation* operation, int internalFilterPropertyIndex)
 {
-    ASSERT_NOT_REACHED();
+    if (animationType() != Basic)
+        return;
+
+    m_properties.keyValues.resize(2);
+    m_properties.keyValues[0] = KeyframeValue(operation->clone());
 }
 #endif
 
@@ -494,7 +506,13 @@ void PlatformCAAnimationRemote::setToValue(const Color& value)
 #if ENABLE(CSS_FILTERS)
 void PlatformCAAnimationRemote::setToValue(const FilterOperation* operation, int internalFilterPropertyIndex)
 {
-    ASSERT_NOT_REACHED();
+    if (animationType() != Basic)
+        return;
+    
+    UNUSED_PARAM(internalFilterPropertyIndex);
+    ASSERT(operation);
+    m_properties.keyValues.resize(2);
+    m_properties.keyValues[1] = KeyframeValue(operation->clone());
 }
 #endif
 
@@ -561,10 +579,20 @@ void PlatformCAAnimationRemote::setValues(const Vector<Color>& values)
 }
 
 #if ENABLE(CSS_FILTERS)
-void PlatformCAAnimationRemote::setValues(const Vector<RefPtr<FilterOperation>>&, int internalFilterPropertyIndex)
+void PlatformCAAnimationRemote::setValues(const Vector<RefPtr<FilterOperation>>& values, int internalFilterPropertyIndex)
 {
     UNUSED_PARAM(internalFilterPropertyIndex);
-    ASSERT_NOT_REACHED();
+    
+    if (animationType() != Keyframe)
+        return;
+        
+    Vector<KeyframeValue> keyframes;
+    keyframes.reserveInitialCapacity(values.size());
+    
+    for (size_t i = 0; i < values.size(); ++i)
+        keyframes.uncheckedAppend(KeyframeValue(values[i]));
+    
+    m_properties.keyValues = std::move(keyframes);
 }
 #endif
 
@@ -617,6 +645,9 @@ static NSObject* animationValueFromKeyframeValue(const PlatformCAAnimationRemote
     }
     case PlatformCAAnimationRemote::KeyframeValue::TransformKeyType:
         return [NSValue valueWithCATransform3D:keyframeValue.transformValue()];
+            
+    case PlatformCAAnimationRemote::KeyframeValue::FilterKeyType:
+        return [PlatformCAFilters::filterValueForOperation(keyframeValue.filterValue(), 0 /* unused */).leakRef() autorelease];
     }
 }