7 #include "flutter/fml/logging.h"
29 scale_ = 1 / (t1 - t0);
33 colors_ = std::move(colors);
37 stops_ = std::move(stops);
41 tile_mode_ = tile_mode;
56 for (
auto color : colors_) {
57 if (!color.IsOpaque()) {
68 return RenderSSBO(renderer, entity, pass);
70 return RenderTexture(renderer, entity, pass);
73 bool SweepGradientContents::RenderSSBO(
const ContentContext& renderer,
79 VS::FrameInfo frame_info;
81 VS::BindFrameInfo(pass,
88 return ColorSourceContents::DrawGeometry<VS>(
89 renderer, entity, pass, pipeline_callback, frame_info,
90 [
this, &renderer](RenderPass& pass) {
91 FS::FragInfo frag_info;
92 frag_info.center = center_;
93 frag_info.bias = bias_;
94 frag_info.scale = scale_;
95 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
96 frag_info.decal_border_color = decal_border_color_;
102 frag_info.colors_length = colors.size();
104 host_buffer.Emplace(colors.data(), colors.size() *
sizeof(StopData),
107 pass.SetCommandLabel(
"SweepGradientSSBOFill");
111 FS::BindColorData(pass, color_buffer);
117 bool SweepGradientContents::RenderTexture(
const ContentContext& renderer,
118 const Entity& entity,
119 RenderPass& pass)
const {
124 auto gradient_texture =
126 if (gradient_texture ==
nullptr) {
130 VS::FrameInfo frame_info;
134 [&renderer](ContentContextOptions options) {
135 return renderer.GetSweepGradientFillPipeline(options);
137 return ColorSourceContents::DrawGeometry<VS>(
138 renderer, entity, pass, pipeline_callback, frame_info,
139 [
this, &renderer, &gradient_texture](RenderPass& pass) {
140 FS::FragInfo frag_info;
141 frag_info.center = center_;
142 frag_info.bias = bias_;
143 frag_info.scale = scale_;
144 frag_info.texture_sampler_y_coord_scale =
145 gradient_texture->GetYCoordScale();
146 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
147 frag_info.decal_border_color = decal_border_color_;
149 frag_info.half_texel =
150 Vector2(0.5 / gradient_texture->GetSize().width,
151 0.5 / gradient_texture->GetSize().height);
153 SamplerDescriptor sampler_desc;
157 pass.SetCommandLabel(
"SweepGradientFill");
160 pass, renderer.GetTransientsBuffer().EmplaceUniform(frag_info));
161 FS::BindTextureSampler(
162 pass, gradient_texture,
163 renderer.GetContext()->GetSamplerLibrary()->GetSampler(
172 for (
Color& color : colors_) {
173 color = color_filter_proc(color);
175 decal_border_color_ = color_filter_proc(decal_border_color_);