Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
926f512f
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看板
提交
926f512f
编写于
11月 25, 2018
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[aat.feat] Rework API and implementation
Fixes
https://github.com/harfbuzz/harfbuzz/pull/1346
上级
84dacbca
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
141 addition
and
130 deletion
+141
-130
docs/harfbuzz-docs.xml
docs/harfbuzz-docs.xml
+5
-0
docs/harfbuzz-sections.txt
docs/harfbuzz-sections.txt
+4
-3
src/hb-aat-layout-feat-table.hh
src/hb-aat-layout-feat-table.hh
+49
-40
src/hb-aat-layout.cc
src/hb-aat-layout.cc
+34
-46
src/hb-aat-layout.h
src/hb-aat-layout.h
+19
-13
test/api/test-aat-layout.c
test/api/test-aat-layout.c
+30
-28
未找到文件。
docs/harfbuzz-docs.xml
浏览文件 @
926f512f
...
...
@@ -112,6 +112,11 @@
<xi:include
href=
"xml/hb-ot-var.xml"
/>
</chapter>
<chapter>
<title>
Apple Advanced Typography API
</title>
<xi:include
href=
"xml/hb-aat-layout.xml"
/>
</chapter>
<chapter>
<title>
Integration API
</title>
<xi:include
href=
"xml/hb-coretext.xml"
/>
...
...
docs/harfbuzz-sections.txt
浏览文件 @
926f512f
...
...
@@ -4,13 +4,14 @@ HB_OT_H_IN
</SECTION>
<SECTION>
<FILE>hb-aat</FILE>
<FILE>hb-aat-layout</FILE>
HB_AAT_LAYOUT_NO_SELECTOR_INDEX
hb_aat_layout_feature_type_t
hb_aat_layout_get_feature_types
hb_aat_layout_feature_type_get_name_id
hb_aat_layout_feature_selector_t
hb_aat_layout_feature_
type_get_selectors
hb_aat_layout_feature_
selector_get_name_id
hb_aat_layout_feature_
selector_info_t
hb_aat_layout_feature_
type_get_selector_infos
</SECTION>
<SECTION>
...
...
src/hb-aat-layout-feat-table.hh
浏览文件 @
926f512f
...
...
@@ -39,13 +39,26 @@ namespace AAT {
struct
SettingName
{
friend
struct
FeatureName
;
int
cmp
(
hb_aat_layout_feature_selector_t
key
)
const
{
return
(
int
)
key
-
(
int
)
setting
;
}
inline
hb_aat_layout_feature_selector_t
get_selector
()
const
{
return
(
hb_aat_layout_feature_selector_t
)
(
unsigned
int
)
setting
;
}
inline
hb_aat_layout_feature_selector_t
get_selector
(
void
)
const
{
return
(
hb_aat_layout_feature_selector_t
)
(
unsigned
)
setting
;
}
inline
void
get_info
(
hb_aat_layout_feature_selector_info_t
*
s
,
hb_aat_layout_feature_selector_t
default_selector
)
const
{
s
->
name_id
=
nameIndex
;
s
->
enable
=
(
hb_aat_layout_feature_selector_t
)
(
unsigned
int
)
setting
;
s
->
disable
=
default_selector
==
HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID
?
(
hb_aat_layout_feature_selector_t
)
(
s
->
enable
+
1
)
:
default_selector
;
inline
hb_ot_name_id_t
get_name_id
()
const
{
return
nameIndex
;
}
s
->
reserved
=
0
;
}
inline
bool
sanitize
(
hb_sanitize_context_t
*
c
)
const
{
...
...
@@ -82,29 +95,34 @@ struct FeatureName
* as the default. */
};
inline
unsigned
int
get_selector
s
(
const
feat
*
fea
t
,
hb_aat_layout_feature_selector_t
*
default_selector
,
unsigned
int
start_offset
,
unsigned
int
*
count
,
hb_aat_layout_feature_selector_t
*
selectors
)
const
inline
unsigned
int
get_selector
_infos
(
unsigned
int
start_offse
t
,
unsigned
int
*
selectors_count
,
/* IN/OUT. May be NULL. */
hb_aat_layout_feature_selector_info_t
*
selectors
,
/* OUT. May be NULL. */
unsigned
int
*
pdefault_index
,
/* OUT. May be NULL. */
const
void
*
base
)
const
{
const
UnsizedArrayOf
<
SettingName
>&
settings_table
=
feat
+
settingTableZ
;
unsigned
int
settings_count
=
nSettings
;
if
(
count
&&
*
count
)
hb_array_t
<
const
SettingName
>
settings_table
=
(
base
+
settingTableZ
).
as_array
(
nSettings
);
static_assert
(
Index
::
NOT_FOUND_INDEX
==
HB_AAT_LAYOUT_NO_SELECTOR_INDEX
,
""
);
hb_aat_layout_feature_selector_t
default_selector
=
HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID
;
unsigned
int
default_index
=
Index
::
NOT_FOUND_INDEX
;
if
(
featureFlags
&
Exclusive
)
{
unsigned
int
len
=
MIN
(
settings_count
-
start_offset
,
*
count
);
for
(
unsigned
int
i
=
0
;
i
<
len
;
i
++
)
selectors
[
i
]
=
settings_table
[
start_offset
+
i
].
get_selector
();
*
count
=
len
;
default_index
=
(
featureFlags
&
NotDefault
)
?
featureFlags
&
IndexMask
:
0
;
default_selector
=
settings_table
[
default_index
].
get_selector
();
}
if
(
default_selector
)
if
(
pdefault_index
)
*
pdefault_index
=
default_index
;
if
(
selectors_count
)
{
unsigned
int
index
=
(
featureFlags
&
NotDefault
)
?
featureFlags
&
IndexMask
:
0
;
*
default_selector
=
((
featureFlags
&
Exclusive
)
&&
index
<
settings_count
)
?
settings_table
[
index
].
get_selector
(
)
:
HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID
;
hb_array_t
<
const
SettingName
>
arr
=
settings_table
.
sub_array
(
start_offset
,
selectors_count
)
;
unsigned
int
count
=
arr
.
len
;
for
(
unsigned
int
i
=
0
;
i
<
count
;
i
++
)
settings_table
[
start_offset
+
i
].
get_info
(
&
selectors
[
i
],
default_selector
)
;
}
return
settings_
count
;
return
settings_
table
.
len
;
}
inline
hb_aat_layout_feature_type_t
get_feature_type
()
const
...
...
@@ -112,12 +130,6 @@ struct FeatureName
inline
hb_ot_name_id_t
get_feature_name_id
()
const
{
return
nameIndex
;
}
inline
hb_ot_name_id_t
get_feature_selector_name_id
(
const
feat
*
feat
,
hb_aat_layout_feature_selector_t
key
)
const
{
return
(
feat
+
settingTableZ
).
lsearch
(
nSettings
,
key
).
get_name_id
();
}
inline
bool
sanitize
(
hb_sanitize_context_t
*
c
,
const
void
*
base
)
const
{
TRACE_SANITIZE
(
this
);
...
...
@@ -162,32 +174,29 @@ struct feat
return
featureNameCount
;
}
inline
const
FeatureName
&
get_feature
(
hb_aat_layout_feature_type_t
key
)
const
inline
const
FeatureName
&
get_feature
(
hb_aat_layout_feature_type_t
feature_type
)
const
{
return
namesZ
.
bsearch
(
featureNameCount
,
key
);
return
namesZ
.
bsearch
(
featureNameCount
,
feature_type
);
}
inline
hb_ot_name_id_t
get_feature_name_id
(
hb_aat_layout_feature_type_t
feature
)
const
{
return
get_feature
(
feature
).
get_feature_name_id
();
}
inline
hb_ot_name_id_t
get_feature_selector_name_id
(
hb_aat_layout_feature_type_t
feature
,
hb_aat_layout_feature_selector_t
selector
)
const
{
return
get_feature
(
feature
).
get_feature_selector_name_id
(
this
,
selector
);
}
inline
unsigned
int
get_selectors
(
hb_aat_layout_feature_type_t
key
,
hb_aat_layout_feature_selector_t
*
default_selector
,
unsigned
int
start_offset
,
unsigned
int
*
count
,
hb_aat_layout_feature_selector_t
*
selectors
)
const
inline
unsigned
int
get_selector_infos
(
hb_aat_layout_feature_type_t
feature_type
,
unsigned
int
start_offset
,
unsigned
int
*
selectors_count
,
/* IN/OUT. May be NULL. */
hb_aat_layout_feature_selector_info_t
*
selectors
,
/* OUT. May be NULL. */
unsigned
int
*
default_index
/* OUT. May be NULL. */
)
const
{
return
get_feature
(
key
).
get_selectors
(
this
,
default_selector
,
start_offset
,
count
,
selector
s
);
return
get_feature
(
feature_type
).
get_selector_infos
(
start_offset
,
selectors_count
,
selectors
,
default_index
,
thi
s
);
}
inline
bool
sanitize
(
hb_sanitize_context_t
*
c
)
const
{
TRACE_SANITIZE
(
this
);
return_trace
(
likely
(
c
->
check_struct
(
this
)
&&
version
.
major
==
1
&&
namesZ
.
sanitize
(
c
,
featureNameCount
,
this
)));
}
...
...
src/hb-aat-layout.cc
浏览文件 @
926f512f
...
...
@@ -39,6 +39,16 @@
#include "hb-aat-ltag-table.hh"
/**
* SECTION:hb-aat-layout
* @title: hb-aat-layout
* @short_description: Apple Advanced Typography Layout
* @include: hb-aat.h
*
* Functions for querying OpenType Layout features in the font face.
**/
/* Table data courtesy of Apple. Converted from mnemonics to integers
* when moving to this file. */
static
const
hb_aat_feature_mapping_t
feature_mappings
[]
=
...
...
@@ -303,26 +313,26 @@ _hb_aat_language_get (hb_face_t *face,
* hb_aat_layout_get_feature_types:
* @face: a face object
* @start_offset: iteration's start offset
* @
count: (inout
): buffer size as input, filled size as output
* @features: (out): features buffer
* @
feature_count:(inout) (allow-none
): buffer size as input, filled size as output
* @features: (out
caller-allocates) (array length=feature_count
): features buffer
*
* Return value: Number of all available feature
s
* Return value: Number of all available feature
types.
*
* Since: REPLACEME
*/
unsigned
int
hb_aat_layout_get_feature_types
(
hb_face_t
*
face
,
unsigned
int
start_offset
,
unsigned
int
*
count
,
/* IN/OUT. May be NULL. */
hb_aat_layout_feature_type_t
*
features
/* OUT. May be NULL. */
)
unsigned
int
*
feature_count
,
/* IN/OUT. May be NULL. */
hb_aat_layout_feature_type_t
*
features
/* OUT. May be NULL. */
)
{
return
face
->
table
.
feat
->
get_feature_types
(
start_offset
,
count
,
features
);
return
face
->
table
.
feat
->
get_feature_types
(
start_offset
,
feature_
count
,
features
);
}
/**
* hb_aat_layout_feature_type_get_name_id:
* @face: a face object
* @feature: feature id
* @feature
_type
: feature id
*
* Return value: Name ID index
*
...
...
@@ -330,55 +340,33 @@ hb_aat_layout_get_feature_types (hb_face_t *face,
*/
hb_ot_name_id_t
hb_aat_layout_feature_type_get_name_id
(
hb_face_t
*
face
,
hb_aat_layout_feature_type_t
feature
)
{
return
face
->
table
.
feat
->
get_feature_name_id
(
feature
);
}
hb_aat_layout_feature_type_t
feature
_type
)
{
return
face
->
table
.
feat
->
get_feature_name_id
(
feature
_type
);
}
/**
* hb_aat_layout_feature_type_get_selectors:
* @face: a face object
* @feature: feature id
* @default_selector: (out): if is set, the feature is exclusive
* @feature_type: feature id
* @start_offset: iteration's start offset
* @count: (inout): buffer size as input, filled size as output
* @settings: (out): settings buffer
* @selector_count: (inout) (allow-none): buffer size as input, filled size as output
* @selectors: (out caller-allocates) (array length=selector_count): settings buffer
* @default_index: (out) (allow-none): index of default selector if any
*
* Per spec:
* For feature types that don't have exclusive settings,
* there will always be a pair of values. One value turns
* a selector on and a second value turns the selector off.
* The on setting must be even and the off setting must be one
* greater than the corresponding on setting. The off setting
* is therefore always odd. As a result, only the on setting
* should have an entry in the setting name array.
* If upon return, @default_index is set to #HB_AAT_LAYOUT_NO_SELECTOR_INDEX, then
* the feature type is non-exclusive. Otherwise, @default_index is the index of
* the selector that is selected by default.
*
* Return value: Number of all available feature
s
* Return value: Number of all available feature
selectors.
*
* Since: REPLACEME
*/
unsigned
int
hb_aat_layout_feature_type_get_selector
s
(
hb_face_t
*
face
,
hb_aat_layout_feature_type_t
featur
e
,
hb_aat_layout_feature_selector_t
*
default_selector
,
/* OUT. May be NULL. */
unsigned
int
start_offset
,
unsigned
int
*
count
,
/* IN/OUT.
May be NULL. */
hb_aat_layout_feature_selector_t
*
selectors
/* OUT. May be NULL. */
)
hb_aat_layout_feature_type_get_selector
_infos
(
hb_face_t
*
face
,
hb_aat_layout_feature_type_t
feature_typ
e
,
unsigned
int
start_offset
,
unsigned
int
*
selector_count
,
/* IN/OUT. May be NULL. */
hb_aat_layout_feature_selector_info_t
*
selectors
,
/* OUT.
May be NULL. */
unsigned
int
*
default_index
/* OUT. May be NULL. */
)
{
return
face
->
table
.
feat
->
get_selectors
(
feature
,
default_selector
,
start_offset
,
count
,
selectors
);
return
face
->
table
.
feat
->
get_selector_infos
(
feature_type
,
start_offset
,
selector_count
,
selectors
,
default_index
);
}
/**
* hb_aat_layout_feature_selector_get_name_id:
* @face: a face object
* @feature: feature id
* @selector: selector value
*
* Return value: Name ID index
*
* Since: REPLACEME
*/
hb_ot_name_id_t
hb_aat_layout_feature_selector_get_name_id
(
hb_face_t
*
face
,
hb_aat_layout_feature_type_t
feature
,
hb_aat_layout_feature_selector_t
selector
)
{
return
face
->
table
.
feat
->
get_feature_selector_name_id
(
feature
,
selector
);
}
src/hb-aat-layout.h
浏览文件 @
926f512f
...
...
@@ -430,26 +430,32 @@ typedef enum
HB_EXTERN
unsigned
int
hb_aat_layout_get_feature_types
(
hb_face_t
*
face
,
unsigned
int
start_offset
,
unsigned
int
*
count
,
/* IN/OUT. May be NULL. */
hb_aat_layout_feature_type_t
*
features
/* OUT. May be NULL. */
);
unsigned
int
*
feature_count
,
/* IN/OUT. May be NULL. */
hb_aat_layout_feature_type_t
*
features
/* OUT. May be NULL. */
);
HB_EXTERN
hb_ot_name_id_t
hb_aat_layout_feature_type_get_name_id
(
hb_face_t
*
face
,
hb_aat_layout_feature_type_t
feature
);
hb_aat_layout_feature_type_t
feature
_type
);
typedef
struct
hb_aat_layout_feature_selector_info_t
{
hb_ot_name_id_t
name_id
;
hb_aat_layout_feature_selector_t
enable
;
hb_aat_layout_feature_selector_t
disable
;
/*< private >*/
unsigned
int
reserved
;
}
hb_aat_layout_feature_selector_info_t
;
#define HB_AAT_LAYOUT_NO_SELECTOR_INDEX 0xFFFFu
HB_EXTERN
unsigned
int
hb_aat_layout_feature_type_get_selector
s
(
hb_face_t
*
face
,
hb_aat_layout_feature_type_t
featur
e
,
hb_aat_layout_feature_selector_t
*
default_selector
,
/* OUT. May be NULL. */
unsigned
int
start_offset
,
unsigned
int
*
count
,
/* IN/OUT.
May be NULL. */
hb_aat_layout_feature_selector_t
*
settings
/* OUT. May be NULL. */
);
hb_aat_layout_feature_type_get_selector
_infos
(
hb_face_t
*
face
,
hb_aat_layout_feature_type_t
feature_typ
e
,
unsigned
int
start_offset
,
unsigned
int
*
selector_count
,
/* IN/OUT. May be NULL. */
hb_aat_layout_feature_selector_info_t
*
selectors
,
/* OUT.
May be NULL. */
unsigned
int
*
default_index
/* OUT. May be NULL. */
);
HB_EXTERN
hb_ot_name_id_t
hb_aat_layout_feature_selector_get_name_id
(
hb_face_t
*
face
,
hb_aat_layout_feature_type_t
feature
,
hb_aat_layout_feature_selector_t
selector
);
HB_END_DECLS
...
...
test/api/test-aat-layout.c
浏览文件 @
926f512f
...
...
@@ -52,51 +52,53 @@ test_aat_get_feature_types (void)
static
void
test_aat_get_feature_selectors
(
void
)
{
hb_aat_layout_feature_selector_t
default_selector
;
hb_aat_layout_feature_selector_t
settings
[
3
];
unsigned
int
default_index
;
hb_aat_layout_feature_selector_
info_
t
settings
[
3
];
unsigned
int
count
=
3
;
g_assert_cmpuint
(
4
,
==
,
hb_aat_layout_feature_type_get_selectors
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
,
&
default_selector
,
0
,
&
count
,
settings
));
g_assert_cmpuint
(
4
,
==
,
hb_aat_layout_feature_type_get_selector_infos
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
,
0
,
&
count
,
settings
,
&
default_index
));
g_assert_cmpuint
(
3
,
==
,
count
);
g_assert_cmpuint
(
0
,
==
,
default_
selector
);
g_assert_cmpuint
(
0
,
==
,
default_
index
);
g_assert_cmpuint
(
0
,
==
,
settings
[
0
]);
g_assert_cmpuint
(
294
,
==
,
hb_aat_layout_feature_selector_get_name_id
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
,
settings
[
0
])
);
g_assert_cmpuint
(
0
,
==
,
settings
[
0
]
.
enable
);
g_assert_cmpuint
(
294
,
==
,
settings
[
0
].
name_id
);
g_assert_cmpuint
(
1
,
==
,
settings
[
1
]);
g_assert_cmpuint
(
295
,
==
,
hb_aat_layout_feature_selector_get_name_id
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
,
settings
[
1
])
);
g_assert_cmpuint
(
1
,
==
,
settings
[
1
]
.
enable
);
g_assert_cmpuint
(
295
,
==
,
settings
[
1
].
name_id
);
g_assert_cmpuint
(
2
,
==
,
settings
[
2
]);
g_assert_cmpuint
(
296
,
==
,
hb_aat_layout_feature_selector_get_name_id
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
,
settings
[
2
]));
g_assert_cmpuint
(
HB_OT_NAME_ID_INVALID
,
==
,
hb_aat_layout_feature_selector_get_name_id
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
,
HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID
));
g_assert_cmpuint
(
2
,
==
,
settings
[
2
].
enable
);
g_assert_cmpuint
(
296
,
==
,
settings
[
2
].
name_id
);
count
=
3
;
g_assert_cmpuint
(
4
,
==
,
hb_aat_layout_feature_type_get_selectors
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
,
&
default_selector
,
3
,
&
count
,
settings
));
g_assert_cmpuint
(
4
,
==
,
hb_aat_layout_feature_type_get_selector_infos
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
,
3
,
&
count
,
settings
,
&
default_index
));
g_assert_cmpuint
(
1
,
==
,
count
);
g_assert_cmpuint
(
0
,
==
,
default_
selector
);
g_assert_cmpuint
(
0
,
==
,
default_
index
);
g_assert_cmpuint
(
3
,
==
,
settings
[
0
]);
g_assert_cmpuint
(
297
,
==
,
hb_aat_layout_feature_selector_get_name_id
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE
,
settings
[
0
])
);
g_assert_cmpuint
(
3
,
==
,
settings
[
0
]
.
enable
);
g_assert_cmpuint
(
297
,
==
,
settings
[
0
].
name_id
);
count
=
1
;
g_assert_cmpuint
(
1
,
==
,
hb_aat_layout_feature_type_get_selectors
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
,
&
default_selector
,
0
,
&
count
,
settings
));
g_assert_cmpuint
(
1
,
==
,
hb_aat_layout_feature_type_get_selector_infos
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
,
0
,
&
count
,
settings
,
&
default_index
));
g_assert_cmpuint
(
1
,
==
,
count
);
g_assert_cmpuint
(
HB_AAT_LAYOUT_
FEATURE_TYPE_INVALID
,
==
,
default_selector
);
g_assert_cmpuint
(
HB_AAT_LAYOUT_
NO_SELECTOR_INDEX
,
==
,
default_index
);
g_assert_cmpuint
(
8
,
==
,
settings
[
0
]);
g_assert_cmpuint
(
308
,
==
,
hb_aat_layout_feature_selector_get_name_id
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS
,
settings
[
0
])
);
g_assert_cmpuint
(
8
,
==
,
settings
[
0
]
.
enable
);
g_assert_cmpuint
(
308
,
==
,
settings
[
0
].
name_id
);
count
=
100
;
g_assert_cmpuint
(
0
,
==
,
hb_aat_layout_feature_type_get_selectors
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_INVALID
,
NULL
,
0
,
&
count
,
settings
));
g_assert_cmpuint
(
0
,
==
,
hb_aat_layout_feature_type_get_selector_infos
(
face
,
HB_AAT_LAYOUT_FEATURE_TYPE_INVALID
,
0
,
&
count
,
settings
,
NULL
));
g_assert_cmpuint
(
0
,
==
,
count
);
g_assert_cmpuint
(
HB_OT_NAME_ID_INVALID
,
==
,
hb_aat_layout_feature_selector_get_name_id
(
sbix
,
HB_AAT_LAYOUT_FEATURE_TYPE_INVALID
,
(
hb_aat_layout_feature_selector_t
)
0
));
}
int
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录