15 #include "flutter/fml/logging.h"
42 const std::shared_ptr<Geometry>& mask_geometry) {
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);
170 const std::shared_ptr<LazyGlyphAtlas>& lazy_glyph_atlas,
172 for (
auto& input : inputs_) {
173 input->PopulateGlyphAtlas(lazy_glyph_atlas,
scale);
177 std::optional<Rect> FilterContents::GetFilterCoverage(
180 const Matrix& effect_transform)
const {
185 if (inputs_.empty()) {
189 std::optional<Rect> result;
190 for (
const auto& input : inputs) {
191 auto coverage = input->GetCoverage(entity);
192 if (!coverage.has_value()) {
195 if (!result.has_value()) {
199 result = result->Union(coverage.value());
205 const Matrix& effect_transform,
206 const Rect& output_limit)
const {
207 auto filter_input_coverage =
208 GetFilterSourceCoverage(effect_transform_, output_limit);
210 if (!filter_input_coverage.has_value()) {
214 std::optional<Rect> inputs_coverage;
215 for (
const auto& input : inputs_) {
216 auto input_coverage = input->GetSourceCoverage(
217 effect_transform, filter_input_coverage.value());
218 if (!input_coverage.has_value()) {
221 inputs_coverage =
Rect::Union(inputs_coverage, input_coverage.value());
223 return inputs_coverage;
229 const std::optional<Rect>& coverage_hint)
const {
230 Entity entity_with_local_transform = entity.
Clone();
233 auto coverage = GetLocalCoverage(entity_with_local_transform);
234 if (!coverage.has_value() || coverage->IsEmpty()) {
238 return RenderFilter(inputs_, renderer, entity_with_local_transform,
239 effect_transform_, coverage.value(), coverage_hint);
245 std::optional<Rect> coverage_limit,
246 const std::optional<SamplerDescriptor>& sampler_descriptor,
249 const std::string& label)
const {
252 if (std::optional<Entity> result =
253 GetEntity(renderer, entity, coverage_limit);
254 result.has_value()) {
255 return result->GetContents()->RenderToSnapshot(
280 for (
auto& input : inputs_) {
281 if (!input->IsTranslationOnly()) {
289 for (
auto& input : inputs_) {
290 if (!input->IsLeaf()) {
302 for (
auto& input : inputs_) {
303 input->SetLeafInputs(inputs);
308 for (
auto& input : inputs_) {
309 input->SetRenderingMode(rendering_mode);