Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
f4c95149
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看板
提交
f4c95149
编写于
5月 17, 2009
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[HB] Simplify more arrays
上级
c9a7cbe9
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
100 addition
and
149 deletion
+100
-149
src/hb-ot-layout-open-private.h
src/hb-ot-layout-open-private.h
+97
-144
src/hb-ot-layout.cc
src/hb-ot-layout.cc
+3
-5
未找到文件。
src/hb-ot-layout-open-private.h
浏览文件 @
f4c95149
...
...
@@ -112,18 +112,12 @@
* List types
*/
#define DEFINE_LIST_ARRAY(Type, name) \
inline const Type##List& get_##name##_list (void) const { \
if (HB_UNLIKELY (!name##List)) return Null(Type##List); \
return *(const Type##List *)((const char*)this + name##List); \
}
#define DEFINE_LIST_INTERFACE(Type, name) \
inline const Type& get_##name (unsigned int i) const { \
return
get_##name##_list (
)[i]; \
return
(this+name##List
)[i]; \
} \
inline unsigned int get_##name##_count (void) const { \
return
get_##name##_list ().get_len ()
; \
return
(this+name##List).len
; \
}
/*
...
...
@@ -138,7 +132,7 @@
#define DEFINE_TAG_LIST_INTERFACE(Type, name) \
DEFINE_LIST_INTERFACE (Type, name); \
inline const Tag& get_##name##_tag (unsigned int i) const { \
return
get_##name##_list (
).get_tag (i); \
return
(this+name##List
).get_tag (i); \
}
#define DEFINE_TAG_FIND_INTERFACE(Type, name) \
...
...
@@ -544,16 +538,45 @@ ASSERT_SIZE (OpenTypeFontFile, 4);
* Script, ScriptList, LangSys, Feature, FeatureList, Lookup, LookupList
*/
typedef
struct
Record
{
template
<
typename
Type
>
struct
Record
{
Tag
tag
;
/* 4-byte Tag identifier */
Offset
offset
;
/* Offset from beginning of object holding
OffsetTo
<
Type
>
offset
;
/* Offset from beginning of object holding
* the Record */
}
ScriptRecord
,
LangSysRecord
,
FeatureRecord
;
ASSERT_SIZE
(
Record
,
6
);
};
template
<
typename
Type
>
struct
RecordListOf
:
ArrayOf
<
Record
<
Type
>
>
{
inline
const
Type
&
operator
[]
(
unsigned
int
i
)
const
{
if
(
HB_UNLIKELY
(
i
>=
this
->
len
))
return
Null
(
Type
);
return
this
+
this
->
array
[
i
].
offset
;
}
inline
const
Tag
&
get_tag
(
unsigned
int
i
)
const
{
if
(
HB_UNLIKELY
(
i
>=
this
->
len
))
return
Null
(
Tag
);
return
this
->
array
[
i
].
tag
;
}
};
struct
Script
;
typedef
Record
<
Script
>
ScriptRecord
;
ASSERT_SIZE
(
ScriptRecord
,
6
);
struct
LangSys
;
typedef
Record
<
LangSys
>
LangSysRecord
;
ASSERT_SIZE
(
LangSysRecord
,
6
);
struct
Feature
;
typedef
Record
<
Feature
>
FeatureRecord
;
ASSERT_SIZE
(
FeatureRecord
,
6
);
struct
LangSys
{
DEFINE_INDEX_ARRAY_INTERFACE
(
feature
);
inline
const
unsigned
int
get_feature_index
(
unsigned
int
i
)
const
{
return
featureIndex
[
i
];
}
inline
unsigned
int
get_feature_count
(
void
)
const
{
return
featureIndex
.
len
;
}
inline
const
bool
has_required_feature
(
void
)
const
{
return
reqFeatureIndex
!=
0xffff
;
...
...
@@ -562,41 +585,30 @@ struct LangSys {
inline
int
get_required_feature_index
(
void
)
const
{
if
(
reqFeatureIndex
==
0xffff
)
return
NO_INDEX
;
return
reqFeatureIndex
;;
return
reqFeatureIndex
;;
}
private:
/* Feature indices, in no particular order */
DEFINE_ARRAY_TYPE
(
USHORT
,
featureIndex
,
featureCount
);
private:
Offset
lookupOrder
;
/* = Null (reserved for an offset to a
* reordering table) */
USHORT
reqFeatureIndex
;
/* Index of a feature required for this
* language system--if no required features
* = 0xFFFF */
USHORT
featureCount
;
/* Number of FeatureIndex values for this
* language system--excludes the required
* feature */
USHORT
featureIndex
[];
/* Array of indices into the FeatureList--in
* arbitrary order. featureCount entires long */
ArrayOf
<
USHORT
>
featureIndex
;
/* Array of indices into the FeatureList */
};
ASSERT_SIZE_DATA
(
LangSys
,
6
,
"
\0\0\xFF\xFF
"
);
struct
Script
{
/* DEFINE_ARRAY_INTERFACE (LangSys, lang_sys) but handling defaultLangSys */
inline
const
LangSys
&
get_lang_sys
(
unsigned
int
i
)
const
{
if
(
i
==
NO_INDEX
)
return
get_default_lang_sys
();
return
(
*
this
)[
i
]
;
return
this
+
langSys
[
i
].
offset
;
}
inline
unsigned
int
get_lang_sys_count
(
void
)
const
{
return
this
->
get_len
()
;
return
langSys
.
len
;
}
inline
const
Tag
&
get_lang_sys_tag
(
unsigned
int
i
)
const
{
return
get_tag
(
i
)
;
return
langSys
[
i
].
tag
;
}
// LONGTERMTODO bsearch
...
...
@@ -609,74 +621,40 @@ struct Script {
return
this
+
defaultLangSys
;
}
private:
/* LangSys', in sorted alphabetical tag order */
DEFINE_RECORD_ARRAY_TYPE
(
LangSys
,
langSysRecord
,
langSysCount
);
private:
OffsetTo
<
LangSys
>
defaultLangSys
;
/* Offset to DefaultLangSys table--from
* beginning of Script table--may be Null */
USHORT
langSysCount
;
/* Number of LangSysRecords for this script--
* excluding the DefaultLangSys */
LangSysRecord
langSysRecord
[];
/* Array of LangSysRecords--listed
ArrayOf
<
LangSysRecord
>
langSys
;
/* Array of LangSysRecords--listed
* alphabetically by LangSysTag */
};
ASSERT_SIZE
(
Script
,
4
);
struct
ScriptList
{
friend
struct
GSUBGPOS
;
private:
/* Scripts, in sorted alphabetical tag order */
DEFINE_RECORD_ARRAY_TYPE
(
Script
,
scriptRecord
,
scriptCount
);
private:
USHORT
scriptCount
;
/* Number of ScriptRecords */
ScriptRecord
scriptRecord
[];
/* Array of ScriptRecords--listed alphabetically
* by ScriptTag */
};
typedef
RecordListOf
<
Script
>
ScriptList
;
ASSERT_SIZE
(
ScriptList
,
2
);
struct
Feature
{
DEFINE_INDEX_ARRAY_INTERFACE
(
lookup
);
/* get_lookup_count(), get_lookup_index(i) */
private:
/* LookupList indices, in no particular order */
DEFINE_ARRAY_TYPE
(
USHORT
,
lookupIndex
,
lookupCount
);
inline
const
unsigned
int
get_lookup_index
(
unsigned
int
i
)
const
{
return
lookupIndex
[
i
];
}
inline
unsigned
int
get_lookup_count
(
void
)
const
{
return
lookupIndex
.
len
;
}
/* TODO: implement get_feature_parameters() */
/* TODO: implement FeatureSize and other special features? */
private:
Offset
featureParams
;
/* Offset to Feature Parameters table (if one
* has been defined for the feature), relative
* to the beginning of the Feature Table; = Null
* if not required */
USHORT
lookupCount
;
/* Number of LookupList indices for this
* feature */
USHORT
lookupIndex
[];
/* Array of LookupList indices for this
* feature--zero-based (first lookup is
* LookupListIndex = 0) */
ArrayOf
<
USHORT
>
lookupIndex
;
/* Array of LookupList indices */
};
ASSERT_SIZE
(
Feature
,
4
);
struct
FeatureList
{
friend
struct
GSUBGPOS
;
private:
/* Feature indices, in sorted alphabetical tag order */
DEFINE_RECORD_ARRAY_TYPE
(
Feature
,
featureRecord
,
featureCount
);
private:
USHORT
featureCount
;
/* Number of FeatureRecords in this table */
FeatureRecord
featureRecord
[];
/* Array of FeatureRecords--zero-based (first
* feature has FeatureIndex = 0)--listed
* alphabetically by FeatureTag */
};
typedef
RecordListOf
<
Feature
>
FeatureList
;
ASSERT_SIZE
(
FeatureList
,
2
);
struct
LookupFlag
:
USHORT
{
...
...
@@ -697,7 +675,13 @@ ASSERT_SIZE (LookupSubTable, 2);
struct
Lookup
{
DEFINE_ARRAY_INTERFACE
(
LookupSubTable
,
subtable
);
/* get_subtable_count(), get_subtable(i) */
inline
const
LookupSubTable
&
get_subtable
(
unsigned
int
i
)
const
{
return
this
+
subTable
[
i
];
}
inline
unsigned
int
get_subtable_count
(
void
)
const
{
return
subTable
.
len
;
}
inline
bool
is_right_to_left
(
void
)
const
{
return
lookupFlag
&
LookupFlag
::
RightToLeft
;
}
inline
bool
ignore_base_glyphs
(
void
)
const
{
return
lookupFlag
&
LookupFlag
::
IgnoreBaseGlyphs
;
}
...
...
@@ -708,33 +692,22 @@ struct Lookup {
inline
unsigned
int
get_type
(
void
)
const
{
return
lookupType
;
}
inline
unsigned
int
get_flag
(
void
)
const
{
return
lookupFlag
;
}
private:
/* SubTables, in the desired order */
DEFINE_OFFSET_ARRAY_TYPE
(
LookupSubTable
,
subTableOffset
,
subTableCount
);
protected:
USHORT
lookupType
;
/* Different enumerations for GSUB and GPOS */
USHORT
lookupFlag
;
/* Lookup qualifiers */
USHORT
subTableCount
;
/* Number of SubTables for this lookup */
Offset
subTableOffset
[];
/* Array of offsets to SubTables-from
* beginning of Lookup table */
OffsetArrayOf
<
LookupSubTable
>
subTable
;
/* Array of SubTables */
};
ASSERT_SIZE
(
Lookup
,
6
);
struct
LookupList
{
friend
struct
GSUBGPOS
;
private:
/* Lookup indices, in sorted alphabetical tag order */
DEFINE_OFFSET_ARRAY_TYPE
(
Lookup
,
lookupOffset
,
lookupCount
);
private:
USHORT
lookupCount
;
/* Number of lookups in this table */
Offset
lookupOffset
[];
/* Array of offsets to Lookup tables--from
* beginning of LookupList--zero based (first
* lookup is Lookup index = 0) */
template
<
typename
Type
>
struct
OffsetListOf
:
OffsetArrayOf
<
Type
>
{
inline
const
Type
&
operator
[]
(
unsigned
int
i
)
const
{
if
(
HB_UNLIKELY
(
i
>=
this
->
len
))
return
Null
(
Type
);
return
this
+
this
->
array
[
i
];
}
};
typedef
OffsetListOf
<
Lookup
>
LookupList
;
ASSERT_SIZE
(
LookupList
,
2
);
/*
...
...
@@ -746,25 +719,22 @@ struct CoverageFormat1 {
friend
struct
Coverage
;
private:
/* GlyphIDs, in sorted numerical order */
DEFINE_ARRAY_TYPE
(
GlyphID
,
glyphArray
,
glyphCount
);
inline
unsigned
int
get_coverage
(
hb_codepoint_t
glyph_id
)
const
{
GlyphID
gid
;
if
(
HB_UNLIKELY
(
glyph_id
>
65535
))
return
NOT_COVERED
;
gid
=
glyph_id
;
// TODO: bsearch
for
(
unsigned
int
i
=
0
;
i
<
glyphCount
;
i
++
)
unsigned
int
num_glyphs
=
glyphArray
.
len
;
for
(
unsigned
int
i
=
0
;
i
<
num_glyphs
;
i
++
)
if
(
gid
==
glyphArray
[
i
])
return
i
;
return
NOT_COVERED
;
}
private:
USHORT
coverageFormat
;
/* Format identifier--format = 1 */
USHORT
glyphCount
;
/* Number of glyphs in the GlyphArray */
GlyphID
glyphArray
[]
;
/* Array of GlyphIDs--in numerical order */
ArrayOf
<
GlyphID
>
glyphArray
;
/* Array of GlyphIDs--in numerical order */
};
ASSERT_SIZE
(
CoverageFormat1
,
4
);
...
...
@@ -792,12 +762,9 @@ struct CoverageFormat2 {
friend
struct
Coverage
;
private:
/* CoverageRangeRecords, in sorted numerical start order */
DEFINE_ARRAY_TYPE
(
CoverageRangeRecord
,
rangeRecord
,
rangeCount
);
inline
unsigned
int
get_coverage
(
hb_codepoint_t
glyph_id
)
const
{
// TODO: bsearch
unsigned
int
count
=
range
Count
;
unsigned
int
count
=
range
Record
.
len
;
for
(
unsigned
int
i
=
0
;
i
<
count
;
i
++
)
{
int
coverage
=
rangeRecord
[
i
].
get_coverage
(
glyph_id
);
if
(
coverage
>=
0
)
...
...
@@ -806,12 +773,11 @@ struct CoverageFormat2 {
return
NOT_COVERED
;
}
private:
USHORT
coverageFormat
;
/* Format identifier--format = 2 */
USHORT
rangeCount
;
/* Number of CoverageRangeRecords */
CoverageRangeRecord
rangeRecord
[];
/* Array of glyph ranges--ordered by
* Start GlyphID. rangeCount entries
* long */
USHORT
coverageFormat
;
/* Format identifier--format = 2 */
ArrayOf
<
CoverageRangeRecord
>
rangeRecord
;
/* Array of glyph ranges--ordered by
* Start GlyphID. rangeCount entries
* long */
};
ASSERT_SIZE
(
CoverageFormat2
,
4
);
...
...
@@ -846,20 +812,16 @@ struct ClassDefFormat1 {
friend
struct
ClassDef
;
private:
/* Class Values, in sorted numerical order */
DEFINE_ARRAY_TYPE
(
USHORT
,
classValueArray
,
glyphCount
);
inline
hb_ot_layout_class_t
get_class
(
hb_codepoint_t
glyph_id
)
const
{
if
(
glyph_id
>=
startGlyph
&&
glyph_id
-
startGlyph
<
glyphCount
)
return
classValue
Array
[
glyph_id
-
startGlyph
];
if
(
(
unsigned
int
)
(
glyph_id
-
startGlyph
)
<
classValue
.
len
)
return
classValue
[
glyph_id
-
startGlyph
];
return
0
;
}
private:
USHORT
classFormat
;
/* Format identifier--format = 1 */
GlyphID
startGlyph
;
/* First GlyphID of the classValueArray */
USHORT
glyphCount
;
/* Size of the classValueArray */
USHORT
classValueArray
[];
/* Array of Class Values--one per GlyphID */
ArrayOf
<
USHORT
>
classValue
;
/* Array of Class Values--one per GlyphID */
};
ASSERT_SIZE
(
ClassDefFormat1
,
6
);
...
...
@@ -886,12 +848,9 @@ struct ClassDefFormat2 {
friend
struct
ClassDef
;
private:
/* ClassRangeRecords, in sorted numerical start order */
DEFINE_ARRAY_TYPE
(
ClassRangeRecord
,
rangeRecord
,
rangeCount
);
inline
hb_ot_layout_class_t
get_class
(
hb_codepoint_t
glyph_id
)
const
{
// TODO: bsearch
unsigned
int
count
=
range
Count
;
unsigned
int
count
=
range
Record
.
len
;
for
(
unsigned
int
i
=
0
;
i
<
count
;
i
++
)
{
int
classValue
=
rangeRecord
[
i
].
get_class
(
glyph_id
);
if
(
classValue
>
0
)
...
...
@@ -900,11 +859,10 @@ struct ClassDefFormat2 {
return
0
;
}
private:
USHORT
classFormat
;
/* Format identifier--format = 2 */
USHORT
rangeCount
;
/* Number of ClassRangeRecords */
ClassRangeRecord
rangeRecord
[];
/* Array of glyph ranges--ordered by
* Start GlyphID */
USHORT
classFormat
;
/* Format identifier--format = 2 */
ArrayOf
<
ClassRangeRecord
>
rangeRecord
;
/* Array of glyph ranges--ordered by
* Start GlyphID */
};
ASSERT_SIZE
(
ClassDefFormat2
,
4
);
...
...
@@ -978,20 +936,15 @@ struct GSUBGPOS {
DEFINE_TAG_FIND_INTERFACE
(
Script
,
script
);
/* find_script_index (), get_script_by_tag (tag) */
DEFINE_TAG_FIND_INTERFACE
(
Feature
,
feature
);
/* find_feature_index(), get_feature_by_tag(tag) */
private:
DEFINE_LIST_ARRAY
(
Script
,
script
);
DEFINE_LIST_ARRAY
(
Feature
,
feature
);
DEFINE_LIST_ARRAY
(
Lookup
,
lookup
);
private:
Fixed_Version
version
;
/* Version of the GSUB/GPOS table--initially set
* to 0x00010000 */
Offset
scriptList
;
/* Offset to ScriptList table--from beginning of
* GSUB/GPOS
table */
Offset
featureList
;
/* Offset to FeatureList table--from beginning of
* GSUB/GPOS
table */
Offset
lookupList
;
/* Offset to LookupList table--from beginning of
* GSUB/GPOS
table */
Offset
To
<
ScriptList
>
scriptList
;
/* ScriptList
table */
Offset
To
<
FeatureList
>
featureList
;
/* FeatureList
table */
Offset
To
<
LookupList
>
lookupList
;
/* LookupList
table */
};
ASSERT_SIZE
(
GSUBGPOS
,
10
);
...
...
src/hb-ot-layout.cc
浏览文件 @
f4c95149
...
...
@@ -257,8 +257,6 @@ hb_ot_layout_build_glyph_classes (hb_ot_layout_t *layout,
unsigned
char
*
klasses
,
uint16_t
count
)
{
int
i
;
if
(
G_UNLIKELY
(
!
count
||
!
glyphs
||
!
klasses
))
return
;
...
...
@@ -267,7 +265,7 @@ hb_ot_layout_build_glyph_classes (hb_ot_layout_t *layout,
layout
->
new_gdef
.
len
=
count
;
}
for
(
i
=
0
;
i
<
count
;
i
++
)
for
(
unsigned
int
i
=
0
;
i
<
count
;
i
++
)
hb_ot_layout_set_glyph_class
(
layout
,
glyphs
[
i
],
(
hb_ot_layout_glyph_class_t
)
klasses
[
i
]);
}
...
...
@@ -481,9 +479,9 @@ hb_ot_layout_language_find_feature (hb_ot_layout_t *layout,
ASSERT_STATIC
(
NO_INDEX
==
HB_OT_LAYOUT_NO_FEATURE_INDEX
);
const
GSUBGPOS
&
g
=
get_gsubgpos_table
(
layout
,
table_type
);
const
LangSys
&
l
=
g
.
get_script
(
script_index
).
get_lang_sys
(
language_index
);
unsigned
int
i
;
for
(
i
=
0
;
i
<
l
.
get_feature_count
();
i
++
)
{
unsigned
int
num_features
=
l
.
get_feature_count
();
for
(
unsigned
int
i
=
0
;
i
<
num_features
;
i
++
)
{
unsigned
int
f_index
=
l
.
get_feature_index
(
i
);
if
(
feature_tag
==
g
.
get_feature_tag
(
f_index
))
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录