Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
b3c0714b
T
Third Party Harfbuzz
项目概览
OpenHarmony
/
Third Party Harfbuzz
12 个月 前同步成功
通知
0
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b3c0714b
编写于
1月 20, 2017
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[var] Add hb_var_coord_t and parsing routines
上级
72364103
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
103 addition
and
6 deletion
+103
-6
src/hb-common.cc
src/hb-common.cc
+89
-5
src/hb-common.h
src/hb-common.h
+14
-1
未找到文件。
src/hb-common.cc
浏览文件 @
b3c0714b
...
...
@@ -607,7 +607,8 @@ hb_version_atleast (unsigned int major,
}
/* hb_feature_t */
/* hb_feature_t and hb_var_coord_t */
static
bool
parse_space
(
const
char
**
pp
,
const
char
*
end
)
...
...
@@ -653,6 +654,28 @@ parse_uint (const char **pp, const char *end, unsigned int *pv)
return
true
;
}
static
bool
parse_float
(
const
char
**
pp
,
const
char
*
end
,
float
*
pv
)
{
char
buf
[
32
];
unsigned
int
len
=
MIN
(
ARRAY_LENGTH
(
buf
)
-
1
,
(
unsigned
int
)
(
end
-
*
pp
));
strncpy
(
buf
,
*
pp
,
len
);
buf
[
len
]
=
'\0'
;
char
*
p
=
buf
;
char
*
pend
=
p
;
float
v
;
errno
=
0
;
v
=
strtof
(
p
,
&
pend
);
if
(
errno
||
p
==
pend
)
return
false
;
*
pv
=
v
;
*
pp
+=
pend
-
p
;
return
true
;
}
static
bool
parse_bool
(
const
char
**
pp
,
const
char
*
end
,
unsigned
int
*
pv
)
{
...
...
@@ -673,6 +696,8 @@ parse_bool (const char **pp, const char *end, unsigned int *pv)
return
true
;
}
/* hb_feature_t */
static
bool
parse_feature_value_prefix
(
const
char
**
pp
,
const
char
*
end
,
hb_feature_t
*
feature
)
{
...
...
@@ -687,7 +712,7 @@ parse_feature_value_prefix (const char **pp, const char *end, hb_feature_t *feat
}
static
bool
parse_
feature_tag
(
const
char
**
pp
,
const
char
*
end
,
hb_feature_t
*
feature
)
parse_
tag
(
const
char
**
pp
,
const
char
*
end
,
hb_tag_t
*
tag
)
{
parse_space
(
pp
,
end
);
...
...
@@ -706,7 +731,7 @@ parse_feature_tag (const char **pp, const char *end, hb_feature_t *feature)
if
(
p
==
*
pp
||
*
pp
-
p
>
4
)
return
false
;
feature
->
tag
=
hb_tag_from_string
(
p
,
*
pp
-
p
);
*
tag
=
hb_tag_from_string
(
p
,
*
pp
-
p
);
if
(
quote
)
{
...
...
@@ -759,12 +784,11 @@ parse_feature_value_postfix (const char **pp, const char *end, hb_feature_t *fea
return
!
had_equal
||
had_value
;
}
static
bool
parse_one_feature
(
const
char
**
pp
,
const
char
*
end
,
hb_feature_t
*
feature
)
{
return
parse_feature_value_prefix
(
pp
,
end
,
feature
)
&&
parse_
feature_tag
(
pp
,
end
,
feature
)
&&
parse_
tag
(
pp
,
end
,
&
feature
->
tag
)
&&
parse_feature_indices
(
pp
,
end
,
feature
)
&&
parse_feature_value_postfix
(
pp
,
end
,
feature
)
&&
parse_space
(
pp
,
end
)
&&
...
...
@@ -855,3 +879,63 @@ hb_feature_to_string (hb_feature_t *feature,
memcpy
(
buf
,
s
,
len
);
buf
[
len
]
=
'\0'
;
}
/* hb_var_coord_t */
static
bool
parse_var_coord_value
(
const
char
**
pp
,
const
char
*
end
,
hb_var_coord_t
*
var_coord
)
{
parse_char
(
pp
,
end
,
'='
);
/* Optional. */
return
parse_float
(
pp
,
end
,
&
var_coord
->
value
);
}
static
bool
parse_one_var_coord
(
const
char
**
pp
,
const
char
*
end
,
hb_var_coord_t
*
var_coord
)
{
return
parse_tag
(
pp
,
end
,
&
var_coord
->
tag
)
&&
parse_var_coord_value
(
pp
,
end
,
var_coord
)
&&
parse_space
(
pp
,
end
)
&&
*
pp
==
end
;
}
hb_bool_t
hb_var_coord_from_string
(
const
char
*
str
,
int
len
,
hb_var_coord_t
*
var_coord
)
{
hb_var_coord_t
coord
;
if
(
len
<
0
)
len
=
strlen
(
str
);
if
(
likely
(
parse_one_var_coord
(
&
str
,
str
+
len
,
&
coord
)))
{
if
(
var_coord
)
*
var_coord
=
coord
;
return
true
;
}
if
(
var_coord
)
memset
(
var_coord
,
0
,
sizeof
(
*
var_coord
));
return
false
;
}
void
hb_var_coord_to_string
(
hb_var_coord_t
*
var_coord
,
char
*
buf
,
unsigned
int
size
)
{
if
(
unlikely
(
!
size
))
return
;
char
s
[
128
];
unsigned
int
len
=
0
;
hb_tag_to_string
(
var_coord
->
tag
,
s
+
len
);
len
+=
4
;
while
(
len
&&
s
[
len
-
1
]
==
' '
)
len
--
;
s
[
len
++
]
=
'='
;
len
+=
MAX
(
0
,
snprintf
(
s
+
len
,
ARRAY_LENGTH
(
s
)
-
len
,
"%g"
,
var_coord
->
value
));
assert
(
len
<
ARRAY_LENGTH
(
s
));
len
=
MIN
(
len
,
size
-
1
);
memcpy
(
buf
,
s
,
len
);
buf
[
len
]
=
'\0'
;
}
src/hb-common.h
浏览文件 @
b3c0714b
...
...
@@ -362,7 +362,7 @@ typedef struct hb_user_data_key_t {
typedef
void
(
*
hb_destroy_func_t
)
(
void
*
user_data
);
/* Font features. */
/* Font features
and variations
. */
typedef
struct
hb_feature_t
{
hb_tag_t
tag
;
...
...
@@ -379,6 +379,19 @@ HB_EXTERN void
hb_feature_to_string
(
hb_feature_t
*
feature
,
char
*
buf
,
unsigned
int
size
);
typedef
struct
hb_var_coord_t
{
hb_tag_t
tag
;
float
value
;
}
hb_var_coord_t
;
HB_EXTERN
hb_bool_t
hb_var_coord_from_string
(
const
char
*
str
,
int
len
,
hb_var_coord_t
*
var_coord
);
HB_EXTERN
void
hb_var_coord_to_string
(
hb_var_coord_t
*
var_coord
,
char
*
buf
,
unsigned
int
size
);
HB_END_DECLS
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录