7 #include "display_list/dl_vertices.h"
11 #include "third_party/skia/include/core/SkPoint.h"
23 static std::vector<uint16_t> fromFanIndices(
size_t vertex_count,
25 const uint16_t* indices) {
26 std::vector<uint16_t> unrolled_indices;
29 if (index_count > 0u) {
30 if (index_count < 3u) {
34 auto center_point = indices[0];
35 for (
auto i = 1u; i < index_count - 1; i++) {
36 unrolled_indices.push_back(center_point);
37 unrolled_indices.push_back(indices[i]);
38 unrolled_indices.push_back(indices[i + 1]);
41 if (vertex_count < 3u) {
47 for (
auto i = 1u; i < vertex_count - 1; i++) {
48 unrolled_indices.push_back(0);
49 unrolled_indices.push_back(i);
50 unrolled_indices.push_back(i + 1);
53 return unrolled_indices;
61 const std::shared_ptr<const flutter::DlVertices>& vertices,
63 : vertices_(vertices) {
64 performed_normalization_ = MaybePerformIndexNormalization(renderer);
69 switch (vertices_->mode()) {
70 case flutter::DlVertexMode::kTriangleFan:
72 if (performed_normalization_) {
76 case flutter::DlVertexMode::kTriangleStrip:
78 case flutter::DlVertexMode::kTriangles:
84 return vertices_->colors() !=
nullptr;
88 return vertices_->texture_coordinates() !=
nullptr;
95 auto vertex_count = vertices_->vertex_count();
96 if (vertex_count == 0) {
100 auto first = vertices_->texture_coordinates();
101 auto left = first->x();
102 auto top = first->y();
103 auto right = first->x();
104 auto bottom = first->y();
106 for (
auto it = first + 1; i < vertex_count; ++it, i++) {
107 left = std::min(left, it->x());
108 top = std::min(top, it->y());
109 right = std::max(right, it->x());
110 bottom = std::max(bottom, it->y());
119 int vertex_count = vertices_->vertex_count();
121 vertices_->vertices(), vertex_count *
sizeof(SkPoint),
alignof(SkPoint));
125 performed_normalization_ ? indices_.size() : vertices_->index_count();
126 const uint16_t* indices_data =
127 performed_normalization_ ? indices_.data() : vertices_->indices();
130 indices_data, index_count *
sizeof(uint16_t),
alignof(uint16_t));
134 .
type = GetPrimitiveType(),
137 .vertex_buffer = vertex_buffer,
138 .index_buffer = index_buffer,
139 .vertex_count = index_count > 0 ? index_count : vertex_count,
148 Rect texture_coverage,
155 int vertex_count = vertices_->vertex_count();
161 const SkPoint* coordinates = has_texture_coordinates
162 ? vertices_->texture_coordinates()
163 : vertices_->vertices();
165 vertex_count *
sizeof(VS::PerVertexData),
alignof(VS::PerVertexData),
167 VS::PerVertexData* vtx_contents =
168 reinterpret_cast<VS::PerVertexData*
>(
data);
169 for (
auto i = 0; i < vertex_count; i++) {
171 Point uv = uv_transform * texture_coord;
176 VS::PerVertexData vertex_data = {
178 .texture_coords = uv,
180 vtx_contents[i] = vertex_data;
186 performed_normalization_ ? indices_.size() : vertices_->index_count();
187 const uint16_t* indices_data =
188 performed_normalization_ ? indices_.data() : vertices_->indices();
191 indices_data, index_count *
sizeof(uint16_t),
alignof(uint16_t));
195 .
type = GetPrimitiveType(),
198 .vertex_buffer = vertex_buffer,
199 .index_buffer = index_buffer,
200 .vertex_count = index_count > 0 ? index_count : vertex_count,
213 bool DlVerticesGeometry::MaybePerformIndexNormalization(
215 if (vertices_->mode() == flutter::DlVertexMode::kTriangleFan &&
217 indices_ = fromFanIndices(vertices_->vertex_count(),
218 vertices_->index_count(), vertices_->indices());