Skip to content

Commit 99f3f7a

Browse files
authored
Fix incorrect transformation matrix (flutter#8001)
Previously the transformation matrix returned on semantics nodes was fetched by matrix col,row (incorrectly). This uses the SkMatrix constants instead and adds a test.
1 parent c88b097 commit 99f3f7a

File tree

3 files changed

+35
-15
lines changed

3 files changed

+35
-15
lines changed

shell/platform/embedder/embedder.cc

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -412,12 +412,18 @@ FlutterEngineResult FlutterEngineRun(size_t version,
412412
user_data](blink::SemanticsNodeUpdates update) {
413413
for (const auto& value : update) {
414414
const auto& node = value.second;
415-
const auto& transform = node.transform;
416-
auto flutter_transform = FlutterTransformation{
417-
transform.get(0, 0), transform.get(0, 1), transform.get(0, 2),
418-
transform.get(1, 0), transform.get(1, 1), transform.get(1, 2),
419-
transform.get(2, 0), transform.get(2, 1), transform.get(2, 2)};
420-
const FlutterSemanticsNode embedder_node = {
415+
SkMatrix transform = static_cast<SkMatrix>(node.transform);
416+
FlutterTransformation flutter_transform{
417+
transform.get(SkMatrix::kMScaleX),
418+
transform.get(SkMatrix::kMSkewX),
419+
transform.get(SkMatrix::kMTransX),
420+
transform.get(SkMatrix::kMSkewY),
421+
transform.get(SkMatrix::kMScaleY),
422+
transform.get(SkMatrix::kMTransY),
423+
transform.get(SkMatrix::kMPersp0),
424+
transform.get(SkMatrix::kMPersp1),
425+
transform.get(SkMatrix::kMPersp2)};
426+
const FlutterSemanticsNode embedder_node{
421427
sizeof(FlutterSemanticsNode),
422428
node.id,
423429
static_cast<FlutterSemanticsFlag>(node.flags),

shell/platform/embedder/fixtures/a11y_main.dart

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@ import 'dart:async';
22
import 'dart:typed_data';
33
import 'dart:ui';
44

5-
Float64List kIdentityTransform = () {
5+
Float64List kTestTransform = () {
66
final Float64List values = Float64List(16);
7-
values[0] = 1.0;
8-
values[5] = 1.0;
9-
values[10] = 1.0;
10-
values[15] = 1.0;
7+
values[0] = 1.0; // scaleX
8+
values[4] = 2.0; // skewX
9+
values[12] = 3.0; // transX
10+
values[1] = 4.0; // skewY
11+
values[5] = 5.0; // scaleY
12+
values[13] = 6.0; // transY
13+
values[3] = 7.0; // pers0
14+
values[7] = 8.0; // pers1
15+
values[15] = 9.0; // pers2
1116
return values;
1217
}();
1318

@@ -68,29 +73,29 @@ main() async {
6873
id: 42,
6974
label: 'A: root',
7075
rect: Rect.fromLTRB(0.0, 0.0, 10.0, 10.0),
71-
transform: kIdentityTransform,
76+
transform: kTestTransform,
7277
childrenInTraversalOrder: Int32List.fromList(<int>[84, 96]),
7378
childrenInHitTestOrder: Int32List.fromList(<int>[96, 84]),
7479
)
7580
..updateNode(
7681
id: 84,
7782
label: 'B: leaf',
7883
rect: Rect.fromLTRB(40.0, 40.0, 80.0, 80.0),
79-
transform: kIdentityTransform,
84+
transform: kTestTransform,
8085
)
8186
..updateNode(
8287
id: 96,
8388
label: 'C: branch',
8489
rect: Rect.fromLTRB(40.0, 40.0, 80.0, 80.0),
85-
transform: kIdentityTransform,
90+
transform: kTestTransform,
8691
childrenInTraversalOrder: Int32List.fromList(<int>[128]),
8792
childrenInHitTestOrder: Int32List.fromList(<int>[128]),
8893
)
8994
..updateNode(
9095
id: 128,
9196
label: 'D: leaf',
9297
rect: Rect.fromLTRB(40.0, 40.0, 80.0, 80.0),
93-
transform: kIdentityTransform,
98+
transform: kTestTransform,
9499
additionalActions: Int32List.fromList(<int>[21]),
95100
)
96101
..updateCustomAction(

shell/platform/embedder/tests/embedder_a11y_unittests.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,15 @@ TEST(EmbedderTest, CanLaunchAndShutdownWithValidProjectArgs) {
158158
++node_batch_end_count;
159159
} else {
160160
++node_count;
161+
ASSERT_EQ(1.0, node->transform.scaleX);
162+
ASSERT_EQ(2.0, node->transform.skewX);
163+
ASSERT_EQ(3.0, node->transform.transX);
164+
ASSERT_EQ(4.0, node->transform.skewY);
165+
ASSERT_EQ(5.0, node->transform.scaleY);
166+
ASSERT_EQ(6.0, node->transform.transY);
167+
ASSERT_EQ(7.0, node->transform.pers0);
168+
ASSERT_EQ(8.0, node->transform.pers1);
169+
ASSERT_EQ(9.0, node->transform.pers2);
161170
}
162171
};
163172
int action_count = 0;

0 commit comments

Comments
 (0)