#include <gaussian_blur_filter_contents.h>
Public Member Functions | |
GaussianBlurFilterContents (Scalar sigma_x, Scalar sigma_y, Entity::TileMode tile_mode, BlurStyle mask_blur_style, const Geometry *mask_geometry=nullptr) | |
Scalar | GetSigmaX () const |
Scalar | GetSigmaY () const |
std::optional< Rect > | GetFilterSourceCoverage (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... | |
std::optional< Rect > | GetFilterCoverage (const FilterInput::Vector &inputs, const Entity &entity, const Matrix &effect_transform) const override |
Internal utility method for |GetLocalCoverage| that computes the output coverage of this filter across the specified inputs, ignoring the coverage hint. More... | |
![]() | |
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< Entity > | GetEntity (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< Rect > | GetCoverage (const Entity &entity) const override |
Get the area of the render pass that will be affected when this contents is rendered. More... | |
std::optional< Snapshot > | RenderToSnapshot (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< Rect > | GetSourceCoverage (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... | |
![]() | |
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< Size > | GetColorSourceSize () const |
Return the color source's intrinsic size, if available. More... | |
void | SetColorSourceSize (Size size) |
virtual void | SetInheritedOpacity (Scalar opacity) |
Inherit the provided opacity. More... | |
virtual std::optional< Color > | AsBackgroundColor (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 Scalar | CalculateBlurRadius (Scalar sigma) |
static Quad | CalculateUVs (const std::shared_ptr< FilterInput > &filter_input, const Entity &entity, const Rect &source_rect, const ISize &texture_size) |
static Scalar | CalculateScale (Scalar sigma) |
static Scalar | ScaleSigma (Scalar sigma) |
![]() | |
static std::shared_ptr< FilterContents > | MakeGaussianBlur (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< FilterContents > | MakeBorderMaskBlur (FilterInput::Ref input, Sigma sigma_x, Sigma sigma_y, BlurStyle blur_style=BlurStyle::kNormal) |
static std::shared_ptr< FilterContents > | MakeDirectionalMorphology (FilterInput::Ref input, Radius radius, Vector2 direction, MorphType morph_type) |
static std::shared_ptr< FilterContents > | MakeMorphology (FilterInput::Ref input, Radius radius_x, Radius radius_y, MorphType morph_type) |
static std::shared_ptr< FilterContents > | MakeMatrixFilter (FilterInput::Ref input, const Matrix &matrix, const SamplerDescriptor &desc) |
static std::shared_ptr< FilterContents > | MakeLocalMatrixFilter (FilterInput::Ref input, const Matrix &matrix) |
static std::shared_ptr< FilterContents > | MakeYUVToRGBFilter (std::shared_ptr< Texture > y_texture, std::shared_ptr< Texture > uv_texture, YUVColorSpace yuv_color_space) |
static std::shared_ptr< FilterContents > | MakeRuntimeEffect (FilterInput::Ref input, std::shared_ptr< RuntimeStage > runtime_stage, std::shared_ptr< std::vector< uint8_t >> uniforms, std::vector< RuntimeEffectContents::TextureInput > texture_inputs) |
![]() | |
static std::shared_ptr< Contents > | MakeAnonymous (RenderProc render_proc, CoverageProc coverage_proc) |
Additional Inherited Members | |
![]() | |
enum class | BlurStyle { kNormal , kSolid , kOuter , kInner } |
enum class | MorphType { kDilate , kErode } |
![]() | |
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)> |
![]() | |
static const int32_t | kBlurFilterRequiredMipCount |
Performs a bidirectional Gaussian blur.
This is accomplished by rendering multiple passes in multiple directions. Note: This will replace DirectionalGaussianBlurFilterContents
.
Definition at line 56 of file gaussian_blur_filter_contents.h.
|
explicit |
Definition at line 631 of file gaussian_blur_filter_contents.cc.
References impeller::FilterContents::kNormal.
Given a sigma (standard deviation) calculate the blur radius (1/2 the kernel size).
Definition at line 882 of file gaussian_blur_filter_contents.cc.
Referenced by CalculateScale(), GetFilterSourceCoverage(), and impeller::testing::TEST().
Calculate the scale factor for the downsample pass given a sigma value.
Visible for testing.
Definition at line 648 of file gaussian_blur_filter_contents.cc.
References blur_radius, and CalculateBlurRadius().
Referenced by impeller::testing::TEST().
|
static |
Calculate the UV coordinates for rendering the filter_input.
filter_input | The FilterInput that should be rendered. |
entity | The associated entity for the filter_input. |
source_rect | The rect in source coordinates to convert to uvs. |
texture_size | The rect to convert in source coordinates. |
Definition at line 886 of file gaussian_blur_filter_contents.cc.
References impeller::TRect< T >::GetTransformedPoints(), impeller::TSize< T >::height, impeller::Matrix::MakeScale(), impeller::Matrix::Transform(), and impeller::TSize< T >::width.
Referenced by impeller::testing::TEST_P().
|
overridevirtual |
Internal utility method for |GetLocalCoverage| that computes the output coverage of this filter across the specified inputs, ignoring the coverage hint.
Reimplemented from impeller::FilterContents.
Definition at line 686 of file gaussian_blur_filter_contents.cc.
Referenced by impeller::testing::TEST(), and impeller::testing::TEST_P().
|
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 675 of file gaussian_blur_filter_contents.cc.
References impeller::Matrix::Basis(), blur_radius, CalculateBlurRadius(), impeller::TRect< T >::Expand(), scaled_sigma, ScaleSigma(), impeller::TPoint< T >::x, impeller::Vector3::x, impeller::TPoint< T >::y, and impeller::Vector3::y.
|
inline |
Definition at line 64 of file gaussian_blur_filter_contents.h.
References impeller::TPoint< T >::x.
Referenced by impeller::testing::TEST().
|
inline |
Definition at line 65 of file gaussian_blur_filter_contents.h.
References impeller::TPoint< T >::y.
Referenced by impeller::testing::TEST().
Scales down the sigma value to match Skia's behavior.
effective_blur_radius = CalculateBlurRadius(ScaleSigma(sigma_));
This function was calculated by observing Skia's behavior. Its blur at 500 seemed to be 0.15. Since we clamp at 500 I solved the quadratic equation that puts the minima there and a f(0)=1.
Definition at line 902 of file gaussian_blur_filter_contents.cc.
References impeller::saturated::b.
Referenced by GetFilterSourceCoverage(), and impeller::testing::TEST().