mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
fixes https://github.com/flutter/flutter/issues/170820 fixes https://github.com/flutter/flutter/issues/177611 This PR snapshots the input of a runtimeeffect if its transform is not identity. This fixes the cases where we use compose with the runtime effect and the inner effect evaluates to a snapshot that doesn't match the size of x, such as`runtime_effect(blur(x))`. Blur will perform at lower resolutions when the sigma is high as an optimization. Blur also adds a halo around what it is blurring. Previously we could optimize away this extra render pass when we assumed that the coverage of inner(x) was the same as x (but potentially just translated), but we can't do that in practice because of things like gaussian blur. In order to make this PR work we had to come up with a way to disable the extra padding that is added to every `RenderToSnapshot`. This is because users want to to reference specific fragments. The extra border of padding would increase the texture size of inner(x) and x which created a jump in the locations calcuated in the fragment shaders when the inner snapshot's transform would jump from identity to non-identity. The only other alternative would be to pass in the offset to the fragment shader but that would be a breaking change. In order to get the shaders rendering in the right orientation on opengles I had to switch the shaders to do a `uv.y = 1.0 - uv.y`. This is in the documentation for ImageFilter.shader but it is an annoying gotcha. Hopefully this doesn't break someone if the logic was different previously for ImageFilter.compose but this is the correct thing to do and since it wasn't tested, there is no breaking change. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md