7 #include "flutter/fml/logging.h"
30 scale_ = 1 / (t1 - t0);
34 colors_ = std::move(colors);
38 stops_ = std::move(stops);
42 tile_mode_ = tile_mode;
61 for (
auto color : colors_) {
62 if (!color.IsOpaque()) {
73 return RenderSSBO(renderer, entity, pass);
75 return RenderTexture(renderer, entity, pass);
78 bool SweepGradientContents::RenderSSBO(
const ContentContext& renderer,
84 FS::FragInfo frag_info;
85 frag_info.center = center_;
86 frag_info.bias = bias_;
87 frag_info.scale = scale_;
88 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
89 frag_info.decal_border_color = decal_border_color_;
91 frag_info.dither = dither_;
96 frag_info.colors_length = colors.size();
98 host_buffer.Emplace(colors.data(), colors.size() *
sizeof(
StopData),
101 VS::FrameInfo frame_info;
109 auto geometry_result =
110 GetGeometry()->GetPositionBuffer(renderer, entity, pass);
113 if (geometry_result.prevent_overdraw) {
117 options.primitive_type = geometry_result.type;
122 FS::BindColorData(cmd, color_buffer);
129 if (geometry_result.prevent_overdraw) {
130 auto restore = ClipRestoreContents();
132 return restore.Render(renderer, entity, pass);
137 bool SweepGradientContents::RenderTexture(
const ContentContext& renderer,
138 const Entity& entity,
139 RenderPass& pass)
const {
144 auto gradient_texture =
146 if (gradient_texture ==
nullptr) {
150 FS::FragInfo frag_info;
151 frag_info.center = center_;
152 frag_info.bias = bias_;
153 frag_info.scale = scale_;
154 frag_info.texture_sampler_y_coord_scale = gradient_texture->GetYCoordScale();
155 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
156 frag_info.decal_border_color = decal_border_color_;
158 frag_info.half_texel =
Vector2(0.5 / gradient_texture->GetSize().width,
159 0.5 / gradient_texture->GetSize().height);
161 auto geometry_result =
162 GetGeometry()->GetPositionBuffer(renderer, entity, pass);
164 VS::FrameInfo frame_info;
165 frame_info.mvp = geometry_result.transform;
170 cmd.stencil_reference = entity.GetStencilDepth();
173 if (geometry_result.prevent_overdraw) {
177 options.primitive_type = geometry_result.type;
178 cmd.pipeline = renderer.GetSweepGradientFillPipeline(options);
180 cmd.BindVertices(geometry_result.vertex_buffer);
181 FS::BindFragInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frag_info));
182 VS::BindFrameInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frame_info));
183 SamplerDescriptor sampler_desc;
186 FS::BindTextureSampler(
187 cmd, gradient_texture,
188 renderer.GetContext()->GetSamplerLibrary()->GetSampler(sampler_desc));
190 if (!pass.AddCommand(std::move(cmd))) {
194 if (geometry_result.prevent_overdraw) {
195 auto restore = ClipRestoreContents();
197 return restore.Render(renderer, entity, pass);
204 for (
Color& color : colors_) {
205 color = color_filter_proc(color);
207 decal_border_color_ = color_filter_proc(decal_border_color_);