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
+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
__ZN7WebCore10TextStreamlsEPKc
__ZN7WebCore10TextStreamlsEPKv
__ZN7WebCore10TextStreamlsERKN3WTF6StringE
+__ZN7WebCore10TextStreamlsERKNS_8IntPointE
__ZN7WebCore10TextStreamlsERKNS_9FloatSizeE
__ZN7WebCore10TextStreamlsEb
__ZN7WebCore10TextStreamlsEd
__ZN7WebCore17MouseRelatedEvent7offsetXEv
__ZN7WebCore17MouseRelatedEvent7offsetYEv
__ZN7WebCore17PlatformCAFilters17setFiltersOnLayerEP7CALayerRKNS_16FilterOperationsE
+__ZN7WebCore17PlatformCAFilters23filterValueForOperationEPKNS_15FilterOperationEi
__ZN7WebCore17SQLiteTransaction5beginEv
__ZN7WebCore17SQLiteTransaction6commitEv
__ZN7WebCore17SQLiteTransaction8rollbackEv
__ZN7WebCore19TextResourceDecoderC1ERKN3WTF6StringERKNS_12TextEncodingEb
__ZN7WebCore19TextResourceDecoderD1Ev
__ZN7WebCore19enclosingLayoutRectERKNS_9FloatRectE
+__ZN7WebCore19floatValueForLengthERKNS_6LengthEfPNS_10RenderViewE
__ZN7WebCore19getFileCreationTimeERKN3WTF6StringERl
__ZN7WebCore19toInt32EnforceRangeEPN3JSC9ExecStateENS0_7JSValueE
__ZN7WebCore20ApplicationCacheHost17maybeLoadResourceEPNS_14ResourceLoaderERKNS_15ResourceRequestERKNS_3URLE
__ZN7WebCore24FrameDestructionObserverC2EPNS_5FrameE
__ZN7WebCore24FrameDestructionObserverD2Ev
__ZN7WebCore24ImmutableStylePropertiesD1Ev
-__ZN7WebCore24ReferenceFilterOperationC1ERKN3WTF6StringES4_
__ZN7WebCore24createFragmentFromMarkupERNS_8DocumentERKN3WTF6StringES5_NS_19ParserContentPolicyE
__ZN7WebCore24decodeURLEscapeSequencesERKN3WTF6StringE
__ZN7WebCore24deleteCookiesForHostnameERKNS_21NetworkStorageSessionERKN3WTF6StringE
__ZTVN7WebCore16IconDatabaseBaseE
__ZTVN7WebCore17FrameLoaderClientE
__ZTVN7WebCore19BlurFilterOperationE
+__ZTVN7WebCore22DefaultFilterOperationE
__ZTVN7WebCore25DropShadowFilterOperationE
__ZTVN7WebCore28InspectorFrontendClientLocal8SettingsE
__ZTVN7WebCore31BasicColorMatrixFilterOperationE
virtual ~FilterOperation() { }
+ virtual PassRefPtr<FilterOperation> clone() const = 0;
+
virtual bool operator==(const FilterOperation&) const = 0;
bool operator!=(const FilterOperation& o) const { return !(*this == o); }
return adoptRef(new DefaultFilterOperation(representedType));
}
+ virtual PassRefPtr<FilterOperation> clone() const override
+ {
+ return adoptRef(new DefaultFilterOperation(representedType()));
+ }
+
OperationType representedType() const { return m_representedType; }
private:
return adoptRef(new PassthroughFilterOperation());
}
+ virtual PassRefPtr<FilterOperation> clone() const override
+ {
+ return adoptRef(new PassthroughFilterOperation());
+ }
+
private:
virtual bool operator==(const FilterOperation& o) const override
{
}
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; }
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;
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; }
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; }
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; }
+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.
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)
bool ArgumentCoder<SelectionRect>::decode(ArgumentDecoder& decoder, SelectionRect& selectionRect)
{
- WebCore::IntRect rect;
+ IntRect rect;
if (!decoder.decode(rect))
return false;
selectionRect.setRect(rect);
uint32_t direction;
if (!decoder.decode(direction))
return false;
- selectionRect.setDirection((WebCore::TextDirection)direction);
+ selectionRect.setDirection((TextDirection)direction);
int intValue;
if (!decoder.decode(intValue))
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;
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;
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;
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;
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();
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))
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();
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))
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);
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;
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();
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))
if (!decoder.decode(layerPositionAtLastLayout))
return false;
- viewportConstraints = WebCore::FixedPositionViewportConstraints();
+ viewportConstraints = FixedPositionViewportConstraints();
viewportConstraints.setAlignmentOffset(alignmentOffset);
viewportConstraints.setAnchorEdges(anchorEdges);
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();
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))
if (!decoder.decode(layerPositionAtLastLayout))
return false;
- viewportConstraints = WebCore::StickyPositionViewportConstraints();
+ viewportConstraints = StickyPositionViewportConstraints();
viewportConstraints.setAlignmentOffset(alignmentOffset);
viewportConstraints.setAnchorEdges(anchorEdges);
}
#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:
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;
}
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)
class CubicBezierTimingFunction;
class Cursor;
class DatabaseDetails;
+class FilterOperation;
class FilterOperations;
class FloatPoint;
class FloatPoint3D;
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)
#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>
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&);
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;
ts << "transform=";
ts << value.transformValue();
break;
+ case PlatformCAAnimationRemote::KeyframeValue::FilterKeyType:
+ ts << "filter=";
+ if (value.filterValue())
+ ts << *value.filterValue();
+ else
+ ts << "null";
+ break;
}
return ts;
}
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
// 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;
};
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;
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;
ColorKeyType,
PointKeyType,
TransformKeyType,
+ FilterKeyType,
};
+ ~KeyframeValue()
+ {
+ }
+
KeyframeValue(float value = 0)
: keyType(NumberKeyType)
, number(value)
, transform(value)
{
}
-
+
+ KeyframeValue(PassRefPtr<WebCore::FilterOperation> value)
+ : keyType(FilterKeyType)
+ , filter(value)
+ {
+ }
+
KeyframeValue(const KeyframeValue& other)
{
*this = other;
case TransformKeyType:
transform = other.transform;
break;
+ case FilterKeyType:
+ filter = other.filter;
+ break;
}
-
+
return *this;
}
-
+
KeyframeType keyframeType() const { return keyType; }
float numberValue() const
return transform;
}
+ const WebCore::FilterOperation* filterValue() const
+ {
+ ASSERT(keyType == FilterKeyType);
+ return filter.get();
+ }
+
void encode(IPC::ArgumentEncoder&) const;
static bool decode(IPC::ArgumentDecoder&, KeyframeValue&);
WebCore::FloatPoint3D point;
WebCore::TransformationMatrix transform;
};
+ RefPtr<WebCore::FilterOperation> filter;
};
struct Properties {
, additive(false)
, reverseTimingFunctions(false)
, hasNonZeroBeginTime(false)
-
{
}
-
+
void encode(IPC::ArgumentEncoder&) const;
static bool decode(IPC::ArgumentDecoder&, Properties&);
double timeOffset;
float repeatCount;
float speed;
-
+
PlatformCAAnimation::FillModeType fillMode;
PlatformCAAnimation::ValueFunctionType valueFunction;
-
+
bool autoReverses;
bool removedOnCompletion;
bool additive;
#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>
case TransformKeyType:
encoder << transform;
break;
+ case FilterKeyType:
+ encoder << *filter.get();
+ break;
}
}
if (!decoder.decode(value.transform))
return false;
break;
+ case FilterKeyType:
+ if (!decodeFilterOperation(decoder, value.filter))
+ return false;
+ break;
}
return true;
#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
#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
}
#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
}
case PlatformCAAnimationRemote::KeyframeValue::TransformKeyType:
return [NSValue valueWithCATransform3D:keyframeValue.transformValue()];
+
+ case PlatformCAAnimationRemote::KeyframeValue::FilterKeyType:
+ return [PlatformCAFilters::filterValueForOperation(keyframeValue.filterValue(), 0 /* unused */).leakRef() autorelease];
}
}