// 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. #include "flutter/lib/ui/painting/vertices.h" #include #include "flutter/lib/ui/ui_dart_state.h" #include "third_party/tonic/dart_binding_macros.h" #include "third_party/tonic/dart_library_natives.h" namespace flutter { IMPLEMENT_WRAPPERTYPEINFO(ui, Vertices); Vertices::Vertices() {} Vertices::~Vertices() {} bool Vertices::init(Dart_Handle vertices_handle, DlVertexMode vertex_mode, Dart_Handle positions_handle, Dart_Handle texture_coordinates_handle, Dart_Handle colors_handle, Dart_Handle indices_handle) { UIDartState::ThrowIfUIOperationsProhibited(); tonic::Float32List positions(positions_handle); tonic::Float32List texture_coordinates(texture_coordinates_handle); tonic::Int32List colors(colors_handle); tonic::Uint16List indices(indices_handle); if (!positions.data()) { return false; } DlVertices::Builder::Flags flags; if (texture_coordinates.data()) { flags = flags | DlVertices::Builder::kHasTextureCoordinates; } if (colors.data()) { flags = flags | DlVertices::Builder::kHasColors; } DlVertices::Builder builder(vertex_mode, positions.num_elements() / 2, flags, indices.num_elements()); if (!builder.is_valid()) { return false; } // positions are required for SkVertices::Builder builder.store_vertices(positions.data()); if (texture_coordinates.data()) { // SkVertices::Builder assumes equal numbers of elements FML_DCHECK(positions.num_elements() == texture_coordinates.num_elements()); builder.store_texture_coordinates(texture_coordinates.data()); } if (colors.data()) { // SkVertices::Builder assumes equal numbers of elements FML_DCHECK(positions.num_elements() / 2 == colors.num_elements()); builder.store_colors(reinterpret_cast(colors.data())); } if (indices.data() && indices.num_elements() > 0) { builder.store_indices(indices.data()); } positions.Release(); texture_coordinates.Release(); colors.Release(); indices.Release(); auto vertices = fml::MakeRefCounted(); vertices->vertices_ = builder.build(); vertices->AssociateWithDartWrapper(vertices_handle); return true; } void Vertices::dispose() { vertices_.reset(); ClearDartWrapper(); } } // namespace flutter