Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
impeller::Paint::MaskBlurDescriptor Struct Reference

#include <paint.h>

Public Member Functions

std::shared_ptr< FilterContentsCreateMaskBlur (std::shared_ptr< TextureContents > texture_contents, FillRectGeometry *rect_geom) const
 
std::shared_ptr< FilterContentsCreateMaskBlur (const FilterInput::Ref &input, bool is_solid_color, const Matrix &ctm) const
 
std::shared_ptr< ContentsCreateMaskBlur (const Paint &paint, const ContentContext &renderer, const Geometry *geometry, std::shared_ptr< ColorSourceContents > contents, bool needs_color_filter, FillRectGeometry *out_geom) const
 

Public Attributes

FilterContents::BlurStyle style
 
Sigma sigma
 
bool respect_ctm = true
 

Detailed Description

Definition at line 54 of file paint.h.

Member Function Documentation

◆ CreateMaskBlur() [1/3]

std::shared_ptr< FilterContents > impeller::Paint::MaskBlurDescriptor::CreateMaskBlur ( const FilterInput::Ref input,
bool  is_solid_color,
const Matrix ctm 
) const

Definition at line 453 of file paint.cc.

456 {
457 Vector2 blur_sigma(sigma.sigma, sigma.sigma);
458 if (!respect_ctm) {
459 blur_sigma /=
460 Vector2(ctm.GetBasisX().GetLength(), ctm.GetBasisY().GetLength());
461 }
462 if (is_solid_color) {
464 input, Sigma(blur_sigma.x), Sigma(blur_sigma.y),
465 Entity::TileMode::kDecal, /*bounds=*/std::nullopt, style);
466 }
467 return FilterContents::MakeBorderMaskBlur(input, Sigma(blur_sigma.x),
468 Sigma(blur_sigma.y), style);
469}
static std::shared_ptr< FilterContents > MakeGaussianBlur(const FilterInput::Ref &input, Sigma sigma_x, Sigma sigma_y, Entity::TileMode tile_mode=Entity::TileMode::kDecal, std::optional< Rect > bounds=std::nullopt, BlurStyle mask_blur_style=BlurStyle::kNormal, const Geometry *mask_geometry=nullptr)
static std::shared_ptr< FilterContents > MakeBorderMaskBlur(FilterInput::Ref input, Sigma sigma_x, Sigma sigma_y, BlurStyle blur_style=BlurStyle::kNormal)
static int input(yyscan_t yyscanner)
Point Vector2
Definition point.h:430
FilterContents::BlurStyle style
Definition paint.h:55
Scalar sigma
Definition sigma.h:33

References impeller::Matrix::GetBasisX(), impeller::Matrix::GetBasisY(), impeller::Vector3::GetLength(), input(), impeller::TPoint< T >::x, and impeller::TPoint< T >::y.

◆ CreateMaskBlur() [2/3]

std::shared_ptr< Contents > impeller::Paint::MaskBlurDescriptor::CreateMaskBlur ( const Paint paint,
const ContentContext renderer,
const Geometry geometry,
std::shared_ptr< ColorSourceContents contents,
bool  needs_color_filter,
FillRectGeometry out_geom 
) const
  1. Create an opaque white mask of the original geometry.
  1. Blur the mask.
  1. Replace the geometry of the original color source with a rectangle that covers the full region of the blurred mask. Note that geometry is in local bounds.
  1. Apply the user set color filter on the GPU, if applicable.
  1. Composite the color source with the blurred mask.

Definition at line 396 of file paint.cc.

402 {
403 // If it's a solid color then we can just get away with doing one Gaussian
404 // blur. The color filter will always be applied on the CPU.
405 if (contents->IsSolidColor()) {
408 /*bounds=*/std::nullopt, style, geometry);
409 }
410
411 /// 1. Create an opaque white mask of the original geometry.
412 auto mask = std::make_shared<SolidColorContents>(geometry);
413 mask->SetColor(Color::White());
414
415 /// 2. Blur the mask.
416 auto blurred_mask = FilterContents::MakeGaussianBlur(
418 /*bounds=*/std::nullopt, style, geometry);
419
420 /// 3. Replace the geometry of the original color source with a rectangle that
421 /// covers the full region of the blurred mask. Note that geometry is in
422 /// local bounds.
423 std::optional<Rect> expanded_local_bounds = blurred_mask->GetCoverage({});
424 if (!expanded_local_bounds.has_value()) {
425 expanded_local_bounds = Rect();
426 }
427 *out_geom = FillRectGeometry(expanded_local_bounds.value());
428
429 std::shared_ptr<ColorSourceContents> expanded_contents =
430 paint.CreateContents(renderer, out_geom);
431 std::shared_ptr<Contents> final_contents = expanded_contents;
432
433 /// 4. Apply the user set color filter on the GPU, if applicable.
434 if (needs_color_filter) {
435 if (paint.color_filter) {
436 final_contents = WrapWithGPUColorFilter(
437 paint.color_filter, FilterInput::Make(std::move(final_contents)),
439 }
440 if (paint.invert_colors) {
441 final_contents =
442 WrapWithInvertColors(FilterInput::Make(std::move(final_contents)),
444 }
445 }
446
447 /// 5. Composite the color source with the blurred mask.
450 {FilterInput::Make(blurred_mask), FilterInput::Make(final_contents)});
451}
static std::shared_ptr< ColorFilterContents > MakeBlend(BlendMode blend_mode, FilterInput::Vector inputs, std::optional< Color > foreground_color=std::nullopt)
the [inputs] are expected to be in the order of dst, src.
static FilterInput::Ref Make(Variant input, bool msaa_enabled=true)
std::shared_ptr< ColorFilterContents > WrapWithGPUColorFilter(const flutter::DlColorFilter *filter, const std::shared_ptr< FilterInput > &input, ColorFilterContents::AbsorbOpacity absorb_opacity)
std::shared_ptr< ColorFilterContents > WrapWithInvertColors(const std::shared_ptr< FilterInput > &input, ColorFilterContents::AbsorbOpacity absorb_opacity)
TRect< Scalar > Rect
Definition rect.h:822
static constexpr Color White()
Definition color.h:269

References impeller::Paint::color_filter, impeller::Paint::CreateContents(), impeller::Paint::invert_colors, impeller::WrapWithGPUColorFilter(), and impeller::WrapWithInvertColors().

◆ CreateMaskBlur() [3/3]

std::shared_ptr< FilterContents > impeller::Paint::MaskBlurDescriptor::CreateMaskBlur ( std::shared_ptr< TextureContents texture_contents,
FillRectGeometry rect_geom 
) const

Definition at line 367 of file paint.cc.

369 {
372 texture_contents->SetSourceRect(
373 texture_contents->GetSourceRect().Expand(expand_amount, expand_amount));
374 std::optional<Rect> coverage = texture_contents->GetCoverage({});
375 Geometry* geometry = nullptr;
376 if (coverage) {
377 texture_contents->SetDestinationRect(
378 coverage.value().Expand(expand_amount, expand_amount));
379 *rect_geom = FillRectGeometry(coverage.value());
380 geometry = rect_geom;
381 }
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 =
389 /*bounds=*/std::nullopt, style, geometry);
390
393 {FilterInput::Make(blurred_mask), FilterInput::Make(texture_contents)});
394}
float Scalar
Definition scalar.h:19

Member Data Documentation

◆ respect_ctm

bool impeller::Paint::MaskBlurDescriptor::respect_ctm = true

Text mask blurs need to not apply the CTM to the blur kernel. See: https://github.com/flutter/flutter/issues/115112

Definition at line 59 of file paint.h.

◆ sigma

Sigma impeller::Paint::MaskBlurDescriptor::sigma

Definition at line 56 of file paint.h.

Referenced by impeller::testing::TEST_P().

◆ style

FilterContents::BlurStyle impeller::Paint::MaskBlurDescriptor::style

Definition at line 55 of file paint.h.

Referenced by impeller::DlDispatcherBase::drawShadow().


The documentation for this struct was generated from the following files: