Skip to content

[vector_graphics_compiler] Set the m4_10 (Z scale) value to 1 when constructing an AffineMatrix from an SVG matrix #9813

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

Merged
merged 3 commits into from
Aug 15, 2025

Conversation

jason-simmons
Copy link
Member

The 4x4 matrix produced by the SVG matrix() function should have its 10th element set to 1. (see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix)

The SVG matrix parser constructs an AffineMatrix from the SVG input. The AffineMatrix is then converted into a list that is given to Flutter engine APIs.

Before flutter/engine@62cb2c9, the Flutter engine was implicitly overriding the 10th element of the matrix with a 1 value. After that commit, the engine uses the matrix contents as is and does not override any values.

This PR changes the SVG matrix parser to explicitly set the AffineMatrix m4_10 parameter to 1. This reflects the SVG spec and produces output that matches the original engine behavior.

See flutter/flutter#171854

…nstructing an AffineMatrix from an SVG matrix

The 4x4 matrix produced by the SVG matrix() function should have its 10th element set to 1.
(see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix)

The SVG matrix parser constructs an AffineMatrix from the SVG input.  The AffineMatrix is then converted into a list that is given to Flutter engine APIs.

Before flutter/engine@62cb2c9, the Flutter engine was implicitly overriding the 10th element of the matrix with a 1 value.  After that commit, the engine uses the matrix contents as is and does not override any values.

This PR changes the SVG matrix parser to explicitly set the AffineMatrix m4_10 parameter to 1.  This reflects the SVG spec and produces output that matches the original engine behavior.

See flutter/flutter#171854
Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request corrects the SVG matrix() transform parsing by explicitly setting the Z-scale component of the AffineMatrix to 1.0, aligning it with the SVG specification. Previously, it incorrectly defaulted to the X-scale value. The tests are updated to reflect this fix. Since this issue originated from the AffineMatrix constructor's default behavior, it may be beneficial to review other transform parsers in the same file for similar issues.

Copy link
Contributor

@flar flar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

Should we also file a bug against the package that other (implicit?) uses of m4_10 and how it is maintained through various operations are likely suspect as well?

@jason-simmons
Copy link
Member Author

LGTM.

Should we also file a bug against the package that other (implicit?) uses of m4_10 and how it is maintained through various operations are likely suspect as well?

Your understanding of this is better than mine. Can you file an issue in https://github.com/flutter/flutter/issues and tag it with [vector_graphics]?

@flar
Copy link
Contributor

flar commented Aug 15, 2025

Your understanding of this is better than mine. Can you file an issue in https://github.com/flutter/flutter/issues and tag it with [vector_graphics]?

flutter/flutter#173817

@jason-simmons jason-simmons added the autosubmit Merge PR when tree becomes green via auto submit App label Aug 15, 2025
@auto-submit auto-submit bot merged commit 5b08378 into flutter:main Aug 15, 2025
80 checks passed
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Aug 15, 2025
… 1 when constructing an AffineMatrix from an SVG matrix (flutter/packages#9813)
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Aug 15, 2025
… 1 when constructing an AffineMatrix from an SVG matrix (flutter/packages#9813)
github-merge-queue bot pushed a commit to flutter/flutter that referenced this pull request Aug 15, 2025
flutter/packages@09533b7...5c52c55

2025-08-15 stuartmorgan@google.com [video_player] Move Android buffer
updates to Dart (flutter/packages#9771)
2025-08-15 sfprhythnn@gmail.com [webview_flutter] Add support for
payment requests on Android (flutter/packages#9679)
2025-08-15 jason-simmons@users.noreply.github.com
[vector_graphics_compiler] Set the m4_10 (Z scale) value to 1 when
constructing an AffineMatrix from an SVG matrix (flutter/packages#9813)
2025-08-15 magder@google.com [url_launcher_ios] Fix test button text to
work on iOS 26 (flutter/packages#9766)
2025-08-15 stuartmorgan@google.com [video_player] Simplify native iOS
code (flutter/packages#9800)
2025-08-14 stuartmorgan@google.com [image_picker] Add the ability to
pick multiple videos - platform_interface (flutter/packages#9804)

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-flutter-autoroll
Please CC flutter-ecosystem@google.com on the revert to ensure that a
human
is aware of the problem.

To file a bug in Flutter:
https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://issues.skia.org/issues/new?component=1389291&template=1850622

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
CaoGiaHieu-dev added a commit to CaoGiaHieu-dev/packages that referenced this pull request Aug 18, 2025
* main: (24 commits)
  Roll Flutter from 0a2906b81d5e to b3fb4c786d80 (5 revisions) (flutter#9840)
  Update repo for 3.35 stable release (flutter#9816)
  Roll Flutter from 52af7a504025 to 0a2906b81d5e (16 revisions) (flutter#9836)
  [image_picker] Updates min SDK to 3.29 (flutter#9830)
  [image_picker] Add the ability to pick multiple videos (flutter#9775)
  [image_picker] Add the ability to pick multiple videos - platform implementations (flutter#9818)
  [various] Updates min SDK for third_party/packages to 3.29 (flutter#9819)
  [vector_graphics] Updates min SDK to 3.29 (flutter#9820)
  [google_maps_flutter] Updates min SDK to 3.29 (flutter#9821)
  [video_player] Updates min SDK to 3.29 (flutter#9826)
  [shared_preferences] Updates min SDK to 3.29 (flutter#9829)
  [image_picker_ios] Add photo to simulator Photos library during test (flutter#9759)
  [interactive_media_ads] Updates `README` with information about enabling desugaring on Android (flutter#9790)
  [in_app_purchase] Updates min SDK to 3.29 (flutter#9825)
  Roll Flutter from f4334d27934b to 52af7a504025 (29 revisions) (flutter#9832)
  [go_router] Update generated output format (flutter#9817)
  [video_player] Move Android buffer updates to Dart (flutter#9771)
  [webview_flutter] Add support for payment requests on Android (flutter#9679)
  [vector_graphics_compiler] Set the m4_10 (Z scale) value to 1 when constructing an AffineMatrix from an SVG matrix (flutter#9813)
  [url_launcher_ios] Fix test button text to work on iOS 26 (flutter#9766)
  ...

# Conflicts:
#	packages/go_router_builder/CHANGELOG.md
#	packages/go_router_builder/example/lib/all_types.g.dart
#	packages/go_router_builder/example/lib/main.g.dart
#	packages/go_router_builder/example/lib/shell_route_with_keys_example.g.dart
#	packages/go_router_builder/example/lib/shell_route_with_observers_example.g.dart
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
autosubmit Merge PR when tree becomes green via auto submit App p: vector_graphics
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants