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
Correctly handle transforms in SVG arcTo #13640
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## branch-3.4 #13640 +/- ##
===========================================
Coverage 92.56% 92.56%
===========================================
Files 323 323
Lines 20509 20509
===========================================
Hits 18985 18985
Misses 1524 1524 |
mattpap
approved these changes
Jan 7, 2024
mattpap
pushed a commit
that referenced
this pull request
Jan 7, 2024
mattpap
pushed a commit
that referenced
this pull request
Jan 8, 2024
mattpap
added a commit
that referenced
this pull request
Jan 8, 2024
* Add a regression test for issue #8890 (#13572) * Don't register keyup twice in `AutocompleteInput` (#13577) * Don't register keyup twice in AutocompleteInput * Pin pytest-asyncio to version 0.21.1 * Link sub-coordinate and context dependent ranges in RangesUpdate (#13603) * Fix support for global/local imported stylesheets (#13559) * Compatibility with Chromium 110 * Robustify unit tests involving browser output (#13602) * Multiple density estimate plot (#13527) * added sample data * created density plot * added gallery images and json * sorted import order * clarified plot description * refactored plotting file * changed tick formatting style * deleted unused import * deleted whitespace * additional file refactoring * pyramid example plot (#13596) * added sample data * created plot and added plot description * added gallery image * minor edits * modified plot title * added bar labels to plot * removed whitespace * post-review * changed color palette * added plot image * added extra tick markers * Remove unnecessary arcTo calls in round_rect (#13627) * Update license and copyright statements to 2024 (#13630) * Use `ruff` to ban `typing_extensions` at the top-level (#13633) * Upgrade to ruff 0.1.11 * Enable TID rules and disable TID252 for now * Ban `typing_extensions` module at the top-level * Remove test_no_typing_extensions_common * Import `typing_extensions` under `TYPE_CHECKING` in `*.pyi` * Correctly handle transforms in SVG arcTo (#13640) * ban PIL and other imports with ruff (#13639) * fix indentation in sphinx extentions (#13549) * fix indentation in property mixins (#13514) * fix indentation of default strings with dedent from textwrap * add missing words in property_mixins.py * fix indentation in tools.py * remove dedent block and introduce ALPHA_DEFAULT_HELP and COLOR_DEFAULT_HELP * change order of imports * Restored broken API links (#13528) * restored broken API links * modified broken API path * Allow newer tornado and pandas in test-minimal-deps (#13635) * Add release notes * Update switcher.json * avoid_Sphinx ThemeError and set Sphinx to a minimum of 7.1.0 (#13560) * fix some sphinx warnings (#13609) * fix some sphinx warnings * don't make the first line bold * fix warnings caused by sampledata (#13613) * add forensic glass and emissions to sampledata.rst (#13615) --------- Co-authored-by: Azaya <99359668+Azaya89@users.noreply.github.com> Co-authored-by: Ian Thomas <ianthomas23@gmail.com> Co-authored-by: Bryan Van de Ven <bryan@bokeh.org> Co-authored-by: Moritz Schreiber <68053396+mosc9575@users.noreply.github.com>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #12699.
Rects with rounded corners are currently rendered incorrectly using the SVG output backend. This is due to a bug in
SVGRenderingContext2D.arcTo
which is called once for each rounded corner. The calculations inarcTo
make use of the last rendered point which is in the member variable__currentPosition
and is updated at the beginning and end of every SVG path rendered. The bug is that__currentPosition
is stored after being transformed by the current transform stack (SVGRenderingContext2D._transform
) whereas the arguments toarcTo
are not transformed. Combining transformed and untransformed points can clearly give incorrect results. Up until recently this has not been a problem, but now we are using rects with rounded corners that may be rotated using theangle
property or translated if they are part of a title.The fix is to inverse transform the
__currentPosition
before using it inarcTo
. I have added aninverse()
function toAffineTransform
that is implemented usingDOMMatrix.inverse
so that we don't have to implement our own maths. There are a number of existing visual tests that show this working correctly now. Note that even the unrotated visual image is altered as it now correctly has a half pixel offset that would not have been visible to the typical human eye. I've also added a unit test forAffineTransform.inverse
.Simple demonstration code:
which gives before this PR:
and after: