19 rendering_mode_ = rendering_mode;
24 sampler_descriptor_ = desc;
28 Matrix CalculateSubpassTransform(
const Matrix& snapshot_transform,
29 const Matrix& effect_transform,
34 return snapshot_transform *
39 FML_DCHECK(rendering_mode ==
41 return effect_transform *
43 effect_transform.
Invert() *
49 std::optional<Entity> MatrixFilterContents::RenderFilter(
51 const ContentContext& renderer,
53 const Matrix& effect_transform,
55 const std::optional<Rect>& coverage_hint)
const {
56 auto snapshot = inputs[0]->GetSnapshot(
"Matrix", renderer, entity);
57 if (!snapshot.has_value()) {
61 if (rendering_mode_ ==
92 snapshot->transform = CalculateSubpassTransform(
93 snapshot->transform, effect_transform, matrix_, rendering_mode_);
95 snapshot->transform = entity.GetTransform() *
97 entity.GetTransform().
Invert() *
100 snapshot->sampler_descriptor = sampler_descriptor_;
101 if (!snapshot.has_value()) {
107 std::optional<Rect> MatrixFilterContents::GetFilterSourceCoverage(
108 const Matrix& effect_transform,
109 const Rect& output_limit)
const {
112 effect_transform.
Invert();
117 return output_limit.TransformBounds(inverse);
123 const Matrix& effect_transform)
const {
124 if (inputs.empty()) {
128 std::optional<Rect> coverage = inputs[0]->GetCoverage(entity);
129 if (!coverage.has_value()) {
133 Matrix input_transform = inputs[0]->GetTransform(entity);
134 if (rendering_mode_ ==
140 input_transform, effect_transform, matrix_, rendering_mode_);
146 return coverage->TransformBounds(
transform);
@ kSubpassPrependSnapshotTransform
@ kSubpassAppendSnapshotTransform
static Entity FromSnapshot(const Snapshot &snapshot, BlendMode blend_mode=BlendMode::kSrcOver)
Create an entity that can be used to render a given snapshot.
virtual void SetRenderingMode(Entity::RenderingMode rendering_mode)
Marks this filter chain as applying in a subpass scenario.
std::optional< Rect > GetFilterCoverage(const FilterInput::Vector &inputs, const Entity &entity, const Matrix &effect_transform) const override
Internal utility method for |GetLocalCoverage| that computes the output coverage of this filter acros...
void SetMatrix(Matrix matrix)
~MatrixFilterContents() override
void SetRenderingMode(Entity::RenderingMode rendering_mode) override
Marks this filter chain as applying in a subpass scenario.
void SetSamplerDescriptor(const SamplerDescriptor &desc)
A 4x4 matrix using column-major storage.
constexpr TRect TransformBounds(const Matrix &transform) const
Creates a new bounding box that contains this transformed rectangle.