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()),
35 case flutter::DlImageFilterType::kDilate: {
36 auto dilate_filter = filter->asDilate();
37 FML_DCHECK(dilate_filter);
41 Radius(dilate_filter->radius_x()),
42 Radius(dilate_filter->radius_y()),
46 case flutter::DlImageFilterType::kErode: {
47 auto erode_filter = filter->asErode();
48 FML_DCHECK(erode_filter);
52 Radius(erode_filter->radius_x()),
53 Radius(erode_filter->radius_y()),
57 case flutter::DlImageFilterType::kMatrix: {
58 auto matrix_filter = filter->asMatrix();
59 FML_DCHECK(matrix_filter);
61 auto matrix = matrix_filter->matrix();
66 case flutter::DlImageFilterType::kLocalMatrix: {
67 auto matrix_filter = filter->asLocalMatrix();
68 FML_DCHECK(matrix_filter);
69 FML_DCHECK(matrix_filter->image_filter());
71 auto matrix = matrix_filter->matrix();
74 WrapInput(matrix_filter->image_filter().get(), input)),
77 case flutter::DlImageFilterType::kColorFilter: {
78 auto image_color_filter = filter->asColorFilter();
79 FML_DCHECK(image_color_filter);
80 auto color_filter = image_color_filter->color_filter();
81 FML_DCHECK(color_filter);
90 case flutter::DlImageFilterType::kCompose: {
91 auto compose = filter->asCompose();
94 auto outer_dl_filter = compose->outer();
95 auto inner_dl_filter = compose->inner();
96 if (!outer_dl_filter) {
97 return WrapInput(inner_dl_filter.get(), input);
99 if (!inner_dl_filter) {
100 return WrapInput(outer_dl_filter.get(), input);
102 FML_DCHECK(outer_dl_filter && inner_dl_filter);
105 outer_dl_filter.get(),
108 case flutter::DlImageFilterType::kRuntimeEffect: {
109 const flutter::DlRuntimeEffectImageFilter* runtime_filter =
110 filter->asRuntimeEffectFilter();
111 FML_DCHECK(runtime_filter);
112 std::shared_ptr<impeller::RuntimeStage> runtime_stage =
113 runtime_filter->runtime_effect()->runtime_stage();
115 std::vector<RuntimeEffectContents::TextureInput> texture_inputs;
117 for (
const std::shared_ptr<flutter::DlColorSource>& sampler :
118 runtime_filter->samplers()) {
119 if (index == 0 && sampler ==
nullptr) {
121 texture_inputs.push_back(
123 .texture =
nullptr});
126 if (sampler ==
nullptr) {
129 auto* image = sampler->asImage();
133 FML_DCHECK(image->image()->impeller_texture());
135 texture_inputs.push_back({
136 .sampler_descriptor =
138 .texture = image->image()->impeller_texture(),
142 runtime_filter->uniform_data(),
143 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...