Flutter Impeller
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 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 52 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 450 of file paint.cc.

453  {
454  Vector2 blur_sigma(sigma.sigma, sigma.sigma);
455  if (!respect_ctm) {
456  blur_sigma /=
457  Vector2(ctm.GetBasisX().GetLength(), ctm.GetBasisY().GetLength());
458  }
459  if (is_solid_color) {
461  input, Sigma(blur_sigma.x), Sigma(blur_sigma.y),
462  Entity::TileMode::kDecal, /*bounds=*/std::nullopt, style);
463  }
464  return FilterContents::MakeBorderMaskBlur(input, Sigma(blur_sigma.x),
465  Sigma(blur_sigma.y), style);
466 }
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)
Point Vector2
Definition: point.h:430
FilterContents::BlurStyle style
Definition: paint.h:53
Scalar sigma
Definition: sigma.h:33

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

◆ CreateMaskBlur() [2/3]

std::shared_ptr< Contents > impeller::Paint::MaskBlurDescriptor::CreateMaskBlur ( const Paint paint,
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.
  2. Blur the mask.
  3. 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.
  4. Apply the user set color filter on the GPU, if applicable.
  5. Composite the color source with the blurred mask.

Definition at line 394 of file paint.cc.

399  {
400  // If it's a solid color then we can just get away with doing one Gaussian
401  // blur. The color filter will always be applied on the CPU.
402  if (contents->IsSolidColor()) {
405  /*bounds=*/std::nullopt, style, geometry);
406  }
407 
408  /// 1. Create an opaque white mask of the original geometry.
409  auto mask = std::make_shared<SolidColorContents>(geometry);
410  mask->SetColor(Color::White());
411 
412  /// 2. Blur the mask.
413  auto blurred_mask = FilterContents::MakeGaussianBlur(
415  /*bounds=*/std::nullopt, style, geometry);
416 
417  /// 3. Replace the geometry of the original color source with a rectangle that
418  /// covers the full region of the blurred mask. Note that geometry is in
419  /// local bounds.
420  std::optional<Rect> expanded_local_bounds = blurred_mask->GetCoverage({});
421  if (!expanded_local_bounds.has_value()) {
422  expanded_local_bounds = Rect();
423  }
424  *out_geom = FillRectGeometry(expanded_local_bounds.value());
425 
426  std::shared_ptr<ColorSourceContents> expanded_contents =
427  paint.CreateContents(out_geom);
428  std::shared_ptr<Contents> final_contents = expanded_contents;
429 
430  /// 4. Apply the user set color filter on the GPU, if applicable.
431  if (needs_color_filter) {
432  if (paint.color_filter) {
433  final_contents = WrapWithGPUColorFilter(
434  paint.color_filter, FilterInput::Make(std::move(final_contents)),
436  }
437  if (paint.invert_colors) {
438  final_contents =
439  WrapWithInvertColors(FilterInput::Make(std::move(final_contents)),
441  }
442  }
443 
444  /// 5. Composite the color source with the blurred mask.
447  {FilterInput::Make(blurred_mask), FilterInput::Make(final_contents)});
448 }
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)
Definition: filter_input.cc:19
std::shared_ptr< ColorFilterContents > WrapWithGPUColorFilter(const flutter::DlColorFilter *filter, const std::shared_ptr< FilterInput > &input, ColorFilterContents::AbsorbOpacity absorb_opacity)
Definition: color_filter.cc:24
std::shared_ptr< ColorFilterContents > WrapWithInvertColors(const std::shared_ptr< FilterInput > &input, ColorFilterContents::AbsorbOpacity absorb_opacity)
Definition: color_filter.cc:16
TRect< Scalar > Rect
Definition: rect.h:788
static constexpr Color White()
Definition: color.h:264

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 365 of file paint.cc.

367  {
370  texture_contents->SetSourceRect(
371  texture_contents->GetSourceRect().Expand(expand_amount, expand_amount));
372  std::optional<Rect> coverage = texture_contents->GetCoverage({});
373  Geometry* geometry = nullptr;
374  if (coverage) {
375  texture_contents->SetDestinationRect(
376  coverage.value().Expand(expand_amount, expand_amount));
377  *rect_geom = FillRectGeometry(coverage.value());
378  geometry = rect_geom;
379  }
380  auto mask = std::make_shared<SolidColorContents>(geometry);
381  mask->SetColor(Color::White());
382  auto descriptor = texture_contents->GetSamplerDescriptor();
383  texture_contents->SetSamplerDescriptor(descriptor);
384  std::shared_ptr<FilterContents> blurred_mask =
387  /*bounds=*/std::nullopt, style, geometry);
388 
391  {FilterInput::Make(blurred_mask), FilterInput::Make(texture_contents)});
392 }
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 57 of file paint.h.

◆ sigma

Sigma impeller::Paint::MaskBlurDescriptor::sigma

Definition at line 54 of file paint.h.

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

◆ style

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

Definition at line 53 of file paint.h.

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


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