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 #include "flutter/lib/ui/painting/vertices.h"
6
7 #include <algorithm>
8
9 namespace flutter {
10
11 namespace {
12
DecodePoints(const tonic::Float32List & coords,SkPoint * points)13 void DecodePoints(const tonic::Float32List& coords, SkPoint* points) {
14 for (size_t i = 0; i < coords.size(); i += 2)
15 points[i / 2] = SkPoint::Make(coords[i], coords[i + 1]);
16 }
17
18 template <typename T>
DecodeInts(const tonic::Int32List & ints,T * out)19 void DecodeInts(const tonic::Int32List& ints, T* out) {
20 for (size_t i = 0; i < ints.size(); i++)
21 out[i] = ints[i];
22 }
23
24 } // namespace
25
26 IMPLEMENT_WRAPPERTYPEINFO(ui, Vertices);
27
28 #define FOR_EACH_BINDING(V) V(Vertices, init)
29
FOR_EACH_BINDING(DART_NATIVE_CALLBACK)30 FOR_EACH_BINDING(DART_NATIVE_CALLBACK)
31
32 Vertices::Vertices() {}
33
~Vertices()34 Vertices::~Vertices() {}
35
RegisterNatives(tonic::DartLibraryNatives * natives)36 void Vertices::RegisterNatives(tonic::DartLibraryNatives* natives) {
37 }
38
Create()39 fml::RefPtr<Vertices> Vertices::Create() {
40 return fml::MakeRefCounted<Vertices>();
41 }
42
init(SkVertices::VertexMode vertex_mode,const tonic::Float32List & positions,const tonic::Float32List & texture_coordinates,const tonic::Int32List & colors,const tonic::Uint16List & indices)43 bool Vertices::init(SkVertices::VertexMode vertex_mode,
44 const tonic::Float32List& positions,
45 const tonic::Float32List& texture_coordinates,
46 const tonic::Int32List& colors,
47 const tonic::Uint16List& indices) {
48 uint32_t builderFlags = 0;
49 if (texture_coordinates.data())
50 builderFlags |= SkVertices::kHasTexCoords_BuilderFlag;
51 if (colors.data())
52 builderFlags |= SkVertices::kHasColors_BuilderFlag;
53
54 SkVertices::Builder builder(vertex_mode, positions.size() / 2,
55 indices.size(), builderFlags);
56
57 if (!builder.isValid())
58 return false;
59
60 // positions are required for SkVertices::Builder
61 FML_DCHECK(positions.data());
62 if (positions.data())
63 DecodePoints(positions, builder.positions());
64
65 if (texture_coordinates.data()) {
66 // SkVertices::Builder assumes equal numbers of elements
67 FML_DCHECK(positions.size() == texture_coordinates.size());
68 DecodePoints(texture_coordinates, builder.texCoords());
69 }
70 if (colors.data()) {
71 // SkVertices::Builder assumes equal numbers of elements
72 FML_DCHECK(positions.size() / 2 == colors.size());
73 DecodeInts<SkColor>(colors, builder.colors());
74 }
75
76 if (indices.data()) {
77 std::copy(indices.data(), indices.data() + indices.size(),
78 builder.indices());
79 }
80
81 vertices_ = builder.detach();
82
83 return true;
84 }
85
86 } // namespace flutter
87