Flutter Engine
 
Loading...
Searching...
No Matches
geometry.h
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef FLUTTER_IMPELLER_ENTITY_GEOMETRY_GEOMETRY_H_
6#define FLUTTER_IMPELLER_ENTITY_GEOMETRY_GEOMETRY_H_
7
15
16namespace impeller {
17
18[[maybe_unused]]
19static constexpr Scalar kMinStrokeSize = 1.0f;
20
22 enum class Mode {
23 /// The geometry has no overlapping triangles.
24 kNormal,
25 /// The geometry may have overlapping triangles. The geometry should be
26 /// stenciled with the NonZero fill rule.
28 /// The geometry may have overlapping triangles. The geometry should be
29 /// stenciled with the EvenOdd fill rule.
31 /// The geometry may have overlapping triangles, but they should not
32 /// overdraw or cancel each other out. This is a special case for stroke
33 /// geometry.
35 };
36
41};
42
45 {
47 },
48};
49
50class Geometry {
51 public:
52 virtual ~Geometry() {}
53
54 static std::unique_ptr<Geometry> MakeFillPath(
55 const flutter::DlPath& path,
56 std::optional<Rect> inner_rect = std::nullopt);
57
58 static std::unique_ptr<Geometry> MakeStrokePath(
59 const flutter::DlPath& path,
60 const StrokeParameters& stroke = {});
61
62 static std::unique_ptr<Geometry> MakeCover();
63
64 static std::unique_ptr<Geometry> MakeRect(const Rect& rect);
65
66 static std::unique_ptr<Geometry> MakeOval(const Rect& rect);
67
68 static std::unique_ptr<Geometry> MakeLine(const Point& p0,
69 const Point& p1,
70 const StrokeParameters& stroke);
71
72 static std::unique_ptr<Geometry> MakeCircle(const Point& center,
73 Scalar radius);
74
75 static std::unique_ptr<Geometry> MakeStrokedCircle(const Point& center,
76 Scalar radius,
77 Scalar stroke_width);
78
79 static std::unique_ptr<Geometry> MakeFilledArc(const Rect& oval_bounds,
80 Degrees start,
81 Degrees sweep,
82 bool include_center);
83
84 static std::unique_ptr<Geometry> MakeStrokedArc(
85 const Rect& oval_bounds,
86 Degrees start,
87 Degrees sweep,
88 const StrokeParameters& stroke);
89
90 static std::unique_ptr<Geometry> MakeRoundRect(const Rect& rect,
91 const Size& radii);
92
93 static std::unique_ptr<Geometry> MakeRoundSuperellipse(const Rect& rect,
94 Scalar corner_radius);
95
97 const Entity& entity,
98 RenderPass& pass) const = 0;
99
100 virtual GeometryResult::Mode GetResultMode() const;
101
102 virtual std::optional<Rect> GetCoverage(const Matrix& transform) const = 0;
103
104 /// @brief Compute an alpha value to simulate lower coverage of fractional
105 /// pixel strokes.
106 static Scalar ComputeStrokeAlphaCoverage(const Matrix& entity,
107 Scalar stroke_width);
108
109 /// @brief Determines if this geometry, transformed by the given
110 /// `transform`, will completely cover all surface area of the given
111 /// `rect`.
112 ///
113 /// This is a conservative estimate useful for certain
114 /// optimizations.
115 ///
116 /// @returns `true` if the transformed geometry is guaranteed to cover the
117 /// given `rect`. May return `false` in many undetected cases where
118 /// the transformed geometry does in fact cover the `rect`.
119 virtual bool CoversArea(const Matrix& transform, const Rect& rect) const;
120
121 virtual bool IsAxisAlignedRect() const;
122
123 virtual bool CanApplyMaskFilter() const;
124
126 return 1.0;
127 }
128
130 const ContentContext& renderer,
131 const Tessellator::VertexGenerator& generator,
132 const Entity& entity,
133 RenderPass& pass);
134};
135
136} // namespace impeller
137
138#endif // FLUTTER_IMPELLER_ENTITY_GEOMETRY_GEOMETRY_H_
virtual std::optional< Rect > GetCoverage(const Matrix &transform) const =0
virtual Scalar ComputeAlphaCoverage(const Matrix &transform) const
Definition geometry.h:125
static std::unique_ptr< Geometry > MakeFillPath(const flutter::DlPath &path, std::optional< Rect > inner_rect=std::nullopt)
Definition geometry.cc:62
static Scalar ComputeStrokeAlphaCoverage(const Matrix &entity, Scalar stroke_width)
Compute an alpha value to simulate lower coverage of fractional pixel strokes.
Definition geometry.cc:149
virtual GeometryResult::Mode GetResultMode() const
Definition geometry.cc:58
static std::unique_ptr< Geometry > MakeRect(const Rect &rect)
Definition geometry.cc:83
static std::unique_ptr< Geometry > MakeFilledArc(const Rect &oval_bounds, Degrees start, Degrees sweep, bool include_center)
Definition geometry.cc:108
static std::unique_ptr< Geometry > MakeStrokePath(const flutter::DlPath &path, const StrokeParameters &stroke={})
Definition geometry.cc:68
static std::unique_ptr< Geometry > MakeCircle(const Point &center, Scalar radius)
Definition geometry.cc:97
virtual GeometryResult GetPositionBuffer(const ContentContext &renderer, const Entity &entity, RenderPass &pass) const =0
virtual bool CanApplyMaskFilter() const
Definition geometry.cc:144
static std::unique_ptr< Geometry > MakeRoundRect(const Rect &rect, const Size &radii)
Definition geometry.cc:125
static GeometryResult ComputePositionGeometry(const ContentContext &renderer, const Tessellator::VertexGenerator &generator, const Entity &entity, RenderPass &pass)
Definition geometry.cc:26
virtual bool CoversArea(const Matrix &transform, const Rect &rect) const
Determines if this geometry, transformed by the given transform, will completely cover all surface ar...
Definition geometry.cc:136
static std::unique_ptr< Geometry > MakeLine(const Point &p0, const Point &p1, const StrokeParameters &stroke)
Definition geometry.cc:91
static std::unique_ptr< Geometry > MakeOval(const Rect &rect)
Definition geometry.cc:87
static std::unique_ptr< Geometry > MakeStrokedCircle(const Point &center, Scalar radius, Scalar stroke_width)
Definition geometry.cc:102
static std::unique_ptr< Geometry > MakeRoundSuperellipse(const Rect &rect, Scalar corner_radius)
Definition geometry.cc:130
virtual ~Geometry()
Definition geometry.h:52
static std::unique_ptr< Geometry > MakeCover()
Definition geometry.cc:79
static std::unique_ptr< Geometry > MakeStrokedArc(const Rect &oval_bounds, Degrees start, Degrees sweep, const StrokeParameters &stroke)
Definition geometry.cc:116
virtual bool IsAxisAlignedRect() const
Definition geometry.cc:140
Render passes encode render commands directed as one specific render target into an underlying comman...
Definition render_pass.h:30
An object which produces a list of vertices as |Point|s that tessellate a previously provided shape a...
PrimitiveType
Decides how backend draws pixels based on input vertices.
Definition formats.h:352
float Scalar
Definition scalar.h:19
@ kNone
Does not use the index buffer.
TRect< Scalar > Rect
Definition rect.h:788
TPoint< Scalar > Point
Definition point.h:327
static const GeometryResult kEmptyResult
Definition geometry.h:43
TSize< Scalar > Size
Definition size.h:159
static constexpr Scalar kMinStrokeSize
Definition geometry.h:19
PrimitiveType type
Definition geometry.h:37
@ kNormal
The geometry has no overlapping triangles.
VertexBuffer vertex_buffer
Definition geometry.h:38
A 4x4 matrix using column-major storage.
Definition matrix.h:37
A structure to store all of the parameters related to stroking a path or basic geometry object.