67 const std::optional<Matrix>& geometry_transform)
const {
69 auto contents = std::make_shared<SolidColorContents>(geometry);
70 contents->SetColor(
color);
74 Matrix inverted_geometry_transform =
75 geometry_transform.has_value() ? geometry_transform->
Invert() :
Matrix();
84 std::vector<Color> colors;
85 std::vector<float> stops;
89 auto effect_transform = linear->
matrix();
91 auto contents = std::make_shared<LinearGradientContents>(geometry);
93 contents->SetColors(std::move(colors));
94 contents->SetStops(std::move(stops));
95 contents->SetEndPoints(start_point, end_point);
96 contents->SetTileMode(tile_mode);
97 contents->SetEffectTransform(inverted_geometry_transform *
100 std::array<Point, 2> bounds{start_point, end_point};
102 if (intrinsic_size.has_value()) {
103 contents->SetColorSourceSize(intrinsic_size->GetSize().Max({1, 1}));
111 auto center = radialGradient->
center();
112 auto radius = radialGradient->
radius();
113 std::vector<Color> colors;
114 std::vector<float> stops;
119 auto effect_transform = radialGradient->
matrix();
121 auto contents = std::make_shared<RadialGradientContents>(geometry);
123 contents->SetColors(std::move(colors));
124 contents->SetStops(std::move(stops));
125 contents->SetCenterAndRadius(center, radius);
126 contents->SetTileMode(tile_mode);
127 contents->SetEffectTransform(inverted_geometry_transform *
131 contents->SetColorSourceSize(intrinsic_size.GetSize().Max({1, 1}));
142 std::vector<Color> colors;
143 std::vector<float> stops;
148 auto effect_transform = conical_gradient->
matrix();
150 auto contents = std::make_shared<ConicalGradientContents>(geometry);
152 contents->SetColors(std::move(colors));
153 contents->SetStops(std::move(stops));
154 contents->SetCenterAndRadius(center, radius);
155 contents->SetTileMode(tile_mode);
156 contents->SetEffectTransform(inverted_geometry_transform *
158 contents->SetFocus(focus_center, focus_radius);
161 contents->SetColorSourceSize(intrinsic_size.GetSize().Max({1, 1}));
169 auto center = sweepGradient->
center();
171 auto end_angle =
Degrees(sweepGradient->
end());
172 std::vector<Color> colors;
173 std::vector<float> stops;
178 auto effect_transform = sweepGradient->
matrix();
180 auto contents = std::make_shared<SweepGradientContents>(geometry);
182 contents->SetCenterAndAngles(center, start_angle, end_angle);
183 contents->SetColors(std::move(colors));
184 contents->SetStops(std::move(stops));
185 contents->SetTileMode(tile_mode);
186 contents->SetEffectTransform(inverted_geometry_transform *
196 image_color_source->
image()->asImpellerImage()->GetCachedTexture(
203 auto sampler_descriptor =
208 auto contents = std::make_shared<TiledTextureContents>(geometry);
211 contents->SetTileModes(x_tile_mode, y_tile_mode);
212 contents->SetSamplerDescriptor(sampler_descriptor);
213 contents->SetEffectTransform(inverted_geometry_transform *
220 std::shared_ptr<FilterContents> color_filter_output =
236 contents->SetColorFilter(filter_proc);
246 auto uniform_data = runtime_effect_color_source->
uniform_data();
247 auto samplers = runtime_effect_color_source->
samplers();
249 std::vector<RuntimeEffectContents::TextureInput> texture_inputs;
251 for (
auto& sampler : samplers) {
252 if (sampler ==
nullptr) {
254 auto contents = std::make_shared<SolidColorContents>(geometry);
258 auto*
image = sampler->asImage();
259 if (!sampler->asImage()) {
261 auto contents = std::make_shared<SolidColorContents>(geometry);
266 image->
image()->asImpellerImage()->GetCachedTexture(renderer);
268 texture_inputs.push_back({
269 .sampler_descriptor =
275 auto contents = std::make_shared<RuntimeEffectContents>(geometry);
277 contents->SetRuntimeStage(std::move(runtime_stage));
278 contents->SetUniformData(std::move(uniform_data));
279 contents->SetTextureInputs(std::move(texture_inputs));
376std::shared_ptr<FilterContents> Paint::MaskBlurDescriptor::CreateMaskBlur(
377 std::shared_ptr<TextureContents> texture_contents,
379 Scalar expand_amount = GaussianBlurFilterContents::CalculateBlurRadius(
380 GaussianBlurFilterContents::ScaleSigma(sigma.sigma));
381 texture_contents->SetSourceRect(
382 texture_contents->GetSourceRect().Expand(expand_amount, expand_amount));
383 std::optional<Rect> coverage = texture_contents->GetCoverage({});
386 texture_contents->SetDestinationRect(
387 coverage.value().Expand(expand_amount, expand_amount));
389 geometry = rect_geom;
391 auto mask = std::make_shared<SolidColorContents>(geometry);
392 mask->SetColor(Color::White());
393 auto descriptor = texture_contents->GetSamplerDescriptor();
394 texture_contents->SetSamplerDescriptor(descriptor);
395 std::shared_ptr<FilterContents> blurred_mask =
396 FilterContents::MakeGaussianBlur(
397 FilterInput::Make(mask), sigma, sigma, Entity::TileMode::kDecal,
398 std::nullopt, style, geometry);
400 return ColorFilterContents::MakeBlend(
402 {FilterInput::Make(blurred_mask), FilterInput::Make(texture_contents)});
405std::shared_ptr<Contents> Paint::MaskBlurDescriptor::CreateMaskBlur(
409 std::shared_ptr<ColorSourceContents> contents,
410 bool needs_color_filter,
414 if (contents->IsSolidColor()) {
415 return FilterContents::MakeGaussianBlur(
416 FilterInput::Make(contents), sigma, sigma, Entity::TileMode::kDecal,
417 std::nullopt, style, geometry);
421 auto mask = std::make_shared<SolidColorContents>(geometry);
422 mask->SetColor(Color::White());
425 auto blurred_mask = FilterContents::MakeGaussianBlur(
426 FilterInput::Make(mask), sigma, sigma, Entity::TileMode::kDecal,
427 std::nullopt, style, geometry);
432 std::optional<Rect> expanded_local_bounds = blurred_mask->GetCoverage({});
433 if (!expanded_local_bounds.has_value()) {
434 expanded_local_bounds =
Rect();
438 std::shared_ptr<ColorSourceContents> expanded_contents =
440 std::shared_ptr<Contents> final_contents = expanded_contents;
443 if (needs_color_filter) {
446 paint.
color_filter, FilterInput::Make(std::move(final_contents)),
447 ColorFilterContents::AbsorbOpacity::kYes);
452 ColorFilterContents::AbsorbOpacity::kYes);
457 return ColorFilterContents::MakeBlend(
459 {FilterInput::Make(blurred_mask), FilterInput::Make(final_contents)});
std::function< std::shared_ptr< ColorFilterContents >(FilterInput::Ref)> ColorFilterProc