Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
5a2b0b38
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看板
提交
5a2b0b38
编写于
10月 08, 2010
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add hb-ot-map.cc
上级
ecc4550e
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
168 addition
and
127 deletion
+168
-127
src/Makefile.am
src/Makefile.am
+1
-0
src/hb-ot-map-private.hh
src/hb-ot-map-private.hh
+2
-127
src/hb-ot-map.cc
src/hb-ot-map.cc
+165
-0
未找到文件。
src/Makefile.am
浏览文件 @
5a2b0b38
...
...
@@ -47,6 +47,7 @@ HBSOURCES += \
hb-ot-layout-gsubgpos-private.hh
\
hb-ot-layout-gsub-private.hh
\
hb-ot-layout-private.hh
\
hb-ot-map.cc
\
hb-ot-map-private.hh
\
hb-ot-shape.cc
\
hb-ot-shape-private.hh
\
...
...
src/hb-ot-map-private.hh
浏览文件 @
5a2b0b38
...
...
@@ -116,134 +116,9 @@ struct hb_mask_allocator_t {
info
->
global
=
global
;
}
void
compile
(
hb_ot_shape_context_t
*
c
)
{
global_mask
=
0
;
lookup_count
[
0
]
=
lookup_count
[
1
]
=
0
;
if
(
!
feature_count
)
return
;
/* Fetch script/language indices for GSUB/GPOS. We need these later to skip
* features not available in either table and not waste precious bits for them. */
const
hb_tag_t
*
script_tags
;
hb_tag_t
language_tag
;
script_tags
=
hb_ot_tags_from_script
(
c
->
buffer
->
props
.
script
);
language_tag
=
hb_ot_tag_from_language
(
c
->
buffer
->
props
.
language
);
unsigned
int
script_index
[
2
],
language_index
[
2
];
for
(
unsigned
int
table_index
=
0
;
table_index
<
2
;
table_index
++
)
{
hb_tag_t
table_tag
=
table_tags
[
table_index
];
hb_ot_layout_table_choose_script
(
c
->
face
,
table_tag
,
script_tags
,
&
script_index
[
table_index
]);
hb_ot_layout_script_find_language
(
c
->
face
,
table_tag
,
script_index
[
table_index
],
language_tag
,
&
language_index
[
table_index
]);
}
/* Sort features and merge duplicates */
qsort
(
feature_infos
,
feature_count
,
sizeof
(
feature_infos
[
0
]),
(
hb_compare_func_t
)
feature_info_t
::
cmp
);
unsigned
int
j
=
0
;
for
(
unsigned
int
i
=
1
;
i
<
feature_count
;
i
++
)
if
(
feature_infos
[
i
].
tag
!=
feature_infos
[
j
].
tag
)
feature_infos
[
++
j
]
=
feature_infos
[
i
];
else
{
if
(
feature_infos
[
i
].
global
)
feature_infos
[
j
]
=
feature_infos
[
i
];
else
{
feature_infos
[
j
].
global
=
false
;
feature_infos
[
j
].
value
=
MAX
(
feature_infos
[
j
].
value
,
feature_infos
[
i
].
value
);
}
}
feature_count
=
j
+
1
;
/* Allocate bits now */
unsigned
int
next_bit
=
1
;
j
=
0
;
for
(
unsigned
int
i
=
0
;
i
<
feature_count
;
i
++
)
{
const
feature_info_t
*
info
=
&
feature_infos
[
i
];
unsigned
int
bits_needed
;
if
(
info
->
global
&&
info
->
value
==
1
)
/* Uses the global bit */
bits_needed
=
0
;
else
bits_needed
=
_hb_bit_storage
(
info
->
value
);
if
(
!
info
->
value
||
next_bit
+
bits_needed
>
8
*
sizeof
(
hb_mask_t
))
continue
;
/* Feature disabled, or not enough bits. */
bool
found
=
false
;
unsigned
int
feature_index
[
2
];
for
(
unsigned
int
table_index
=
0
;
table_index
<
2
;
table_index
++
)
found
|=
hb_ot_layout_language_find_feature
(
c
->
face
,
table_tags
[
table_index
],
script_index
[
table_index
],
language_index
[
table_index
],
info
->
tag
,
&
feature_index
[
table_index
]);
if
(
!
found
)
continue
;
feature_map_t
*
map
=
&
feature_maps
[
j
++
];
map
->
tag
=
info
->
tag
;
map
->
index
[
0
]
=
feature_index
[
0
];
map
->
index
[
1
]
=
feature_index
[
1
];
if
(
info
->
global
&&
info
->
value
==
1
)
{
/* Uses the global bit */
map
->
shift
=
0
;
map
->
mask
=
1
;
}
else
{
map
->
shift
=
next_bit
;
map
->
mask
=
(
1
<<
(
next_bit
+
bits_needed
))
-
(
1
<<
next_bit
);
next_bit
+=
bits_needed
;
if
(
info
->
global
)
global_mask
|=
map
->
mask
;
}
}
feature_count
=
j
;
for
(
unsigned
int
table_index
=
0
;
table_index
<
2
;
table_index
++
)
{
hb_tag_t
table_tag
=
table_tags
[
table_index
];
/* Collect lookup indices for features */
unsigned
int
required_feature_index
;
if
(
hb_ot_layout_language_get_required_feature_index
(
c
->
face
,
table_tag
,
script_index
[
table_index
],
language_index
[
table_index
],
&
required_feature_index
))
add_lookups
(
c
,
table_index
,
required_feature_index
,
1
);
for
(
unsigned
i
=
0
;
i
<
feature_count
;
i
++
)
add_lookups
(
c
,
table_index
,
feature_maps
[
i
].
index
[
table_index
],
feature_maps
[
i
].
mask
);
/* Sort lookups and merge duplicates */
qsort
(
lookup_maps
[
table_index
],
lookup_count
[
table_index
],
sizeof
(
lookup_maps
[
table_index
][
0
]),
(
hb_compare_func_t
)
lookup_map_t
::
cmp
);
if
(
lookup_count
[
table_index
])
{
unsigned
int
j
=
0
;
for
(
unsigned
int
i
=
1
;
i
<
lookup_count
[
table_index
];
i
++
)
if
(
lookup_maps
[
table_index
][
i
].
index
!=
lookup_maps
[
table_index
][
j
].
index
)
lookup_maps
[
table_index
][
++
j
]
=
lookup_maps
[
table_index
][
i
];
else
lookup_maps
[
table_index
][
j
].
mask
|=
lookup_maps
[
table_index
][
i
].
mask
;
j
++
;
lookup_count
[
table_index
]
=
j
;
}
}
}
HB_INTERNAL
void
compile
(
hb_ot_shape_context_t
*
c
);
hb_mask_t
get_global_mask
(
void
)
{
return
global_mask
;
}
hb_mask_t
get_global_mask
(
void
)
const
{
return
global_mask
;
}
hb_mask_t
get_mask
(
hb_tag_t
tag
,
unsigned
int
*
shift
)
const
{
const
feature_map_t
*
map
=
(
const
feature_map_t
*
)
bsearch
(
&
tag
,
feature_maps
,
feature_count
,
sizeof
(
feature_maps
[
0
]),
(
hb_compare_func_t
)
feature_map_t
::
cmp
);
...
...
src/hb-ot-map.cc
0 → 100644
浏览文件 @
5a2b0b38
/*
* Copyright (C) 2009,2010 Red Hat, Inc.
* Copyright (C) 2010 Google, Inc.
*
* This is part of HarfBuzz, a text shaping library.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* Red Hat Author(s): Behdad Esfahbod
* Google Author(s): Behdad Esfahbod
*/
#include "hb-ot-map-private.hh"
#include "hb-ot-shape-private.hh"
HB_BEGIN_DECLS
void
hb_mask_allocator_t
::
compile
(
hb_ot_shape_context_t
*
c
)
{
global_mask
=
0
;
lookup_count
[
0
]
=
lookup_count
[
1
]
=
0
;
if
(
!
feature_count
)
return
;
/* Fetch script/language indices for GSUB/GPOS. We need these later to skip
* features not available in either table and not waste precious bits for them. */
const
hb_tag_t
*
script_tags
;
hb_tag_t
language_tag
;
script_tags
=
hb_ot_tags_from_script
(
c
->
buffer
->
props
.
script
);
language_tag
=
hb_ot_tag_from_language
(
c
->
buffer
->
props
.
language
);
unsigned
int
script_index
[
2
],
language_index
[
2
];
for
(
unsigned
int
table_index
=
0
;
table_index
<
2
;
table_index
++
)
{
hb_tag_t
table_tag
=
table_tags
[
table_index
];
hb_ot_layout_table_choose_script
(
c
->
face
,
table_tag
,
script_tags
,
&
script_index
[
table_index
]);
hb_ot_layout_script_find_language
(
c
->
face
,
table_tag
,
script_index
[
table_index
],
language_tag
,
&
language_index
[
table_index
]);
}
/* Sort features and merge duplicates */
qsort
(
feature_infos
,
feature_count
,
sizeof
(
feature_infos
[
0
]),
(
hb_compare_func_t
)
feature_info_t
::
cmp
);
unsigned
int
j
=
0
;
for
(
unsigned
int
i
=
1
;
i
<
feature_count
;
i
++
)
if
(
feature_infos
[
i
].
tag
!=
feature_infos
[
j
].
tag
)
feature_infos
[
++
j
]
=
feature_infos
[
i
];
else
{
if
(
feature_infos
[
i
].
global
)
feature_infos
[
j
]
=
feature_infos
[
i
];
else
{
feature_infos
[
j
].
global
=
false
;
feature_infos
[
j
].
value
=
MAX
(
feature_infos
[
j
].
value
,
feature_infos
[
i
].
value
);
}
}
feature_count
=
j
+
1
;
/* Allocate bits now */
unsigned
int
next_bit
=
1
;
j
=
0
;
for
(
unsigned
int
i
=
0
;
i
<
feature_count
;
i
++
)
{
const
feature_info_t
*
info
=
&
feature_infos
[
i
];
unsigned
int
bits_needed
;
if
(
info
->
global
&&
info
->
value
==
1
)
/* Uses the global bit */
bits_needed
=
0
;
else
bits_needed
=
_hb_bit_storage
(
info
->
value
);
if
(
!
info
->
value
||
next_bit
+
bits_needed
>
8
*
sizeof
(
hb_mask_t
))
continue
;
/* Feature disabled, or not enough bits. */
bool
found
=
false
;
unsigned
int
feature_index
[
2
];
for
(
unsigned
int
table_index
=
0
;
table_index
<
2
;
table_index
++
)
found
|=
hb_ot_layout_language_find_feature
(
c
->
face
,
table_tags
[
table_index
],
script_index
[
table_index
],
language_index
[
table_index
],
info
->
tag
,
&
feature_index
[
table_index
]);
if
(
!
found
)
continue
;
feature_map_t
*
map
=
&
feature_maps
[
j
++
];
map
->
tag
=
info
->
tag
;
map
->
index
[
0
]
=
feature_index
[
0
];
map
->
index
[
1
]
=
feature_index
[
1
];
if
(
info
->
global
&&
info
->
value
==
1
)
{
/* Uses the global bit */
map
->
shift
=
0
;
map
->
mask
=
1
;
}
else
{
map
->
shift
=
next_bit
;
map
->
mask
=
(
1
<<
(
next_bit
+
bits_needed
))
-
(
1
<<
next_bit
);
next_bit
+=
bits_needed
;
if
(
info
->
global
)
global_mask
|=
map
->
mask
;
}
}
feature_count
=
j
;
for
(
unsigned
int
table_index
=
0
;
table_index
<
2
;
table_index
++
)
{
hb_tag_t
table_tag
=
table_tags
[
table_index
];
/* Collect lookup indices for features */
unsigned
int
required_feature_index
;
if
(
hb_ot_layout_language_get_required_feature_index
(
c
->
face
,
table_tag
,
script_index
[
table_index
],
language_index
[
table_index
],
&
required_feature_index
))
add_lookups
(
c
,
table_index
,
required_feature_index
,
1
);
for
(
unsigned
i
=
0
;
i
<
feature_count
;
i
++
)
add_lookups
(
c
,
table_index
,
feature_maps
[
i
].
index
[
table_index
],
feature_maps
[
i
].
mask
);
/* Sort lookups and merge duplicates */
qsort
(
lookup_maps
[
table_index
],
lookup_count
[
table_index
],
sizeof
(
lookup_maps
[
table_index
][
0
]),
(
hb_compare_func_t
)
lookup_map_t
::
cmp
);
if
(
lookup_count
[
table_index
])
{
unsigned
int
j
=
0
;
for
(
unsigned
int
i
=
1
;
i
<
lookup_count
[
table_index
];
i
++
)
if
(
lookup_maps
[
table_index
][
i
].
index
!=
lookup_maps
[
table_index
][
j
].
index
)
lookup_maps
[
table_index
][
++
j
]
=
lookup_maps
[
table_index
][
i
];
else
lookup_maps
[
table_index
][
j
].
mask
|=
lookup_maps
[
table_index
][
i
].
mask
;
j
++
;
lookup_count
[
table_index
]
=
j
;
}
}
}
HB_END_DECLS
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录