未验证 提交 1c6eef1b 编写于 作者: J Jason Simmons 提交者: GitHub

libtxt: make minIntrinsicWidth match maxIntrinsicWidth if constraints prevent line wrapping (#4468)

上级 1cc9abb2
...@@ -439,7 +439,7 @@ void Paragraph::Layout(double width, bool force) { ...@@ -439,7 +439,7 @@ void Paragraph::Layout(double width, bool force) {
std::vector<uint16_t> ellipsized_text; std::vector<uint16_t> ellipsized_text;
if (ellipsis.length() && !isinf(width_) && !line_range.hard_break && if (ellipsis.length() && !isinf(width_) && !line_range.hard_break &&
(line_number == line_limit - 1 || (line_number == line_limit - 1 ||
paragraph_style_.max_lines == std::numeric_limits<size_t>::max())) { paragraph_style_.unlimited_lines())) {
float ellipsis_width = layout.measureText( float ellipsis_width = layout.measureText(
reinterpret_cast<const uint16_t*>(ellipsis.data()), 0, reinterpret_cast<const uint16_t*>(ellipsis.data()), 0,
ellipsis.length(), ellipsis.length(), bidiFlags, font, ellipsis.length(), ellipsis.length(), bidiFlags, font,
...@@ -471,7 +471,7 @@ void Paragraph::Layout(double width, bool force) { ...@@ -471,7 +471,7 @@ void Paragraph::Layout(double width, bool force) {
// If there is no line limit, then skip all lines after the ellipsized // If there is no line limit, then skip all lines after the ellipsized
// line. // line.
if (paragraph_style_.max_lines == std::numeric_limits<size_t>::max()) { if (paragraph_style_.unlimited_lines()) {
line_limit = line_number + 1; line_limit = line_number + 1;
did_exceed_max_lines_ = true; did_exceed_max_lines_ = true;
} }
...@@ -666,7 +666,12 @@ void Paragraph::Layout(double width, bool force) { ...@@ -666,7 +666,12 @@ void Paragraph::Layout(double width, bool force) {
for (double line_width : line_widths_) { for (double line_width : line_widths_) {
max_intrinsic_width_ += line_width; max_intrinsic_width_ += line_width;
} }
min_intrinsic_width_ = std::min(max_word_width, max_intrinsic_width_); if (paragraph_style_.max_lines == 1 ||
(paragraph_style_.unlimited_lines() && paragraph_style_.ellipsized())) {
min_intrinsic_width_ = max_intrinsic_width_;
} else {
min_intrinsic_width_ = std::min(max_word_width, max_intrinsic_width_);
}
std::sort(code_unit_runs_.begin(), code_unit_runs_.end(), std::sort(code_unit_runs_.begin(), code_unit_runs_.end(),
[](const CodeUnitRun& a, const CodeUnitRun& b) { [](const CodeUnitRun& a, const CodeUnitRun& b) {
......
...@@ -27,4 +27,12 @@ TextStyle ParagraphStyle::GetTextStyle() const { ...@@ -27,4 +27,12 @@ TextStyle ParagraphStyle::GetTextStyle() const {
return result; return result;
} }
bool ParagraphStyle::unlimited_lines() const {
return max_lines == std::numeric_limits<size_t>::max();
};
bool ParagraphStyle::ellipsized() const {
return !ellipsis.empty();
}
} // namespace txt } // namespace txt
...@@ -61,6 +61,9 @@ class ParagraphStyle { ...@@ -61,6 +61,9 @@ class ParagraphStyle {
minikin::BreakStrategy::kBreakStrategy_Greedy; minikin::BreakStrategy::kBreakStrategy_Greedy;
TextStyle GetTextStyle() const; TextStyle GetTextStyle() const;
bool unlimited_lines() const;
bool ellipsized() const;
}; };
} // namespace txt } // namespace txt
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册