24 const sk_sp<const DlImage>&
image,
29 return std::make_shared<DlImageColorSource>(
30 image, horizontal_tile_mode, vertical_tile_mode, sampling, matrix);
34template <
typename GradientColorSource>
35size_t CalculateGradientSize(uint32_t stop_count) {
36 return sizeof(GradientColorSource) +
37 (stop_count * (
sizeof(
DlColor) +
sizeof(
float)));
50 CalculateGradientSize<DlLinearGradientColorSource>(stop_count);
51 void* storage = ::operator
new(needed);
53 std::shared_ptr<DlLinearGradientColorSource> ret;
54 ret.reset(
new (storage)
56 colors, stops, tile_mode, matrix),
70 CalculateGradientSize<DlLinearGradientColorSource>(stop_count);
71 void* storage = ::operator
new(needed);
73 std::shared_ptr<DlLinearGradientColorSource> ret;
75 stop_count, colors_argb,
76 stops, tile_mode, matrix),
90 CalculateGradientSize<DlRadialGradientColorSource>(stop_count);
91 void* storage = ::operator
new(needed);
93 std::shared_ptr<DlRadialGradientColorSource> ret;
95 center, radius, stop_count, colors, stops, tile_mode, matrix),
109 CalculateGradientSize<DlRadialGradientColorSource>(stop_count);
110 void* storage = ::operator
new(needed);
112 std::shared_ptr<DlRadialGradientColorSource> ret;
115 center, radius, stop_count, colors_argb, stops, tile_mode, matrix),
131 CalculateGradientSize<DlConicalGradientColorSource>(stop_count);
132 void* storage = ::operator
new(needed);
134 std::shared_ptr<DlConicalGradientColorSource> ret;
136 start_center, start_radius, end_center, end_radius, stop_count,
137 colors, stops, tile_mode, matrix),
153 CalculateGradientSize<DlConicalGradientColorSource>(stop_count);
155 void* storage = ::operator
new(needed);
157 std::shared_ptr<DlConicalGradientColorSource> ret;
159 start_center, start_radius, end_center, end_radius, stop_count,
160 colors_argb, stops, tile_mode, matrix),
174 size_t needed = CalculateGradientSize<DlSweepGradientColorSource>(stop_count);
175 void* storage = ::operator
new(needed);
177 std::shared_ptr<DlSweepGradientColorSource> ret;
178 ret.reset(
new (storage)
180 colors, stops, tile_mode, matrix),
194 size_t needed = CalculateGradientSize<DlSweepGradientColorSource>(stop_count);
195 void* storage = ::operator
new(needed);
197 std::shared_ptr<DlSweepGradientColorSource> ret;
199 stop_count, colors_argb,
200 stops, tile_mode, matrix),
206 sk_sp<DlRuntimeEffect> runtime_effect,
207 std::vector<std::shared_ptr<DlColorSource>> samplers,
208 std::shared_ptr<std::vector<uint8_t>> uniform_data) {
210 return std::make_shared<DlRuntimeEffectColorSource>(
211 std::move(runtime_effect), std::move(samplers), std::move(uniform_data));
219 stop_count_(stop_count) {}
226 for (uint32_t
i = 0;
i < stop_count_;
i++) {
227 if (my_colors[
i].getAlpha() < 255) {
236 if (mode_ != other_base->mode_ ||
matrix() != other_base->
matrix() ||
237 stop_count_ != other_base->stop_count_) {
241 stop_count_ *
sizeof(
colors()[0])) == 0 &&
243 stop_count_ *
sizeof(
stops()[0])) == 0);
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) {
253 uint32_t stop_count = 0;
254 while (color_data_argb_begin < color_data_argb_end) {
255 *color_storage++ = *color_data_argb_begin++;
258 float* stop_storage =
reinterpret_cast<float*
>(color_storage);
260 memcpy(stop_storage, stop_data, stop_count *
sizeof(*stop_data));
262 float div = stop_count - 1;
266 for (uint32_t
i = 0;
i < stop_count;
i++) {
267 stop_storage[
i] =
i / div;
272class DlScalerToDlColorIterator {
274 explicit DlScalerToDlColorIterator(
const DlScalar* ptr) : ptr_(ptr) {}
275 DlScalerToDlColorIterator(DlScalerToDlColorIterator&&) =
default;
276 DlScalerToDlColorIterator(
const DlScalerToDlColorIterator&) =
delete;
277 DlScalerToDlColorIterator& operator=(
const DlScalerToDlColorIterator&) =
281 return DlColor(ptr_[0], ptr_[1], ptr_[2], ptr_[3],
284 DlScalerToDlColorIterator operator++(
int) {
285 auto result = DlScalerToDlColorIterator(ptr_);
289 bool operator<(
const DlScalerToDlColorIterator& that)
const {
290 return ptr_ < that.ptr_;
301 const float* stop_data) {
302 do_store_color_stops(
pod, color_data, color_data + stop_count_, stop_data);
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);
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 is_opaque() const override
const DlColor * colors() const
const float * stops() const
bool base_equals_(DlGradientColorSourceBase const *other_base) const
virtual const void * pod() const =0
const DlMatrix & matrix() const
FlutterVulkanImage * image
#define FML_DCHECK(condition)
impeller::Scalar DlScalar
static void DlGradientDeleter(void *p)
constexpr Color operator*(T value, const Color &c)
bool operator<(const AXPosition< AXPositionType, AXNodeType > &first, const AXPosition< AXPositionType, AXNodeType > &second)
A 4x4 matrix using column-major storage.