michael@0: /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef MOZILLA_GFX_FILTERNODED2D1_H_ michael@0: #define MOZILLA_GFX_FILTERNODED2D1_H_ michael@0: michael@0: #include "2D.h" michael@0: #include "Filters.h" michael@0: #include michael@0: #include michael@0: michael@0: namespace mozilla { michael@0: namespace gfx { michael@0: michael@0: class FilterNodeD2D1 : public FilterNode michael@0: { michael@0: public: michael@0: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeD2D1) michael@0: static TemporaryRef Create(DrawTarget* aDT, ID2D1DeviceContext *aDC, FilterType aType); michael@0: michael@0: FilterNodeD2D1(DrawTarget* aDT, ID2D1Effect *aEffect, FilterType aType) michael@0: : mDT(aDT) michael@0: , mEffect(aEffect) michael@0: , mType(aType) michael@0: { michael@0: InitUnmappedProperties(); michael@0: } michael@0: michael@0: virtual FilterBackend GetBackendType() { return FILTER_BACKEND_DIRECT2D1_1; } michael@0: michael@0: virtual void SetInput(uint32_t aIndex, SourceSurface *aSurface); michael@0: virtual void SetInput(uint32_t aIndex, FilterNode *aFilter); michael@0: michael@0: virtual void SetAttribute(uint32_t aIndex, uint32_t aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, Float aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const Point &aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const Matrix5x4 &aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const Point3D &aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const Size &aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const IntSize &aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const Color &aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const Rect &aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const IntRect &aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, bool aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const Float *aValues, uint32_t aSize); michael@0: virtual void SetAttribute(uint32_t aIndex, const IntPoint &aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const Matrix &aValue); michael@0: michael@0: protected: michael@0: friend class DrawTargetD2D1; michael@0: friend class DrawTargetD2D; michael@0: friend class FilterNodeConvolveD2D1; michael@0: michael@0: virtual ID2D1Effect* InputEffect() { return mEffect.get(); } michael@0: virtual ID2D1Effect* OutputEffect() { return mEffect.get(); } michael@0: michael@0: void InitUnmappedProperties(); michael@0: michael@0: RefPtr mDT; michael@0: RefPtr mEffect; michael@0: FilterType mType; michael@0: }; michael@0: michael@0: class FilterNodeConvolveD2D1 : public FilterNodeD2D1 michael@0: { michael@0: public: michael@0: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeConvolveD2D1) michael@0: FilterNodeConvolveD2D1(DrawTarget *aDT, ID2D1DeviceContext *aDC); michael@0: michael@0: virtual void SetInput(uint32_t aIndex, SourceSurface *aSurface); michael@0: virtual void SetInput(uint32_t aIndex, FilterNode *aFilter); michael@0: michael@0: virtual void SetAttribute(uint32_t aIndex, uint32_t aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const IntSize &aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const IntPoint &aValue); michael@0: virtual void SetAttribute(uint32_t aIndex, const IntRect &aValue); michael@0: michael@0: private: michael@0: void UpdateChain(); michael@0: void UpdateOffset(); michael@0: void UpdateSourceRect(); michael@0: michael@0: RefPtr mInput; michael@0: RefPtr mInputEffect; michael@0: RefPtr mFloodEffect; michael@0: RefPtr mCompositeEffect; michael@0: RefPtr mCropEffect; michael@0: RefPtr mBorderEffect; michael@0: ConvolveMatrixEdgeMode mEdgeMode; michael@0: IntPoint mTarget; michael@0: IntSize mKernelSize; michael@0: IntRect mSourceRect; michael@0: }; michael@0: michael@0: class FilterNodeComponentTransferD2D1 : public FilterNodeD2D1 michael@0: { michael@0: public: michael@0: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeComponentTransferD2D1) michael@0: FilterNodeComponentTransferD2D1(DrawTarget *aDT, ID2D1DeviceContext *aDC, ID2D1Effect *aEffect, FilterType aType); michael@0: michael@0: protected: michael@0: virtual ID2D1Effect* InputEffect() MOZ_OVERRIDE { return mPrePremultiplyEffect.get(); } michael@0: virtual ID2D1Effect* OutputEffect() MOZ_OVERRIDE { return mPostUnpremultiplyEffect.get(); } michael@0: michael@0: private: michael@0: RefPtr mPrePremultiplyEffect; michael@0: RefPtr mPostUnpremultiplyEffect; michael@0: }; michael@0: michael@0: } michael@0: } michael@0: michael@0: #endif