9 #include "display_list/effects/dl_color_filter.h"
10 #include "display_list/effects/dl_color_source.h"
11 #include "display_list/geometry/dl_path.h"
12 #include "fml/logging.h"
39 auto contents = std::make_shared<SolidColorContents>();
40 contents->SetColor(
color);
45 case flutter::DlColorSourceType::kLinearGradient: {
46 const flutter::DlLinearGradientColorSource* linear =
51 std::vector<Color> colors;
52 std::vector<float> stops;
58 auto contents = std::make_shared<LinearGradientContents>();
60 contents->SetColors(std::move(colors));
61 contents->SetStops(std::move(stops));
62 contents->SetEndPoints(start_point, end_point);
63 contents->SetTileMode(tile_mode);
64 contents->SetEffectTransform(effect_transform);
66 std::array<Point, 2> bounds{start_point, end_point};
68 if (intrinsic_size.has_value()) {
69 contents->SetColorSourceSize(intrinsic_size->GetSize());
73 case flutter::DlColorSourceType::kRadialGradient: {
74 const flutter::DlRadialGradientColorSource* radialGradient =
76 FML_DCHECK(radialGradient);
78 auto radius = radialGradient->radius();
79 std::vector<Color> colors;
80 std::vector<float> stops;
85 auto effect_transform =
88 auto contents = std::make_shared<RadialGradientContents>();
90 contents->SetColors(std::move(colors));
91 contents->SetStops(std::move(stops));
92 contents->SetCenterAndRadius(center, radius);
93 contents->SetTileMode(tile_mode);
94 contents->SetEffectTransform(effect_transform);
96 auto radius_pt =
Point(radius, radius);
97 std::array<Point, 2> bounds{center + radius_pt, center - radius_pt};
99 if (intrinsic_size.has_value()) {
100 contents->SetColorSourceSize(intrinsic_size->GetSize());
104 case flutter::DlColorSourceType::kConicalGradient: {
105 const flutter::DlConicalGradientColorSource* conical_gradient =
107 FML_DCHECK(conical_gradient);
109 DlScalar radius = conical_gradient->end_radius();
112 DlScalar focus_radius = conical_gradient->start_radius();
113 std::vector<Color> colors;
114 std::vector<float> stops;
119 auto effect_transform =
122 std::shared_ptr<ConicalGradientContents> contents =
123 std::make_shared<ConicalGradientContents>();
125 contents->SetColors(std::move(colors));
126 contents->SetStops(std::move(stops));
127 contents->SetCenterAndRadius(center, radius);
128 contents->SetTileMode(tile_mode);
129 contents->SetEffectTransform(effect_transform);
130 contents->SetFocus(focus_center, focus_radius);
132 auto radius_pt =
Point(radius, radius);
133 std::array<Point, 2> bounds{center + radius_pt, center - radius_pt};
135 if (intrinsic_size.has_value()) {
136 contents->SetColorSourceSize(intrinsic_size->GetSize());
140 case flutter::DlColorSourceType::kSweepGradient: {
141 const flutter::DlSweepGradientColorSource* sweepGradient =
143 FML_DCHECK(sweepGradient);
146 auto start_angle =
Degrees(sweepGradient->start());
147 auto end_angle =
Degrees(sweepGradient->end());
148 std::vector<Color> colors;
149 std::vector<float> stops;
154 auto effect_transform =
157 auto contents = std::make_shared<SweepGradientContents>();
159 contents->SetCenterAndAngles(center, start_angle, end_angle);
160 contents->SetColors(std::move(colors));
161 contents->SetStops(std::move(stops));
162 contents->SetTileMode(tile_mode);
163 contents->SetEffectTransform(effect_transform);
167 case flutter::DlColorSourceType::kImage: {
168 const flutter::DlImageColorSource* image_color_source =
170 FML_DCHECK(image_color_source &&
171 image_color_source->image()->impeller_texture());
172 auto texture = image_color_source->image()->impeller_texture();
174 image_color_source->horizontal_tile_mode());
176 image_color_source->vertical_tile_mode());
177 auto sampler_descriptor =
179 auto effect_transform =
182 auto contents = std::make_shared<TiledTextureContents>();
184 contents->SetTexture(texture);
185 contents->SetTileModes(x_tile_mode, y_tile_mode);
186 contents->SetSamplerDescriptor(sampler_descriptor);
187 contents->SetEffectTransform(effect_transform);
193 std::shared_ptr<FilterContents> color_filter_output =
209 contents->SetColorFilter(filter_proc);
211 contents->SetColorSourceSize(
Size::Ceil(texture->GetSize()));
214 case flutter::DlColorSourceType::kRuntimeEffect: {
215 const flutter::DlRuntimeEffectColorSource* runtime_effect_color_source =
218 runtime_effect_color_source->runtime_effect()->runtime_stage();
219 auto uniform_data = runtime_effect_color_source->uniform_data();
220 auto samplers = runtime_effect_color_source->samplers();
222 std::vector<RuntimeEffectContents::TextureInput> texture_inputs;
224 for (
auto& sampler : samplers) {
225 if (sampler ==
nullptr) {
228 auto* image = sampler->asImage();
229 if (!sampler->asImage()) {
232 FML_DCHECK(image->image()->impeller_texture());
233 texture_inputs.push_back({
234 .sampler_descriptor =
236 .texture = image->image()->impeller_texture(),
240 auto contents = std::make_shared<RuntimeEffectContents>();
242 contents->SetRuntimeStage(std::move(runtime_stage));
243 contents->SetUniformData(std::move(uniform_data));
244 contents->SetTextureInputs(std::move(texture_inputs));
247 case flutter::DlColorSourceType::kColor: {
248 auto contents = std::make_shared<SolidColorContents>();
249 contents->SetColor(
color);
257 std::shared_ptr<Contents> input)
const {
268 std::shared_ptr<Contents> input,
269 const Matrix& effect_transform)
const {
282 const Matrix& ctm)
const {
285 is_solid_color, ctm);
292 const Matrix& effect_transform,
298 filter->SetRenderingMode(rendering_mode);
299 filter->SetEffectTransform(effect_transform);
303 std::shared_ptr<Contents> Paint::WithColorFilter(
304 std::shared_ptr<Contents> input,
309 color_source->type() == flutter::DlColorSourceType::kImage) {
320 if (input->ApplyColorFilter([&](Color
color) -> Color {
322 color = GetCPUColorFilterProc(color_filter)(color);
343 std::shared_ptr<FilterContents> Paint::MaskBlurDescriptor::CreateMaskBlur(
344 std::shared_ptr<TextureContents> texture_contents,
346 Scalar expand_amount = GaussianBlurFilterContents::CalculateBlurRadius(
347 GaussianBlurFilterContents::ScaleSigma(sigma.sigma));
348 texture_contents->SetSourceRect(
349 texture_contents->GetSourceRect().Expand(expand_amount, expand_amount));
350 auto mask = std::make_shared<SolidColorContents>();
351 mask->SetColor(Color::White());
352 std::optional<Rect> coverage = texture_contents->GetCoverage({});
355 texture_contents->SetDestinationRect(
356 coverage.value().Expand(expand_amount, expand_amount));
358 geometry = rect_geom;
360 mask->SetGeometry(geometry);
361 auto descriptor = texture_contents->GetSamplerDescriptor();
362 texture_contents->SetSamplerDescriptor(descriptor);
363 std::shared_ptr<FilterContents> blurred_mask =
364 FilterContents::MakeGaussianBlur(FilterInput::Make(mask), sigma, sigma,
365 Entity::TileMode::kDecal, style,
368 return ColorFilterContents::MakeBlend(
369 BlendMode::kSourceIn,
370 {FilterInput::Make(blurred_mask), FilterInput::Make(texture_contents)});
373 std::shared_ptr<FilterContents> Paint::MaskBlurDescriptor::CreateMaskBlur(
374 std::shared_ptr<ColorSourceContents> color_source_contents,
375 const flutter::DlColorFilter* color_filter,
380 if (color_source_contents->IsSolidColor()) {
381 return FilterContents::MakeGaussianBlur(
382 FilterInput::Make(color_source_contents), sigma, sigma,
383 Entity::TileMode::kDecal, style, color_source_contents->GetGeometry());
388 auto mask = std::make_shared<SolidColorContents>();
389 mask->SetColor(Color::White());
390 mask->SetGeometry(color_source_contents->GetGeometry());
394 auto blurred_mask = FilterContents::MakeGaussianBlur(
395 FilterInput::Make(mask), sigma, sigma, Entity::TileMode::kDecal, style,
396 color_source_contents->GetGeometry());
402 auto expanded_local_bounds = blurred_mask->GetCoverage({});
403 if (!expanded_local_bounds.has_value()) {
404 expanded_local_bounds =
Rect();
406 *rect_geom =
RectGeometry(expanded_local_bounds.value());
407 color_source_contents->SetGeometry(rect_geom);
408 std::shared_ptr<Contents> color_contents = color_source_contents;
414 ColorFilterContents::AbsorbOpacity::kYes);
419 ColorFilterContents::AbsorbOpacity::kYes);
424 return ColorFilterContents::MakeBlend(
425 BlendMode::kSourceIn,
426 {FilterInput::Make(blurred_mask), FilterInput::Make(color_contents)});
429 std::shared_ptr<FilterContents> Paint::MaskBlurDescriptor::CreateMaskBlur(
432 const Matrix& ctm)
const {
433 Vector2 blur_sigma(sigma.sigma, sigma.sigma);
438 if (is_solid_color) {
439 return FilterContents::MakeGaussianBlur(input,
Sigma(blur_sigma.
x),
441 Entity::TileMode::kDecal, style);
443 return FilterContents::MakeBorderMaskBlur(input,
Sigma(blur_sigma.
x),
444 Sigma(blur_sigma.
y), style);
447 bool Paint::HasColorFilter()
const {
448 return color_filter || invert_colors;