-
Notifications
You must be signed in to change notification settings - Fork 28.6k
[dart:ui] Add Path.addRSuperellipse
#166045
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
It looks like this pull request may not have tests. Please make sure to add tests or get an explicit test exemption before merging. If you are not sure if you need tests, consider this rule of thumb: the purpose of a test is to make sure someone doesn't accidentally revert the fix. Ask yourself, is there anything in your PR that you feel it is important we not accidentally revert back to how it was before your fix? Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing.If you believe this PR qualifies for a test exemption, contact "@test-exemption-reviewer" in the #hackers channel in Discord (don't just cc them here, they won't see it!). The test exemption team is a small volunteer group, so all reviewers should feel empowered to ask for tests, without delegating that responsibility entirely to the test exemption group. |
This pull request has been changed to a draft. The currently pending flutter-gold status will not be able to resolve until a new commit is pushed or the change is marked ready for review again. For more guidance, visit Writing a golden file test for Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rather than having two different recievers, I would do an RSE -> Path conversion during dispatching (always to a skia path).
You could also move the stroke conversion check there.
@jonahwilliams I've made the change and it looks much cleaner. PTAL, thanks! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just a cursory inspection, but I didn't see anything wrong here. Sending review as just a comment review.
Is web UI dealt with? I'm guessing it was modified in the original RSE change?
Yeah I need to handle web_ui (which will probably be notified by the Linux analyze check anyway), but in general the Web is not supporting RSuperellipse for now and falls back to RRect. Edit: Web added. |
I've met an obstacle for this approach: the |
I don't think we should abandon this approach because of that test. @flar can you help adjust the test case? |
Oh, interesting. Is there a reason we encode the path into the DisplayList buffer rather than do that on dispatch? At some point in the future we may not need to generate the path and that state will depend on the backend so doing it in the DisplayList recording process would be premature. |
Actually we no longer need to diverge at the display list level, since I'm now able to convert an impeller path to a skia path at the |
The reason we should do this during recording and not dispatch is to avoid doing repeated work. Any work done during dispatch is repeated on each frame, whereas work done during recording is reused as long as the picture is stable. This optimization is the motivation for changes I'd like the make to DL for #155115 Another example is places where Impeller decides we need to convert a piece of geometry (like a RRect) to a Path. |
@jonahwilliams If we want to do such optimization, shouldn't we implement it to all shapes including all tessellation? |
No, because tessellation itself depends on the exact CTM which isn't known during recording. |
As a workaround for now, the drawRSE could contain a DlPath which will be an empty path for fills and a completed path for strokes at the cost of basically a shared_ptr (the only contents and the size of a DlPath object). |
Roll Flutter from a0b1b3253416 to 02f13c37841f (37 revisions) flutter/flutter@a0b1b32...02f13c3 2025-04-03 [email protected] Roll Packages from 07496eb to 4a36dc6 (3 revisions) (flutter/flutter#166542) 2025-04-03 [email protected] Roll Skia from b67e53719e78 to 5f65df75febd (2 revisions) (flutter/flutter#166538) 2025-04-03 [email protected] Update docs to debug the Android embedder (flutter/flutter#166170) 2025-04-03 [email protected] Roll Dart SDK from 72562ca93bb5 to d174ec16c3ea (1 revision) (flutter/flutter#166525) 2025-04-03 [email protected] [macOS] Implement merged UI and platform thread (flutter/flutter#162883) 2025-04-03 [email protected] Roll Skia from f91412f5d89d to b67e53719e78 (1 revision) (flutter/flutter#166527) 2025-04-03 [email protected] Roll Packages from 125c117 to 07496eb (31 revisions) (flutter/flutter#166457) 2025-04-03 [email protected] Roll Skia from 2be12bc2668b to f91412f5d89d (2 revisions) (flutter/flutter#166517) 2025-04-03 [email protected] Roll Dart SDK from 2a1a13cc3a91 to 72562ca93bb5 (2 revisions) (flutter/flutter#166514) 2025-04-03 [email protected] [native_assets] Roll dependencies (flutter/flutter#166282) 2025-04-03 [email protected] Fix read only TextField focus traversal on macOS (flutter/flutter#166056) 2025-04-03 [email protected] Roll Skia from c106d7831592 to 2be12bc2668b (1 revision) (flutter/flutter#166509) 2025-04-03 [email protected] Roll Fuchsia Linux SDK from v7PGvypiiWLO8PbsZ... to vYisSsIgqw0mqFRVJ... (flutter/flutter#166508) 2025-04-03 [email protected] Roll Dart SDK from b8b4076b1237 to 2a1a13cc3a91 (1 revision) (flutter/flutter#166504) 2025-04-03 [email protected] Roll Skia from 75a0ec473181 to c106d7831592 (1 revision) (flutter/flutter#166499) 2025-04-03 [email protected] Migrate to Theme.brightnessOf method (flutter/flutter#163950) 2025-04-03 [email protected] Fix: Range slider show overlay for both thumbs on hovering one (flutter/flutter#165393) 2025-04-03 [email protected] Deprecate ExpansionTileController (flutter/flutter#166368) 2025-04-03 [email protected] Add styling parameters in `PopupMenuDivider` (flutter/flutter#164790) 2025-04-03 [email protected] Fix ISSUE_TEMPLATE Ordering: `10 < 9`, but `10 > 09` (flutter/flutter#166455) 2025-04-03 [email protected] Skip flaking scheduler test (flutter/flutter#166471) 2025-04-02 [email protected] Roll pub packages (flutter/flutter#166043) 2025-04-02 [email protected] [a11y] add SemanticsValidationResult (flutter/flutter#165935) 2025-04-02 [email protected] Remove unnecessary cache busting mechanism in hot restart (flutter/flutter#166295) 2025-04-02 [email protected] Roll Skia from 52cbb917fffd to 75a0ec473181 (21 revisions) (flutter/flutter#166484) 2025-04-02 [email protected] Started pixel aligning hairlines (flutter/flutter#166351) 2025-04-02 [email protected] Adds semantics role and adjust semantics for navigation bar (flutter/flutter#162467) 2025-04-02 [email protected] Reland "[skwasm] Dynamic Threading" (flutter/flutter#166454) 2025-04-02 [email protected] [dart:ui] Add `Path.addRSuperellipse` (flutter/flutter#166045) 2025-04-02 [email protected] Fix: Hero animation for page transition (flutter/flutter#164469) 2025-04-02 [email protected] Fix: DelegateTransition for cupertino sheet route (flutter/flutter#164675) 2025-04-02 [email protected] Roll Fuchsia Test Scripts from AEdsljKmUiPk92Wvv... to FZdRtNwH7jmADecj6... (flutter/flutter#166383) 2025-04-02 [email protected] [Impeller] cache for text shadows. (flutter/flutter#166228) 2025-04-02 [email protected] Convert `AppPluginLoaderPlugin` to Kotlin, and add `NativePluginLoaderReflectionBridge` to expose it in Kotlin (flutter/flutter#166027) 2025-04-02 [email protected] Roll Dart SDK from 4e1f02bc704f to b8b4076b1237 (7 revisions) (flutter/flutter#166474) 2025-04-02 [email protected] Update Roadmap (flutter/flutter#166332) 2025-04-02 [email protected] Update `CODEOWNERS` (flutter/flutter#166444) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose ...
Roll Flutter from a0b1b3253416 to 02f13c37841f (37 revisions) flutter/flutter@a0b1b32...02f13c3 2025-04-03 [email protected] Roll Packages from d10d5af to 95f8e65 (3 revisions) (flutter/flutter#166542) 2025-04-03 [email protected] Roll Skia from b67e53719e78 to 5f65df75febd (2 revisions) (flutter/flutter#166538) 2025-04-03 [email protected] Update docs to debug the Android embedder (flutter/flutter#166170) 2025-04-03 [email protected] Roll Dart SDK from 72562ca93bb5 to d174ec16c3ea (1 revision) (flutter/flutter#166525) 2025-04-03 [email protected] [macOS] Implement merged UI and platform thread (flutter/flutter#162883) 2025-04-03 [email protected] Roll Skia from f91412f5d89d to b67e53719e78 (1 revision) (flutter/flutter#166527) 2025-04-03 [email protected] Roll Packages from 0d5d57b to d10d5af (31 revisions) (flutter/flutter#166457) 2025-04-03 [email protected] Roll Skia from 2be12bc2668b to f91412f5d89d (2 revisions) (flutter/flutter#166517) 2025-04-03 [email protected] Roll Dart SDK from 2a1a13cc3a91 to 72562ca93bb5 (2 revisions) (flutter/flutter#166514) 2025-04-03 [email protected] [native_assets] Roll dependencies (flutter/flutter#166282) 2025-04-03 [email protected] Fix read only TextField focus traversal on macOS (flutter/flutter#166056) 2025-04-03 [email protected] Roll Skia from c106d7831592 to 2be12bc2668b (1 revision) (flutter/flutter#166509) 2025-04-03 [email protected] Roll Fuchsia Linux SDK from v7PGvypiiWLO8PbsZ... to vYisSsIgqw0mqFRVJ... (flutter/flutter#166508) 2025-04-03 [email protected] Roll Dart SDK from b8b4076b1237 to 2a1a13cc3a91 (1 revision) (flutter/flutter#166504) 2025-04-03 [email protected] Roll Skia from 75a0ec473181 to c106d7831592 (1 revision) (flutter/flutter#166499) 2025-04-03 [email protected] Migrate to Theme.brightnessOf method (flutter/flutter#163950) 2025-04-03 [email protected] Fix: Range slider show overlay for both thumbs on hovering one (flutter/flutter#165393) 2025-04-03 [email protected] Deprecate ExpansionTileController (flutter/flutter#166368) 2025-04-03 [email protected] Add styling parameters in `PopupMenuDivider` (flutter/flutter#164790) 2025-04-03 [email protected] Fix ISSUE_TEMPLATE Ordering: `10 < 9`, but `10 > 09` (flutter/flutter#166455) 2025-04-03 [email protected] Skip flaking scheduler test (flutter/flutter#166471) 2025-04-02 [email protected] Roll pub packages (flutter/flutter#166043) 2025-04-02 [email protected] [a11y] add SemanticsValidationResult (flutter/flutter#165935) 2025-04-02 [email protected] Remove unnecessary cache busting mechanism in hot restart (flutter/flutter#166295) 2025-04-02 [email protected] Roll Skia from 52cbb917fffd to 75a0ec473181 (21 revisions) (flutter/flutter#166484) 2025-04-02 [email protected] Started pixel aligning hairlines (flutter/flutter#166351) 2025-04-02 [email protected] Adds semantics role and adjust semantics for navigation bar (flutter/flutter#162467) 2025-04-02 [email protected] Reland "[skwasm] Dynamic Threading" (flutter/flutter#166454) 2025-04-02 [email protected] [dart:ui] Add `Path.addRSuperellipse` (flutter/flutter#166045) 2025-04-02 [email protected] Fix: Hero animation for page transition (flutter/flutter#164469) 2025-04-02 [email protected] Fix: DelegateTransition for cupertino sheet route (flutter/flutter#164675) 2025-04-02 [email protected] Roll Fuchsia Test Scripts from AEdsljKmUiPk92Wvv... to FZdRtNwH7jmADecj6... (flutter/flutter#166383) 2025-04-02 [email protected] [Impeller] cache for text shadows. (flutter/flutter#166228) 2025-04-02 [email protected] Convert `AppPluginLoaderPlugin` to Kotlin, and add `NativePluginLoaderReflectionBridge` to expose it in Kotlin (flutter/flutter#166027) 2025-04-02 [email protected] Roll Dart SDK from 4e1f02bc704f to b8b4076b1237 (7 revisions) (flutter/flutter#166474) 2025-04-02 [email protected] Update Roadmap (flutter/flutter#166332) 2025-04-02 [email protected] Update `CODEOWNERS` (flutter/flutter#166444) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose ...
This PR adds
Path.addRSuperellipse
todart:ui
. This is needed to implement a parity class toRoundedRectangleBorder
as discussed here.Obsolete description, no longer applicable
I want to reuse the existing algorithm created for impeller stroking. The existing algorithm is moved from `path_builder.cc` to `round_superellipse_param.cc`, and a delegated is added so that the same algorithm can output for different path classes.I'm not 100% sure this is the best way to implement this, but I've tried some methods in vain.
DlPathReceiver
added in [DisplayList] DlPath supports generic path dispatching #164753 sounds like a similar concept as the delegate created in this PR. I tried to use that but not only are the methods private, they're neither in an accessible directory.Path
to a skia path, but it seems that the impeller path isn't designed to be traversed.StrokePathGeometry
and have some ideas but also something uncertain, so I didn't choose this path for now.Pre-launch Checklist
///
).If you need help, consider asking for advice on the #hackers-new channel on Discord.