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()) {
64#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0]))
65#define UNIFORM_FRAG_INFO(t) \
66 t##GradientUniformFillPipeline::FragmentShader::FragInfo
67#define UNIFORM_COLOR_SIZE ARRAY_LEN(UNIFORM_FRAG_INFO(Sweep)::colors)
68#define UNIFORM_STOP_SIZE ARRAY_LEN(UNIFORM_FRAG_INFO(Sweep)::stop_pairs)
76 return RenderSSBO(renderer, entity, pass);
80 return RenderUniform(renderer, entity, pass);
82 return RenderTexture(renderer, entity, pass);
85bool SweepGradientContents::RenderSSBO(
const ContentContext& renderer,
88 using VS = SweepGradientSSBOFillPipeline::VertexShader;
89 using FS = SweepGradientSSBOFillPipeline::FragmentShader;
91 VS::FrameInfo frame_info;
100 return ColorSourceContents::DrawGeometry<VS>(
101 renderer, entity, pass, pipeline_callback, frame_info,
102 [
this, &renderer, &entity](RenderPass& pass) {
103 FS::FragInfo frag_info;
104 frag_info.center = center_;
105 frag_info.bias = bias_;
106 frag_info.scale = scale_;
107 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
108 frag_info.decal_border_color = decal_border_color_;
116 frag_info.colors_length = colors.size();
117 auto color_buffer = data_host_buffer.Emplace(
118 colors.data(), colors.size() *
sizeof(StopData),
122 pass.SetCommandLabel(
"SweepGradientSSBOFill");
126 FS::BindColorData(pass, color_buffer);
132bool SweepGradientContents::RenderUniform(
const ContentContext& renderer,
133 const Entity& entity,
134 RenderPass& pass)
const {
135 using VS = SweepGradientUniformFillPipeline::VertexShader;
136 using FS = SweepGradientUniformFillPipeline::FragmentShader;
138 VS::FrameInfo frame_info;
141 pass, renderer.GetTransientsDataBuffer().EmplaceUniform(frame_info));
144 [&renderer](ContentContextOptions options) {
145 return renderer.GetSweepGradientUniformFillPipeline(options);
147 return ColorSourceContents::DrawGeometry<VS>(
148 renderer, entity, pass, pipeline_callback, frame_info,
149 [
this, &renderer, &entity](RenderPass& pass) {
150 FS::FragInfo frag_info;
151 frag_info.center = center_;
152 frag_info.bias = bias_;
153 frag_info.scale = scale_;
154 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
159 colors_, stops_, frag_info.colors, frag_info.stop_pairs);
161 frag_info.decal_border_color = decal_border_color_;
163 pass.SetCommandLabel(
"SweepGradientUniformFill");
166 pass, renderer.GetTransientsDataBuffer().EmplaceUniform(frag_info));
172bool SweepGradientContents::RenderTexture(
const ContentContext& renderer,
173 const Entity& entity,
174 RenderPass& pass)
const {
175 using VS = SweepGradientFillPipeline::VertexShader;
176 using FS = SweepGradientFillPipeline::FragmentShader;
179 auto gradient_texture =
181 if (gradient_texture ==
nullptr) {
185 VS::FrameInfo frame_info;
189 [&renderer](ContentContextOptions options) {
190 return renderer.GetSweepGradientFillPipeline(options);
192 return ColorSourceContents::DrawGeometry<VS>(
193 renderer, entity, pass, pipeline_callback, frame_info,
194 [
this, &renderer, &gradient_texture, &entity](RenderPass& pass) {
195 FS::FragInfo frag_info;
196 frag_info.center = center_;
197 frag_info.bias = bias_;
198 frag_info.scale = scale_;
199 frag_info.texture_sampler_y_coord_scale =
200 gradient_texture->GetYCoordScale();
201 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
202 frag_info.decal_border_color = decal_border_color_;
206 frag_info.half_texel =
207 Vector2(0.5 / gradient_texture->GetSize().width,
208 0.5 / gradient_texture->GetSize().height);
210 SamplerDescriptor sampler_desc;
214 pass.SetCommandLabel(
"SweepGradientFill");
217 pass, renderer.GetTransientsDataBuffer().EmplaceUniform(frag_info));
218 FS::BindTextureSampler(
219 pass, gradient_texture,
220 renderer.GetContext()->GetSamplerLibrary()->GetSampler(
229 for (
Color& color : colors_) {
230 color = color_filter_proc(color);
232 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.
const Geometry * GetGeometry() const
Get the geometry that this contents will use to render.
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.
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)
void SetColors(std::vector< Color > colors)
#define UNIFORM_STOP_SIZE
#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.