7 #include "flutter/fml/logging.h"
23 start_point_ = start_point;
24 end_point_ = end_point;
28 colors_ = std::move(colors);
32 stops_ = std::move(stops);
44 tile_mode_ = tile_mode;
51 for (
auto color : colors_) {
52 if (!color.IsOpaque()) {
67 return RenderSSBO(renderer, entity, pass);
69 return RenderTexture(renderer, entity, pass);
72 bool LinearGradientContents::RenderTexture(
const ContentContext& renderer,
79 auto gradient_texture =
81 if (gradient_texture ==
nullptr) {
85 FS::FragInfo frag_info;
86 frag_info.start_point = start_point_;
87 frag_info.end_point = end_point_;
88 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
89 frag_info.decal_border_color = decal_border_color_;
90 frag_info.texture_sampler_y_coord_scale = gradient_texture->GetYCoordScale();
92 frag_info.half_texel =
Vector2(0.5 / gradient_texture->GetSize().width,
93 0.5 / gradient_texture->GetSize().height);
95 auto geometry_result =
96 GetGeometry()->GetPositionBuffer(renderer, entity, pass);
98 VS::FrameInfo frame_info;
99 frame_info.mvp = geometry_result.transform;
107 if (geometry_result.prevent_overdraw) {
111 options.primitive_type = geometry_result.type;
114 cmd.BindVertices(geometry_result.vertex_buffer);
116 SamplerDescriptor sampler_desc;
119 FS::BindTextureSampler(
120 cmd, std::move(gradient_texture),
121 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(sampler_desc));
128 if (geometry_result.prevent_overdraw) {
129 auto restore = ClipRestoreContents();
131 return restore.Render(renderer, entity, pass);
136 bool LinearGradientContents::RenderSSBO(
const ContentContext& renderer,
137 const Entity& entity,
138 RenderPass& pass)
const {
142 FS::FragInfo frag_info;
143 frag_info.start_point = start_point_;
144 frag_info.end_point = end_point_;
145 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
146 frag_info.decal_border_color = decal_border_color_;
149 auto& host_buffer = pass.GetTransientsBuffer();
152 frag_info.colors_length = colors.size();
153 frag_info.dither = dither_;
155 host_buffer.Emplace(colors.data(), colors.size() *
sizeof(StopData),
158 VS::FrameInfo frame_info;
160 entity.GetTransformation();
165 cmd.stencil_reference = entity.GetStencilDepth();
167 auto geometry_result =
168 GetGeometry()->GetPositionBuffer(renderer, entity, pass);
170 if (geometry_result.prevent_overdraw) {
174 options.primitive_type = geometry_result.type;
175 cmd.pipeline = renderer.GetLinearGradientSSBOFillPipeline(options);
177 cmd.BindVertices(geometry_result.vertex_buffer);
178 FS::BindFragInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frag_info));
179 FS::BindColorData(cmd, color_buffer);
180 VS::BindFrameInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frame_info));
182 if (!pass.AddCommand(std::move(cmd))) {
186 if (geometry_result.prevent_overdraw) {
187 auto restore = ClipRestoreContents();
189 return restore.Render(renderer, entity, pass);
196 for (
Color& color : colors_) {
197 color = color_filter_proc(color);
199 decal_border_color_ = color_filter_proc(decal_border_color_);