未验证 提交 dd06cda5 编写于 作者: G Gary Qian 提交者: GitHub

Fix justify for RTL paragraphs. (#9859)

上级 be3e2ed4
......@@ -1047,14 +1047,14 @@ void ParagraphTxt::Layout(double width) {
// advance subtracted, so we do add the advance here to reset the
// run_x_offset. We do keep the record though so GetRectsForRange() can
// find metrics for trailing spaces.
// if (!run.is_ghost() || run.is_rtl()) {
if ((!run.is_ghost() || run.is_rtl()) && !run.is_placeholder_run()) {
run_x_offset += layout.getAdvance();
}
} // for each in line_runs
// Adjust the glyph positions based on the alignment of the line.
double line_x_offset = GetLineXOffset(run_x_offset);
double line_x_offset =
GetLineXOffset(run_x_offset, line_number, line_limit);
if (line_x_offset) {
for (CodeUnitRun& code_unit_run : line_code_unit_runs) {
code_unit_run.Shift(line_x_offset);
......@@ -1174,13 +1174,18 @@ void ParagraphTxt::Layout(double width) {
longest_line_ = max_right_ - min_left_;
}
double ParagraphTxt::GetLineXOffset(double line_total_advance) {
double ParagraphTxt::GetLineXOffset(double line_total_advance,
size_t line_number,
size_t line_limit) {
if (isinf(width_))
return 0;
TextAlign align = paragraph_style_.effective_align();
if (align == TextAlign::right) {
if (align == TextAlign::right ||
(align == TextAlign::justify &&
paragraph_style_.text_direction == TextDirection::rtl &&
line_number == line_limit - 1)) {
return width_ - line_total_advance;
} else if (align == TextAlign::center) {
return (width_ - line_total_advance) / 2;
......
......@@ -362,7 +362,9 @@ class ParagraphTxt : public Paragraph {
// Calculate the starting X offset of a line based on the line's width and
// alignment.
double GetLineXOffset(double line_total_advance);
double GetLineXOffset(double line_total_advance,
size_t line_number,
size_t line_limit);
// Creates and draws the decorations onto the canvas.
void PaintDecorations(SkCanvas* canvas,
......
......@@ -1856,15 +1856,25 @@ TEST_F(ParagraphTest, DISABLE_ON_WINDOWS(JustifyRTL)) {
GetCanvas()->drawRect(boxes[i].rect, paint);
}
ASSERT_EQ(boxes.size(), 5ull);
paint.setColor(SK_ColorBLUE);
boxes = paragraph->GetRectsForRange(240, 250, rect_height_style,
rect_width_style);
for (size_t i = 0; i < boxes.size(); ++i) {
GetCanvas()->drawRect(boxes[i].rect, paint);
}
ASSERT_EQ(boxes.size(), 1ull);
EXPECT_FLOAT_EQ(boxes[0].rect.left(), 588);
EXPECT_FLOAT_EQ(boxes[0].rect.top(), 130);
EXPECT_FLOAT_EQ(boxes[0].rect.right(), 640);
EXPECT_FLOAT_EQ(boxes[0].rect.bottom(), 156);
ASSERT_TRUE(Snapshot());
// All lines except the last should be justified to the width of the
// All lines should be justified to the width of the
// paragraph.
for (size_t i = 0; i < paragraph->glyph_lines_.size() - 1; ++i) {
for (size_t i = 0; i < paragraph->glyph_lines_.size(); ++i) {
ASSERT_EQ(glyph_line_width(i), paragraph_width);
}
ASSERT_NE(glyph_line_width(paragraph->glyph_lines_.size() - 1),
paragraph_width);
}
TEST_F(ParagraphTest, DecorationsParagraph) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册