From 89b7ad486784acb9f63f790375f9d55afcbdee20 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 2 Apr 2024 12:24:35 -0700 Subject: [PATCH] [skwasm] Fix `Paragraph.getLineBoundary` --- .../engine/skwasm/skwasm_impl/paragraph.dart | 19 ++++++++++--------- .../test/ui/paragraph_builder_test.dart | 13 +++++++++++++ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart index 65ed59d83a288..c14ff139fbeef 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart @@ -77,6 +77,9 @@ class SkwasmLineMetrics extends SkwasmObjectWrapper implements u @override int get lineNumber => lineMetricsGetLineNumber(handle); + + int get startIndex => lineMetricsGetStartIndex(handle); + int get endIndex => lineMetricsGetEndIndex(handle); } class SkwasmParagraph extends SkwasmObjectWrapper implements ui.Paragraph { @@ -243,15 +246,13 @@ class SkwasmParagraph extends SkwasmObjectWrapper implements ui.Pa @override ui.TextRange getLineBoundary(ui.TextPosition position) { - final int lineNumber = paragraphGetLineNumberAt(handle, position.offset); - final LineMetricsHandle metricsHandle = - paragraphGetLineMetricsAtIndex(handle, lineNumber); - final ui.TextRange range = ui.TextRange( - start: lineMetricsGetStartIndex(metricsHandle), - end: lineMetricsGetEndIndex(metricsHandle), - ); - lineMetricsDispose(metricsHandle); - return range; + final int offset = position.offset; + for (final SkwasmLineMetrics metrics in computeLineMetrics()) { + if (offset >= metrics.startIndex && offset <= metrics.endIndex) { + return ui.TextRange(start: metrics.startIndex, end: metrics.endIndex); + } + } + return ui.TextRange.empty; } @override diff --git a/lib/web_ui/test/ui/paragraph_builder_test.dart b/lib/web_ui/test/ui/paragraph_builder_test.dart index b83d255b0a2de..187c57b015a2d 100644 --- a/lib/web_ui/test/ui/paragraph_builder_test.dart +++ b/lib/web_ui/test/ui/paragraph_builder_test.dart @@ -59,6 +59,19 @@ Future testMain() async { expect(upstreamWordBoundary, const TextRange(start: 0, end: 5)); }); + test('getLineBoundary at the last character position gives correct results', () { + final ParagraphBuilder builder = ParagraphBuilder(ParagraphStyle()); + builder.addText('hello world'); + + final Paragraph paragraph = builder.build(); + paragraph.layout(const ParagraphConstraints(width: double.infinity)); + + final TextRange lineBoundary = paragraph.getLineBoundary(const TextPosition( + offset: 11, + )); + expect(lineBoundary, const TextRange(start: 0, end: 11)); + }); + test('build and layout a paragraph with an empty addText', () { final ParagraphBuilder builder = ParagraphBuilder(ParagraphStyle()); builder.addText('');