15 #include "flutter/fml/logging.h"
43 auto blur = std::make_shared<GaussianBlurFilterContents>(
44 sigma_x.
sigma, sigma_y.
sigma, tile_mode, mask_blur_style, mask_geometry);
45 blur->SetInputs({input});
54 auto filter = std::make_shared<BorderMaskBlurFilterContents>();
55 filter->SetInputs({std::move(input)});
56 filter->SetSigma(sigma_x, sigma_y);
57 filter->SetBlurStyle(blur_style);
66 auto filter = std::make_shared<DirectionalMorphologyFilterContents>();
67 filter->SetInputs({std::move(input)});
68 filter->SetRadius(radius);
69 filter->SetDirection(direction);
70 filter->SetMorphType(morph_type);
80 Point(1, 0), morph_type);
90 auto filter = std::make_shared<MatrixFilterContents>();
91 filter->SetInputs({std::move(input)});
92 filter->SetMatrix(matrix);
93 filter->SetSamplerDescriptor(desc);
100 auto filter = std::make_shared<LocalMatrixFilterContents>();
101 filter->SetInputs({std::move(input)});
102 filter->SetMatrix(matrix);
107 std::shared_ptr<Texture> y_texture,
108 std::shared_ptr<Texture> uv_texture,
110 auto filter = std::make_shared<impeller::YUVToRGBFilterContents>();
113 filter->SetYUVColorSpace(yuv_color_space);
122 inputs_ = std::move(inputs);
126 effect_transform_ = effect_transform;
128 for (
auto& input : inputs_) {
129 input->SetEffectTransform(effect_transform);
137 if (!filter_coverage.has_value()) {
144 if (!maybe_entity.has_value()) {
148 return maybe_entity->Render(renderer, pass);
151 std::optional<Rect> FilterContents::GetLocalCoverage(
152 const Entity& local_entity)
const {
153 auto coverage = GetFilterCoverage(inputs_, local_entity, effect_transform_);
155 if (coverage_hint.has_value() && coverage.has_value()) {
156 coverage = coverage->Intersection(coverage_hint.value());
163 Entity entity_with_local_transform = entity.
Clone();
166 return GetLocalCoverage(entity_with_local_transform);
169 std::optional<Rect> FilterContents::GetFilterCoverage(
172 const Matrix& effect_transform)
const {
177 if (inputs_.empty()) {
181 std::optional<Rect> result;
182 for (
const auto& input : inputs) {
183 auto coverage = input->GetCoverage(entity);
184 if (!coverage.has_value()) {
187 if (!result.has_value()) {
191 result = result->Union(coverage.value());
197 const Matrix& effect_transform,
198 const Rect& output_limit)
const {
199 auto filter_input_coverage =
200 GetFilterSourceCoverage(effect_transform_, output_limit);
202 if (!filter_input_coverage.has_value()) {
206 std::optional<Rect> inputs_coverage;
207 for (
const auto& input : inputs_) {
208 auto input_coverage = input->GetSourceCoverage(
209 effect_transform, filter_input_coverage.value());
210 if (!input_coverage.has_value()) {
213 inputs_coverage =
Rect::Union(inputs_coverage, input_coverage.value());
215 return inputs_coverage;
221 const std::optional<Rect>& coverage_hint)
const {
222 Entity entity_with_local_transform = entity.
Clone();
225 auto coverage = GetLocalCoverage(entity_with_local_transform);
226 if (!coverage.has_value() || coverage->IsEmpty()) {
230 return RenderFilter(inputs_, renderer, entity_with_local_transform,
231 effect_transform_, coverage.value(), coverage_hint);
237 std::optional<Rect> coverage_limit,
238 const std::optional<SamplerDescriptor>& sampler_descriptor,
241 const std::string& label)
const {
244 if (std::optional<Entity> result =
245 GetEntity(renderer, entity, coverage_limit);
246 result.has_value()) {
247 return result->GetContents()->RenderToSnapshot(
272 for (
auto& input : inputs_) {
273 if (!input->IsTranslationOnly()) {
281 for (
auto& input : inputs_) {
282 if (!input->IsLeaf()) {
294 for (
auto& input : inputs_) {
295 input->SetLeafInputs(inputs);
300 for (
auto& input : inputs_) {
301 input->SetRenderingMode(rendering_mode);