Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
be1cca27
T
Third Party Harfbuzz
项目概览
OpenHarmony
/
Third Party Harfbuzz
大约 1 年 前同步成功
通知
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,发现更多精彩内容 >>
提交
be1cca27
编写于
9月 25, 2014
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[ot-font] Add metrics_accel_t
上级
d41b809e
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
54 addition
and
63 deletion
+54
-63
src/hb-ot-font.cc
src/hb-ot-font.cc
+51
-60
src/hb-ot-hhea-table.hh
src/hb-ot-hhea-table.hh
+1
-1
src/hb-ot-hmtx-table.hh
src/hb-ot-hmtx-table.hh
+2
-2
未找到文件。
src/hb-ot-font.cc
浏览文件 @
be1cca27
...
@@ -35,18 +35,55 @@
...
@@ -35,18 +35,55 @@
#include "hb-ot-hmtx-table.hh"
#include "hb-ot-hmtx-table.hh"
struct
metrics_accel_t
{
unsigned
int
num_metrics
;
unsigned
int
num_advances
;
const
OT
::
_mtx
*
table
;
hb_blob_t
*
blob
;
inline
void
init
(
hb_font_t
*
font
,
hb_tag_t
_hea_tag
,
hb_tag_t
_mtx_tag
)
{
this
->
num_metrics
=
font
->
face
->
get_num_glyphs
();
hb_blob_t
*
_hea_blob
=
OT
::
Sanitizer
<
OT
::
_hea
>::
sanitize
(
font
->
face
->
reference_table
(
_hea_tag
));
const
OT
::
_hea
*
_hea
=
OT
::
Sanitizer
<
OT
::
_hea
>::
lock_instance
(
_hea_blob
);
this
->
num_advances
=
_hea
->
numberOfLongMetrics
;
hb_blob_destroy
(
_hea_blob
);
this
->
blob
=
OT
::
Sanitizer
<
OT
::
_mtx
>::
sanitize
(
font
->
face
->
reference_table
(
_mtx_tag
));
if
(
unlikely
(
!
this
->
num_advances
||
2
*
(
this
->
num_advances
+
this
->
num_metrics
)
<
hb_blob_get_length
(
this
->
blob
)))
{
hb_blob_destroy
(
this
->
blob
);
this
->
blob
=
hb_blob_get_empty
();
}
this
->
table
=
OT
::
Sanitizer
<
OT
::
_mtx
>::
lock_instance
(
this
->
blob
);
}
inline
void
fini
(
void
)
{
hb_blob_destroy
(
this
->
blob
);
}
inline
unsigned
int
get_advance
(
hb_codepoint_t
glyph
)
const
{
if
(
unlikely
(
glyph
>=
this
->
num_metrics
))
return
0
;
if
(
glyph
>=
this
->
num_advances
)
glyph
=
this
->
num_advances
-
1
;
return
this
->
table
->
longMetric
[
glyph
].
advance
;
}
};
struct
hb_ot_font_t
struct
hb_ot_font_t
{
{
unsigned
int
num_glyphs
;
unsigned
int
num_glyphs
;
unsigned
int
num_hmetrics
;
metrics_accel_t
h_metrics
;
const
OT
::
hmtx
*
hmtx
;
metrics_accel_t
v_metrics
;
hb_blob_t
*
hmtx_blob
;
unsigned
int
num_vmetrics
;
const
OT
::
vmtx
*
vmtx
;
hb_blob_t
*
vmtx_blob
;
const
OT
::
CmapSubtable
*
cmap
;
const
OT
::
CmapSubtable
*
cmap
;
const
OT
::
CmapSubtable
*
cmap_uvs
;
const
OT
::
CmapSubtable
*
cmap_uvs
;
...
@@ -64,41 +101,9 @@ _hb_ot_font_create (hb_font_t *font)
...
@@ -64,41 +101,9 @@ _hb_ot_font_create (hb_font_t *font)
ot_font
->
num_glyphs
=
font
->
face
->
get_num_glyphs
();
ot_font
->
num_glyphs
=
font
->
face
->
get_num_glyphs
();
/* Setup horizontal metrics. */
ot_font
->
h_metrics
.
init
(
font
,
HB_OT_TAG_hhea
,
HB_OT_TAG_hmtx
);
{
/* TODO Can we do this lazily? */
hb_blob_t
*
hhea_blob
=
OT
::
Sanitizer
<
OT
::
hhea
>::
sanitize
(
font
->
face
->
reference_table
(
HB_OT_TAG_hhea
));
ot_font
->
v_metrics
.
init
(
font
,
HB_OT_TAG_vhea
,
HB_OT_TAG_vmtx
);
const
OT
::
hhea
*
hhea
=
OT
::
Sanitizer
<
OT
::
hhea
>::
lock_instance
(
hhea_blob
);
ot_font
->
num_hmetrics
=
hhea
->
numberOfMetrics
;
hb_blob_destroy
(
hhea_blob
);
ot_font
->
hmtx_blob
=
OT
::
Sanitizer
<
OT
::
hmtx
>::
sanitize
(
font
->
face
->
reference_table
(
HB_OT_TAG_hmtx
));
if
(
unlikely
(
!
ot_font
->
num_hmetrics
||
2
*
(
ot_font
->
num_hmetrics
+
ot_font
->
num_glyphs
)
<
hb_blob_get_length
(
ot_font
->
hmtx_blob
)))
{
hb_blob_destroy
(
ot_font
->
hmtx_blob
);
free
(
ot_font
);
return
NULL
;
}
ot_font
->
hmtx
=
OT
::
Sanitizer
<
OT
::
hmtx
>::
lock_instance
(
ot_font
->
hmtx_blob
);
}
/* Setup vertical metrics. */
{
hb_blob_t
*
vhea_blob
=
OT
::
Sanitizer
<
OT
::
vhea
>::
sanitize
(
font
->
face
->
reference_table
(
HB_OT_TAG_vhea
));
const
OT
::
vhea
*
vhea
=
OT
::
Sanitizer
<
OT
::
vhea
>::
lock_instance
(
vhea_blob
);
ot_font
->
num_vmetrics
=
vhea
->
numberOfMetrics
;
hb_blob_destroy
(
vhea_blob
);
ot_font
->
vmtx_blob
=
OT
::
Sanitizer
<
OT
::
vmtx
>::
sanitize
(
font
->
face
->
reference_table
(
HB_TAG
(
'v'
,
'm'
,
't'
,
'x'
)));
if
(
unlikely
(
!
ot_font
->
num_vmetrics
||
2
*
(
ot_font
->
num_vmetrics
+
ot_font
->
num_glyphs
)
<
hb_blob_get_length
(
ot_font
->
vmtx_blob
)))
{
hb_blob_destroy
(
ot_font
->
vmtx_blob
);
free
(
ot_font
);
return
NULL
;
}
ot_font
->
vmtx
=
OT
::
Sanitizer
<
OT
::
vmtx
>::
lock_instance
(
ot_font
->
vmtx_blob
);
}
ot_font
->
cmap_blob
=
OT
::
Sanitizer
<
OT
::
cmap
>::
sanitize
(
font
->
face
->
reference_table
(
HB_OT_TAG_cmap
));
ot_font
->
cmap_blob
=
OT
::
Sanitizer
<
OT
::
cmap
>::
sanitize
(
font
->
face
->
reference_table
(
HB_OT_TAG_cmap
));
const
OT
::
cmap
*
cmap
=
OT
::
Sanitizer
<
OT
::
cmap
>::
lock_instance
(
ot_font
->
cmap_blob
);
const
OT
::
cmap
*
cmap
=
OT
::
Sanitizer
<
OT
::
cmap
>::
lock_instance
(
ot_font
->
cmap_blob
);
...
@@ -133,8 +138,8 @@ static void
...
@@ -133,8 +138,8 @@ static void
_hb_ot_font_destroy
(
hb_ot_font_t
*
ot_font
)
_hb_ot_font_destroy
(
hb_ot_font_t
*
ot_font
)
{
{
hb_blob_destroy
(
ot_font
->
cmap_blob
);
hb_blob_destroy
(
ot_font
->
cmap_blob
);
hb_blob_destroy
(
ot_font
->
hmtx_blob
);
ot_font
->
h_metrics
.
fini
(
);
hb_blob_destroy
(
ot_font
->
vmtx_blob
);
ot_font
->
v_metrics
.
fini
(
);
free
(
ot_font
);
free
(
ot_font
);
}
}
...
@@ -173,14 +178,7 @@ hb_ot_get_glyph_h_advance (hb_font_t *font HB_UNUSED,
...
@@ -173,14 +178,7 @@ hb_ot_get_glyph_h_advance (hb_font_t *font HB_UNUSED,
void
*
user_data
HB_UNUSED
)
void
*
user_data
HB_UNUSED
)
{
{
const
hb_ot_font_t
*
ot_font
=
(
const
hb_ot_font_t
*
)
font_data
;
const
hb_ot_font_t
*
ot_font
=
(
const
hb_ot_font_t
*
)
font_data
;
return
font
->
em_scale_x
(
ot_font
->
h_metrics
.
get_advance
(
glyph
));
if
(
unlikely
(
glyph
>=
ot_font
->
num_glyphs
))
return
0
;
if
(
glyph
>=
ot_font
->
num_hmetrics
)
glyph
=
ot_font
->
num_hmetrics
-
1
;
return
font
->
em_scale_x
(
ot_font
->
hmtx
->
longHorMetric
[
glyph
].
advance
);
}
}
static
hb_position_t
static
hb_position_t
...
@@ -190,14 +188,7 @@ hb_ot_get_glyph_v_advance (hb_font_t *font HB_UNUSED,
...
@@ -190,14 +188,7 @@ hb_ot_get_glyph_v_advance (hb_font_t *font HB_UNUSED,
void
*
user_data
HB_UNUSED
)
void
*
user_data
HB_UNUSED
)
{
{
const
hb_ot_font_t
*
ot_font
=
(
const
hb_ot_font_t
*
)
font_data
;
const
hb_ot_font_t
*
ot_font
=
(
const
hb_ot_font_t
*
)
font_data
;
return
font
->
em_scale_y
(
-
ot_font
->
v_metrics
.
get_advance
(
glyph
));
if
(
unlikely
(
glyph
>=
ot_font
->
num_glyphs
))
return
0
;
if
(
glyph
>=
ot_font
->
num_vmetrics
)
glyph
=
ot_font
->
num_vmetrics
-
1
;
return
font
->
em_scale_y
(
-
ot_font
->
vmtx
->
longHorMetric
[
glyph
].
advance
);
}
}
static
hb_bool_t
static
hb_bool_t
...
...
src/hb-ot-hhea-table.hh
浏览文件 @
be1cca27
...
@@ -80,7 +80,7 @@ struct _hea
...
@@ -80,7 +80,7 @@ struct _hea
SHORT
reserved3
;
/* Set to 0. */
SHORT
reserved3
;
/* Set to 0. */
SHORT
reserved4
;
/* Set to 0. */
SHORT
reserved4
;
/* Set to 0. */
SHORT
metricDataFormat
;
/* 0 for current format. */
SHORT
metricDataFormat
;
/* 0 for current format. */
USHORT
numberOfMetrics
;
/* Number of LongMetric entries in metric
USHORT
numberOf
Long
Metrics
;
/* Number of LongMetric entries in metric
* table. */
* table. */
public:
public:
DEFINE_SIZE_STATIC
(
36
);
DEFINE_SIZE_STATIC
(
36
);
...
...
src/hb-ot-hmtx-table.hh
浏览文件 @
be1cca27
...
@@ -63,7 +63,7 @@ struct _mtx
...
@@ -63,7 +63,7 @@ struct _mtx
}
}
public:
public:
LongMetric
long
Hor
Metric
[
VAR
];
/* Paired advance width and leading
LongMetric
longMetric
[
VAR
];
/* Paired advance width and leading
* bearing values for each glyph. The
* bearing values for each glyph. The
* value numOfHMetrics comes from
* value numOfHMetrics comes from
* the 'hhea' table. If the font is
* the 'hhea' table. If the font is
...
@@ -85,7 +85,7 @@ struct _mtx
...
@@ -85,7 +85,7 @@ struct _mtx
* font to vary the side bearing
* font to vary the side bearing
* values for each glyph. */
* values for each glyph. */
public:
public:
DEFINE_SIZE_ARRAY2
(
0
,
long
Hor
Metric
,
leadingBearingX
);
DEFINE_SIZE_ARRAY2
(
0
,
longMetric
,
leadingBearingX
);
};
};
struct
hmtx
:
_mtx
{
struct
hmtx
:
_mtx
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录