Flutter Impeller
impeller::ColorFilterContents Class Reference

#include <color_filter_contents.h>

Inheritance diagram for impeller::ColorFilterContents:
impeller::FilterContents impeller::Contents impeller::BlendFilterContents impeller::ColorMatrixFilterContents impeller::LinearToSrgbFilterContents impeller::SrgbToLinearFilterContents

Public Types

enum class  AbsorbOpacity {
  kYes ,
  kNo
}
 
- Public Types inherited from impeller::FilterContents
enum class  BlurStyle {
  kNormal ,
  kSolid ,
  kOuter ,
  kInner
}
 
enum class  MorphType {
  kDilate ,
  kErode
}
 
- Public Types inherited from impeller::Contents
using ColorFilterProc = std::function< Color(Color)>
 
using RenderProc = std::function< bool(const ContentContext &renderer, const Entity &entity, RenderPass &pass)>
 
using CoverageProc = std::function< std::optional< Rect >(const Entity &entity)>
 

Public Member Functions

 ColorFilterContents ()
 
 ~ColorFilterContents () override
 
void SetAbsorbOpacity (AbsorbOpacity absorb_opacity)
 
AbsorbOpacity GetAbsorbOpacity () const
 
void SetAlpha (Scalar alpha)
 Sets an alpha that is applied to the final blended result. More...
 
std::optional< ScalarGetAlpha () const
 
void SetInheritedOpacity (Scalar opacity) override
 Inherit the provided opacity. More...
 
std::optional< RectGetFilterSourceCoverage (const Matrix &effect_transform, const Rect &output_limit) const override
 Internal utility method for |GetSourceCoverage| that computes the inverse effect of this transform on the specified output coverage, ignoring the inputs which will be accommodated by the caller. More...
 
- Public Member Functions inherited from impeller::FilterContents
 FilterContents ()
 
 ~FilterContents () override
 
void SetInputs (FilterInput::Vector inputs)
 The input texture sources for this filter. Each input's emitted texture is expected to have premultiplied alpha colors. More...
 
void SetEffectTransform (const Matrix &effect_transform)
 Sets the transform which gets appended to the effect of this filter. Note that this is in addition to the entity's transform. More...
 
std::optional< EntityGetEntity (const ContentContext &renderer, const Entity &entity, const std::optional< Rect > &coverage_hint) const
 Create an Entity that renders this filter's output. More...
 
bool Render (const ContentContext &renderer, const Entity &entity, RenderPass &pass) const override
 
std::optional< RectGetCoverage (const Entity &entity) const override
 Get the area of the render pass that will be affected when this contents is rendered. More...
 
std::optional< SnapshotRenderToSnapshot (const ContentContext &renderer, const Entity &entity, std::optional< Rect > coverage_limit=std::nullopt, const std::optional< SamplerDescriptor > &sampler_descriptor=std::nullopt, bool msaa_enabled=true, int32_t mip_count=1, std::string_view label="Filter Snapshot") const override
 Render this contents to a snapshot, respecting the entity's transform, path, clip depth, and blend mode. The result texture size is always the size of GetCoverage(entity). More...
 
std::optional< RectGetSourceCoverage (const Matrix &effect_transform, const Rect &output_limit) const
 Determines the coverage of source pixels that will be needed to produce results for the specified |output_limit| under the specified |effect_transform|. This is essentially a reverse of the |GetCoverage| method computing a source coverage from an intended |output_limit| coverage. More...
 
virtual Matrix GetLocalTransform (const Matrix &parent_transform) const
 
Matrix GetTransform (const Matrix &parent_transform) const
 
virtual void SetRenderingMode (Entity::RenderingMode rendering_mode)
 Marks this filter chain as applying in a subpass scenario. More...
 
- Public Member Functions inherited from impeller::Contents
 Contents ()
 
virtual ~Contents ()
 
void SetCoverageHint (std::optional< Rect > coverage_hint)
 Hint that specifies the coverage area of this Contents that will actually be used during rendering. This is for optimization purposes only and can not be relied on as a clip. May optionally affect the result of GetCoverage(). More...
 
const std::optional< Rect > & GetCoverageHint () const
 
virtual bool IsOpaque (const Matrix &transform) const
 Whether this Contents only emits opaque source colors from the fragment stage. This value does not account for any entity properties (e.g. the blend mode), clips/visibility culling, or inherited opacity. More...
 
std::optional< SizeGetColorSourceSize () const
 Return the color source's intrinsic size, if available. More...
 
void SetColorSourceSize (Size size)
 
virtual std::optional< ColorAsBackgroundColor (const Entity &entity, ISize target_size) const
 Returns a color if this Contents will flood the given target_size with a color. This output color is the "Source" color that will be used for the Entity's blend operation. More...
 
virtual bool ApplyColorFilter (const ColorFilterProc &color_filter_proc)
 If possible, applies a color filter to this contents inputs on the CPU. More...
 

Static Public Member Functions

static std::shared_ptr< ColorFilterContentsMakeBlend (BlendMode blend_mode, FilterInput::Vector inputs, std::optional< Color > foreground_color=std::nullopt)
 the [inputs] are expected to be in the order of dst, src. More...
 
static std::shared_ptr< ColorFilterContentsMakeColorMatrix (FilterInput::Ref input, const ColorMatrix &color_matrix)
 
static std::shared_ptr< ColorFilterContentsMakeLinearToSrgbFilter (FilterInput::Ref input)
 
static std::shared_ptr< ColorFilterContentsMakeSrgbToLinearFilter (FilterInput::Ref input)
 
- Static Public Member Functions inherited from impeller::FilterContents
static std::shared_ptr< FilterContentsMakeGaussianBlur (const FilterInput::Ref &input, Sigma sigma_x, Sigma sigma_y, Entity::TileMode tile_mode=Entity::TileMode::kDecal, BlurStyle mask_blur_style=BlurStyle::kNormal, const Geometry *mask_geometry=nullptr)
 
static std::shared_ptr< FilterContentsMakeBorderMaskBlur (FilterInput::Ref input, Sigma sigma_x, Sigma sigma_y, BlurStyle blur_style=BlurStyle::kNormal)
 
static std::shared_ptr< FilterContentsMakeDirectionalMorphology (FilterInput::Ref input, Radius radius, Vector2 direction, MorphType morph_type)
 
static std::shared_ptr< FilterContentsMakeMorphology (FilterInput::Ref input, Radius radius_x, Radius radius_y, MorphType morph_type)
 
static std::shared_ptr< FilterContentsMakeMatrixFilter (FilterInput::Ref input, const Matrix &matrix, const SamplerDescriptor &desc)
 
static std::shared_ptr< FilterContentsMakeLocalMatrixFilter (FilterInput::Ref input, const Matrix &matrix)
 
static std::shared_ptr< FilterContentsMakeYUVToRGBFilter (std::shared_ptr< Texture > y_texture, std::shared_ptr< Texture > uv_texture, YUVColorSpace yuv_color_space)
 
static std::shared_ptr< FilterContentsMakeRuntimeEffect (FilterInput::Ref input, std::shared_ptr< RuntimeStage > runtime_stage, std::shared_ptr< std::vector< uint8_t >> uniforms, std::vector< RuntimeEffectContents::TextureInput > texture_inputs)
 
- Static Public Member Functions inherited from impeller::Contents
static std::shared_ptr< ContentsMakeAnonymous (RenderProc render_proc, CoverageProc coverage_proc)
 

Additional Inherited Members

- Static Public Attributes inherited from impeller::FilterContents
static const int32_t kBlurFilterRequiredMipCount
 

Detailed Description

Definition at line 12 of file color_filter_contents.h.

Member Enumeration Documentation

◆ AbsorbOpacity

Enumerator
kYes 
kNo 

Definition at line 14 of file color_filter_contents.h.

14  {
15  kYes,
16  kNo,
17  };

Constructor & Destructor Documentation

◆ ColorFilterContents()

impeller::ColorFilterContents::ColorFilterContents ( )
default

◆ ~ColorFilterContents()

impeller::ColorFilterContents::~ColorFilterContents ( )
overridedefault

Member Function Documentation

◆ GetAbsorbOpacity()

ColorFilterContents::AbsorbOpacity impeller::ColorFilterContents::GetAbsorbOpacity ( ) const

Definition at line 89 of file color_filter_contents.cc.

90  {
91  return absorb_opacity_;
92 }

◆ GetAlpha()

std::optional< Scalar > impeller::ColorFilterContents::GetAlpha ( ) const

Definition at line 98 of file color_filter_contents.cc.

98  {
99  return alpha_.value_or(1.0) * inherited_opacity_;
100 }

◆ GetFilterSourceCoverage()

std::optional< Rect > impeller::ColorFilterContents::GetFilterSourceCoverage ( const Matrix effect_transform,
const Rect output_limit 
) const
overridevirtual

Internal utility method for |GetSourceCoverage| that computes the inverse effect of this transform on the specified output coverage, ignoring the inputs which will be accommodated by the caller.

Implements impeller::FilterContents.

Definition at line 106 of file color_filter_contents.cc.

108  {
109  return output_limit;
110 }

◆ MakeBlend()

std::shared_ptr< ColorFilterContents > impeller::ColorFilterContents::MakeBlend ( BlendMode  blend_mode,
FilterInput::Vector  inputs,
std::optional< Color foreground_color = std::nullopt 
)
static

the [inputs] are expected to be in the order of dst, src.

Definition at line 17 of file color_filter_contents.cc.

20  {
21  if (blend_mode > Entity::kLastAdvancedBlendMode) {
22  VALIDATION_LOG << "Invalid blend mode " << static_cast<int>(blend_mode)
23  << " passed to ColorFilterContents::MakeBlend.";
24  return nullptr;
25  }
26 
27  size_t total_inputs = inputs.size() + (foreground_color.has_value() ? 1 : 0);
28  if (total_inputs < 2 || blend_mode <= Entity::kLastPipelineBlendMode) {
29  auto blend = std::make_shared<BlendFilterContents>();
30  blend->SetInputs(inputs);
31  blend->SetBlendMode(blend_mode);
32  blend->SetForegroundColor(foreground_color);
33  return blend;
34  }
35 
36  auto blend_input = inputs[0];
37  std::shared_ptr<BlendFilterContents> new_blend;
38  for (auto in_i = inputs.begin() + 1; in_i < inputs.end(); in_i++) {
39  new_blend = std::make_shared<BlendFilterContents>();
40  new_blend->SetInputs({blend_input, *in_i});
41  new_blend->SetBlendMode(blend_mode);
42  if (in_i < inputs.end() - 1 || foreground_color.has_value()) {
43  blend_input = FilterInput::Make(
44  std::static_pointer_cast<FilterContents>(new_blend));
45  }
46  }
47 
48  if (foreground_color.has_value()) {
49  new_blend = std::make_shared<BlendFilterContents>();
50  new_blend->SetInputs({blend_input});
51  new_blend->SetBlendMode(blend_mode);
52  new_blend->SetForegroundColor(foreground_color);
53  }
54 
55  return new_blend;
56 }
static constexpr BlendMode kLastAdvancedBlendMode
Definition: entity.h:29
static constexpr BlendMode kLastPipelineBlendMode
Definition: entity.h:28
static FilterInput::Ref Make(Variant input, bool msaa_enabled=true)
Definition: filter_input.cc:19
#define VALIDATION_LOG
Definition: validation.h:91

References impeller::Entity::kLastAdvancedBlendMode, impeller::Entity::kLastPipelineBlendMode, impeller::FilterInput::Make(), and VALIDATION_LOG.

Referenced by impeller::Canvas::Restore(), impeller::testing::TEST_P(), and impeller::WrapWithGPUColorFilter().

◆ MakeColorMatrix()

std::shared_ptr< ColorFilterContents > impeller::ColorFilterContents::MakeColorMatrix ( FilterInput::Ref  input,
const ColorMatrix color_matrix 
)
static

Definition at line 58 of file color_filter_contents.cc.

60  {
61  auto filter = std::make_shared<ColorMatrixFilterContents>();
62  filter->SetInputs({std::move(input)});
63  filter->SetMatrix(color_matrix);
64  return filter;
65 }

Referenced by impeller::testing::TEST_P(), impeller::WrapWithGPUColorFilter(), and impeller::WrapWithInvertColors().

◆ MakeLinearToSrgbFilter()

std::shared_ptr< ColorFilterContents > impeller::ColorFilterContents::MakeLinearToSrgbFilter ( FilterInput::Ref  input)
static

Definition at line 68 of file color_filter_contents.cc.

68  {
69  auto filter = std::make_shared<LinearToSrgbFilterContents>();
70  filter->SetInputs({std::move(input)});
71  return filter;
72 }

Referenced by impeller::testing::TEST_P(), and impeller::WrapWithGPUColorFilter().

◆ MakeSrgbToLinearFilter()

std::shared_ptr< ColorFilterContents > impeller::ColorFilterContents::MakeSrgbToLinearFilter ( FilterInput::Ref  input)
static

Definition at line 75 of file color_filter_contents.cc.

75  {
76  auto filter = std::make_shared<SrgbToLinearFilterContents>();
77  filter->SetInputs({std::move(input)});
78  return filter;
79 }

Referenced by impeller::testing::TEST_P(), and impeller::WrapWithGPUColorFilter().

◆ SetAbsorbOpacity()

void impeller::ColorFilterContents::SetAbsorbOpacity ( AbsorbOpacity  absorb_opacity)

Definition at line 85 of file color_filter_contents.cc.

85  {
86  absorb_opacity_ = absorb_opacity;
87 }

◆ SetAlpha()

void impeller::ColorFilterContents::SetAlpha ( Scalar  alpha)

Sets an alpha that is applied to the final blended result.

Definition at line 94 of file color_filter_contents.cc.

94  {
95  alpha_ = alpha;
96 }

◆ SetInheritedOpacity()

void impeller::ColorFilterContents::SetInheritedOpacity ( Scalar  opacity)
overridevirtual

Inherit the provided opacity.

   Use of this method is invalid if CanAcceptOpacity returns false.

Reimplemented from impeller::Contents.

Definition at line 102 of file color_filter_contents.cc.

102  {
103  inherited_opacity_ = opacity;
104 }

The documentation for this class was generated from the following files: