Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
2130392d
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,发现更多精彩内容 >>
提交
2130392d
编写于
2月 16, 2018
作者:
G
Garret Rieger
提交者:
Behdad Esfahbod
2月 16, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[subset] Add support for updating reference gids in components to their new values.
上级
49544eb8
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
33 addition
and
5 deletion
+33
-5
src/hb-subset-glyf.cc
src/hb-subset-glyf.cc
+33
-5
未找到文件。
src/hb-subset-glyf.cc
浏览文件 @
2130392d
...
@@ -28,6 +28,7 @@
...
@@ -28,6 +28,7 @@
#include "hb-ot-glyf-table.hh"
#include "hb-ot-glyf-table.hh"
#include "hb-set.h"
#include "hb-set.h"
#include "hb-subset-glyf.hh"
#include "hb-subset-glyf.hh"
#include "hb-subset-plan.hh"
static
bool
static
bool
_calculate_glyf_and_loca_prime_size
(
const
OT
::
glyf
::
accelerator_t
&
glyf
,
_calculate_glyf_and_loca_prime_size
(
const
OT
::
glyf
::
accelerator_t
&
glyf
,
...
@@ -70,16 +71,41 @@ _write_loca_entry (unsigned int id, unsigned int offset, bool is_short, void *lo
...
@@ -70,16 +71,41 @@ _write_loca_entry (unsigned int id, unsigned int offset, bool is_short, void *lo
}
}
}
}
static
void
_update_components
(
hb_subset_plan_t
*
plan
,
char
*
glyph_start
,
unsigned
int
length
)
{
OT
::
glyf
::
CompositeGlyphHeader
::
Iterator
iterator
;
if
(
OT
::
glyf
::
CompositeGlyphHeader
::
get_iterator
(
glyph_start
,
length
,
&
iterator
))
{
do
{
hb_codepoint_t
new_gid
;
if
(
!
hb_subset_plan_new_gid_for_old_id
(
plan
,
iterator
.
current
->
glyphIndex
,
&
new_gid
))
continue
;
((
OT
::
glyf
::
CompositeGlyphHeader
*
)
iterator
.
current
)
->
glyphIndex
.
set
(
new_gid
);
}
while
(
iterator
.
move_to_next
());
}
}
static
bool
static
bool
_write_glyf_and_loca_prime
(
const
OT
::
glyf
::
accelerator_t
&
glyf
,
_write_glyf_and_loca_prime
(
hb_subset_plan_t
*
plan
,
const
OT
::
glyf
::
accelerator_t
&
glyf
,
const
char
*
glyf_data
,
const
char
*
glyf_data
,
hb_prealloced_array_t
<
hb_codepoint_t
>
&
glyph_ids
,
bool
use_short_loca
,
bool
use_short_loca
,
int
glyf_prime_size
,
int
glyf_prime_size
,
char
*
glyf_prime_data
/* OUT */
,
char
*
glyf_prime_data
/* OUT */
,
int
loca_prime_size
,
int
loca_prime_size
,
char
*
loca_prime_data
/* OUT */
)
char
*
loca_prime_data
/* OUT */
)
{
{
hb_prealloced_array_t
<
hb_codepoint_t
>
&
glyph_ids
=
plan
->
gids_to_retain_sorted
;
char
*
glyf_prime_data_next
=
glyf_prime_data
;
char
*
glyf_prime_data_next
=
glyf_prime_data
;
for
(
unsigned
int
i
=
0
;
i
<
glyph_ids
.
len
;
i
++
)
for
(
unsigned
int
i
=
0
;
i
<
glyph_ids
.
len
;
i
++
)
...
@@ -92,6 +118,7 @@ _write_glyf_and_loca_prime (const OT::glyf::accelerator_t &glyf,
...
@@ -92,6 +118,7 @@ _write_glyf_and_loca_prime (const OT::glyf::accelerator_t &glyf,
memcpy
(
glyf_prime_data_next
,
glyf_data
+
start_offset
,
length
);
memcpy
(
glyf_prime_data_next
,
glyf_data
+
start_offset
,
length
);
_write_loca_entry
(
i
,
glyf_prime_data_next
-
glyf_prime_data
,
use_short_loca
,
loca_prime_data
);
_write_loca_entry
(
i
,
glyf_prime_data_next
-
glyf_prime_data
,
use_short_loca
,
loca_prime_data
);
_update_components
(
plan
,
glyf_prime_data_next
,
end_offset
-
start_offset
);
glyf_prime_data_next
+=
length
;
glyf_prime_data_next
+=
length
;
}
}
...
@@ -104,7 +131,7 @@ _write_glyf_and_loca_prime (const OT::glyf::accelerator_t &glyf,
...
@@ -104,7 +131,7 @@ _write_glyf_and_loca_prime (const OT::glyf::accelerator_t &glyf,
static
bool
static
bool
_hb_subset_glyf_and_loca
(
const
OT
::
glyf
::
accelerator_t
&
glyf
,
_hb_subset_glyf_and_loca
(
const
OT
::
glyf
::
accelerator_t
&
glyf
,
const
char
*
glyf_data
,
const
char
*
glyf_data
,
hb_prealloced_array_t
<
hb_codepoint_t
>&
glyphs_to_retai
n
,
hb_subset_plan_t
*
pla
n
,
bool
*
use_short_loca
,
bool
*
use_short_loca
,
hb_blob_t
**
glyf_prime
/* OUT */
,
hb_blob_t
**
glyf_prime
/* OUT */
,
hb_blob_t
**
loca_prime
/* OUT */
)
hb_blob_t
**
loca_prime
/* OUT */
)
...
@@ -112,6 +139,7 @@ _hb_subset_glyf_and_loca (const OT::glyf::accelerator_t &glyf,
...
@@ -112,6 +139,7 @@ _hb_subset_glyf_and_loca (const OT::glyf::accelerator_t &glyf,
// TODO(grieger): Sanity check writes to make sure they are in-bounds.
// TODO(grieger): Sanity check writes to make sure they are in-bounds.
// TODO(grieger): Sanity check allocation size for the new table.
// TODO(grieger): Sanity check allocation size for the new table.
// TODO(grieger): Don't fail on bad offsets, just dump them.
// TODO(grieger): Don't fail on bad offsets, just dump them.
hb_prealloced_array_t
<
hb_codepoint_t
>
&
glyphs_to_retain
=
plan
->
gids_to_retain_sorted
;
unsigned
int
glyf_prime_size
;
unsigned
int
glyf_prime_size
;
unsigned
int
loca_prime_size
;
unsigned
int
loca_prime_size
;
...
@@ -126,7 +154,7 @@ _hb_subset_glyf_and_loca (const OT::glyf::accelerator_t &glyf,
...
@@ -126,7 +154,7 @@ _hb_subset_glyf_and_loca (const OT::glyf::accelerator_t &glyf,
char
*
glyf_prime_data
=
(
char
*
)
malloc
(
glyf_prime_size
);
char
*
glyf_prime_data
=
(
char
*
)
malloc
(
glyf_prime_size
);
char
*
loca_prime_data
=
(
char
*
)
malloc
(
loca_prime_size
);
char
*
loca_prime_data
=
(
char
*
)
malloc
(
loca_prime_size
);
if
(
unlikely
(
!
_write_glyf_and_loca_prime
(
glyf
,
glyf_data
,
glyphs_to_retain
,
if
(
unlikely
(
!
_write_glyf_and_loca_prime
(
plan
,
glyf
,
glyf_data
,
*
use_short_loca
,
*
use_short_loca
,
glyf_prime_size
,
glyf_prime_data
,
glyf_prime_size
,
glyf_prime_data
,
loca_prime_size
,
loca_prime_data
)))
{
loca_prime_size
,
loca_prime_data
)))
{
...
@@ -168,7 +196,7 @@ hb_subset_glyf_and_loca (hb_subset_plan_t *plan,
...
@@ -168,7 +196,7 @@ hb_subset_glyf_and_loca (hb_subset_plan_t *plan,
glyf
.
init
(
plan
->
source
);
glyf
.
init
(
plan
->
source
);
bool
result
=
_hb_subset_glyf_and_loca
(
glyf
,
bool
result
=
_hb_subset_glyf_and_loca
(
glyf
,
glyf_data
,
glyf_data
,
plan
->
gids_to_retain_sorted
,
plan
,
use_short_loca
,
use_short_loca
,
glyf_prime
,
glyf_prime
,
loca_prime
);
loca_prime
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录