Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 7c5a9d5

Browse files
Use plain Uint32List objects with the fragmenter APIs. (#40239)
Use plain Uint32List objects with the fragmenter APIs.
1 parent 3d545ad commit 7c5a9d5

File tree

3 files changed

+23
-33
lines changed

3 files changed

+23
-33
lines changed

lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,12 +1911,12 @@ extension SkParagraphBuilderExtension on SkParagraphBuilder {
19111911
// into a utf16 string.
19121912
String getText() => utf8.decode(getTextUtf8().codeUnits);
19131913

1914-
external void setWordsUtf8(SkUint32List words);
1915-
external void setWordsUtf16(SkUint32List words);
1916-
external void setGraphemeBreaksUtf8(SkUint32List graphemes);
1917-
external void setGraphemeBreaksUtf16(SkUint32List graphemes);
1918-
external void setLineBreaksUtf8(SkUint32List lineBreaks);
1919-
external void setLineBreaksUtf16(SkUint32List lineBreaks);
1914+
external void setWordsUtf8(Uint32List words);
1915+
external void setWordsUtf16(Uint32List words);
1916+
external void setGraphemeBreaksUtf8(Uint32List graphemes);
1917+
external void setGraphemeBreaksUtf16(Uint32List graphemes);
1918+
external void setLineBreaksUtf8(Uint32List lineBreaks);
1919+
external void setLineBreaksUtf16(Uint32List lineBreaks);
19201920

19211921
external SkParagraph build();
19221922
external void delete();

lib/web_ui/lib/src/engine/canvaskit/text_fragmenter.dart

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ final Map<IntlSegmenterGranularity, DomSegmenter> _intlSegmenters = <IntlSegment
4343
IntlSegmenterGranularity.word: createIntlSegmenter(granularity: 'word'),
4444
};
4545

46-
SkUint32List fragmentUsingIntlSegmenter(
46+
Uint32List fragmentUsingIntlSegmenter(
4747
String text,
4848
IntlSegmenterGranularity granularity,
4949
) {
@@ -55,10 +55,7 @@ SkUint32List fragmentUsingIntlSegmenter(
5555
breaks.add(iterator.current.index);
5656
}
5757
breaks.add(text.length);
58-
59-
final SkUint32List mallocedList = mallocUint32List(breaks.length);
60-
mallocedList.toTypedArray().setAll(0, breaks);
61-
return mallocedList;
58+
return Uint32List.fromList(breaks);
6259
}
6360

6461
// These are the soft/hard line break values expected by Skia's SkParagraph.
@@ -67,13 +64,12 @@ const int _kHardLineBreak = 1;
6764

6865
final DomV8BreakIterator _v8LineBreaker = createV8BreakIterator();
6966

70-
SkUint32List fragmentUsingV8LineBreaker(String text) {
67+
Uint32List fragmentUsingV8LineBreaker(String text) {
7168
final List<LineBreakFragment> fragments =
7269
breakLinesUsingV8BreakIterator(text, _v8LineBreaker);
7370

7471
final int size = (fragments.length + 1) * 2;
75-
final SkUint32List mallocedList = mallocUint32List(size);
76-
final Uint32List typedArray = mallocedList.toTypedArray();
72+
final Uint32List typedArray = Uint32List(size);
7773

7874
typedArray[0] = 0; // start index
7975
typedArray[1] = _kSoftLineBreak; // break type
@@ -87,5 +83,5 @@ SkUint32List fragmentUsingV8LineBreaker(String text) {
8783
: _kSoftLineBreak;
8884
}
8985

90-
return mallocedList;
86+
return typedArray;
9187
}

lib/web_ui/test/canvaskit/text_fragmenter_test.dart

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
import 'dart:typed_data';
6+
57
import 'package:test/bootstrap/browser.dart';
68
import 'package:test/test.dart';
79
import 'package:ui/src/engine.dart';
@@ -15,33 +17,25 @@ void main() {
1517
void testMain() {
1618
setUpCanvasKitTest();
1719

18-
late SkUint32List breaks;
19-
20-
tearDown(() {
21-
if (browserSupportsCanvaskitChromium) {
22-
free(breaks);
23-
}
24-
});
25-
2620
group('$fragmentUsingIntlSegmenter', () {
2721
test('fragments text into words', () {
28-
breaks = fragmentUsingIntlSegmenter(
22+
final Uint32List breaks = fragmentUsingIntlSegmenter(
2923
'Hello world 你好世界',
3024
IntlSegmenterGranularity.word,
3125
);
3226
expect(
33-
breaks.toTypedArray(),
27+
breaks,
3428
orderedEquals(<int>[0, 5, 6, 11, 12, 14, 16]),
3529
);
3630
});
3731

3832
test('fragments multi-line text into words', () {
39-
breaks = fragmentUsingIntlSegmenter(
33+
final Uint32List breaks = fragmentUsingIntlSegmenter(
4034
'Lorem ipsum\ndolor 你好世界 sit\namet',
4135
IntlSegmenterGranularity.word,
4236
);
4337
expect(
44-
breaks.toTypedArray(),
38+
breaks,
4539
orderedEquals(<int>[
4640
0, 5, 6, 11, 12, // "Lorem ipsum\n"
4741
17, 18, 20, 22, 23, 26, 27, // "dolor 你好世界 sit\n"
@@ -53,12 +47,12 @@ void testMain() {
5347
test('fragments text into grapheme clusters', () {
5448
// The smiley emoji has a length of 2.
5549
// The family emoji has a length of 11.
56-
breaks = fragmentUsingIntlSegmenter(
50+
final Uint32List breaks = fragmentUsingIntlSegmenter(
5751
'Lorem🙂ipsum👨‍👩‍👧‍👦',
5852
IntlSegmenterGranularity.grapheme,
5953
);
6054
expect(
61-
breaks.toTypedArray(),
55+
breaks,
6256
orderedEquals(<int>[
6357
0, 1, 2, 3, 4, 5, 7, // "Lorem🙂"
6458
8, 9, 10, 11, 12, 23, // "ipsum👨‍👩‍👧‍👦"
@@ -69,12 +63,12 @@ void testMain() {
6963
test('fragments multi-line text into grapheme clusters', () {
7064
// The smiley emojis have a length of 2 each.
7165
// The family emoji has a length of 11.
72-
breaks = fragmentUsingIntlSegmenter(
66+
final Uint32List breaks = fragmentUsingIntlSegmenter(
7367
'Lorem🙂\nipsum👨‍👩‍👧‍👦dolor\n😄',
7468
IntlSegmenterGranularity.grapheme,
7569
);
7670
expect(
77-
breaks.toTypedArray(),
71+
breaks,
7872
orderedEquals(<int>[
7973
0, 1, 2, 3, 4, 5, 7, 8, // "Lorem🙂\n"
8074
9, 10, 11, 12, 13, 24, // "ipsum👨‍👩‍👧‍👦"
@@ -89,11 +83,11 @@ void testMain() {
8983
const int kHard = 1;
9084

9185
test('fragments text into soft and hard line breaks', () {
92-
breaks = fragmentUsingV8LineBreaker(
86+
final Uint32List breaks = fragmentUsingV8LineBreaker(
9387
'Lorem-ipsum 你好🙂\nDolor sit',
9488
);
9589
expect(
96-
breaks.toTypedArray(),
90+
breaks,
9791
orderedEquals(<int>[
9892
0, kSoft,
9993
6, kSoft, // "Lorem-"

0 commit comments

Comments
 (0)