68 auto contents = std::make_shared<SolidColorContents>(geometry);
69 contents->SetColor(
color);
80 std::vector<Color> colors;
81 std::vector<float> stops;
85 auto effect_transform = linear->
matrix();
87 auto contents = std::make_shared<LinearGradientContents>(geometry);
89 contents->SetColors(std::move(colors));
90 contents->SetStops(std::move(stops));
91 contents->SetEndPoints(start_point, end_point);
92 contents->SetTileMode(tile_mode);
93 contents->SetEffectTransform(effect_transform);
95 std::array<Point, 2> bounds{start_point, end_point};
97 if (intrinsic_size.has_value()) {
98 contents->SetColorSourceSize(intrinsic_size->GetSize().Max({1, 1}));
106 auto center = radialGradient->
center();
107 auto radius = radialGradient->
radius();
108 std::vector<Color> colors;
109 std::vector<float> stops;
114 auto effect_transform = radialGradient->
matrix();
116 auto contents = std::make_shared<RadialGradientContents>(geometry);
118 contents->SetColors(std::move(colors));
119 contents->SetStops(std::move(stops));
120 contents->SetCenterAndRadius(center, radius);
121 contents->SetTileMode(tile_mode);
122 contents->SetEffectTransform(effect_transform);
125 contents->SetColorSourceSize(intrinsic_size.GetSize().Max({1, 1}));
136 std::vector<Color> colors;
137 std::vector<float> stops;
142 auto effect_transform = conical_gradient->
matrix();
144 auto contents = std::make_shared<ConicalGradientContents>(geometry);
146 contents->SetColors(std::move(colors));
147 contents->SetStops(std::move(stops));
148 contents->SetCenterAndRadius(center, radius);
149 contents->SetTileMode(tile_mode);
150 contents->SetEffectTransform(effect_transform);
151 contents->SetFocus(focus_center, focus_radius);
154 contents->SetColorSourceSize(intrinsic_size.GetSize().Max({1, 1}));
162 auto center = sweepGradient->
center();
164 auto end_angle =
Degrees(sweepGradient->
end());
165 std::vector<Color> colors;
166 std::vector<float> stops;
171 auto effect_transform = sweepGradient->
matrix();
173 auto contents = std::make_shared<SweepGradientContents>(geometry);
175 contents->SetCenterAndAngles(center, start_angle, end_angle);
176 contents->SetColors(std::move(colors));
177 contents->SetStops(std::move(stops));
178 contents->SetTileMode(tile_mode);
179 contents->SetEffectTransform(effect_transform);
188 image_color_source->
image()->asImpellerImage()->GetCachedTexture(
195 auto sampler_descriptor =
200 auto contents = std::make_shared<TiledTextureContents>(geometry);
203 contents->SetTileModes(x_tile_mode, y_tile_mode);
204 contents->SetSamplerDescriptor(sampler_descriptor);
205 contents->SetEffectTransform(effect_transform);
211 std::shared_ptr<FilterContents> color_filter_output =
227 contents->SetColorFilter(filter_proc);
237 auto uniform_data = runtime_effect_color_source->
uniform_data();
238 auto samplers = runtime_effect_color_source->
samplers();
240 std::vector<RuntimeEffectContents::TextureInput> texture_inputs;
242 for (
auto& sampler : samplers) {
243 if (sampler ==
nullptr) {
245 auto contents = std::make_shared<SolidColorContents>(geometry);
249 auto*
image = sampler->asImage();
250 if (!sampler->asImage()) {
252 auto contents = std::make_shared<SolidColorContents>(geometry);
257 image->
image()->asImpellerImage()->GetCachedTexture(renderer);
259 texture_inputs.push_back({
260 .sampler_descriptor =
266 auto contents = std::make_shared<RuntimeEffectContents>(geometry);
268 contents->SetRuntimeStage(std::move(runtime_stage));
269 contents->SetUniformData(std::move(uniform_data));
270 contents->SetTextureInputs(std::move(texture_inputs));
367std::shared_ptr<FilterContents> Paint::MaskBlurDescriptor::CreateMaskBlur(
368 std::shared_ptr<TextureContents> texture_contents,
370 Scalar expand_amount = GaussianBlurFilterContents::CalculateBlurRadius(
371 GaussianBlurFilterContents::ScaleSigma(sigma.sigma));
372 texture_contents->SetSourceRect(
373 texture_contents->GetSourceRect().Expand(expand_amount, expand_amount));
374 std::optional<Rect> coverage = texture_contents->GetCoverage({});
377 texture_contents->SetDestinationRect(
378 coverage.value().Expand(expand_amount, expand_amount));
380 geometry = rect_geom;
382 auto mask = std::make_shared<SolidColorContents>(geometry);
383 mask->SetColor(Color::White());
384 auto descriptor = texture_contents->GetSamplerDescriptor();
385 texture_contents->SetSamplerDescriptor(descriptor);
386 std::shared_ptr<FilterContents> blurred_mask =
387 FilterContents::MakeGaussianBlur(
388 FilterInput::Make(mask), sigma, sigma, Entity::TileMode::kDecal,
389 std::nullopt, style, geometry);
391 return ColorFilterContents::MakeBlend(
393 {FilterInput::Make(blurred_mask), FilterInput::Make(texture_contents)});
396std::shared_ptr<Contents> Paint::MaskBlurDescriptor::CreateMaskBlur(
400 std::shared_ptr<ColorSourceContents> contents,
401 bool needs_color_filter,
405 if (contents->IsSolidColor()) {
406 return FilterContents::MakeGaussianBlur(
407 FilterInput::Make(contents), sigma, sigma, Entity::TileMode::kDecal,
408 std::nullopt, style, geometry);
412 auto mask = std::make_shared<SolidColorContents>(geometry);
413 mask->SetColor(Color::White());
416 auto blurred_mask = FilterContents::MakeGaussianBlur(
417 FilterInput::Make(mask), sigma, sigma, Entity::TileMode::kDecal,
418 std::nullopt, style, geometry);
423 std::optional<Rect> expanded_local_bounds = blurred_mask->GetCoverage({});
424 if (!expanded_local_bounds.has_value()) {
425 expanded_local_bounds =
Rect();
429 std::shared_ptr<ColorSourceContents> expanded_contents =
431 std::shared_ptr<Contents> final_contents = expanded_contents;
434 if (needs_color_filter) {
437 paint.
color_filter, FilterInput::Make(std::move(final_contents)),
438 ColorFilterContents::AbsorbOpacity::kYes);
443 ColorFilterContents::AbsorbOpacity::kYes);
448 return ColorFilterContents::MakeBlend(
450 {FilterInput::Make(blurred_mask), FilterInput::Make(final_contents)});
std::function< std::shared_ptr< ColorFilterContents >(FilterInput::Ref)> ColorFilterProc