Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions ci/licenses_golden/licenses_flutter
Original file line number Diff line number Diff line change
Expand Up @@ -354,13 +354,11 @@ FILE: ../../../flutter/lib/ui/text/asset_manager_font_provider.cc
FILE: ../../../flutter/lib/ui/text/asset_manager_font_provider.h
FILE: ../../../flutter/lib/ui/text/font_collection.cc
FILE: ../../../flutter/lib/ui/text/font_collection.h
FILE: ../../../flutter/lib/ui/text/line_metrics.cc
FILE: ../../../flutter/lib/ui/text/line_metrics.h
FILE: ../../../flutter/lib/ui/text/paragraph.cc
FILE: ../../../flutter/lib/ui/text/paragraph.h
FILE: ../../../flutter/lib/ui/text/paragraph_builder.cc
FILE: ../../../flutter/lib/ui/text/paragraph_builder.h
FILE: ../../../flutter/lib/ui/text/text_box.cc
FILE: ../../../flutter/lib/ui/text/text_box.h
FILE: ../../../flutter/lib/ui/ui.dart
FILE: ../../../flutter/lib/ui/ui_dart_state.cc
Expand Down
2 changes: 0 additions & 2 deletions lib/ui/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,11 @@ source_set("ui") {
"text/asset_manager_font_provider.h",
"text/font_collection.cc",
"text/font_collection.h",
"text/line_metrics.cc",
"text/line_metrics.h",
"text/paragraph.cc",
"text/paragraph.h",
"text/paragraph_builder.cc",
"text/paragraph_builder.h",
"text/text_box.cc",
"text/text_box.h",
"ui_dart_state.cc",
"ui_dart_state.h",
Expand Down
76 changes: 47 additions & 29 deletions lib/ui/text.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1306,16 +1306,6 @@ class TextBox {
this.direction,
);

@pragma('vm:entry-point')
// ignore: unused_element
TextBox._(
this.left,
this.top,
this.right,
this.bottom,
int directionIndex,
) : direction = TextDirection.values[directionIndex];

/// The left edge of the text box, irrespective of direction.
///
/// To get the leading edge (which may depend on the [direction]), consider [start].
Expand Down Expand Up @@ -1764,20 +1754,6 @@ class LineMetrics {
this.lineNumber,
});

@pragma('vm:entry-point')
// ignore: unused_element
LineMetrics._(
this.hardBreak,
this.ascent,
this.descent,
this.unscaledAscent,
this.height,
this.width,
this.left,
this.baseline,
this.lineNumber,
);

/// True if this line ends with an explicit line break (e.g. '\n') or is the end
/// of the paragraph. False otherwise.
final bool hardBreak;
Expand Down Expand Up @@ -1914,6 +1890,20 @@ class Paragraph extends NativeFieldWrapperClass2 {
void layout(ParagraphConstraints constraints) => _layout(constraints.width);
void _layout(double width) native 'Paragraph_layout';

List<TextBox> _decodeTextBoxes(Float32List encoded) {
final List<TextBox> boxes = List<TextBox>(encoded[0].toInt());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The count of text boxes is redundant with the length of the encoded Float32List

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done

for (int index = 0; index < boxes.length; index += 1) {
final int position = (index * 5) + 1;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Avoid the cost of the multiply by advancing the index by 5 on each iteration

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done

boxes[index] = TextBox.fromLTRBD(
encoded[position + 0],
encoded[position + 1],
encoded[position + 2],
encoded[position + 3],
TextDirection.values[encoded[position + 4].toInt()],
);
}
return boxes;
}
/// Returns a list of text boxes that enclose the given text range.
///
/// The [boxHeightStyle] and [boxWidthStyle] parameters allow customization
Expand All @@ -1930,17 +1920,21 @@ class Paragraph extends NativeFieldWrapperClass2 {
List<TextBox> getBoxesForRange(int start, int end, {BoxHeightStyle boxHeightStyle = BoxHeightStyle.tight, BoxWidthStyle boxWidthStyle = BoxWidthStyle.tight}) {
assert(boxHeightStyle != null);
assert(boxWidthStyle != null);
return _getBoxesForRange(start, end, boxHeightStyle.index, boxWidthStyle.index);
return _decodeTextBoxes(_getBoxesForRange(start, end, boxHeightStyle.index, boxWidthStyle.index));
}
List<TextBox> _getBoxesForRange(int start, int end, int boxHeightStyle, int boxWidthStyle) native 'Paragraph_getRectsForRange';
// See paragraph.cc for the layout of this return value.
Float32List _getBoxesForRange(int start, int end, int boxHeightStyle, int boxWidthStyle) native 'Paragraph_getRectsForRange';

/// Returns a list of text boxes that enclose all placeholders in the paragraph.
///
/// The order of the boxes are in the same order as passed in through [addPlaceholder].
///
/// Coordinates of the [TextBox] are relative to the upper-left corner of the paragraph,
/// where positive y values indicate down.
List<TextBox> getBoxesForPlaceholders() native 'Paragraph_getRectsForPlaceholders';
List<TextBox> getBoxesForPlaceholders() {
return _decodeTextBoxes(_getBoxesForPlaceholders());
}
Float32List _getBoxesForPlaceholders() native 'Paragraph_getRectsForPlaceholders';

/// Returns the text position closest to the given offset.
TextPosition getPositionForOffset(Offset offset) {
Expand Down Expand Up @@ -1987,7 +1981,26 @@ class Paragraph extends NativeFieldWrapperClass2 {
///
/// This can potentially return a large amount of data, so it is not recommended
/// to repeatedly call this. Instead, cache the results.
List<LineMetrics> computeLineMetrics() native 'Paragraph_computeLineMetrics';
List<LineMetrics> computeLineMetrics() {
final Float64List encoded = _computeLineMetrics();
final List<LineMetrics> metrics = List<LineMetrics>(encoded[0].toInt());
for (int index = 0; index < metrics.length; index += 1) {
final int position = (index * 5) + 1;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Advance the position by 9 instead of 5 for LineMetrics

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done, and added some tests that didn't exist that would have caught this.

metrics[index] = LineMetrics(
hardBreak: encoded[position + 0] != 0,
ascent: encoded[position + 1],
descent: encoded[position + 2],
unscaledAscent: encoded[position + 3],
height: encoded[position + 4],
width: encoded[position + 5],
left: encoded[position + 6],
baseline: encoded[position + 7],
lineNumber: encoded[position + 8].toInt(),
);
}
return metrics;
}
Float64List _computeLineMetrics() native 'Paragraph_computeLineMetrics';
}

/// Builds a [Paragraph] containing text with the given styling information.
Expand Down Expand Up @@ -2195,7 +2208,12 @@ class ParagraphBuilder extends NativeFieldWrapperClass2 {
///
/// After calling this function, the paragraph builder object is invalid and
/// cannot be used further.
Paragraph build() native 'ParagraphBuilder_build';
Paragraph build() {
final Paragraph paragraph = Paragraph._();
_build(paragraph);
return paragraph;
}
void _build(Paragraph outParagraph) native 'ParagraphBuilder_build';
}

/// Loads a font from a buffer and makes it available for rendering text.
Expand Down
48 changes: 0 additions & 48 deletions lib/ui/text/line_metrics.cc

This file was deleted.

13 changes: 0 additions & 13 deletions lib/ui/text/line_metrics.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,17 +59,4 @@ struct LineMetrics {

} // namespace flutter

namespace tonic {
template <>
struct DartConverter<flutter::LineMetrics> {
static Dart_Handle ToDart(const flutter::LineMetrics& val);
};

template <>
struct DartListFactory<flutter::LineMetrics> {
static Dart_Handle NewList(intptr_t length);
};

} // namespace tonic

#endif // FLUTTER_LIB_UI_TEXT_LINE_METRICS_H_
76 changes: 55 additions & 21 deletions lib/ui/text/paragraph.cc
Original file line number Diff line number Diff line change
Expand Up @@ -94,28 +94,42 @@ void Paragraph::paint(Canvas* canvas, double x, double y) {
m_paragraph->Paint(sk_canvas, x, y);
}

std::vector<TextBox> Paragraph::getRectsForRange(unsigned start,
unsigned end,
unsigned boxHeightStyle,
unsigned boxWidthStyle) {
std::vector<TextBox> result;
static tonic::Float32List EncodeTextBoxes(
const std::vector<txt::Paragraph::TextBox>& boxes) {
// Layout:
// First value is the number of values.
// Then there are boxes.size() groups of 5 which are LTRBD, where D is the
// text direction index.
auto count = boxes.size() * 5;
tonic::Float32List result(
Dart_NewTypedData(Dart_TypedData_kFloat32, 1 + count));
result[0] = count;
for (unsigned long i = 0; i < boxes.size(); i++) {
auto position = (i * 5) + 1;
const txt::Paragraph::TextBox& box = boxes[i];
result[position + 0] = box.rect.fLeft;
result[position + 1] = box.rect.fTop;
result[position + 2] = box.rect.fRight;
result[position + 3] = box.rect.fBottom;
result[position + 4] = static_cast<float>(box.direction);
}
return result;
}

tonic::Float32List Paragraph::getRectsForRange(unsigned start,
unsigned end,
unsigned boxHeightStyle,
unsigned boxWidthStyle) {
std::vector<txt::Paragraph::TextBox> boxes = m_paragraph->GetRectsForRange(
start, end, static_cast<txt::Paragraph::RectHeightStyle>(boxHeightStyle),
static_cast<txt::Paragraph::RectWidthStyle>(boxWidthStyle));
for (const txt::Paragraph::TextBox& box : boxes) {
result.emplace_back(box.rect, static_cast<TextDirection>(box.direction));
}
return result;
return EncodeTextBoxes(boxes);
}

std::vector<TextBox> Paragraph::getRectsForPlaceholders() {
std::vector<TextBox> result;
tonic::Float32List Paragraph::getRectsForPlaceholders() {
std::vector<txt::Paragraph::TextBox> boxes =
m_paragraph->GetRectsForPlaceholders();
for (const txt::Paragraph::TextBox& box : boxes) {
result.emplace_back(box.rect, static_cast<TextDirection>(box.direction));
}
return result;
return EncodeTextBoxes(boxes);
}

Dart_Handle Paragraph::getPositionForOffset(double dx, double dy) {
Expand Down Expand Up @@ -152,14 +166,34 @@ Dart_Handle Paragraph::getLineBoundary(unsigned offset) {
return result;
}

std::vector<LineMetrics> Paragraph::computeLineMetrics() {
std::vector<LineMetrics> result;
tonic::Float64List Paragraph::computeLineMetrics() {
std::vector<txt::LineMetrics> metrics = m_paragraph->GetLineMetrics();
for (txt::LineMetrics& line : metrics) {
result.emplace_back(&line.hard_break, &line.ascent, &line.descent,
&line.unscaled_ascent, &line.height, &line.width,
&line.left, &line.baseline, &line.line_number);

// Layout:
// First value is the number of values.
// Then there are boxes.size() groups of 9 which are the line metrics
// properties
auto count = metrics.size() * 9;
tonic::Float64List result(
Dart_NewTypedData(Dart_TypedData_kFloat64, 1 + count));
result[0] = count;
for (unsigned long i = 0; i < metrics.size(); i++) {
auto position = (i * 9) + 1;
const txt::LineMetrics& line = metrics[i];
result[position + 0] = static_cast<float>(line.hard_break);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

cast this to double to match the type of result

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done

result[position + 1] = line.ascent;
result[position + 2] = line.descent;
result[position + 3] = line.unscaled_ascent;
// We add then round to get the height. The
// definition of height here is different
// than the one in LibTxt.
result[position + 4] = round(line.ascent + line.descent);
result[position + 5] = line.width;
result[position + 6] = line.left;
result[position + 7] = line.baseline;
result[position + 8] = static_cast<double>(line.line_number);
}

return result;
}

Expand Down
19 changes: 10 additions & 9 deletions lib/ui/text/paragraph.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,10 @@ class Paragraph : public RefCountedDartWrappable<Paragraph> {
FML_FRIEND_MAKE_REF_COUNTED(Paragraph);

public:
static fml::RefPtr<Paragraph> Create(
std::unique_ptr<txt::Paragraph> paragraph) {
return fml::MakeRefCounted<Paragraph>(std::move(paragraph));
static void Create(Dart_Handle paragraph_handle,
std::unique_ptr<txt::Paragraph> txt_paragraph) {
auto paragraph = fml::MakeRefCounted<Paragraph>(std::move(txt_paragraph));
paragraph->AssociateWithDartWrapper(paragraph_handle);
}

~Paragraph() override;
Expand All @@ -42,15 +43,15 @@ class Paragraph : public RefCountedDartWrappable<Paragraph> {
void layout(double width);
void paint(Canvas* canvas, double x, double y);

std::vector<TextBox> getRectsForRange(unsigned start,
unsigned end,
unsigned boxHeightStyle,
unsigned boxWidthStyle);
std::vector<TextBox> getRectsForPlaceholders();
tonic::Float32List getRectsForRange(unsigned start,
unsigned end,
unsigned boxHeightStyle,
unsigned boxWidthStyle);
tonic::Float32List getRectsForPlaceholders();
Dart_Handle getPositionForOffset(double dx, double dy);
Dart_Handle getWordBoundary(unsigned offset);
Dart_Handle getLineBoundary(unsigned offset);
std::vector<LineMetrics> computeLineMetrics();
tonic::Float64List computeLineMetrics();

size_t GetAllocationSize() override;

Expand Down
4 changes: 2 additions & 2 deletions lib/ui/text/paragraph_builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -493,8 +493,8 @@ Dart_Handle ParagraphBuilder::addPlaceholder(double width,
return Dart_Null();
}

fml::RefPtr<Paragraph> ParagraphBuilder::build() {
return Paragraph::Create(m_paragraphBuilder->Build());
void ParagraphBuilder::build(Dart_Handle paragraph_handle) {
Paragraph::Create(paragraph_handle, m_paragraphBuilder->Build());
}

} // namespace flutter
2 changes: 1 addition & 1 deletion lib/ui/text/paragraph_builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class ParagraphBuilder : public RefCountedDartWrappable<ParagraphBuilder> {
double baseline_offset,
unsigned baseline);

fml::RefPtr<Paragraph> build();
void build(Dart_Handle paragraph_handle);

static void RegisterNatives(tonic::DartLibraryNatives* natives);

Expand Down
Loading