Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
815cde9f
T
Third Party Harfbuzz
项目概览
OpenHarmony
/
Third Party Harfbuzz
接近 2 年 前同步成功
通知
1
Star
18
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Harfbuzz
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
815cde9f
编写于
1月 07, 2019
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[iter] Use is_sorted_iterator
上级
ed433668
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
66 addition
and
53 deletion
+66
-53
src/hb-aat-map.hh
src/hb-aat-map.hh
+1
-1
src/hb-array.hh
src/hb-array.hh
+4
-0
src/hb-meta.hh
src/hb-meta.hh
+13
-10
src/hb-ot-layout-common.hh
src/hb-ot-layout-common.hh
+4
-4
src/hb-ot-layout-gsub-table.hh
src/hb-ot-layout-gsub-table.hh
+21
-21
src/hb-ot-map.hh
src/hb-ot-map.hh
+1
-1
src/hb-ot-shape-complex-arabic-fallback.hh
src/hb-ot-shape-complex-arabic-fallback.hh
+2
-2
src/hb-set.hh
src/hb-set.hh
+1
-1
src/hb-vector.hh
src/hb-vector.hh
+19
-13
未找到文件。
src/hb-aat-map.hh
浏览文件 @
815cde9f
...
...
@@ -84,7 +84,7 @@ struct hb_aat_map_builder_t
hb_face_t
*
face
;
public:
hb_vector_t
<
feature_info_t
>
features
;
hb_
sorted_
vector_t
<
feature_info_t
>
features
;
};
...
...
src/hb-array.hh
浏览文件 @
815cde9f
...
...
@@ -46,6 +46,8 @@ struct hb_array_t :
*/
hb_array_t
()
:
arrayZ
(
nullptr
),
length
(
0
)
{}
hb_array_t
(
Type
*
array_
,
unsigned
int
length_
)
:
arrayZ
(
array_
),
length
(
length_
)
{}
hb_array_t
(
const
hb_array_t
<
hb_remove_const
(
Type
)
>
&
o
)
:
arrayZ
(
o
.
arrayZ
),
length
(
o
.
length
)
{}
hb_array_t
(
const
hb_array_t
<
const
Type
>
&
o
)
:
arrayZ
(
o
.
arrayZ
),
length
(
o
.
length
)
{}
template
<
unsigned
int
length_
>
hb_array_t
(
Type
(
&
array_
)[
length_
])
:
arrayZ
(
array_
),
length
(
length_
)
{}
...
...
@@ -203,6 +205,8 @@ struct hb_sorted_array_t :
hb_sorted_array_t
()
:
hb_array_t
<
Type
>
()
{}
hb_sorted_array_t
(
const
hb_array_t
<
Type
>
&
o
)
:
hb_array_t
<
Type
>
(
o
)
{}
hb_sorted_array_t
(
const
hb_sorted_array_t
<
hb_remove_const
(
Type
)
>
&
o
)
:
hb_array_t
<
Type
>
(
o
)
{}
hb_sorted_array_t
(
const
hb_sorted_array_t
<
const
Type
>
&
o
)
:
hb_array_t
<
Type
>
(
o
)
{}
hb_sorted_array_t
(
Type
*
array_
,
unsigned
int
length_
)
:
hb_array_t
<
Type
>
(
array_
,
length_
)
{}
template
<
unsigned
int
length_
>
hb_sorted_array_t
(
Type
(
&
array_
)[
length_
])
:
hb_array_t
<
Type
>
(
array_
)
{}
...
...
src/hb-meta.hh
浏览文件 @
815cde9f
...
...
@@ -37,15 +37,18 @@
template
<
typename
T
>
static
inline
T
hb_declval
();
template
<
typename
T
>
struct
hb_remove_const
{
typedef
T
value
;
};
template
<
typename
T
>
struct
hb_remove_const
<
const
T
>
{
typedef
T
value
;
};
#define hb_remove_const(T) typename hb_remove_const<T>::value
template
<
typename
T
>
struct
hb_remove_reference
{
typedef
T
value
;
};
template
<
typename
T
>
struct
hb_remove_reference
<
T
&>
{
typedef
T
value
;
};
#define hb_remove_reference(T) typename hb_remove_reference<T>::value
template
<
typename
T
>
struct
hb_remove_pointer
{
typedef
T
value
;
};
template
<
typename
T
>
struct
hb_remove_pointer
<
T
*>
{
typedef
T
value
;
};
#define hb_remove_pointer(T) typename hb_remove_pointer<T>::value
template
<
typename
T
>
struct
hb_match_const
{
typedef
T
type
;
enum
{
matched
=
false
};
};
template
<
typename
T
>
struct
hb_match_const
<
const
T
>
{
typedef
T
type
;
enum
{
matched
=
true
};
};
#define hb_remove_const(T) typename hb_match_const<T>::type
#define hb_is_const(T) hb_match_const<T>::matched
template
<
typename
T
>
struct
hb_match_reference
{
typedef
T
type
;
enum
{
matched
=
false
};
};
template
<
typename
T
>
struct
hb_match_reference
<
T
&>
{
typedef
T
type
;
enum
{
matched
=
true
};
};
#define hb_remove_reference(T) typename hb_match_reference<T>::type
#define hb_is_reference(T) hb_match_reference<T>::matched
template
<
typename
T
>
struct
hb_match_pointer
{
typedef
T
type
;
enum
{
matched
=
false
};
};
template
<
typename
T
>
struct
hb_match_pointer
<
T
*>
{
typedef
T
type
;
enum
{
matched
=
true
};
};
#define hb_remove_pointer(T) typename hb_match_pointer<T>::type
#define hb_is_pointer(T) hb_match_pointer<T>::matched
/* Void! For when we need a expression-type of void. */
...
...
@@ -64,7 +67,7 @@ struct hb_enable_if {};
template
<
typename
T
>
struct
hb_enable_if
<
true
,
T
>
{
typedef
T
type
;
};
#define hb_enable_if(Cond) typename hb_enable_if<
Cond
>::type* = nullptr
#define hb_enable_if(Cond) typename hb_enable_if<
(Cond)
>::type* = nullptr
#define hb_enable_if_t(Cond, Type) typename hb_enable_if<(Cond), Type>::type
...
...
src/hb-ot-layout-common.hh
浏览文件 @
815cde9f
...
...
@@ -827,7 +827,7 @@ struct CoverageFormat1
}
template
<
typename
Iterator
>
hb_enable_if_t
(
hb_is_iterator
(
Iterator
,
const
GlyphID
),
hb_enable_if_t
(
hb_is_
sorted_
iterator
(
Iterator
,
const
GlyphID
),
bool
)
serialize
(
hb_serialize_context_t
*
c
,
Iterator
glyphs
)
{
...
...
@@ -896,7 +896,7 @@ struct CoverageFormat2
}
template
<
typename
Iterator
>
hb_enable_if_t
(
hb_is_iterator
(
Iterator
,
const
GlyphID
),
hb_enable_if_t
(
hb_is_
sorted_
iterator
(
Iterator
,
const
GlyphID
),
bool
)
serialize
(
hb_serialize_context_t
*
c
,
Iterator
glyphs
)
{
...
...
@@ -1047,7 +1047,7 @@ struct Coverage
}
template
<
typename
Iterator
>
hb_enable_if_t
(
hb_is_iterator
(
Iterator
,
const
GlyphID
),
hb_enable_if_t
(
hb_is_
sorted_
iterator
(
Iterator
,
const
GlyphID
),
bool
)
serialize
(
hb_serialize_context_t
*
c
,
Iterator
glyphs
)
{
...
...
@@ -1240,7 +1240,7 @@ struct ClassDefFormat1
TRACE_SUBSET
(
this
);
const
hb_set_t
&
glyphset
=
*
c
->
plan
->
glyphset
;
const
hb_map_t
&
glyph_map
=
*
c
->
plan
->
glyph_map
;
hb_vector_t
<
GlyphID
>
glyphs
;
hb_
sorted_
vector_t
<
GlyphID
>
glyphs
;
hb_vector_t
<
HBUINT16
>
klasses
;
hb_codepoint_t
start
=
startGlyph
;
...
...
src/hb-ot-layout-gsub-table.hh
浏览文件 @
815cde9f
...
...
@@ -36,7 +36,7 @@ namespace OT {
static
inline
void
SingleSubst_serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
glyphs
,
hb_array_t
<
const
GlyphID
>
substitutes
);
struct
SingleSubstFormat1
...
...
@@ -92,7 +92,7 @@ struct SingleSubstFormat1
}
bool
serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
glyphs
,
int
delta
)
{
TRACE_SERIALIZE
(
this
);
...
...
@@ -107,7 +107,7 @@ struct SingleSubstFormat1
TRACE_SUBSET
(
this
);
const
hb_set_t
&
glyphset
=
*
c
->
plan
->
glyphset
;
const
hb_map_t
&
glyph_map
=
*
c
->
plan
->
glyph_map
;
hb_vector_t
<
GlyphID
>
from
;
hb_
sorted_
vector_t
<
GlyphID
>
from
;
hb_vector_t
<
GlyphID
>
to
;
hb_codepoint_t
delta
=
deltaGlyphID
;
for
(
/*TODO(C++11)auto*/
Coverage
::
iter_t
iter
=
(
this
+
coverage
).
iter
();
iter
;
iter
++
)
...
...
@@ -189,7 +189,7 @@ struct SingleSubstFormat2
}
bool
serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
glyphs
,
hb_array_t
<
const
GlyphID
>
substitutes
)
{
TRACE_SERIALIZE
(
this
);
...
...
@@ -204,7 +204,7 @@ struct SingleSubstFormat2
TRACE_SUBSET
(
this
);
const
hb_set_t
&
glyphset
=
*
c
->
plan
->
glyphset
;
const
hb_map_t
&
glyph_map
=
*
c
->
plan
->
glyph_map
;
hb_vector_t
<
GlyphID
>
from
;
hb_
sorted_
vector_t
<
GlyphID
>
from
;
hb_vector_t
<
GlyphID
>
to
;
for
(
/*TODO(C++11)auto*/
Coverage
::
iter_t
iter
=
(
this
+
coverage
).
iter
();
iter
;
iter
++
)
{
...
...
@@ -238,7 +238,7 @@ struct SingleSubstFormat2
struct
SingleSubst
{
bool
serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
glyphs
,
hb_array_t
<
const
GlyphID
>
substitutes
)
{
TRACE_SERIALIZE
(
this
);
...
...
@@ -286,7 +286,7 @@ struct SingleSubst
static
inline
void
SingleSubst_serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
glyphs
,
hb_array_t
<
const
GlyphID
>
substitutes
)
{
c
->
start_embed
<
SingleSubst
>
()
->
serialize
(
c
,
glyphs
,
substitutes
);
}
...
...
@@ -335,10 +335,10 @@ struct Sequence
}
bool
serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
glyphs
)
hb_array_t
<
const
GlyphID
>
subst
)
{
TRACE_SERIALIZE
(
this
);
return_trace
(
substitute
.
serialize
(
c
,
glyphs
));
return_trace
(
substitute
.
serialize
(
c
,
subst
));
}
bool
sanitize
(
hb_sanitize_context_t
*
c
)
const
...
...
@@ -398,7 +398,7 @@ struct MultipleSubstFormat1
}
bool
serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
glyphs
,
hb_array_t
<
const
unsigned
int
>
substitute_len_list
,
hb_array_t
<
const
GlyphID
>
substitute_glyphs_list
)
{
...
...
@@ -444,7 +444,7 @@ struct MultipleSubstFormat1
struct
MultipleSubst
{
bool
serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
glyphs
,
hb_array_t
<
const
unsigned
int
>
substitute_len_list
,
hb_array_t
<
const
GlyphID
>
substitute_glyphs_list
)
{
...
...
@@ -514,10 +514,10 @@ struct AlternateSet
}
bool
serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
glyph
s
)
hb_array_t
<
const
GlyphID
>
alt
s
)
{
TRACE_SERIALIZE
(
this
);
return_trace
(
alternates
.
serialize
(
c
,
glyph
s
));
return_trace
(
alternates
.
serialize
(
c
,
alt
s
));
}
bool
sanitize
(
hb_sanitize_context_t
*
c
)
const
...
...
@@ -582,7 +582,7 @@ struct AlternateSubstFormat1
}
bool
serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
glyphs
,
hb_array_t
<
const
unsigned
int
>
alternate_len_list
,
hb_array_t
<
const
GlyphID
>
alternate_glyphs_list
)
{
...
...
@@ -628,7 +628,7 @@ struct AlternateSubstFormat1
struct
AlternateSubst
{
bool
serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
glyphs
,
hb_array_t
<
const
unsigned
int
>
alternate_len_list
,
hb_array_t
<
const
GlyphID
>
alternate_glyphs_list
)
{
...
...
@@ -917,7 +917,7 @@ struct LigatureSubstFormat1
}
bool
serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
first_glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
first_glyphs
,
hb_array_t
<
const
unsigned
int
>
ligature_per_first_glyph_count_list
,
hb_array_t
<
const
GlyphID
>
ligatures_list
,
hb_array_t
<
const
unsigned
int
>
component_count_list
,
...
...
@@ -968,7 +968,7 @@ struct LigatureSubstFormat1
struct
LigatureSubst
{
bool
serialize
(
hb_serialize_context_t
*
c
,
hb_array_t
<
const
GlyphID
>
first_glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
first_glyphs
,
hb_array_t
<
const
unsigned
int
>
ligature_per_first_glyph_count_list
,
hb_array_t
<
const
GlyphID
>
ligatures_list
,
hb_array_t
<
const
unsigned
int
>
component_count_list
,
...
...
@@ -1320,7 +1320,7 @@ struct SubstLookup : Lookup
bool
serialize_single
(
hb_serialize_context_t
*
c
,
uint32_t
lookup_props
,
hb_array_t
<
const
GlyphID
>
glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
glyphs
,
hb_array_t
<
const
GlyphID
>
substitutes
)
{
TRACE_SERIALIZE
(
this
);
...
...
@@ -1330,7 +1330,7 @@ struct SubstLookup : Lookup
bool
serialize_multiple
(
hb_serialize_context_t
*
c
,
uint32_t
lookup_props
,
hb_array_t
<
const
GlyphID
>
glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
glyphs
,
hb_array_t
<
const
unsigned
int
>
substitute_len_list
,
hb_array_t
<
const
GlyphID
>
substitute_glyphs_list
)
{
...
...
@@ -1344,7 +1344,7 @@ struct SubstLookup : Lookup
bool
serialize_alternate
(
hb_serialize_context_t
*
c
,
uint32_t
lookup_props
,
hb_array_t
<
const
GlyphID
>
glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
glyphs
,
hb_array_t
<
const
unsigned
int
>
alternate_len_list
,
hb_array_t
<
const
GlyphID
>
alternate_glyphs_list
)
{
...
...
@@ -1358,7 +1358,7 @@ struct SubstLookup : Lookup
bool
serialize_ligature
(
hb_serialize_context_t
*
c
,
uint32_t
lookup_props
,
hb_array_t
<
const
GlyphID
>
first_glyphs
,
hb_
sorted_
array_t
<
const
GlyphID
>
first_glyphs
,
hb_array_t
<
const
unsigned
int
>
ligature_per_first_glyph_count_list
,
hb_array_t
<
const
GlyphID
>
ligatures_list
,
hb_array_t
<
const
unsigned
int
>
component_count_list
,
...
...
src/hb-ot-map.hh
浏览文件 @
815cde9f
...
...
@@ -167,7 +167,7 @@ struct hb_ot_map_t
hb_mask_t
global_mask
;
hb_vector_t
<
feature_map_t
>
features
;
hb_
sorted_
vector_t
<
feature_map_t
>
features
;
hb_vector_t
<
lookup_map_t
>
lookups
[
2
];
/* GSUB/GPOS */
hb_vector_t
<
stage_map_t
>
stages
[
2
];
/* GSUB/GPOS */
};
...
...
src/hb-ot-shape-complex-arabic-fallback.hh
浏览文件 @
815cde9f
...
...
@@ -88,7 +88,7 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS
OT
::
SubstLookup
*
lookup
=
c
.
start_serialize
<
OT
::
SubstLookup
>
();
bool
ret
=
lookup
->
serialize_single
(
&
c
,
OT
::
LookupFlag
::
IgnoreMarks
,
hb_array
(
glyphs
,
num_glyphs
),
hb_
sorted_
array
(
glyphs
,
num_glyphs
),
hb_array
(
substitutes
,
num_glyphs
));
c
.
end_serialize
();
/* TODO sanitize the results? */
...
...
@@ -163,7 +163,7 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN
OT
::
SubstLookup
*
lookup
=
c
.
start_serialize
<
OT
::
SubstLookup
>
();
bool
ret
=
lookup
->
serialize_ligature
(
&
c
,
OT
::
LookupFlag
::
IgnoreMarks
,
hb_array
(
first_glyphs
,
num_first_glyphs
),
hb_
sorted_
array
(
first_glyphs
,
num_first_glyphs
),
hb_array
(
ligature_per_first_glyph_count_list
,
num_first_glyphs
),
hb_array
(
ligature_list
,
num_ligatures
),
hb_array
(
component_count_list
,
num_ligatures
),
...
...
src/hb-set.hh
浏览文件 @
815cde9f
...
...
@@ -186,7 +186,7 @@ struct hb_set_t
hb_object_header_t
header
;
bool
successful
;
/* Allocations successful */
mutable
unsigned
int
population
;
hb_vector_t
<
page_map_t
>
page_map
;
hb_
sorted_
vector_t
<
page_map_t
>
page_map
;
hb_vector_t
<
page_t
>
pages
;
void
init_shallow
()
...
...
src/hb-vector.hh
浏览文件 @
815cde9f
...
...
@@ -115,15 +115,6 @@ struct hb_vector_t
hb_sorted_array_t
<
const
Type
>
as_sorted_array
()
const
{
return
hb_sorted_array
(
arrayZ
(),
length
);
}
hb_array_t
<
const
Type
>
sorted_sub_array
(
unsigned
int
start_offset
,
unsigned
int
count
)
const
{
return
as_sorted_array
().
sorted_sub_array
(
start_offset
,
count
);}
hb_array_t
<
const
Type
>
sorted_sub_array
(
unsigned
int
start_offset
,
unsigned
int
*
count
=
nullptr
/* IN/OUT */
)
const
{
return
as_sorted_array
().
sorted_sub_array
(
start_offset
,
count
);}
hb_array_t
<
Type
>
sorted_sub_array
(
unsigned
int
start_offset
,
unsigned
int
count
)
{
return
as_sorted_array
().
sorted_sub_array
(
start_offset
,
count
);}
hb_array_t
<
Type
>
sorted_sub_array
(
unsigned
int
start_offset
,
unsigned
int
*
count
=
nullptr
/* IN/OUT */
)
{
return
as_sorted_array
().
sorted_sub_array
(
start_offset
,
count
);}
template
<
typename
T
>
explicit_operator
T
*
()
{
return
arrayZ
();
}
template
<
typename
T
>
explicit_operator
const
T
*
()
const
{
return
arrayZ
();
}
...
...
@@ -247,19 +238,34 @@ struct hb_vector_t
template
<
typename
T
>
const
Type
*
lsearch
(
const
T
&
x
,
const
Type
*
not_found
=
nullptr
)
const
{
return
as_array
().
lsearch
(
x
,
not_found
);
}
};
template
<
typename
Type
>
struct
hb_sorted_vector_t
:
hb_vector_t
<
Type
>
{
hb_sorted_array_t
<
Type
>
as_array
()
{
return
hb_sorted_array
(
this
->
arrayZ
(),
this
->
length
);
}
hb_sorted_array_t
<
const
Type
>
as_array
()
const
{
return
hb_sorted_array
(
this
->
arrayZ
(),
this
->
length
);
}
/* Iterator. */
typedef
hb_sorted_array_t
<
const
Type
>
const_iter_t
;
typedef
hb_sorted_array_t
<
Type
>
iter_t
;
const_iter_t
iter
()
const
{
return
as_array
();
}
const_iter_t
citer
()
const
{
return
as_array
();
}
iter_t
iter
()
{
return
as_array
();
}
operator
iter_t
()
{
return
iter
();
}
operator
const_iter_t
()
const
{
return
iter
();
}
template
<
typename
T
>
Type
*
bsearch
(
const
T
&
x
,
Type
*
not_found
=
nullptr
)
{
return
as_
sorted_
array
().
bsearch
(
x
,
not_found
);
}
{
return
as_array
().
bsearch
(
x
,
not_found
);
}
template
<
typename
T
>
const
Type
*
bsearch
(
const
T
&
x
,
const
Type
*
not_found
=
nullptr
)
const
{
return
as_
sorted_
array
().
bsearch
(
x
,
not_found
);
}
{
return
as_array
().
bsearch
(
x
,
not_found
);
}
template
<
typename
T
>
bool
bfind
(
const
T
&
x
,
unsigned
int
*
i
=
nullptr
,
hb_bfind_not_found_t
not_found
=
HB_BFIND_NOT_FOUND_DONT_STORE
,
unsigned
int
to_store
=
(
unsigned
int
)
-
1
)
const
{
return
as_
sorted_
array
().
bfind
(
x
,
i
,
not_found
,
to_store
);
}
{
return
as_array
().
bfind
(
x
,
i
,
not_found
,
to_store
);
}
};
#endif
/* HB_VECTOR_HH */
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录