7 #include "flutter/fml/logging.h"
29 tile_mode_ = tile_mode;
37 colors_ = std::move(colors);
41 stops_ = std::move(stops);
55 focus_radius_ = radius;
62 return RenderSSBO(renderer, entity, pass);
64 return RenderTexture(renderer, entity, pass);
67 bool ConicalGradientContents::RenderSSBO(
const ContentContext& renderer,
73 FS::FragInfo frag_info;
74 frag_info.center = center_;
75 frag_info.radius = radius_;
76 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
77 frag_info.decal_border_color = decal_border_color_;
79 frag_info.dither = dither_;
81 frag_info.focus = focus_.value();
82 frag_info.focus_radius = focus_radius_;
84 frag_info.focus = center_;
85 frag_info.focus_radius = 0.0;
91 frag_info.colors_length = colors.size();
93 host_buffer.Emplace(colors.data(), colors.size() *
sizeof(StopData),
96 VS::FrameInfo frame_info;
105 auto geometry_result =
106 GetGeometry()->GetPositionBuffer(renderer, entity, pass);
108 if (geometry_result.prevent_overdraw) {
112 options.primitive_type = geometry_result.type;
115 cmd.BindVertices(geometry_result.vertex_buffer);
117 FS::BindColorData(cmd, color_buffer);
124 if (geometry_result.prevent_overdraw) {
125 auto restore = ClipRestoreContents();
127 return restore.Render(renderer, entity, pass);
132 bool ConicalGradientContents::RenderTexture(
const ContentContext& renderer,
133 const Entity& entity,
134 RenderPass& pass)
const {
139 auto gradient_texture =
141 if (gradient_texture ==
nullptr) {
145 FS::FragInfo frag_info;
146 frag_info.center = center_;
147 frag_info.radius = radius_;
148 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
149 frag_info.decal_border_color = decal_border_color_;
150 frag_info.texture_sampler_y_coord_scale = gradient_texture->GetYCoordScale();
152 frag_info.half_texel =
Vector2(0.5 / gradient_texture->GetSize().width,
153 0.5 / gradient_texture->GetSize().height);
155 frag_info.focus = focus_.value();
156 frag_info.focus_radius = focus_radius_;
158 frag_info.focus = center_;
159 frag_info.focus_radius = 0.0;
162 auto geometry_result =
163 GetGeometry()->GetPositionBuffer(renderer, entity, pass);
165 VS::FrameInfo frame_info;
166 frame_info.mvp = geometry_result.transform;
171 cmd.stencil_reference = entity.GetStencilDepth();
174 if (geometry_result.prevent_overdraw) {
178 options.primitive_type = geometry_result.type;
179 cmd.pipeline = renderer.GetConicalGradientFillPipeline(options);
181 cmd.BindVertices(geometry_result.vertex_buffer);
182 FS::BindFragInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frag_info));
183 SamplerDescriptor sampler_desc;
186 FS::BindTextureSampler(
187 cmd, gradient_texture,
188 renderer.GetContext()->GetSamplerLibrary()->GetSampler(sampler_desc));
189 VS::BindFrameInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frame_info));
191 if (!pass.AddCommand(std::move(cmd))) {
195 if (geometry_result.prevent_overdraw) {
196 auto restore = ClipRestoreContents();
198 return restore.Render(renderer, entity, pass);
205 for (
Color& color : colors_) {
206 color = color_filter_proc(color);
208 decal_border_color_ = color_filter_proc(decal_border_color_);