/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef MOZILLA_GFX_FILTERNODED2D1_H_ #define MOZILLA_GFX_FILTERNODED2D1_H_ #include "2D.h" #include "Filters.h" #include #include #include #include namespace mozilla { namespace gfx { class FilterNodeD2D1 : public FilterNode { public: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeD2D1, override) static already_AddRefed Create(ID2D1DeviceContext* aDC, FilterType aType); FilterNodeD2D1(ID2D1Effect* aEffect, FilterType aType) : mEffect(aEffect), mType(aType) { InitUnmappedProperties(); } virtual FilterBackend GetBackendType() { return FILTER_BACKEND_DIRECT2D1_1; } virtual void SetInput(uint32_t aIndex, SourceSurface* aSurface); virtual void SetInput(uint32_t aIndex, FilterNode* aFilter); virtual void SetAttribute(uint32_t aIndex, uint32_t aValue); virtual void SetAttribute(uint32_t aIndex, Float aValue); virtual void SetAttribute(uint32_t aIndex, const Point& aValue); virtual void SetAttribute(uint32_t aIndex, const Matrix5x4& aValue); virtual void SetAttribute(uint32_t aIndex, const Point3D& aValue); virtual void SetAttribute(uint32_t aIndex, const Size& aValue); virtual void SetAttribute(uint32_t aIndex, const IntSize& aValue); virtual void SetAttribute(uint32_t aIndex, const DeviceColor& aValue); virtual void SetAttribute(uint32_t aIndex, const Rect& aValue); virtual void SetAttribute(uint32_t aIndex, const IntRect& aValue); virtual void SetAttribute(uint32_t aIndex, bool aValue); virtual void SetAttribute(uint32_t aIndex, const Float* aValues, uint32_t aSize); virtual void SetAttribute(uint32_t aIndex, const IntPoint& aValue); virtual void SetAttribute(uint32_t aIndex, const Matrix& aValue); // Called by DrawTarget before it draws our OutputEffect, and recursively // by the filter nodes that have this filter as one of their inputs. This // gives us a chance to convert any input surfaces to the target format for // the DrawTarget that we will draw to. virtual void WillDraw(DrawTarget* aDT); virtual ID2D1Effect* MainEffect() { return mEffect.get(); } virtual ID2D1Effect* InputEffect() { return mEffect.get(); } virtual ID2D1Effect* OutputEffect() { return mEffect.get(); } protected: friend class DrawTargetD2D1; friend class DrawTargetD2D; friend class FilterNodeConvolveD2D1; void InitUnmappedProperties(); RefPtr mEffect; std::vector> mInputFilters; std::vector> mInputSurfaces; FilterType mType; private: using FilterNode::SetAttribute; using FilterNode::SetInput; }; class FilterNodeConvolveD2D1 : public FilterNodeD2D1 { public: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeConvolveD2D1, override) explicit FilterNodeConvolveD2D1(ID2D1DeviceContext* aDC); void SetInput(uint32_t aIndex, FilterNode* aFilter) override; void SetAttribute(uint32_t aIndex, uint32_t aValue) override; void SetAttribute(uint32_t aIndex, const IntSize& aValue) override; void SetAttribute(uint32_t aIndex, const IntPoint& aValue) override; void SetAttribute(uint32_t aIndex, const IntRect& aValue) override; ID2D1Effect* InputEffect() override; private: using FilterNode::SetAttribute; using FilterNode::SetInput; void UpdateChain(); void UpdateOffset(); void UpdateSourceRect(); RefPtr mExtendInputEffect; RefPtr mBorderEffect; ConvolveMatrixEdgeMode mEdgeMode; IntPoint mTarget; IntSize mKernelSize; IntRect mSourceRect; }; class FilterNodeOpacityD2D1 : public FilterNodeD2D1 { public: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeOpacityD2D1, override) FilterNodeOpacityD2D1(ID2D1Effect* aEffect, FilterType aType) : FilterNodeD2D1(aEffect, aType) {} void SetAttribute(uint32_t aIndex, Float aValue) override; }; class FilterNodeExtendInputAdapterD2D1 : public FilterNodeD2D1 { public: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeExtendInputAdapterD2D1, override) FilterNodeExtendInputAdapterD2D1(ID2D1DeviceContext* aDC, FilterNodeD2D1* aFilterNode, FilterType aType); ID2D1Effect* InputEffect() override { return mExtendInputEffect.get(); } ID2D1Effect* OutputEffect() override { return mWrappedFilterNode->OutputEffect(); } private: RefPtr mWrappedFilterNode; RefPtr mExtendInputEffect; }; class FilterNodePremultiplyAdapterD2D1 : public FilterNodeD2D1 { public: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodePremultiplyAdapterD2D1, override) FilterNodePremultiplyAdapterD2D1(ID2D1DeviceContext* aDC, FilterNodeD2D1* aFilterNode, FilterType aType); ID2D1Effect* InputEffect() override { return mPrePremultiplyEffect.get(); } ID2D1Effect* OutputEffect() override { return mPostUnpremultiplyEffect.get(); } private: RefPtr mPrePremultiplyEffect; RefPtr mPostUnpremultiplyEffect; }; } // namespace gfx } // namespace mozilla #endif