-
Notifications
You must be signed in to change notification settings - Fork 6k
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
Use preTranslate when applying offset to matrix #21648
Conversation
cc @liyuqian who wrote the original version. |
@knopp : do you happen to also have a sample Flutter app that exhibits the difference before and after this PR? I'm very curious about what triggered you to discover this issue, and I'd like to dive deep to see if there are similar issues in other places (e.g., in PictureLayer). I personally tried the gallery app but couldn't find anything. A sample app would also help us see whether someone could rely on the old behavior which makes this a breaking change. |
@liyuqian, This is related to partial redraw, which is work in progress. The issue here is that if I compute a damage area between last frame and current and then set it as cull-rect in preroll, some layers will be culled out even though they are within damage area due to wrongly calculated screen-space coordinates (as the unit test shows). Given that this only causes issue when doing partial repaint you can't really reproduce it with current engine code. But I also can't imagine how any app would rely on wrong screen-space layer coordinates during pre-roll. There are few other subtle issues that manifest while doing partial repaint related to Backdrop and ImageFilterLayers bounds, but I plan to address them in separate PRs. |
In both cases (opacity and picture layer), these layers use (Actually, opacity uses a mixture of The matrix in the Preroll method is only used for rasterizing layers AFAICT, and since we ignore the translation when we rasterize the layer, it won't affect the resulting image. During paint we then work out where to place the rasterized image and at that point the translation is correct and so we put it in the right position. So, even raster caching wouldn't detect this issue. But, we do integer CTM adjustments on the transforms which might round in different directions if the offset was a fractional pixel, so this could lead to "off by 1" errors in the placement of cached layers? |
Good point with the integer CTM. I think both |
The off by 1 error should be fine as we've already relaxed the constraint in Line 32 in 412e14d
Since this translation only affects the raster cache slightly, I'm ready to approve it. Let's also correct the usage in |
Not entirely sure what you mean. The patch already changes PictureLayer to preTranslate here. Is there something else you have in mind? |
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.
Ah, I missed that file. LGTM!
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.
That's a +1 from me too...
matrix.preTranslate(x,y) is identical to matrix.setConcat(matrix, SkMatrix::Translate(x,y));
717b82f
to
1cfe7db
Compare
* 53d5d68 Add dart-lang/sdk's new package:clock dependency (flutter/engine#22142) * c32e3d8 Roll Skia from 7737a5bd2510 to 5567a6091ceb (8 revisions) (flutter/engine#22146) * 376045c Roll Fuchsia Linux SDK from XYN02FThN... to UKgKCjxSA... (flutter/engine#22147) * 03395de Roll Fuchsia Mac SDK from GKPwGj1Ux... to xHjtLQPQ5... (flutter/engine#22151) * 0c7e952 Manual Dart SDK roll 6e015bd9cddb to 9c6e76468ca4 (6 revisions (flutter/engine#22153) * e5f168a Update constraint to latest integration test (flutter/engine#22169) * e61e8c2 Smooth window resizing on macOS (flutter/engine#21525) * acece00 Allow parse_and_send to use access tokens (flutter/engine#22019) * 0270632 Includes roles for links, checkboxes, and radio buttons in semantics (flutter/engine#22061) * 632354d Roll Fuchsia Linux SDK from UKgKCjxSA... to PY5hNI-wY... (flutter/engine#22175) * 62d50af Add plumbing for command line arguments on Windows (flutter/engine#22094) * 06b0910 Fix possible use of std::moved value in Rasterizer (flutter/engine#22125) * 005dec4 [web] Clean up unused previousStyle logic (flutter/engine#22150) * ca05bdc Roll Skia from 5567a6091ceb to f548a028ce70 (7 revisions) (flutter/engine#22155) * 5b07ac4 Roll Fuchsia Mac SDK from xHjtLQPQ5... to ICK_JlnKJ... (flutter/engine#22188) * d615a97 Roll Fuchsia Linux SDK from PY5hNI-wY... to Usec4YBzR... (flutter/engine#22197) * 11ed711 Invalidate the cached SkParagraph font collection when a new font manager is installed (flutter/engine#22157) * 07c780b [web] Assign default natural width/height for svgs that report 0,0 on firefox and ie11 (flutter/engine#22184) * b54bb88 Migrate runZoned to runZonedGuarded (flutter/engine#22198) * 247139a [web] Fix transform not invalidating path bounds causing debugValidate failure (flutter/engine#22172) * e4dffc1 [web] Fix scroll wheel line delta on Firefox. (flutter/engine#21928) * d6627c6 Reland [ios] Refactor IOSSurface factory and unify surface creation (flutter/engine#22016) * ce1dd11 Standardize macro names for dartdoc macros (flutter/engine#22180) * f81bc37 [profiling] Handle thread_info to account for killed threads (flutter/engine#22170) * fd94c86 Fix for firefox custom clipping (flutter/engine#22182) * 9ccf9f1 bring back build_test to ensure we validate licenses (flutter/engine#22201) * 38f6665 Set strut font to Roboto if the given font hasn't been registered (flutter/engine#22129) * caf32d5 Add a proc table version of embedder API (flutter/engine#21813) * ed0f477 Use preTranslate when applying offset to matrix (flutter/engine#21648) * b457e2d Refactor make_mock_engine into fl_test (flutter/engine#21585) * 28497c8 Fix typos in FlValue docs (flutter/engine#21875) * bb32446 Fix FlTextInputPlugin tear down (flutter/engine#22007) * 7a7804b Add "input shield" to capture pointer input for reinjection (flutter/engine#22067) * fe85f94 Update painting.dart (flutter/engine#22195) * 99cc50d [ios] Surface factory holds the canonical reference to the external view embedder (flutter/engine#22206)
Description
matrix.preTranslate(x,y)
is identical tomatrix.setConcat(matrix, SkMatrix::Translate(x,y))
which is the desired effect.Related Issues
flutter/flutter#33939
Tests
I added the following tests:
OpacityLayerTest.TranslateChildren
Checklist
Before you create this PR confirm that it meets all requirements listed below by checking the relevant checkboxes (
[x]
). This will ensure a smooth and quick review process.Breaking Change
Did any tests fail when you ran them? Please read handling breaking changes.