Flutter Engine
 
Loading...
Searching...
No Matches
dl_color_source.cc
Go to the documentation of this file.
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
6
10#include "flutter/fml/logging.h"
11
12namespace flutter {
13
14static void DlGradientDeleter(void* p) {
15 // Some of our target environments would prefer a sized delete,
16 // but other target environments do not have that operator.
17 // Use an unsized delete until we get better agreement in the
18 // environments.
19 // See https://github.com/flutter/flutter/issues/100327
20 ::operator delete(p);
21}
22
23std::shared_ptr<DlColorSource> DlColorSource::MakeImage(
24 const sk_sp<const DlImage>& image,
25 DlTileMode horizontal_tile_mode,
26 DlTileMode vertical_tile_mode,
27 DlImageSampling sampling,
28 const DlMatrix* matrix) {
29 return std::make_shared<DlImageColorSource>(
30 image, horizontal_tile_mode, vertical_tile_mode, sampling, matrix);
31}
32
33namespace {
34template <typename GradientColorSource>
35size_t CalculateGradientSize(uint32_t stop_count) {
36 return sizeof(GradientColorSource) +
37 (stop_count * (sizeof(DlColor) + sizeof(float)));
38}
39} // namespace
40
41std::shared_ptr<DlColorSource> DlColorSource::MakeLinear(
42 const DlPoint start_point,
43 const DlPoint end_point,
44 uint32_t stop_count,
45 const DlColor* colors,
46 const float* stops,
47 DlTileMode tile_mode,
48 const DlMatrix* matrix) {
49 size_t needed =
50 CalculateGradientSize<DlLinearGradientColorSource>(stop_count);
51 void* storage = ::operator new(needed);
52
53 std::shared_ptr<DlLinearGradientColorSource> ret;
54 ret.reset(new (storage)
55 DlLinearGradientColorSource(start_point, end_point, stop_count,
56 colors, stops, tile_mode, matrix),
58 return ret;
59}
60
61std::shared_ptr<DlColorSource> DlColorSource::MakeLinear(
62 const DlPoint start_point,
63 const DlPoint end_point,
64 uint32_t stop_count,
65 const DlScalar* colors_argb,
66 const float* stops,
67 DlTileMode tile_mode,
68 const DlMatrix* matrix) {
69 size_t needed =
70 CalculateGradientSize<DlLinearGradientColorSource>(stop_count);
71 void* storage = ::operator new(needed);
72
73 std::shared_ptr<DlLinearGradientColorSource> ret;
74 ret.reset(new (storage) DlLinearGradientColorSource(start_point, end_point,
75 stop_count, colors_argb,
76 stops, tile_mode, matrix),
78 return ret;
79}
80
81std::shared_ptr<DlColorSource> DlColorSource::MakeRadial(
82 DlPoint center,
83 DlScalar radius,
84 uint32_t stop_count,
85 const DlColor* colors,
86 const float* stops,
87 DlTileMode tile_mode,
88 const DlMatrix* matrix) {
89 size_t needed =
90 CalculateGradientSize<DlRadialGradientColorSource>(stop_count);
91 void* storage = ::operator new(needed);
92
93 std::shared_ptr<DlRadialGradientColorSource> ret;
94 ret.reset(new (storage) DlRadialGradientColorSource(
95 center, radius, stop_count, colors, stops, tile_mode, matrix),
97 return ret;
98}
99
100std::shared_ptr<DlColorSource> DlColorSource::MakeRadial(
101 DlPoint center,
102 DlScalar radius,
103 uint32_t stop_count,
104 const DlScalar* colors_argb,
105 const float* stops,
106 DlTileMode tile_mode,
107 const DlMatrix* matrix) {
108 size_t needed =
109 CalculateGradientSize<DlRadialGradientColorSource>(stop_count);
110 void* storage = ::operator new(needed);
111
112 std::shared_ptr<DlRadialGradientColorSource> ret;
113 ret.reset(
114 new (storage) DlRadialGradientColorSource(
115 center, radius, stop_count, colors_argb, stops, tile_mode, matrix),
117 return ret;
118}
119
120std::shared_ptr<DlColorSource> DlColorSource::MakeConical(
121 DlPoint start_center,
122 DlScalar start_radius,
123 DlPoint end_center,
124 DlScalar end_radius,
125 uint32_t stop_count,
126 const DlColor* colors,
127 const float* stops,
128 DlTileMode tile_mode,
129 const DlMatrix* matrix) {
130 size_t needed =
131 CalculateGradientSize<DlConicalGradientColorSource>(stop_count);
132 void* storage = ::operator new(needed);
133
134 std::shared_ptr<DlConicalGradientColorSource> ret;
135 ret.reset(new (storage) DlConicalGradientColorSource(
136 start_center, start_radius, end_center, end_radius, stop_count,
137 colors, stops, tile_mode, matrix),
139 return ret;
140}
141
142std::shared_ptr<DlColorSource> DlColorSource::MakeConical(
143 DlPoint start_center,
144 DlScalar start_radius,
145 DlPoint end_center,
146 DlScalar end_radius,
147 uint32_t stop_count,
148 const DlScalar* colors_argb,
149 const float* stops,
150 DlTileMode tile_mode,
151 const DlMatrix* matrix) {
152 size_t needed =
153 CalculateGradientSize<DlConicalGradientColorSource>(stop_count);
154
155 void* storage = ::operator new(needed);
156
157 std::shared_ptr<DlConicalGradientColorSource> ret;
158 ret.reset(new (storage) DlConicalGradientColorSource(
159 start_center, start_radius, end_center, end_radius, stop_count,
160 colors_argb, stops, tile_mode, matrix),
162 return ret;
163}
164
165std::shared_ptr<DlColorSource> DlColorSource::MakeSweep(
166 DlPoint center,
167 DlScalar start,
169 uint32_t stop_count,
170 const DlColor* colors,
171 const float* stops,
172 DlTileMode tile_mode,
173 const DlMatrix* matrix) {
174 size_t needed = CalculateGradientSize<DlSweepGradientColorSource>(stop_count);
175 void* storage = ::operator new(needed);
176
177 std::shared_ptr<DlSweepGradientColorSource> ret;
178 ret.reset(new (storage)
179 DlSweepGradientColorSource(center, start, end, stop_count,
180 colors, stops, tile_mode, matrix),
182 return ret;
183}
184
185std::shared_ptr<DlColorSource> DlColorSource::MakeSweep(
186 DlPoint center,
187 DlScalar start,
189 uint32_t stop_count,
190 const DlScalar* colors_argb,
191 const float* stops,
192 DlTileMode tile_mode,
193 const DlMatrix* matrix) {
194 size_t needed = CalculateGradientSize<DlSweepGradientColorSource>(stop_count);
195 void* storage = ::operator new(needed);
196
197 std::shared_ptr<DlSweepGradientColorSource> ret;
198 ret.reset(new (storage) DlSweepGradientColorSource(center, start, end,
199 stop_count, colors_argb,
200 stops, tile_mode, matrix),
202 return ret;
203}
204
205std::shared_ptr<DlColorSource> DlColorSource::MakeRuntimeEffect(
206 sk_sp<DlRuntimeEffect> runtime_effect,
207 std::vector<std::shared_ptr<DlColorSource>> samplers,
208 std::shared_ptr<std::vector<uint8_t>> uniform_data) {
209 FML_DCHECK(uniform_data != nullptr);
210 return std::make_shared<DlRuntimeEffectColorSource>(
211 std::move(runtime_effect), std::move(samplers), std::move(uniform_data));
212}
213
215 DlTileMode tile_mode,
216 const DlMatrix* matrix)
217 : DlMatrixColorSourceBase(matrix),
218 mode_(tile_mode),
219 stop_count_(stop_count) {}
220
222 if (mode_ == DlTileMode::kDecal) {
223 return false;
224 }
225 const DlColor* my_colors = colors();
226 for (uint32_t i = 0; i < stop_count_; i++) {
227 if (my_colors[i].getAlpha() < 255) {
228 return false;
229 }
230 }
231 return true;
232}
233
235 DlGradientColorSourceBase const* other_base) const {
236 if (mode_ != other_base->mode_ || matrix() != other_base->matrix() ||
237 stop_count_ != other_base->stop_count_) {
238 return false;
239 }
240 return (memcmp(colors(), other_base->colors(),
241 stop_count_ * sizeof(colors()[0])) == 0 &&
242 memcmp(stops(), other_base->stops(),
243 stop_count_ * sizeof(stops()[0])) == 0);
244}
245
246namespace {
247template <typename DlColorIt>
248void do_store_color_stops(void* pod,
249 DlColorIt color_data_argb_begin,
250 DlColorIt color_data_argb_end,
251 const float* stop_data) {
252 DlColor* color_storage = reinterpret_cast<DlColor*>(pod);
253 uint32_t stop_count = 0;
254 while (color_data_argb_begin < color_data_argb_end) {
255 *color_storage++ = *color_data_argb_begin++;
256 stop_count += 1;
257 }
258 float* stop_storage = reinterpret_cast<float*>(color_storage);
259 if (stop_data) {
260 memcpy(stop_storage, stop_data, stop_count * sizeof(*stop_data));
261 } else {
262 float div = stop_count - 1;
263 if (div <= 0) {
264 div = 1;
265 }
266 for (uint32_t i = 0; i < stop_count; i++) {
267 stop_storage[i] = i / div;
268 }
269 }
270}
271
272class DlScalerToDlColorIterator {
273 public:
274 explicit DlScalerToDlColorIterator(const DlScalar* ptr) : ptr_(ptr) {}
275 DlScalerToDlColorIterator(DlScalerToDlColorIterator&&) = default;
276 DlScalerToDlColorIterator(const DlScalerToDlColorIterator&) = delete;
277 DlScalerToDlColorIterator& operator=(const DlScalerToDlColorIterator&) =
278 delete;
279
281 return DlColor(ptr_[0], ptr_[1], ptr_[2], ptr_[3],
283 }
284 DlScalerToDlColorIterator operator++(int) {
285 auto result = DlScalerToDlColorIterator(ptr_);
286 ptr_ += 4;
287 return result;
288 }
289 bool operator<(const DlScalerToDlColorIterator& that) const {
290 return ptr_ < that.ptr_;
291 }
292
293 private:
294 const DlScalar* ptr_;
295};
296
297} // namespace
298
300 const DlColor* color_data,
301 const float* stop_data) {
302 do_store_color_stops(pod, color_data, color_data + stop_count_, stop_data);
303}
304
306 void* pod,
307 const DlScalar* color_data_argb,
308 const float* stop_data) {
309 do_store_color_stops(
310 pod, DlScalerToDlColorIterator(color_data_argb),
311 DlScalerToDlColorIterator(color_data_argb + stop_count_ * 4), stop_data);
312}
313
314} // namespace flutter
static std::shared_ptr< DlColorSource > MakeSweep(DlPoint center, DlScalar start, DlScalar end, uint32_t stop_count, const DlColor *colors, const float *stops, DlTileMode tile_mode, const DlMatrix *matrix=nullptr)
static std::shared_ptr< DlColorSource > MakeImage(const sk_sp< const DlImage > &image, DlTileMode horizontal_tile_mode, DlTileMode vertical_tile_mode, DlImageSampling sampling=DlImageSampling::kLinear, const DlMatrix *matrix=nullptr)
static std::shared_ptr< DlColorSource > MakeLinear(const DlPoint start_point, const DlPoint end_point, uint32_t stop_count, const DlColor *colors, const float *stops, DlTileMode tile_mode, const DlMatrix *matrix=nullptr)
static std::shared_ptr< DlColorSource > MakeRuntimeEffect(sk_sp< DlRuntimeEffect > runtime_effect, std::vector< std::shared_ptr< DlColorSource > > samplers, std::shared_ptr< std::vector< uint8_t > > uniform_data)
static std::shared_ptr< DlColorSource > MakeConical(DlPoint start_center, DlScalar start_radius, DlPoint end_center, DlScalar end_radius, uint32_t stop_count, const DlColor *colors, const float *stops, DlTileMode tile_mode, const DlMatrix *matrix=nullptr)
static std::shared_ptr< DlColorSource > MakeRadial(DlPoint center, DlScalar radius, uint32_t stop_count, const DlColor *colors, const float *stops, DlTileMode tile_mode, const DlMatrix *matrix=nullptr)
void store_color_stops(void *pod, const DlColor *color_data, const float *stop_data)
DlGradientColorSourceBase(uint32_t stop_count, DlTileMode tile_mode, const DlMatrix *matrix=nullptr)
bool base_equals_(DlGradientColorSourceBase const *other_base) const
virtual const void * pod() const =0
FlutterVulkanImage * image
#define FML_DCHECK(condition)
Definition logging.h:122
impeller::Scalar DlScalar
static void DlGradientDeleter(void *p)
constexpr Color operator*(T value, const Color &c)
Definition color.h:909
flutter::DlColor DlColor
bool operator<(const AXPosition< AXPositionType, AXNodeType > &first, const AXPosition< AXPositionType, AXNodeType > &second)
A 4x4 matrix using column-major storage.
Definition matrix.h:37
const size_t start
const size_t end