18 : geometry_(geometry) {}
34 scale_ = 1 / (t1 - t0);
38 colors_ = std::move(colors);
42 stops_ = std::move(stops);
46 tile_mode_ = tile_mode;
61 for (
auto color : colors_) {
62 if (!color.IsOpaque()) {
69#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0]))
70#define UNIFORM_COLORS_INFO(t) \
71 t##GradientUniformFillPipeline::FragmentShader::ColorsInfo
72#define UNIFORM_STOP_PAIRS_INFO(t) \
73 t##GradientUniformFillPipeline::FragmentShader::StopPairsInfo
74#define UNIFORM_COLOR_SIZE ARRAY_LEN(UNIFORM_COLORS_INFO(Sweep)::colors)
75#define UNIFORM_STOP_SIZE ARRAY_LEN(UNIFORM_STOP_PAIRS_INFO(Sweep)::stop_pairs)
87 return RenderSSBO(renderer, entity, pass);
91 return RenderUniform(renderer, entity, pass);
93 return RenderTexture(renderer, entity, pass);
96bool SweepGradientContents::RenderSSBO(
const ContentContext& renderer,
99 using VS = SweepGradientSSBOFillPipeline::VertexShader;
100 using FS = SweepGradientSSBOFillPipeline::FragmentShader;
102 VS::FrameInfo frame_info;
111 return ColorSourceContents::DrawGeometry<VS>(
112 renderer, entity, pass, pipeline_callback, frame_info,
113 [
this, &renderer, &entity](RenderPass& pass) {
114 FS::FragInfo frag_info;
115 frag_info.center = center_;
116 frag_info.bias = bias_;
117 frag_info.scale = scale_;
118 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
119 frag_info.decal_border_color = decal_border_color_;
127 frag_info.colors_length = colors.size();
128 auto color_buffer = data_host_buffer.Emplace(
129 colors.data(), colors.size() *
sizeof(StopData),
133 pass.SetCommandLabel(
"SweepGradientSSBOFill");
137 FS::BindColorData(pass, color_buffer);
143bool SweepGradientContents::RenderUniform(
const ContentContext& renderer,
144 const Entity& entity,
145 RenderPass& pass)
const {
146 using VS = SweepGradientUniformFillPipeline::VertexShader;
147 using FS = SweepGradientUniformFillPipeline::FragmentShader;
149 VS::FrameInfo frame_info;
152 pass, renderer.GetTransientsDataBuffer().EmplaceUniform(frame_info));
155 [&renderer](ContentContextOptions options) {
156 return renderer.GetSweepGradientUniformFillPipeline(options);
158 return ColorSourceContents::DrawGeometry<VS>(
159 renderer, entity, pass, pipeline_callback, frame_info,
160 [
this, &renderer, &entity](RenderPass& pass) {
161 FS::FragInfo frag_info;
162 FS::ColorsInfo colors_info;
163 FS::StopPairsInfo stop_pairs_info;
165 frag_info.center = center_;
166 frag_info.bias = bias_;
167 frag_info.scale = scale_;
168 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
173 colors_, stops_, colors_info.colors, stop_pairs_info.stop_pairs);
175 frag_info.decal_border_color = decal_border_color_;
177 pass.SetCommandLabel(
"SweepGradientUniformFill");
179 auto& transients_buffer = renderer.GetTransientsDataBuffer();
180 FS::BindFragInfo(pass, transients_buffer.EmplaceUniform(frag_info));
181 FS::BindColorsInfo(pass, transients_buffer.EmplaceUniform(colors_info));
182 FS::BindStopPairsInfo(
183 pass, transients_buffer.EmplaceUniform(stop_pairs_info));
189bool SweepGradientContents::RenderTexture(
const ContentContext& renderer,
190 const Entity& entity,
191 RenderPass& pass)
const {
192 using VS = SweepGradientFillPipeline::VertexShader;
193 using FS = SweepGradientFillPipeline::FragmentShader;
196 auto gradient_texture =
198 if (gradient_texture ==
nullptr) {
202 VS::FrameInfo frame_info;
206 [&renderer](ContentContextOptions options) {
207 return renderer.GetSweepGradientFillPipeline(options);
209 return ColorSourceContents::DrawGeometry<VS>(
210 renderer, entity, pass, pipeline_callback, frame_info,
211 [
this, &renderer, &gradient_texture, &entity](RenderPass& pass) {
212 FS::FragInfo frag_info;
213 frag_info.center = center_;
214 frag_info.bias = bias_;
215 frag_info.scale = scale_;
216 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
217 frag_info.decal_border_color = decal_border_color_;
221 frag_info.half_texel =
222 Vector2(0.5 / gradient_texture->GetSize().width,
223 0.5 / gradient_texture->GetSize().height);
225 SamplerDescriptor sampler_desc;
229 pass.SetCommandLabel(
"SweepGradientFill");
232 pass, renderer.GetTransientsDataBuffer().EmplaceUniform(frag_info));
233 FS::BindTextureSampler(
234 pass, gradient_texture,
235 renderer.GetContext()->GetSamplerLibrary()->GetSampler(
244 for (
Color& color : colors_) {
245 color = color_filter_proc(color);
247 decal_border_color_ = color_filter_proc(decal_border_color_);
virtual size_t GetMinimumStorageBufferAlignment() const
The minimum alignment of storage buffer value offsets in bytes.
virtual bool SupportsSSBO() const =0
Whether the context backend supports binding Shader Storage Buffer Objects (SSBOs) to pipelines.
Scalar GetOpacityFactor() const
Get the opacity factor for this color source.
bool AppliesAlphaForStrokeCoverage(const Matrix &transform) const
Whether the entity should be treated as non-opaque due to stroke geometry requiring alpha for coverag...
const Matrix & GetInverseEffectTransform() const
Set the inverted effect transform for this color source.
std::function< PipelineRef(ContentContextOptions)> PipelineBuilderCallback
HostBuffer & GetTransientsDataBuffer() const
Retrieve the current host buffer for transient storage of other non-index data.
const Capabilities & GetDeviceCapabilities() const
PipelineRef GetSweepGradientSSBOFillPipeline(ContentContextOptions opts) const
const Matrix & GetTransform() const
Get the global transform matrix for this Entity.
virtual Scalar ComputeAlphaCoverage(const Matrix &transform) const
BufferView EmplaceUniform(const UniformType &uniform)
Emplace uniform data onto the host buffer. Ensure that backend specific uniform alignment requirement...
Render passes encode render commands directed as one specific render target into an underlying comman...
void SetTileMode(Entity::TileMode tile_mode)
void SetCenterAndAngles(Point center, Degrees start_angle, Degrees end_angle)
bool Render(const ContentContext &renderer, const Entity &entity, RenderPass &pass) const override
bool ApplyColorFilter(const ColorFilterProc &color_filter_proc) override
If possible, applies a color filter to this contents inputs on the CPU.
const Geometry * GetGeometry() const override
Get the geometry that this contents will use to render.
bool IsOpaque(const Matrix &transform) const override
Whether this Contents only emits opaque source colors from the fragment stage. This value does not ac...
const std::vector< Color > & GetColors() const
const std::vector< Scalar > & GetStops() const
~SweepGradientContents() override
void SetStops(std::vector< Scalar > stops)
SweepGradientContents(const Geometry *geometry)
void SetColors(std::vector< Color > colors)
#define UNIFORM_STOP_PAIRS_INFO(t)
#define UNIFORM_STOP_SIZE
#define UNIFORM_COLORS_INFO(t)
#define UNIFORM_COLOR_SIZE
#define FML_DCHECK(condition)
LinePipeline::FragmentShader FS
int PopulateUniformGradientColors(const std::vector< Color > &colors, const std::vector< Scalar > &stops, Vector4 frag_info_colors[kMaxUniformGradientStops], Vector4 frag_info_stop_pairs[kMaxUniformGradientStops/2])
Populate 2 arrays with the colors and stop data for a gradient.
std::function< Color(Color)> ColorFilterProc
std::vector< StopData > CreateGradientColors(const std::vector< Color > &colors, const std::vector< Scalar > &stops)
Populate a vector with the color and stop data for a gradient.
LinePipeline::VertexShader VS
std::shared_ptr< Texture > CreateGradientTexture(const GradientData &gradient_data, const std::shared_ptr< impeller::Context > &context)
Create a host visible texture that contains the gradient defined by the provided gradient data.
GradientData CreateGradientBuffer(const std::vector< Color > &colors, const std::vector< Scalar > &stops)
Populate a vector with the interpolated color bytes for the linear gradient described by colors and s...
static constexpr uint32_t kMaxUniformGradientStops
A 4x4 matrix using column-major storage.