7 #include "flutter/display_list/effects/dl_color_sources.h"
8 #include "flutter/display_list/effects/dl_image_filters.h"
9 #include "fml/logging.h"
18 std::shared_ptr<FilterContents>
WrapInput(
const flutter::DlImageFilter* filter,
22 switch (filter->type()) {
23 case flutter::DlImageFilterType::kBlur: {
24 auto blur_filter = filter->asBlur();
25 FML_DCHECK(blur_filter);
29 Sigma(blur_filter->sigma_x()),
30 Sigma(blur_filter->sigma_y()),
32 blur_filter->bounds(),
36 case flutter::DlImageFilterType::kDilate: {
37 auto dilate_filter = filter->asDilate();
38 FML_DCHECK(dilate_filter);
42 Radius(dilate_filter->radius_x()),
43 Radius(dilate_filter->radius_y()),
47 case flutter::DlImageFilterType::kErode: {
48 auto erode_filter = filter->asErode();
49 FML_DCHECK(erode_filter);
53 Radius(erode_filter->radius_x()),
54 Radius(erode_filter->radius_y()),
58 case flutter::DlImageFilterType::kMatrix: {
59 auto matrix_filter = filter->asMatrix();
60 FML_DCHECK(matrix_filter);
62 auto matrix = matrix_filter->matrix();
67 case flutter::DlImageFilterType::kLocalMatrix: {
68 auto matrix_filter = filter->asLocalMatrix();
69 FML_DCHECK(matrix_filter);
70 FML_DCHECK(matrix_filter->image_filter());
72 auto matrix = matrix_filter->matrix();
75 WrapInput(matrix_filter->image_filter().get(), input)),
78 case flutter::DlImageFilterType::kColorFilter: {
79 auto image_color_filter = filter->asColorFilter();
80 FML_DCHECK(image_color_filter);
81 auto color_filter = image_color_filter->color_filter();
82 FML_DCHECK(color_filter);
91 case flutter::DlImageFilterType::kCompose: {
92 auto compose = filter->asCompose();
95 auto outer_dl_filter = compose->outer();
96 auto inner_dl_filter = compose->inner();
97 if (!outer_dl_filter) {
98 return WrapInput(inner_dl_filter.get(), input);
100 if (!inner_dl_filter) {
101 return WrapInput(outer_dl_filter.get(), input);
103 FML_DCHECK(outer_dl_filter && inner_dl_filter);
106 outer_dl_filter.get(),
109 case flutter::DlImageFilterType::kRuntimeEffect: {
110 const flutter::DlRuntimeEffectImageFilter* runtime_filter =
111 filter->asRuntimeEffectFilter();
112 FML_DCHECK(runtime_filter);
113 std::shared_ptr<impeller::RuntimeStage> runtime_stage =
114 runtime_filter->runtime_effect()->runtime_stage();
116 std::vector<RuntimeEffectContents::TextureInput> texture_inputs;
118 for (
const std::shared_ptr<flutter::DlColorSource>& sampler :
119 runtime_filter->samplers()) {
120 if (index == 0 && sampler ==
nullptr) {
122 texture_inputs.push_back(
124 .texture =
nullptr});
127 if (sampler ==
nullptr) {
130 auto* image = sampler->asImage();
134 FML_DCHECK(image->image()->impeller_texture());
136 texture_inputs.push_back({
137 .sampler_descriptor =
139 .texture = image->image()->impeller_texture(),
143 runtime_filter->uniform_data(),
144 std::move(texture_inputs));
static std::shared_ptr< FilterContents > MakeGaussianBlur(const FilterInput::Ref &input, Sigma sigma_x, Sigma sigma_y, Entity::TileMode tile_mode=Entity::TileMode::kDecal, std::optional< Rect > bounds=std::nullopt, BlurStyle mask_blur_style=BlurStyle::kNormal, const Geometry *mask_geometry=nullptr)
@ kNormal
Blurred inside and outside.
static std::shared_ptr< FilterContents > MakeMorphology(FilterInput::Ref input, Radius radius_x, Radius radius_y, MorphType morph_type)
static std::shared_ptr< FilterContents > MakeLocalMatrixFilter(FilterInput::Ref input, const Matrix &matrix)
static std::shared_ptr< FilterContents > MakeMatrixFilter(FilterInput::Ref input, const Matrix &matrix, const SamplerDescriptor &desc)
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)
impeller::SamplerDescriptor ToSamplerDescriptor(const flutter::DlImageSampling options)
std::shared_ptr< ColorFilterContents > WrapWithGPUColorFilter(const flutter::DlColorFilter *filter, const std::shared_ptr< FilterInput > &input, ColorFilterContents::AbsorbOpacity absorb_opacity)
std::shared_ptr< FilterContents > WrapInput(const flutter::DlImageFilter *filter, const FilterInput::Ref &input)
Generate a new FilterContents using this filter's configuration.
For convolution filters, the "radius" is the size of the convolution kernel to use on the local space...
In filters that use Gaussian distributions, "sigma" is a size of one standard deviation in terms of t...