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