11 : path_(
std::move(path)), inner_rect_(inner_rect) {}
26 points.data(), points.size() *
sizeof(
Point),
alignof(
Point));
30 return GeometryResult{
32 .vertex_buffer = vertex_buffer,
34 .prevent_overdraw =
false,
40 [&vertex_buffer, &host_buffer](
41 const float* vertices,
size_t vertices_count,
const uint16_t* indices,
42 size_t indices_count) {
43 vertex_buffer.vertex_buffer = host_buffer.Emplace(
44 vertices, vertices_count * sizeof(float) * 2, alignof(float));
45 if (indices != nullptr) {
46 vertex_buffer.index_buffer = host_buffer.Emplace(
47 indices, indices_count * sizeof(uint16_t), alignof(uint16_t));
48 vertex_buffer.vertex_count = indices_count;
49 vertex_buffer.index_type = IndexType::k16bit;
51 vertex_buffer.index_buffer = {};
57 if (tesselation_result != Tessellator::Result::kSuccess) {
60 return GeometryResult{
61 .type = PrimitiveType::kTriangle,
62 .vertex_buffer = vertex_buffer,
64 .prevent_overdraw =
false,
69 GeometryResult FillPathGeometry::GetPositionUVBuffer(
70 Rect texture_coverage,
71 Matrix effect_transform,
72 const ContentContext& renderer,
74 RenderPass& pass)
const {
75 using VS = TextureFillVertexShader;
78 texture_coverage.GetNormalizingTransform() * effect_transform;
80 if (path_.GetFillType() == FillType::kNonZero &&
82 auto points = renderer.GetTessellator()->TessellateConvex(
83 path_, entity.GetTransform().GetMaxBasisLength());
85 VertexBufferBuilder<VS::PerVertexData> vertex_builder;
86 vertex_builder.Reserve(points.size());
87 for (
auto i = 0u; i < points.size(); i++) {
88 VS::PerVertexData data;
89 data.position = points[i];
90 data.texture_coords = uv_transform * points[i];
91 vertex_builder.AppendVertex(data);
94 return GeometryResult{
95 .type = PrimitiveType::kTriangleStrip,
97 vertex_builder.CreateVertexBuffer(pass.GetTransientsBuffer()),
98 .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
99 .prevent_overdraw =
false,
103 VertexBufferBuilder<VS::PerVertexData> vertex_builder;
104 auto tesselation_result = renderer.GetTessellator()->Tessellate(
105 path_, entity.GetTransform().GetMaxBasisLength(),
106 [&vertex_builder, &uv_transform](
107 const float* vertices,
size_t vertices_count,
const uint16_t* indices,
108 size_t indices_count) {
109 for (auto i = 0u; i < vertices_count * 2; i += 2) {
110 VS::PerVertexData data;
111 Point vtx = {vertices[i], vertices[i + 1]};
113 data.texture_coords = uv_transform * vtx;
114 vertex_builder.AppendVertex(data);
116 FML_DCHECK(vertex_builder.GetVertexCount() == vertices_count);
117 if (indices !=
nullptr) {
118 for (
auto i = 0u; i < indices_count; i++) {
119 vertex_builder.AppendIndex(indices[i]);
124 if (tesselation_result != Tessellator::Result::kSuccess) {
127 return GeometryResult{
128 .type = PrimitiveType::kTriangle,
130 vertex_builder.CreateVertexBuffer(pass.GetTransientsBuffer()),
131 .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
132 .prevent_overdraw =
false,
140 std::optional<Rect> FillPathGeometry::GetCoverage(
141 const Matrix& transform)
const {
142 return path_.GetTransformedBoundingBox(transform);
145 bool FillPathGeometry::CoversArea(
const Matrix& transform,
146 const Rect& rect)
const {
147 if (!inner_rect_.has_value()) {