• 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 // ACE PC preivew.
6 #ifndef WINDOWS_PLATFORM
7 // It cannot be passed to the sub-include of math.h, so define it in gn.
8 #define _USE_MATH_DEFINES
9 #endif
10 
11 #include "flutter/lib/ui/painting/gradient.h"
12 
13 namespace flutter {
14 
15 typedef CanvasGradient
16     Gradient;  // Because the C++ name doesn't match the Dart name.
17 
18 IMPLEMENT_WRAPPERTYPEINFO(ui, Gradient);
19 
20 #define FOR_EACH_BINDING(V) \
21   V(Gradient, initLinear)   \
22   V(Gradient, initRadial)   \
23   V(Gradient, initSweep)    \
24   V(Gradient, initTwoPointConical)
25 
FOR_EACH_BINDING(DART_NATIVE_CALLBACK)26 FOR_EACH_BINDING(DART_NATIVE_CALLBACK)
27 
28 void CanvasGradient::RegisterNatives(tonic::DartLibraryNatives* natives) {
29 }
30 
Create()31 fml::RefPtr<CanvasGradient> CanvasGradient::Create() {
32   return fml::MakeRefCounted<CanvasGradient>();
33 }
34 
initLinear(const tonic::Float32List & end_points,const tonic::Int32List & colors,const tonic::Float32List & color_stops,SkTileMode tile_mode,const tonic::Float64List & matrix4)35 void CanvasGradient::initLinear(const tonic::Float32List& end_points,
36                                 const tonic::Int32List& colors,
37                                 const tonic::Float32List& color_stops,
38                                 SkTileMode tile_mode,
39                                 const tonic::Float64List& matrix4) {
40   FML_DCHECK(end_points.size() == 4);
41   FML_DCHECK(colors.size() == color_stops.size() ||
42              color_stops.data() == nullptr);
43 
44   static_assert(sizeof(SkPoint) == sizeof(float) * 2,
45                 "SkPoint doesn't use floats.");
46   static_assert(sizeof(SkColor) == sizeof(int32_t),
47                 "SkColor doesn't use int32_t.");
48 
49   SkMatrix sk_matrix;
50   bool has_matrix = matrix4.data() != nullptr;
51   if (has_matrix) {
52     sk_matrix = ToSkMatrix(matrix4);
53   }
54 
55   set_shader(UIDartState::CreateGPUObject(SkGradientShader::MakeLinear(
56       reinterpret_cast<const SkPoint*>(end_points.data()),
57       reinterpret_cast<const SkColor*>(colors.data()), color_stops.data(),
58       colors.size(), tile_mode, 0, has_matrix ? &sk_matrix : nullptr)));
59 }
60 
initRadial(double center_x,double center_y,double radius,const tonic::Int32List & colors,const tonic::Float32List & color_stops,SkTileMode tile_mode,const tonic::Float64List & matrix4)61 void CanvasGradient::initRadial(double center_x,
62                                 double center_y,
63                                 double radius,
64                                 const tonic::Int32List& colors,
65                                 const tonic::Float32List& color_stops,
66                                 SkTileMode tile_mode,
67                                 const tonic::Float64List& matrix4) {
68   FML_DCHECK(colors.size() == color_stops.size() ||
69              color_stops.data() == nullptr);
70 
71   static_assert(sizeof(SkColor) == sizeof(int32_t),
72                 "SkColor doesn't use int32_t.");
73 
74   SkMatrix sk_matrix;
75   bool has_matrix = matrix4.data() != nullptr;
76   if (has_matrix) {
77     sk_matrix = ToSkMatrix(matrix4);
78   }
79 
80   set_shader(UIDartState::CreateGPUObject(SkGradientShader::MakeRadial(
81       SkPoint::Make(center_x, center_y), radius,
82       reinterpret_cast<const SkColor*>(colors.data()), color_stops.data(),
83       colors.size(), tile_mode, 0, has_matrix ? &sk_matrix : nullptr)));
84 }
85 
initSweep(double center_x,double center_y,const tonic::Int32List & colors,const tonic::Float32List & color_stops,SkTileMode tile_mode,double start_angle,double end_angle,const tonic::Float64List & matrix4)86 void CanvasGradient::initSweep(double center_x,
87                                double center_y,
88                                const tonic::Int32List& colors,
89                                const tonic::Float32List& color_stops,
90                                SkTileMode tile_mode,
91                                double start_angle,
92                                double end_angle,
93                                const tonic::Float64List& matrix4) {
94   FML_DCHECK(colors.size() == color_stops.size() ||
95              color_stops.data() == nullptr);
96 
97   static_assert(sizeof(SkColor) == sizeof(int32_t),
98                 "SkColor doesn't use int32_t.");
99 
100   SkMatrix sk_matrix;
101   bool has_matrix = matrix4.data() != nullptr;
102   if (has_matrix) {
103     sk_matrix = ToSkMatrix(matrix4);
104   }
105 
106   set_shader(UIDartState::CreateGPUObject(SkGradientShader::MakeSweep(
107       center_x, center_y, reinterpret_cast<const SkColor*>(colors.data()),
108       color_stops.data(), colors.size(), tile_mode,
109       start_angle * 180.0 / M_PI, end_angle * 180.0 / M_PI, 0,
110       has_matrix ? &sk_matrix : nullptr)));
111 }
112 
initTwoPointConical(double start_x,double start_y,double start_radius,double end_x,double end_y,double end_radius,const tonic::Int32List & colors,const tonic::Float32List & color_stops,SkTileMode tile_mode,const tonic::Float64List & matrix4)113 void CanvasGradient::initTwoPointConical(double start_x,
114                                          double start_y,
115                                          double start_radius,
116                                          double end_x,
117                                          double end_y,
118                                          double end_radius,
119                                          const tonic::Int32List& colors,
120                                          const tonic::Float32List& color_stops,
121                                          SkTileMode tile_mode,
122                                          const tonic::Float64List& matrix4) {
123   FML_DCHECK(colors.size() == color_stops.size() ||
124              color_stops.data() == nullptr);
125 
126   static_assert(sizeof(SkColor) == sizeof(int32_t),
127                 "SkColor doesn't use int32_t.");
128 
129   SkMatrix sk_matrix;
130   bool has_matrix = matrix4.data() != nullptr;
131   if (has_matrix) {
132     sk_matrix = ToSkMatrix(matrix4);
133   }
134 
135   set_shader(UIDartState::CreateGPUObject(SkGradientShader::MakeTwoPointConical(
136       SkPoint::Make(start_x, start_y), start_radius,
137       SkPoint::Make(end_x, end_y), end_radius,
138       reinterpret_cast<const SkColor*>(colors.data()), color_stops.data(),
139       colors.size(), tile_mode, 0, has_matrix ? &sk_matrix : nullptr)));
140 }
141 
142 CanvasGradient::CanvasGradient() = default;
143 
144 CanvasGradient::~CanvasGradient() = default;
145 
146 }  // namespace flutter
147