• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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