15 #include "flutter/fml/logging.h"
41 Sigma secondary_sigma) {
42 auto blur = std::make_shared<DirectionalGaussianBlurFilterContents>();
43 blur->SetInputs({std::move(input)});
44 blur->SetSigma(sigma);
45 blur->SetDirection(direction);
46 blur->SetBlurStyle(blur_style);
47 blur->SetTileMode(tile_mode);
48 blur->SetIsSecondPass(is_second_pass);
49 blur->SetSecondarySigma(secondary_sigma);
59 constexpr
bool use_new_filter =
60 #ifdef IMPELLER_ENABLE_NEW_GAUSSIAN_FILTER
69 auto blur = std::make_shared<GaussianBlurFilterContents>(
71 blur->SetInputs({input});
98 auto filter = std::make_shared<BorderMaskBlurFilterContents>();
99 filter->SetInputs({std::move(input)});
100 filter->SetSigma(sigma_x, sigma_y);
101 filter->SetBlurStyle(blur_style);
110 auto filter = std::make_shared<DirectionalMorphologyFilterContents>();
111 filter->SetInputs({std::move(input)});
112 filter->SetRadius(radius);
113 filter->SetDirection(direction);
114 filter->SetMorphType(morph_type);
124 Point(1, 0), morph_type);
134 auto filter = std::make_shared<MatrixFilterContents>();
135 filter->SetInputs({std::move(input)});
136 filter->SetMatrix(matrix);
137 filter->SetSamplerDescriptor(desc);
144 auto filter = std::make_shared<LocalMatrixFilterContents>();
145 filter->SetInputs({std::move(input)});
146 filter->SetMatrix(matrix);
151 std::shared_ptr<Texture> y_texture,
152 std::shared_ptr<Texture> uv_texture,
154 auto filter = std::make_shared<impeller::YUVToRGBFilterContents>();
157 filter->SetYUVColorSpace(yuv_color_space);
166 inputs_ = std::move(inputs);
170 effect_transform_ = effect_transform;
172 for (
auto& input : inputs_) {
173 input->SetEffectTransform(effect_transform);
181 if (!filter_coverage.has_value()) {
188 if (!maybe_entity.has_value()) {
191 return maybe_entity->Render(renderer, pass);
194 std::optional<Rect> FilterContents::GetLocalCoverage(
195 const Entity& local_entity)
const {
196 auto coverage = GetFilterCoverage(inputs_, local_entity, effect_transform_);
198 if (coverage_hint.has_value() && coverage.has_value()) {
199 coverage = coverage->Intersection(coverage_hint.value());
206 Entity entity_with_local_transform = entity.
Clone();
209 return GetLocalCoverage(entity_with_local_transform);
213 const std::shared_ptr<LazyGlyphAtlas>& lazy_glyph_atlas,
215 for (
auto& input : inputs_) {
216 input->PopulateGlyphAtlas(lazy_glyph_atlas, scale);
220 std::optional<Rect> FilterContents::GetFilterCoverage(
223 const Matrix& effect_transform)
const {
228 if (inputs_.empty()) {
232 std::optional<Rect> result;
233 for (
const auto& input : inputs) {
234 auto coverage = input->GetCoverage(entity);
235 if (!coverage.has_value()) {
238 if (!result.has_value()) {
242 result = result->Union(coverage.value());
248 const Matrix& effect_transform,
249 const Rect& output_limit)
const {
250 auto filter_input_coverage =
251 GetFilterSourceCoverage(effect_transform_, output_limit);
253 if (!filter_input_coverage.has_value()) {
257 std::optional<Rect> inputs_coverage;
258 for (
const auto& input : inputs_) {
259 auto input_coverage = input->GetSourceCoverage(
260 effect_transform, filter_input_coverage.value());
261 if (!input_coverage.has_value()) {
264 inputs_coverage =
Rect::Union(inputs_coverage, input_coverage.value());
266 return inputs_coverage;
272 const std::optional<Rect>& coverage_hint)
const {
273 Entity entity_with_local_transform = entity.
Clone();
276 auto coverage = GetLocalCoverage(entity_with_local_transform);
277 if (!coverage.has_value() || coverage->IsEmpty()) {
281 return RenderFilter(inputs_, renderer, entity_with_local_transform,
282 effect_transform_, coverage.value(), coverage_hint);
288 std::optional<Rect> coverage_limit,
289 const std::optional<SamplerDescriptor>& sampler_descriptor,
291 const std::string& label)
const {
294 if (std::optional<Entity> result =
295 GetEntity(renderer, entity, coverage_limit);
296 result.has_value()) {
297 return result->GetContents()->RenderToSnapshot(
321 for (
auto& input : inputs_) {
322 if (!input->IsTranslationOnly()) {
330 for (
auto& input : inputs_) {
331 if (!input->IsLeaf()) {
343 for (
auto& input : inputs_) {
344 input->SetLeafInputs(inputs);
349 for (
auto& input : inputs_) {
350 input->SetRenderingMode(rendering_mode);