| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef FLUTTER_IMPELLER_ENTITY_GEOMETRY_GEOMETRY_H_ |
| #define FLUTTER_IMPELLER_ENTITY_GEOMETRY_GEOMETRY_H_ |
| |
| #include "impeller/core/formats.h" |
| #include "impeller/core/vertex_buffer.h" |
| #include "impeller/entity/contents/content_context.h" |
| #include "impeller/entity/entity.h" |
| #include "impeller/renderer/render_pass.h" |
| #include "impeller/renderer/vertex_buffer_builder.h" |
| |
| namespace impeller { |
| |
| class Tessellator; |
| |
| struct GeometryResult { |
| enum class Mode { |
| /// The geometry has no overlapping triangles. |
| kNormal, |
| /// The geometry may have overlapping triangles. The geometry should be |
| /// stenciled with the NonZero fill rule. |
| kNonZero, |
| /// The geometry may have overlapping triangles. The geometry should be |
| /// stenciled with the EvenOdd fill rule. |
| kEvenOdd, |
| /// The geometry may have overlapping triangles, but they should not |
| /// overdraw or cancel each other out. This is a special case for stroke |
| /// geometry. |
| kPreventOverdraw, |
| }; |
| |
| PrimitiveType type = PrimitiveType::kTriangleStrip; |
| VertexBuffer vertex_buffer; |
| Matrix transform; |
| Mode mode = Mode::kNormal; |
| }; |
| |
| static const GeometryResult kEmptyResult = { |
| .vertex_buffer = |
| { |
| .index_type = IndexType::kNone, |
| }, |
| }; |
| |
| class Geometry { |
| public: |
| static std::shared_ptr<Geometry> MakeFillPath( |
| const Path& path, |
| std::optional<Rect> inner_rect = std::nullopt); |
| |
| static std::shared_ptr<Geometry> MakeStrokePath( |
| const Path& path, |
| Scalar stroke_width = 0.0, |
| Scalar miter_limit = 4.0, |
| Cap stroke_cap = Cap::kButt, |
| Join stroke_join = Join::kMiter); |
| |
| static std::shared_ptr<Geometry> MakeCover(); |
| |
| static std::shared_ptr<Geometry> MakeRect(const Rect& rect); |
| |
| static std::shared_ptr<Geometry> MakeOval(const Rect& rect); |
| |
| static std::shared_ptr<Geometry> MakeLine(const Point& p0, |
| const Point& p1, |
| Scalar width, |
| Cap cap); |
| |
| static std::shared_ptr<Geometry> MakeCircle(const Point& center, |
| Scalar radius); |
| |
| static std::shared_ptr<Geometry> MakeStrokedCircle(const Point& center, |
| Scalar radius, |
| Scalar stroke_width); |
| |
| static std::shared_ptr<Geometry> MakeRoundRect(const Rect& rect, |
| const Size& radii); |
| |
| static std::shared_ptr<Geometry> MakePointField(std::vector<Point> points, |
| Scalar radius, |
| bool round); |
| |
| virtual GeometryResult GetPositionBuffer(const ContentContext& renderer, |
| const Entity& entity, |
| RenderPass& pass) const = 0; |
| |
| virtual GeometryResult::Mode GetResultMode() const; |
| |
| virtual std::optional<Rect> GetCoverage(const Matrix& transform) const = 0; |
| |
| /// @brief 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`. |
| virtual bool CoversArea(const Matrix& transform, const Rect& rect) const; |
| |
| virtual bool IsAxisAlignedRect() const; |
| |
| virtual bool CanApplyMaskFilter() const; |
| |
| virtual Scalar ComputeAlphaCoverage(const Entity& entitys) const { |
| return 1.0; |
| } |
| |
| protected: |
| static GeometryResult ComputePositionGeometry( |
| const ContentContext& renderer, |
| const Tessellator::VertexGenerator& generator, |
| const Entity& entity, |
| RenderPass& pass); |
| }; |
| |
| } // namespace impeller |
| |
| #endif // FLUTTER_IMPELLER_ENTITY_GEOMETRY_GEOMETRY_H_ |