| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef FLUTTER_IMPELLER_AIKS_IMAGE_FILTER_H_ |
| #define FLUTTER_IMPELLER_AIKS_IMAGE_FILTER_H_ |
| |
| #include "impeller/aiks/color_filter.h" |
| #include "impeller/core/sampler_descriptor.h" |
| #include "impeller/entity/contents/filters/filter_contents.h" |
| #include "impeller/entity/entity.h" |
| #include "impeller/geometry/matrix.h" |
| #include "impeller/geometry/sigma.h" |
| |
| namespace impeller { |
| |
| struct Paint; |
| |
| class LocalMatrixImageFilter; |
| class BlurImageFilter; |
| class DilateImageFilter; |
| class ErodeImageFilter; |
| class MatrixImageFilter; |
| class ComposeImageFilter; |
| class ColorImageFilter; |
| |
| class ImageFilterVisitor { |
| public: |
| virtual void Visit(const BlurImageFilter& filter) = 0; |
| virtual void Visit(const LocalMatrixImageFilter& filter) = 0; |
| virtual void Visit(const DilateImageFilter& filter) = 0; |
| virtual void Visit(const ErodeImageFilter& filter) = 0; |
| virtual void Visit(const MatrixImageFilter& filter) = 0; |
| virtual void Visit(const ComposeImageFilter& filter) = 0; |
| virtual void Visit(const ColorImageFilter& filter) = 0; |
| }; |
| |
| /******************************************************************************* |
| ******* ImageFilter |
| ******************************************************************************/ |
| |
| class ImageFilter { |
| public: |
| ImageFilter(); |
| |
| virtual ~ImageFilter(); |
| |
| static std::shared_ptr<ImageFilter> MakeBlur( |
| Sigma sigma_x, |
| Sigma sigma_y, |
| FilterContents::BlurStyle blur_style, |
| Entity::TileMode tile_mode); |
| |
| static std::shared_ptr<ImageFilter> MakeDilate(Radius radius_x, |
| Radius radius_y); |
| |
| static std::shared_ptr<ImageFilter> MakeErode(Radius radius_x, |
| Radius radius_y); |
| |
| static std::shared_ptr<ImageFilter> MakeMatrix( |
| const Matrix& matrix, |
| SamplerDescriptor sampler_descriptor); |
| |
| static std::shared_ptr<ImageFilter> MakeCompose(const ImageFilter& inner, |
| const ImageFilter& outer); |
| |
| static std::shared_ptr<ImageFilter> MakeFromColorFilter( |
| const ColorFilter& color_filter); |
| |
| static std::shared_ptr<ImageFilter> MakeLocalMatrix( |
| const Matrix& matrix, |
| const ImageFilter& internal_filter); |
| |
| /// @brief Generate a new FilterContents using this filter's configuration. |
| /// |
| /// This is the same as WrapInput, except no input is set. The input |
| /// for the filter chain can be set later using. |
| /// FilterContents::SetLeafInputs(). |
| /// |
| /// @see `FilterContents::SetLeafInputs` |
| std::shared_ptr<FilterContents> GetFilterContents() const; |
| |
| /// @brief Wraps the given filter input with a GPU-based image filter. |
| virtual std::shared_ptr<FilterContents> WrapInput( |
| const FilterInput::Ref& input) const = 0; |
| |
| virtual std::shared_ptr<ImageFilter> Clone() const = 0; |
| |
| virtual void Visit(ImageFilterVisitor& visitor) = 0; |
| }; |
| |
| /******************************************************************************* |
| ******* BlurImageFilter |
| ******************************************************************************/ |
| |
| class BlurImageFilter : public ImageFilter { |
| public: |
| BlurImageFilter(Sigma sigma_x, |
| Sigma sigma_y, |
| FilterContents::BlurStyle blur_style, |
| Entity::TileMode tile_mode); |
| |
| ~BlurImageFilter() override; |
| |
| // |ImageFilter| |
| std::shared_ptr<FilterContents> WrapInput( |
| const FilterInput::Ref& input) const override; |
| |
| // |ImageFilter| |
| std::shared_ptr<ImageFilter> Clone() const override; |
| |
| // |ImageFilter| |
| void Visit(ImageFilterVisitor& visitor) override { visitor.Visit(*this); } |
| |
| private: |
| Sigma sigma_x_; |
| Sigma sigma_y_; |
| FilterContents::BlurStyle blur_style_; |
| Entity::TileMode tile_mode_; |
| }; |
| |
| /******************************************************************************* |
| ******* DilateImageFilter |
| ******************************************************************************/ |
| |
| class DilateImageFilter : public ImageFilter { |
| public: |
| DilateImageFilter(Radius radius_x, Radius radius_y); |
| |
| ~DilateImageFilter() override; |
| |
| // |ImageFilter| |
| std::shared_ptr<FilterContents> WrapInput( |
| const FilterInput::Ref& input) const override; |
| |
| // |ImageFilter| |
| std::shared_ptr<ImageFilter> Clone() const override; |
| |
| // |ImageFilter| |
| void Visit(ImageFilterVisitor& visitor) override { visitor.Visit(*this); } |
| |
| private: |
| Radius radius_x_; |
| Radius radius_y_; |
| }; |
| |
| /******************************************************************************* |
| ******* ErodeImageFilter |
| ******************************************************************************/ |
| |
| class ErodeImageFilter : public ImageFilter { |
| public: |
| ErodeImageFilter(Radius radius_x, Radius radius_y); |
| |
| ~ErodeImageFilter() override; |
| |
| // |ImageFilter| |
| std::shared_ptr<FilterContents> WrapInput( |
| const FilterInput::Ref& input) const override; |
| |
| // |ImageFilter| |
| std::shared_ptr<ImageFilter> Clone() const override; |
| |
| // |ImageFilter| |
| void Visit(ImageFilterVisitor& visitor) override { visitor.Visit(*this); } |
| |
| private: |
| Radius radius_x_; |
| Radius radius_y_; |
| }; |
| |
| /******************************************************************************* |
| ******* MatrixImageFilter |
| ******************************************************************************/ |
| |
| class MatrixImageFilter : public ImageFilter { |
| public: |
| MatrixImageFilter(const Matrix& matrix, SamplerDescriptor sampler_descriptor); |
| |
| ~MatrixImageFilter() override; |
| |
| // |ImageFilter| |
| std::shared_ptr<FilterContents> WrapInput( |
| const FilterInput::Ref& input) const override; |
| |
| // |ImageFilter| |
| std::shared_ptr<ImageFilter> Clone() const override; |
| |
| // |ImageFilter| |
| void Visit(ImageFilterVisitor& visitor) override { visitor.Visit(*this); } |
| |
| const Matrix& GetMatrix() const { return matrix_; } |
| |
| private: |
| Matrix matrix_; |
| SamplerDescriptor sampler_descriptor_; |
| }; |
| |
| /******************************************************************************* |
| ******* ComposeImageFilter |
| ******************************************************************************/ |
| |
| class ComposeImageFilter : public ImageFilter { |
| public: |
| ComposeImageFilter(const ImageFilter& inner, const ImageFilter& outer); |
| |
| ~ComposeImageFilter() override; |
| |
| // |ImageFilter| |
| std::shared_ptr<FilterContents> WrapInput( |
| const FilterInput::Ref& input) const override; |
| |
| // |ImageFilter| |
| std::shared_ptr<ImageFilter> Clone() const override; |
| |
| // |ImageFilter| |
| void Visit(ImageFilterVisitor& visitor) override { visitor.Visit(*this); } |
| |
| private: |
| std::shared_ptr<ImageFilter> inner_; |
| std::shared_ptr<ImageFilter> outer_; |
| }; |
| |
| /******************************************************************************* |
| ******* ColorImageFilter |
| ******************************************************************************/ |
| |
| class ColorImageFilter : public ImageFilter { |
| public: |
| explicit ColorImageFilter(const ColorFilter& color_filter); |
| |
| ~ColorImageFilter() override; |
| |
| // |ImageFilter| |
| std::shared_ptr<FilterContents> WrapInput( |
| const FilterInput::Ref& input) const override; |
| |
| // |ImageFilter| |
| std::shared_ptr<ImageFilter> Clone() const override; |
| |
| // |ImageFilter| |
| void Visit(ImageFilterVisitor& visitor) override { visitor.Visit(*this); } |
| |
| private: |
| std::shared_ptr<ColorFilter> color_filter_; |
| }; |
| |
| /******************************************************************************* |
| ******* LocalMatrixImageFilter |
| ******************************************************************************/ |
| |
| class LocalMatrixImageFilter : public ImageFilter { |
| public: |
| LocalMatrixImageFilter(const Matrix& matrix, |
| const ImageFilter& internal_filter); |
| |
| ~LocalMatrixImageFilter() override; |
| |
| // |ImageFilter| |
| std::shared_ptr<FilterContents> WrapInput( |
| const FilterInput::Ref& input) const override; |
| |
| // |ImageFilter| |
| std::shared_ptr<ImageFilter> Clone() const override; |
| |
| // |ImageFilter| |
| void Visit(ImageFilterVisitor& visitor) override { visitor.Visit(*this); } |
| |
| private: |
| Matrix matrix_; |
| std::shared_ptr<ImageFilter> internal_filter_; |
| }; |
| |
| } // namespace impeller |
| |
| #endif // FLUTTER_IMPELLER_AIKS_IMAGE_FILTER_H_ |