7 #include "flutter/display_list/effects/dl_image_filters.h"
8 #include "fml/logging.h"
17 std::shared_ptr<FilterContents>
WrapInput(
const flutter::DlImageFilter* filter,
21 switch (filter->type()) {
22 case flutter::DlImageFilterType::kBlur: {
23 auto blur_filter = filter->asBlur();
24 FML_DCHECK(blur_filter);
28 Sigma(blur_filter->sigma_x()),
29 Sigma(blur_filter->sigma_y()),
34 case flutter::DlImageFilterType::kDilate: {
35 auto dilate_filter = filter->asDilate();
36 FML_DCHECK(dilate_filter);
40 Radius(dilate_filter->radius_x()),
41 Radius(dilate_filter->radius_y()),
45 case flutter::DlImageFilterType::kErode: {
46 auto erode_filter = filter->asErode();
47 FML_DCHECK(erode_filter);
51 Radius(erode_filter->radius_x()),
52 Radius(erode_filter->radius_y()),
56 case flutter::DlImageFilterType::kMatrix: {
57 auto matrix_filter = filter->asMatrix();
58 FML_DCHECK(matrix_filter);
60 auto matrix = matrix_filter->matrix();
65 case flutter::DlImageFilterType::kLocalMatrix: {
66 auto matrix_filter = filter->asLocalMatrix();
67 FML_DCHECK(matrix_filter);
68 FML_DCHECK(matrix_filter->image_filter());
70 auto matrix = matrix_filter->matrix();
73 WrapInput(matrix_filter->image_filter().get(), input)),
76 case flutter::DlImageFilterType::kColorFilter: {
77 auto image_color_filter = filter->asColorFilter();
78 FML_DCHECK(image_color_filter);
79 auto color_filter = image_color_filter->color_filter();
80 FML_DCHECK(color_filter);
89 case flutter::DlImageFilterType::kCompose: {
90 auto compose = filter->asCompose();
93 auto outer_dl_filter = compose->outer();
94 auto inner_dl_filter = compose->inner();
95 if (!outer_dl_filter) {
96 return WrapInput(inner_dl_filter.get(), input);
98 if (!inner_dl_filter) {
99 return WrapInput(outer_dl_filter.get(), input);
101 FML_DCHECK(outer_dl_filter && inner_dl_filter);
104 outer_dl_filter.get(),
107 case flutter::DlImageFilterType::kRuntimeEffect: {
108 const flutter::DlRuntimeEffectImageFilter* runtime_filter =
109 filter->asRuntimeEffectFilter();
110 FML_DCHECK(runtime_filter);
111 std::shared_ptr<impeller::RuntimeStage> runtime_stage =
112 runtime_filter->runtime_effect()->runtime_stage();
114 std::vector<RuntimeEffectContents::TextureInput> texture_inputs;
116 for (
const std::shared_ptr<flutter::DlColorSource>& sampler :
117 runtime_filter->samplers()) {
118 if (index == 0 && sampler ==
nullptr) {
120 texture_inputs.push_back(
122 .texture =
nullptr});
125 if (sampler ==
nullptr) {
128 auto* image = sampler->asImage();
132 FML_DCHECK(image->image()->impeller_texture());
134 texture_inputs.push_back({
135 .sampler_descriptor =
137 .texture = image->image()->impeller_texture(),
141 runtime_filter->uniform_data(),
142 std::move(texture_inputs));
@ 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 > 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 > 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...