| Flutter Impeller |

Public Member Functions | Protected Member Functions | List of all members
impeller::FillRoundRectGeometry Class Referencefinal

A Geometry class that produces fillable vertices from any |RoundRect| object regardless of radii uniformity. More...

`#include <round_rect_geometry.h>`

Inheritance diagram for impeller::FillRoundRectGeometry:

## Public Member Functions
| FillRoundRectGeometry (const RoundRect &round_rect)
bool | CoversArea (const Matrix &transform, const Rect &rect) const override
| Determines if this geometry, transformed by the given `transform`, will completely cover all surface area of the given `rect`. More...
Public Member Functions inherited from impeller::FillPathSourceGeometry
| ~FillPathSourceGeometry () override
Public Member Functions inherited from impeller::Geometry
virtual | ~Geometry ()
virtual bool | IsAxisAlignedRect () const
virtual bool | CanApplyMaskFilter () const
virtual Scalar | ComputeAlphaCoverage (const Matrix &transform) const

## Protected Member Functions
const PathSource & | GetSource () const override
Protected Member Functions inherited from impeller::FillPathSourceGeometry
| FillPathSourceGeometry (std::optional< Rect > inner_rect)

## Additional Inherited Members
Static Public Member Functions inherited from impeller::Geometry
static std::unique_ptr< Geometry > | MakeFillPath (const flutter::DlPath &path, std::optional< Rect > inner_rect=std::nullopt)
static std::unique_ptr< Geometry > | MakeStrokePath (const flutter::DlPath &path, const StrokeParameters &stroke={})
static std::unique_ptr< Geometry > | MakeCover ()
static std::unique_ptr< Geometry > | MakeRect (const Rect &rect)
static std::unique_ptr< Geometry > | MakeOval (const Rect &rect)
static std::unique_ptr< Geometry > | MakeLine (const Point &p0, const Point &p1, const StrokeParameters &stroke)
static std::unique_ptr< Geometry > | MakeCircle (const Point &center, Scalar radius)
static std::unique_ptr< Geometry > | MakeStrokedCircle (const Point &center, Scalar radius, Scalar stroke_width)
static std::unique_ptr< Geometry > | MakeFilledArc (const Rect &oval_bounds, Degrees start, Degrees sweep, bool include_center)
static std::unique_ptr< Geometry > | MakeStrokedArc (const Rect &oval_bounds, Degrees start, Degrees sweep, const StrokeParameters &stroke)
static std::unique_ptr< Geometry > | MakeRoundRect (const Rect &rect, const Size &radii)
static std::unique_ptr< Geometry > | MakeRoundSuperellipse (const Rect &rect, Scalar corner_radius)
static Scalar | ComputeStrokeAlphaCoverage (const Matrix &entity, Scalar stroke_width)
| Compute an alpha value to simulate lower coverage of fractional pixel strokes. More...
static GeometryResult | ComputePositionGeometry (const ContentContext &renderer, const Tessellator::VertexGenerator &generator, const Entity &entity, RenderPass &pass)

## Detailed Description

A Geometry class that produces fillable vertices from any |RoundRect| object regardless of radii uniformity.

This class uses the |FillPathSourceGeometry| base class to do the work by providing a |RoundRectPathSoure| iterator.

Definition at line 59 of file round_rect_geometry.h.

## Constructor & Destructor Documentation

## ◆ FillRoundRectGeometry()

impeller::FillRoundRectGeometry::FillRoundRectGeometry | ( | const RoundRect & | round_rect | ) |
| explicit

Definition at line 66 of file round_rect_geometry.cc.

67 : FillPathSourceGeometry(std::nullopt), round_rect_source_(round_rect) {}
impeller::FillPathSourceGeometry::FillPathSourceGeometry
FillPathSourceGeometry(std::optional< Rect > inner_rect)
Definition: fill_path_geometry.cc:15

## Member Function Documentation

## ◆ CoversArea()

bool impeller::FillRoundRectGeometry::CoversArea | ( | const Matrix & | transform,
|  | const Rect & | rect
| ) |  | const
| overridevirtual

Determines if this geometry, transformed by the given `transform`, will completely cover all surface area of the given `rect`.

This is a conservative estimate useful for certain optimizations.

Returns
  `true` if the transformed geometry is guaranteed to cover the given `rect`. May return `false` in many undetected cases where the transformed geometry does in fact cover the `rect`.

Reimplemented from impeller::FillPathSourceGeometry.

Definition at line 73 of file round_rect_geometry.cc.

74 {
75 // Similar procedure to |RoundRectGeometry| except that we have different
76 // radii at every corner.
77 if (!transform.IsTranslationScaleOnly()) {
78 return false;
79 }
80 const RoundRect& round_rect = round_rect_source_.GetRoundRect();
81
82 const Rect& bounds = round_rect.GetBounds();
83 const RoundingRadii& radii = round_rect.GetRadii();
84
85 Scalar left_margin = std::max(radii.top_left.width, radii.bottom_left.width);
86 Scalar right_margin =
87 std::max(radii.top_right.width, radii.bottom_right.width);
88 Scalar top_margin = std::max(radii.top_left.height, radii.top_right.height);
89 Scalar bottom_margin =
90 std::max(radii.bottom_left.height, radii.bottom_right.height);
91
92 bool flat_on_tb = bounds.GetWidth() > left_margin + right_margin;
93 bool flat_on_lr = bounds.GetHeight() > top_margin + bottom_margin;
94 if (!flat_on_tb && !flat_on_lr) {
95 return false;
96 }
97 // We either transform the bounds and delta-transform the radii,
98 // or we compute the vertical and horizontal bounds and then
99 // transform each. Either way there are 2 transform operations.
100 // We could also get a weaker answer by computing just the
101 // "inner rect" and only doing a coverage analysis on that,
102 // but this process will produce more culling results.
103 if (flat_on_tb) {
104 Rect vertical_bounds = bounds.Expand(-left_margin, 0, -right_margin, 0);
105 Rect coverage = vertical_bounds.TransformBounds(transform);
106 if (coverage.Contains(rect)) {
107 return true;
108 }
109 }
110 if (flat_on_lr) {
111 Rect horizontal_bounds = bounds.Expand(0, -top_margin, 0, -bottom_margin);
112 Rect coverage = horizontal_bounds.TransformBounds(transform);
113 if (coverage.Contains(rect)) {
114 return true;
115 }
116 }
117 return false;
118 }
impeller::RoundRectPathSource::GetRoundRect
const RoundRect & GetRoundRect() const
Definition: round_rect.h:151
transform
Matrix transform
Definition: gaussian_blur_filter_contents.cc:312
impeller::Scalar
float Scalar
Definition: scalar.h:19
impeller::Rect
TRect< Scalar > Rect
Definition: rect.h:788
impeller::TRect::Expand
constexpr TRect< T > Expand(T left, T top, T right, T bottom) const
Returns a rectangle with expanded edges. Negative expansion results in shrinking.
Definition: rect.h:618
impeller::TRect::TransformBounds
constexpr TRect TransformBounds(const Matrix &transform) const
Creates a new bounding box that contains this transformed rectangle.
Definition: rect.h:472

References impeller::RoundingRadii::bottom_left, impeller::RoundingRadii::bottom_right, impeller::TRect< T >::Contains(), impeller::TRect< T >::Expand(), impeller::RoundRect::GetBounds(), impeller::TRect< T >::GetHeight(), impeller::RoundRect::GetRadii(), impeller::RoundRectPathSource::GetRoundRect(), impeller::TRect< T >::GetWidth(), impeller::TSize< T >::height, impeller::RoundingRadii::top_left, impeller::RoundingRadii::top_right, transform, impeller::TRect< T >::TransformBounds(), and impeller::TSize< T >::width.

## ◆ GetSource()

const PathSource & impeller::FillRoundRectGeometry::GetSource | ( |  | ) | const
| overrideprotectedvirtual

The PathSource object that will be iterated to produce the filled vertices.

Implements impeller::FillPathSourceGeometry.

Definition at line 69 of file round_rect_geometry.cc.

69 {
70 return round_rect_source_;
71 }

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

- impeller/entity/geometry/round_rect_geometry.h
- impeller/entity/geometry/round_rect_geometry.cc