Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_34031325
engine
提交
a3be1ff5
E
engine
项目概览
qq_34031325
/
engine
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
engine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
a3be1ff5
编写于
2月 11, 2019
作者:
J
Jason Simmons
提交者:
GitHub
2月 11, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
libtxt: support justification of RTL text (#7719)
Fixes
https://github.com/flutter/flutter/issues/25567
上级
694300d3
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
76 addition
and
8 deletion
+76
-8
third_party/txt/src/txt/paragraph.cc
third_party/txt/src/txt/paragraph.cc
+28
-8
third_party/txt/src/txt/paragraph.h
third_party/txt/src/txt/paragraph.h
+1
-0
third_party/txt/tests/paragraph_unittests.cc
third_party/txt/tests/paragraph_unittests.cc
+47
-0
未找到文件。
third_party/txt/src/txt/paragraph.cc
浏览文件 @
a3be1ff5
...
...
@@ -534,11 +534,12 @@ void Paragraph::Layout(double width, bool force) {
}
}
// Exclude trailing whitespace from
right and center-justified lines so th
e
//
last visible
character in the line will be flush with the right margin.
// Exclude trailing whitespace from
justified lines so the last visibl
e
// character in the line will be flush with the right margin.
size_t
line_end_index
=
(
paragraph_style_
.
effective_align
()
==
TextAlign
::
right
||
paragraph_style_
.
effective_align
()
==
TextAlign
::
center
)
paragraph_style_
.
effective_align
()
==
TextAlign
::
center
||
paragraph_style_
.
effective_align
()
==
TextAlign
::
justify
)
?
line_range
.
end_excluding_whitespace
:
line_range
.
end
;
...
...
@@ -552,6 +553,14 @@ void Paragraph::Layout(double width, bool force) {
bidi_run
.
direction
(),
bidi_run
.
style
());
}
}
bool
line_runs_all_rtl
=
line_runs
.
size
()
&&
std
::
accumulate
(
line_runs
.
begin
(),
line_runs
.
end
(),
true
,
[](
const
bool
a
,
const
BidiRun
&
b
)
{
return
a
&&
b
.
is_rtl
();
});
if
(
line_runs_all_rtl
)
{
std
::
reverse
(
words
.
begin
(),
words
.
end
());
}
std
::
vector
<
GlyphPosition
>
line_glyph_positions
;
std
::
vector
<
CodeUnitRun
>
line_code_unit_runs
;
...
...
@@ -720,15 +729,26 @@ void Paragraph::Layout(double width, bool force) {
grapheme_code_unit_counts
[
i
]);
}
if
(
word_index
<
words
.
size
()
&&
words
[
word_index
].
start
==
run
.
start
()
+
glyph_code_units
.
start
)
{
bool
at_word_start
=
false
;
bool
at_word_end
=
false
;
if
(
word_index
<
words
.
size
())
{
at_word_start
=
words
[
word_index
].
start
==
run
.
start
()
+
glyph_code_units
.
start
;
at_word_end
=
words
[
word_index
].
end
==
run
.
start
()
+
glyph_code_units
.
end
;
if
(
line_runs_all_rtl
)
{
std
::
swap
(
at_word_start
,
at_word_end
);
}
}
if
(
at_word_start
)
{
word_start_position
=
run_x_offset
+
glyph_x_offset
;
}
if
(
word_index
<
words
.
size
()
&&
words
[
word_index
].
end
==
run
.
start
()
+
glyph_code_units
.
end
)
{
if
(
justify_line
)
if
(
at_word_end
)
{
if
(
justify_line
)
{
justify_x_offset
+=
word_gap_width
;
}
word_index
++
;
if
(
!
isnan
(
word_start_position
))
{
...
...
third_party/txt/src/txt/paragraph.h
浏览文件 @
a3be1ff5
...
...
@@ -212,6 +212,7 @@ class Paragraph {
FRIEND_TEST_WINDOWS_DISABLED
(
ParagraphTest
,
RightAlignParagraph
);
FRIEND_TEST_WINDOWS_DISABLED
(
ParagraphTest
,
CenterAlignParagraph
);
FRIEND_TEST_WINDOWS_DISABLED
(
ParagraphTest
,
JustifyAlignParagraph
);
FRIEND_TEST_WINDOWS_DISABLED
(
ParagraphTest
,
JustifyRTL
);
FRIEND_TEST
(
ParagraphTest
,
DecorationsParagraph
);
FRIEND_TEST
(
ParagraphTest
,
ItalicsParagraph
);
FRIEND_TEST
(
ParagraphTest
,
ChineseParagraph
);
...
...
third_party/txt/tests/paragraph_unittests.cc
浏览文件 @
a3be1ff5
...
...
@@ -669,6 +669,53 @@ TEST_F(ParagraphTest, DISABLE_ON_WINDOWS(JustifyAlignParagraph)) {
ASSERT_TRUE
(
Snapshot
());
}
TEST_F
(
ParagraphTest
,
DISABLE_ON_WINDOWS
(
JustifyRTL
))
{
const
char
*
text
=
"אאא בּבּבּבּ אאאא בּבּ אאא בּבּבּ אאאאא בּבּבּבּ אאאא בּבּבּבּבּ "
"אאאאא בּבּבּבּבּ אאאבּבּבּבּבּבּאאאאא בּבּבּבּבּבּאאאאאבּבּבּבּבּבּ אאאאא בּבּבּבּבּ "
"אאאאא בּבּבּבּבּבּ אאאאא בּבּבּבּבּבּ אאאאא בּבּבּבּבּבּ אאאאא בּבּבּבּבּבּ אאאאא בּבּבּבּבּבּ"
;
auto
icu_text
=
icu
::
UnicodeString
::
fromUTF8
(
text
);
std
::
u16string
u16_text
(
icu_text
.
getBuffer
(),
icu_text
.
getBuffer
()
+
icu_text
.
length
());
txt
::
ParagraphStyle
paragraph_style
;
paragraph_style
.
max_lines
=
14
;
paragraph_style
.
text_align
=
TextAlign
::
justify
;
txt
::
ParagraphBuilder
builder
(
paragraph_style
,
GetTestFontCollection
());
txt
::
TextStyle
text_style
;
text_style
.
font_families
=
std
::
vector
<
std
::
string
>
(
1
,
"Ahem"
);
text_style
.
font_size
=
26
;
text_style
.
color
=
SK_ColorBLACK
;
text_style
.
height
=
1
;
builder
.
PushStyle
(
text_style
);
builder
.
AddText
(
u16_text
);
builder
.
Pop
();
auto
paragraph
=
builder
.
Build
();
size_t
paragraph_width
=
GetTestCanvasWidth
()
-
100
;
paragraph
->
Layout
(
paragraph_width
);
paragraph
->
Paint
(
GetCanvas
(),
0
,
0
);
ASSERT_TRUE
(
Snapshot
());
auto
glyph_line_width
=
[
&
paragraph
](
int
index
)
{
return
paragraph
->
glyph_lines_
[
index
].
positions
.
back
().
x_pos
.
end
;
};
// All lines except the last should be justified to the width of the
// paragraph.
for
(
size_t
i
=
0
;
i
<
paragraph
->
glyph_lines_
.
size
()
-
1
;
++
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
)
{
txt
::
ParagraphStyle
paragraph_style
;
paragraph_style
.
max_lines
=
14
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录