Skip to content

Commit

Permalink
account for inline placeholders in longest line calculation (flutter#…
Browse files Browse the repository at this point in the history
  • Loading branch information
LongCatIsLooong authored Aug 11, 2020
1 parent 3242a69 commit 9893a29
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 9 deletions.
18 changes: 9 additions & 9 deletions third_party/txt/src/txt/paragraph_txt.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1045,25 +1045,25 @@ void ParagraphTxt::Layout(double width) {
return a.code_units.start < b.code_units.start;
});

double blob_x_pos_start = glyph_positions.front().x_pos.start;
double blob_x_pos_end = run.is_placeholder_run()
? glyph_positions.back().x_pos.start +
run.placeholder_run()->width
: glyph_positions.back().x_pos.end;
line_code_unit_runs.emplace_back(
std::move(code_unit_positions),
Range<size_t>(run.start(), run.end()),
Range<double>(glyph_positions.front().x_pos.start,
run.is_placeholder_run()
? glyph_positions.back().x_pos.start +
run.placeholder_run()->width
: glyph_positions.back().x_pos.end),
line_number, *metrics, run.style(), run.direction(),
run.placeholder_run());
Range<double>(blob_x_pos_start, blob_x_pos_end), line_number,
*metrics, run.style(), run.direction(), run.placeholder_run());

if (run.is_placeholder_run()) {
line_inline_placeholder_code_unit_runs.push_back(
line_code_unit_runs.back());
}

if (!run.is_ghost()) {
min_left_ = std::min(min_left_, glyph_positions.front().x_pos.start);
max_right_ = std::max(max_right_, glyph_positions.back().x_pos.end);
min_left_ = std::min(min_left_, blob_x_pos_start);
max_right_ = std::max(max_right_, blob_x_pos_end);
}
} // for each in glyph_blobs

Expand Down
1 change: 1 addition & 0 deletions third_party/txt/src/txt/paragraph_txt.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ class ParagraphTxt : public Paragraph {
FRIEND_TEST_WINDOWS_DISABLED(ParagraphTest, CenterAlignParagraph);
FRIEND_TEST_WINDOWS_DISABLED(ParagraphTest, JustifyAlignParagraph);
FRIEND_TEST_WINDOWS_DISABLED(ParagraphTest, JustifyRTL);
FRIEND_TEST_WINDOWS_DISABLED(ParagraphTest, InlinePlaceholderLongestLine);
FRIEND_TEST_LINUX_ONLY(ParagraphTest, JustifyRTLNewLine);
FRIEND_TEST(ParagraphTest, DecorationsParagraph);
FRIEND_TEST(ParagraphTest, ItalicsParagraph);
Expand Down
29 changes: 29 additions & 0 deletions third_party/txt/tests/paragraph_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1454,6 +1454,35 @@ TEST_F(ParagraphTest, DISABLE_ON_WINDOWS(InlinePlaceholderGetRectsParagraph)) {
ASSERT_TRUE(Snapshot());
}

TEST_F(ParagraphTest, DISABLE_ON_WINDOWS(InlinePlaceholderLongestLine)) {
txt::ParagraphStyle paragraph_style;
paragraph_style.max_lines = 1;
txt::ParagraphBuilderTxt builder(paragraph_style, GetTestFontCollection());

txt::TextStyle text_style;
text_style.font_families = std::vector<std::string>(1, "Roboto");
text_style.font_size = 26;
text_style.letter_spacing = 1;
text_style.word_spacing = 5;
text_style.color = SK_ColorBLACK;
text_style.height = 1;
text_style.decoration = TextDecoration::kUnderline;
text_style.decoration_color = SK_ColorBLACK;
builder.PushStyle(text_style);

txt::PlaceholderRun placeholder_run(50, 50, PlaceholderAlignment::kBaseline,
TextBaseline::kAlphabetic, 0);
builder.AddPlaceholder(placeholder_run);
builder.Pop();

auto paragraph = BuildParagraph(builder);
paragraph->Layout(GetTestCanvasWidth());

ASSERT_DOUBLE_EQ(paragraph->width_, GetTestCanvasWidth());
ASSERT_TRUE(paragraph->longest_line_ < GetTestCanvasWidth());
ASSERT_TRUE(paragraph->longest_line_ >= 50);
}

#if OS_LINUX
// Tests if manually inserted 0xFFFC characters are replaced to 0xFFFD in order
// to not interfere with the placeholder box layout.
Expand Down

0 comments on commit 9893a29

Please sign in to comment.