Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
4c44d830
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看板
提交
4c44d830
编写于
5月 19, 2009
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[HB] Indentation
上级
d18fd8e3
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
284 addition
and
231 deletion
+284
-231
src/hb-ot-layout-gpos-private.h
src/hb-ot-layout-gpos-private.h
+142
-111
src/hb-ot-layout-gsub-private.h
src/hb-ot-layout-gsub-private.h
+142
-120
未找到文件。
src/hb-ot-layout-gpos-private.h
浏览文件 @
4c44d830
...
...
@@ -65,9 +65,10 @@ struct ValueRecord {
};
#endif
struct
ValueFormat
:
USHORT
{
enum
{
struct
ValueFormat
:
USHORT
{
enum
{
xPlacement
=
0x0001
,
/* Includes horizontal adjustment for placement */
yPlacement
=
0x0002
,
/* Includes vertical adjustment for placement */
xAdvance
=
0x0004
,
/* Includes horizontal adjustment for advance */
...
...
@@ -79,7 +80,8 @@ struct ValueFormat : USHORT {
reserved
=
0xF000
,
/* For future use */
};
inline
unsigned
int
get_len
()
const
{
inline
unsigned
int
get_len
()
const
{
return
_hb_popcount32
((
unsigned
int
)
*
this
);
}
...
...
@@ -136,8 +138,8 @@ struct ValueFormat : USHORT {
ASSERT_SIZE
(
ValueFormat
,
2
);
struct
AnchorFormat1
{
struct
AnchorFormat1
{
friend
struct
Anchor
;
private:
...
...
@@ -155,8 +157,8 @@ struct AnchorFormat1 {
};
ASSERT_SIZE
(
AnchorFormat1
,
6
);
struct
AnchorFormat2
{
struct
AnchorFormat2
{
friend
struct
Anchor
;
private:
...
...
@@ -176,8 +178,8 @@ struct AnchorFormat2 {
};
ASSERT_SIZE
(
AnchorFormat2
,
8
);
struct
AnchorFormat3
{
struct
AnchorFormat3
{
friend
struct
Anchor
;
private:
...
...
@@ -204,8 +206,8 @@ struct AnchorFormat3 {
};
ASSERT_SIZE
(
AnchorFormat3
,
10
);
struct
Anchor
{
struct
Anchor
{
inline
void
get_anchor
(
hb_ot_layout_t
*
layout
,
hb_codepoint_t
glyph_id
,
hb_position_t
*
x
,
hb_position_t
*
y
)
const
{
...
...
@@ -229,7 +231,8 @@ struct Anchor {
ASSERT_SIZE
(
Anchor
,
2
);
struct
MarkRecord
{
struct
MarkRecord
{
/* TODO */
private:
...
...
@@ -240,7 +243,8 @@ struct MarkRecord {
};
ASSERT_SIZE
(
MarkRecord
,
4
);
struct
MarkArray
{
struct
MarkArray
{
/* TODO */
private:
...
...
@@ -252,8 +256,8 @@ ASSERT_SIZE (MarkArray, 2);
/* Lookups */
struct
SinglePosFormat1
{
struct
SinglePosFormat1
{
friend
struct
SinglePos
;
private:
...
...
@@ -280,8 +284,8 @@ struct SinglePosFormat1 {
};
ASSERT_SIZE
(
SinglePosFormat1
,
6
);
struct
SinglePosFormat2
{
struct
SinglePosFormat2
{
friend
struct
SinglePos
;
private:
...
...
@@ -313,8 +317,8 @@ struct SinglePosFormat2 {
};
ASSERT_SIZE
(
SinglePosFormat2
,
8
);
struct
SinglePos
{
struct
SinglePos
{
friend
struct
PosLookupSubTable
;
private:
...
...
@@ -338,8 +342,8 @@ struct SinglePos {
ASSERT_SIZE
(
SinglePos
,
2
);
struct
PairValueRecord
{
struct
PairValueRecord
{
friend
struct
PairPosFormat1
;
private:
...
...
@@ -351,19 +355,10 @@ struct PairValueRecord {
};
ASSERT_SIZE
(
PairValueRecord
,
2
);
struct
PairSet
{
struct
PairSet
{
friend
struct
PairPosFormat1
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
,
ValueFormat
&
f1
,
ValueFormat
&
f2
,
unsigned
int
next_pos
)
const
{
return
true
;
}
private:
USHORT
len
;
/* Number of PairValueRecords */
/* XXX */
...
...
@@ -373,8 +368,8 @@ struct PairSet {
};
ASSERT_SIZE
(
PairSet
,
2
);
struct
PairPosFormat1
{
struct
PairPosFormat1
{
friend
struct
PairPos
;
private:
...
...
@@ -389,7 +384,8 @@ struct PairPosFormat1 {
return
false
;
unsigned
int
j
=
buffer
->
in_pos
+
1
;
while
(
!
_hb_ot_layout_check_glyph_property
(
layout
,
IN_ITEM
(
j
),
lookup_flag
,
&
property
))
{
while
(
!
_hb_ot_layout_check_glyph_property
(
layout
,
IN_ITEM
(
j
),
lookup_flag
,
&
property
))
{
if
(
HB_UNLIKELY
(
j
==
end
))
return
false
;
j
++
;
...
...
@@ -403,8 +399,10 @@ struct PairPosFormat1 {
unsigned
int
count
=
pair_set
.
len
;
const
PairValueRecord
*
record
=
pair_set
.
array
;
for
(
unsigned
int
i
=
0
;
i
<
count
;
i
++
)
{
if
(
IN_GLYPH
(
j
)
==
record
->
secondGlyph
)
{
for
(
unsigned
int
i
=
0
;
i
<
count
;
i
++
)
{
if
(
IN_GLYPH
(
j
)
==
record
->
secondGlyph
)
{
valueFormat1
.
apply_value
(
layout
,
(
const
char
*
)
this
,
record
->
values
,
CURPOSITION
());
valueFormat2
.
apply_value
(
layout
,
(
const
char
*
)
this
,
record
->
values
+
len1
,
POSITION
(
j
));
if
(
len2
)
...
...
@@ -435,8 +433,8 @@ struct PairPosFormat1 {
};
ASSERT_SIZE
(
PairPosFormat1
,
10
);
struct
PairPosFormat2
{
struct
PairPosFormat2
{
friend
struct
PairPos
;
private:
...
...
@@ -451,7 +449,8 @@ struct PairPosFormat2 {
return
false
;
unsigned
int
j
=
buffer
->
in_pos
+
1
;
while
(
!
_hb_ot_layout_check_glyph_property
(
layout
,
IN_ITEM
(
j
),
lookup_flag
,
&
property
))
{
while
(
!
_hb_ot_layout_check_glyph_property
(
layout
,
IN_ITEM
(
j
),
lookup_flag
,
&
property
))
{
if
(
HB_UNLIKELY
(
j
==
end
))
return
false
;
j
++
;
...
...
@@ -507,13 +506,14 @@ struct PairPosFormat2 {
};
ASSERT_SIZE
(
PairPosFormat2
,
16
);
struct
PairPos
{
struct
PairPos
{
friend
struct
PosLookupSubTable
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
apply
(
APPLY_ARG
);
case
2
:
return
u
.
format2
->
apply
(
APPLY_ARG
);
...
...
@@ -531,7 +531,8 @@ struct PairPos {
ASSERT_SIZE
(
PairPos
,
2
);
struct
EntryExitRecord
{
struct
EntryExitRecord
{
OffsetTo
<
Anchor
>
entryAnchor
;
/* Offset to EntryAnchor table--from
* beginning of CursivePos
...
...
@@ -543,8 +544,8 @@ struct EntryExitRecord {
};
ASSERT_SIZE
(
EntryExitRecord
,
4
);
struct
CursivePosFormat1
{
struct
CursivePosFormat1
{
friend
struct
CursivePos
;
private:
...
...
@@ -729,13 +730,14 @@ struct CursivePosFormat1 {
};
ASSERT_SIZE
(
CursivePosFormat1
,
6
);
struct
CursivePos
{
struct
CursivePos
{
friend
struct
PosLookupSubTable
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
apply
(
APPLY_ARG
);
default:
return
false
;
...
...
@@ -751,7 +753,8 @@ struct CursivePos {
ASSERT_SIZE
(
CursivePos
,
2
);
struct
BaseRecord
{
struct
BaseRecord
{
/* TODO */
private:
...
...
@@ -762,7 +765,8 @@ struct BaseRecord {
};
ASSERT_SIZE
(
BaseRecord
,
0
);
struct
BaseArray
{
struct
BaseArray
{
/* TODO */
private:
...
...
@@ -772,12 +776,13 @@ struct BaseArray {
};
ASSERT_SIZE
(
BaseArray
,
2
);
struct
MarkBasePosFormat1
{
struct
MarkBasePosFormat1
{
friend
struct
MarkBasePos
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
/* TODO */
return
false
;
}
...
...
@@ -797,13 +802,14 @@ struct MarkBasePosFormat1 {
};
ASSERT_SIZE
(
MarkBasePosFormat1
,
12
);
struct
MarkBasePos
{
struct
MarkBasePos
{
friend
struct
PosLookupSubTable
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
apply
(
APPLY_ARG
);
default:
return
false
;
...
...
@@ -819,7 +825,8 @@ struct MarkBasePos {
ASSERT_SIZE
(
MarkBasePos
,
2
);
struct
ComponentRecord
{
struct
ComponentRecord
{
/* TODO */
private:
...
...
@@ -833,7 +840,8 @@ struct ComponentRecord {
};
ASSERT_SIZE
(
ComponentRecord
,
0
);
struct
LigatureAttach
{
struct
LigatureAttach
{
/* TODO */
private:
...
...
@@ -846,7 +854,8 @@ struct LigatureAttach {
};
ASSERT_SIZE
(
LigatureAttach
,
2
);
struct
LigatureArray
{
struct
LigatureArray
{
/* TODO */
private:
...
...
@@ -857,12 +866,13 @@ struct LigatureArray {
};
ASSERT_SIZE
(
LigatureArray
,
2
);
struct
MarkLigPosFormat1
{
struct
MarkLigPosFormat1
{
friend
struct
MarkLigPos
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
/* TODO */
return
false
;
}
...
...
@@ -882,13 +892,14 @@ struct MarkLigPosFormat1 {
};
ASSERT_SIZE
(
MarkLigPosFormat1
,
12
);
struct
MarkLigPos
{
struct
MarkLigPos
{
friend
struct
PosLookupSubTable
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
apply
(
APPLY_ARG
);
default:
return
false
;
...
...
@@ -904,7 +915,8 @@ struct MarkLigPos {
ASSERT_SIZE
(
MarkLigPos
,
2
);
struct
Mark2Record
{
struct
Mark2Record
{
/* TODO */
private:
...
...
@@ -914,7 +926,8 @@ struct Mark2Record {
* Mark2Array table--zero--based array */
};
struct
Mark2Array
{
struct
Mark2Array
{
/* TODO */
private:
...
...
@@ -924,12 +937,13 @@ struct Mark2Array {
};
ASSERT_SIZE
(
Mark2Array
,
2
);
struct
MarkMarkPosFormat1
{
struct
MarkMarkPosFormat1
{
friend
struct
MarkMarkPos
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
/* TODO */
return
false
;
}
...
...
@@ -949,13 +963,14 @@ struct MarkMarkPosFormat1 {
};
ASSERT_SIZE
(
MarkMarkPosFormat1
,
10
);
struct
MarkMarkPos
{
struct
MarkMarkPos
{
friend
struct
PosLookupSubTable
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
apply
(
APPLY_ARG
);
default:
return
false
;
...
...
@@ -973,25 +988,27 @@ ASSERT_SIZE (MarkMarkPos, 2);
static
inline
bool
position_lookup
(
APPLY_ARG_DEF
,
unsigned
int
lookup_index
);
struct
ContextPos
:
Context
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
struct
ContextPos
:
Context
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
return
Context
::
apply
(
APPLY_ARG
,
position_lookup
);
}
};
ASSERT_SIZE
(
ContextPos
,
2
);
struct
ChainContextPos
:
ChainContext
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
struct
ChainContextPos
:
ChainContext
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
return
ChainContext
::
apply
(
APPLY_ARG
,
position_lookup
);
}
};
ASSERT_SIZE
(
ChainContextPos
,
2
);
struct
ExtensionPosFormat1
{
struct
ExtensionPosFormat1
{
friend
struct
ExtensionPos
;
private:
...
...
@@ -1011,21 +1028,23 @@ struct ExtensionPosFormat1 {
};
ASSERT_SIZE
(
ExtensionPosFormat1
,
8
);
struct
ExtensionPos
{
struct
ExtensionPos
{
friend
struct
PosLookup
;
friend
struct
PosLookupSubTable
;
private:
inline
unsigned
int
get_type
(
void
)
const
{
inline
unsigned
int
get_type
(
void
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
get_type
();
default:
return
0
;
}
}
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
apply
(
APPLY_ARG
);
default:
return
false
;
...
...
@@ -1058,12 +1077,12 @@ enum {
};
struct
PosLookupSubTable
{
struct
PosLookupSubTable
{
friend
struct
PosLookup
;
inline
bool
apply
(
APPLY_ARG_DEF
,
unsigned
int
lookup_type
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
,
unsigned
int
lookup_type
)
const
{
switch
(
lookup_type
)
{
case
GPOS_Single
:
return
u
.
single
->
apply
(
APPLY_ARG
);
case
GPOS_Pair
:
return
u
.
pair
->
apply
(
APPLY_ARG
);
...
...
@@ -1095,18 +1114,21 @@ struct PosLookupSubTable {
ASSERT_SIZE
(
PosLookupSubTable
,
2
);
struct
PosLookup
:
Lookup
{
inline
const
PosLookupSubTable
&
get_subtable
(
unsigned
int
i
)
const
{
struct
PosLookup
:
Lookup
{
inline
const
PosLookupSubTable
&
get_subtable
(
unsigned
int
i
)
const
{
return
(
const
PosLookupSubTable
&
)
Lookup
::
get_subtable
(
i
);
}
/* Like get_type(), but looks through extension lookups.
* Never returns Extension */
inline
unsigned
int
get_effective_type
(
void
)
const
{
inline
unsigned
int
get_effective_type
(
void
)
const
{
unsigned
int
type
=
get_type
();
if
(
HB_UNLIKELY
(
type
==
GPOS_Extension
))
{
if
(
HB_UNLIKELY
(
type
==
GPOS_Extension
))
{
unsigned
int
count
=
get_subtable_count
();
type
=
get_subtable
(
0
).
u
.
extension
->
get_type
();
/* The spec says all subtables should have the same type.
...
...
@@ -1123,7 +1145,8 @@ struct PosLookup : Lookup {
hb_buffer_t
*
buffer
,
unsigned
int
context_length
,
unsigned
int
nesting_level_left
,
unsigned
int
property
)
const
{
unsigned
int
property
)
const
{
unsigned
int
lookup_type
=
get_type
();
unsigned
int
lookup_flag
=
get_flag
();
...
...
@@ -1134,8 +1157,8 @@ struct PosLookup : Lookup {
return
false
;
}
inline
bool
apply_once
(
hb_ot_layout_t
*
layout
,
hb_buffer_t
*
buffer
)
const
{
inline
bool
apply_once
(
hb_ot_layout_t
*
layout
,
hb_buffer_t
*
buffer
)
const
{
unsigned
int
lookup_flag
=
get_flag
();
unsigned
int
property
;
...
...
@@ -1147,8 +1170,8 @@ struct PosLookup : Lookup {
bool
apply_string
(
hb_ot_layout_t
*
layout
,
hb_buffer_t
*
buffer
,
hb_ot_layout_feature_mask_t
mask
)
const
{
hb_ot_layout_feature_mask_t
mask
)
const
{
bool
ret
=
false
;
if
(
HB_UNLIKELY
(
!
buffer
->
in_length
))
...
...
@@ -1157,13 +1180,16 @@ struct PosLookup : Lookup {
layout
->
gpos_info
.
last
=
0xFFFF
;
/* no last valid glyph for cursive pos. */
buffer
->
in_pos
=
0
;
while
(
buffer
->
in_pos
<
buffer
->
in_length
)
{
while
(
buffer
->
in_pos
<
buffer
->
in_length
)
{
bool
done
;
if
(
~
IN_PROPERTIES
(
buffer
->
in_pos
)
&
mask
)
{
if
(
~
IN_PROPERTIES
(
buffer
->
in_pos
)
&
mask
)
{
done
=
apply_once
(
layout
,
buffer
);
ret
|=
done
;
}
else
{
}
else
{
done
=
false
;
/* Contrary to properties defined in GDEF, user-defined properties
will always stop a possible cursive positioning. */
...
...
@@ -1184,20 +1210,23 @@ ASSERT_SIZE (PosLookup, 6);
* GPOS
*/
struct
GPOS
:
GSUBGPOS
{
struct
GPOS
:
GSUBGPOS
{
static
const
hb_tag_t
Tag
=
HB_TAG
(
'G'
,
'P'
,
'O'
,
'S'
);
STATIC_DEFINE_GET_FOR_DATA
(
GPOS
);
/* XXX check version here? */
inline
const
PosLookup
&
get_lookup
(
unsigned
int
i
)
const
{
return
(
PosLookup
&
)(((
GSUBGPOS
*
)
this
)
->
get_lookup
(
i
));
inline
const
PosLookup
&
get_lookup
(
unsigned
int
i
)
const
{
return
(
const
PosLookup
&
)
GSUBGPOS
::
get_lookup
(
i
);
}
inline
bool
position_lookup
(
hb_ot_layout_t
*
layout
,
hb_buffer_t
*
buffer
,
unsigned
int
lookup_index
,
hb_ot_layout_feature_mask_t
mask
)
const
{
hb_ot_layout_feature_mask_t
mask
)
const
{
return
get_lookup
(
lookup_index
).
apply_string
(
layout
,
buffer
,
mask
);
}
...
...
@@ -1207,7 +1236,8 @@ ASSERT_SIZE (GPOS, 10);
/* Out-of-class implementation for methods recursing */
inline
bool
ExtensionPosFormat1
::
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
ExtensionPosFormat1
::
apply
(
APPLY_ARG_DEF
)
const
{
unsigned
int
lookup_type
=
get_type
();
if
(
HB_UNLIKELY
(
lookup_type
==
GPOS_Extension
))
...
...
@@ -1216,7 +1246,8 @@ inline bool ExtensionPosFormat1::apply (APPLY_ARG_DEF) const {
return
((
PosLookupSubTable
&
)
*
(((
char
*
)
this
)
+
get_offset
())).
apply
(
APPLY_ARG
,
lookup_type
);
}
static
inline
bool
position_lookup
(
APPLY_ARG_DEF
,
unsigned
int
lookup_index
)
{
static
inline
bool
position_lookup
(
APPLY_ARG_DEF
,
unsigned
int
lookup_index
)
{
const
GPOS
&
gpos
=
*
(
layout
->
gpos
);
const
PosLookup
&
l
=
gpos
.
get_lookup
(
lookup_index
);
...
...
src/hb-ot-layout-gsub-private.h
浏览文件 @
4c44d830
...
...
@@ -40,19 +40,27 @@ _hb_buffer_add_output_glyph_ids( HB_Buffer buffer,
HB_UShort
ligID
);
struct
SingleSubstFormat1
{
struct
SingleSubstFormat1
{
friend
struct
SingleSubst
;
private:
inline
bool
get_substitute
(
hb_codepoint_t
&
glyph_id
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
hb_codepoint_t
glyph_id
=
IN_CURGLYPH
();
unsigned
int
index
=
(
this
+
coverage
)
(
glyph_id
);
if
(
HB_LIKELY
(
index
==
NOT_COVERED
))
return
false
;
glyph_id
+=
deltaGlyphID
;
_hb_buffer_replace_glyph
(
buffer
,
glyph_id
);
if
(
_hb_ot_layout_has_new_glyph_classes
(
layout
)
)
{
/* we inherit the old glyph class to the substituted glyph */
_hb_ot_layout_set_glyph_property
(
layout
,
glyph_id
,
property
);
}
return
true
;
}
...
...
@@ -67,14 +75,15 @@ struct SingleSubstFormat1 {
};
ASSERT_SIZE
(
SingleSubstFormat1
,
6
);
struct
SingleSubstFormat2
{
struct
SingleSubstFormat2
{
friend
struct
SingleSubst
;
private:
inline
bool
get_substitute
(
hb_codepoint_t
&
glyph_id
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
hb_codepoint_t
glyph_id
=
IN_CURGLYPH
();
unsigned
int
index
=
(
this
+
coverage
)
(
glyph_id
);
if
(
HB_LIKELY
(
index
==
NOT_COVERED
))
return
false
;
...
...
@@ -83,6 +92,14 @@ struct SingleSubstFormat2 {
return
false
;
glyph_id
=
substitute
[
index
];
_hb_buffer_replace_glyph
(
buffer
,
glyph_id
);
if
(
_hb_ot_layout_has_new_glyph_classes
(
layout
)
)
{
/* we inherit the old glyph class to the substituted glyph */
_hb_ot_layout_set_glyph_property
(
layout
,
glyph_id
,
property
);
}
return
true
;
}
...
...
@@ -97,38 +114,21 @@ struct SingleSubstFormat2 {
};
ASSERT_SIZE
(
SingleSubstFormat2
,
6
);
struct
SingleSubst
{
struct
SingleSubst
{
friend
struct
SubstLookupSubTable
;
private:
inline
bool
get_substitute
(
hb_codepoint_t
&
glyph_id
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
get_substitute
(
glyph_id
);
case
2
:
return
u
.
format2
->
get_substitute
(
glyph_id
);
case
1
:
return
u
.
format1
->
apply
(
APPLY_ARG
);
case
2
:
return
u
.
format2
->
apply
(
APPLY_ARG
);
default:
return
false
;
}
}
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
hb_codepoint_t
glyph_id
=
IN_CURGLYPH
();
if
(
!
get_substitute
(
glyph_id
))
return
false
;
_hb_buffer_replace_glyph
(
buffer
,
glyph_id
);
if
(
_hb_ot_layout_has_new_glyph_classes
(
layout
)
)
{
/* we inherit the old glyph class to the substituted glyph */
_hb_ot_layout_set_glyph_property
(
layout
,
glyph_id
,
property
);
}
return
true
;
}
private:
union
{
USHORT
format
;
/* Format identifier */
...
...
@@ -139,21 +139,21 @@ struct SingleSubst {
ASSERT_SIZE
(
SingleSubst
,
2
);
struct
Sequence
{
struct
Sequence
{
friend
struct
MultipleSubstFormat1
;
private:
inline
void
set_glyph_class
(
hb_ot_layout_t
*
layout
,
unsigned
int
property
)
const
{
inline
void
set_glyph_class
(
hb_ot_layout_t
*
layout
,
unsigned
int
property
)
const
{
unsigned
int
count
=
substitute
.
len
;
for
(
unsigned
int
n
=
0
;
n
<
count
;
n
++
)
_hb_ot_layout_set_glyph_property
(
layout
,
substitute
[
n
],
property
);
}
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
if
(
HB_UNLIKELY
(
!
substitute
.
len
))
return
false
;
...
...
@@ -180,13 +180,14 @@ struct Sequence {
};
ASSERT_SIZE
(
Sequence
,
2
);
struct
MultipleSubstFormat1
{
struct
MultipleSubstFormat1
{
friend
struct
MultipleSubst
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
unsigned
int
index
=
(
this
+
coverage
)
(
IN_CURGLYPH
());
if
(
HB_LIKELY
(
index
==
NOT_COVERED
))
...
...
@@ -206,13 +207,14 @@ struct MultipleSubstFormat1 {
};
ASSERT_SIZE
(
MultipleSubstFormat1
,
6
);
struct
MultipleSubst
{
struct
MultipleSubst
{
friend
struct
SubstLookupSubTable
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
apply
(
APPLY_ARG
);
default:
return
false
;
...
...
@@ -232,14 +234,14 @@ typedef ArrayOf<GlyphID> AlternateSet; /* Array of alternate GlyphIDs--in
* arbitrary order */
ASSERT_SIZE
(
AlternateSet
,
2
);
struct
AlternateSubstFormat1
{
struct
AlternateSubstFormat1
{
friend
struct
AlternateSubst
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
hb_codepoint_t
glyph_id
=
IN_CURGLYPH
();
unsigned
int
index
=
(
this
+
coverage
)
(
glyph_id
);
...
...
@@ -287,13 +289,14 @@ struct AlternateSubstFormat1 {
};
ASSERT_SIZE
(
AlternateSubstFormat1
,
6
);
struct
AlternateSubst
{
struct
AlternateSubst
{
friend
struct
SubstLookupSubTable
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
apply
(
APPLY_ARG
);
default:
return
false
;
...
...
@@ -309,21 +312,23 @@ struct AlternateSubst {
ASSERT_SIZE
(
AlternateSubst
,
2
);
struct
Ligature
{
struct
Ligature
{
friend
struct
LigatureSet
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
,
bool
is_mark
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
,
bool
is_mark
)
const
{
unsigned
int
i
,
j
;
unsigned
int
count
=
component
.
len
;
unsigned
int
end
=
MIN
(
buffer
->
in_length
,
buffer
->
in_pos
+
context_length
);
if
(
HB_UNLIKELY
(
buffer
->
in_pos
+
count
>
end
))
return
false
;
for
(
i
=
1
,
j
=
buffer
->
in_pos
+
1
;
i
<
count
;
i
++
,
j
++
)
{
while
(
!
_hb_ot_layout_check_glyph_property
(
layout
,
IN_ITEM
(
j
),
lookup_flag
,
&
property
))
{
for
(
i
=
1
,
j
=
buffer
->
in_pos
+
1
;
i
<
count
;
i
++
,
j
++
)
{
while
(
!
_hb_ot_layout_check_glyph_property
(
layout
,
IN_ITEM
(
j
),
lookup_flag
,
&
property
))
{
if
(
HB_UNLIKELY
(
j
+
count
-
i
==
end
))
return
false
;
j
++
;
...
...
@@ -387,16 +392,17 @@ struct Ligature {
};
ASSERT_SIZE
(
Ligature
,
4
);
struct
LigatureSet
{
struct
LigatureSet
{
friend
struct
LigatureSubstFormat1
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
,
bool
is_mark
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
,
bool
is_mark
)
const
{
unsigned
int
num_ligs
=
ligature
.
len
;
for
(
unsigned
int
i
=
0
;
i
<
num_ligs
;
i
++
)
{
for
(
unsigned
int
i
=
0
;
i
<
num_ligs
;
i
++
)
{
const
Ligature
&
lig
=
this
+
ligature
[
i
];
if
(
lig
.
apply
(
APPLY_ARG
,
is_mark
))
return
true
;
...
...
@@ -412,14 +418,14 @@ struct LigatureSet {
};
ASSERT_SIZE
(
LigatureSet
,
2
);
struct
LigatureSubstFormat1
{
struct
LigatureSubstFormat1
{
friend
struct
LigatureSubst
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
hb_codepoint_t
glyph_id
=
IN_CURGLYPH
();
bool
first_is_mark
=
(
property
==
HB_OT_LAYOUT_GLYPH_CLASS_MARK
||
...
...
@@ -444,13 +450,14 @@ struct LigatureSubstFormat1 {
};
ASSERT_SIZE
(
LigatureSubstFormat1
,
6
);
struct
LigatureSubst
{
struct
LigatureSubst
{
friend
struct
SubstLookupSubTable
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
apply
(
APPLY_ARG
);
default:
return
false
;
...
...
@@ -469,25 +476,27 @@ ASSERT_SIZE (LigatureSubst, 2);
static
inline
bool
substitute_lookup
(
APPLY_ARG_DEF
,
unsigned
int
lookup_index
);
struct
ContextSubst
:
Context
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
struct
ContextSubst
:
Context
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
return
Context
::
apply
(
APPLY_ARG
,
substitute_lookup
);
}
};
ASSERT_SIZE
(
ContextSubst
,
2
);
struct
ChainContextSubst
:
ChainContext
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
struct
ChainContextSubst
:
ChainContext
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
return
ChainContext
::
apply
(
APPLY_ARG
,
substitute_lookup
);
}
};
ASSERT_SIZE
(
ChainContextSubst
,
2
);
struct
ExtensionSubstFormat1
{
struct
ExtensionSubstFormat1
{
friend
struct
ExtensionSubst
;
private:
...
...
@@ -507,21 +516,23 @@ struct ExtensionSubstFormat1 {
};
ASSERT_SIZE
(
ExtensionSubstFormat1
,
8
);
struct
ExtensionSubst
{
struct
ExtensionSubst
{
friend
struct
SubstLookup
;
friend
struct
SubstLookupSubTable
;
private:
inline
unsigned
int
get_type
(
void
)
const
{
inline
unsigned
int
get_type
(
void
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
get_type
();
default:
return
0
;
}
}
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
apply
(
APPLY_ARG
);
default:
return
false
;
...
...
@@ -537,13 +548,13 @@ struct ExtensionSubst {
ASSERT_SIZE
(
ExtensionSubst
,
2
);
struct
ReverseChainSingleSubstFormat1
{
struct
ReverseChainSingleSubstFormat1
{
friend
struct
ReverseChainSingleSubst
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
if
(
HB_UNLIKELY
(
context_length
!=
NO_CONTEXT
))
return
false
;
/* No chaining to this type */
...
...
@@ -591,13 +602,14 @@ struct ReverseChainSingleSubstFormat1 {
};
ASSERT_SIZE
(
ReverseChainSingleSubstFormat1
,
10
);
struct
ReverseChainSingleSubst
{
struct
ReverseChainSingleSubst
{
friend
struct
SubstLookupSubTable
;
private:
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
)
const
{
switch
(
u
.
format
)
{
case
1
:
return
u
.
format1
->
apply
(
APPLY_ARG
);
default:
return
false
;
...
...
@@ -629,12 +641,12 @@ enum {
GSUB_ReverseChainSingle
=
8
,
};
struct
SubstLookupSubTable
{
struct
SubstLookupSubTable
{
friend
struct
SubstLookup
;
inline
bool
apply
(
APPLY_ARG_DEF
,
unsigned
int
lookup_type
)
const
{
inline
bool
apply
(
APPLY_ARG_DEF
,
unsigned
int
lookup_type
)
const
{
switch
(
lookup_type
)
{
case
GSUB_Single
:
return
u
.
single
->
apply
(
APPLY_ARG
);
case
GSUB_Multiple
:
return
u
.
multiple
->
apply
(
APPLY_ARG
);
...
...
@@ -664,18 +676,21 @@ struct SubstLookupSubTable {
ASSERT_SIZE
(
SubstLookupSubTable
,
2
);
struct
SubstLookup
:
Lookup
{
inline
const
SubstLookupSubTable
&
get_subtable
(
unsigned
int
i
)
const
{
struct
SubstLookup
:
Lookup
{
inline
const
SubstLookupSubTable
&
get_subtable
(
unsigned
int
i
)
const
{
return
(
const
SubstLookupSubTable
&
)
Lookup
::
get_subtable
(
i
);
}
/* Like get_type(), but looks through extension lookups.
* Never returns Extension */
inline
unsigned
int
get_effective_type
(
void
)
const
{
inline
unsigned
int
get_effective_type
(
void
)
const
{
unsigned
int
type
=
get_type
();
if
(
HB_UNLIKELY
(
type
==
GSUB_Extension
))
{
if
(
HB_UNLIKELY
(
type
==
GSUB_Extension
))
{
unsigned
int
count
=
get_subtable_count
();
type
=
get_subtable
(
0
).
u
.
extension
->
get_type
();
/* The spec says all subtables should have the same type.
...
...
@@ -688,18 +703,17 @@ struct SubstLookup : Lookup {
return
type
;
}
inline
bool
is_reverse
(
void
)
const
{
switch
(
get_effective_type
())
{
case
GSUB_ReverseChainSingle
:
return
true
;
default:
return
false
;
}
inline
bool
is_reverse
(
void
)
const
{
return
HB_UNLIKELY
(
get_effective_type
()
==
GSUB_ReverseChainSingle
);
}
inline
bool
apply_subtables
(
hb_ot_layout_t
*
layout
,
hb_buffer_t
*
buffer
,
unsigned
int
context_length
,
unsigned
int
nesting_level_left
,
unsigned
int
property
)
const
{
unsigned
int
property
)
const
{
unsigned
int
lookup_type
=
get_type
();
unsigned
int
lookup_flag
=
get_flag
();
...
...
@@ -710,8 +724,8 @@ struct SubstLookup : Lookup {
return
false
;
}
inline
bool
apply_once
(
hb_ot_layout_t
*
layout
,
hb_buffer_t
*
buffer
)
const
{
inline
bool
apply_once
(
hb_ot_layout_t
*
layout
,
hb_buffer_t
*
buffer
)
const
{
unsigned
int
lookup_flag
=
get_flag
();
unsigned
int
property
;
...
...
@@ -723,20 +737,20 @@ struct SubstLookup : Lookup {
bool
apply_string
(
hb_ot_layout_t
*
layout
,
hb_buffer_t
*
buffer
,
hb_ot_layout_feature_mask_t
mask
)
const
{
hb_ot_layout_feature_mask_t
mask
)
const
{
bool
ret
=
false
;
if
(
HB_UNLIKELY
(
!
buffer
->
in_length
))
return
false
;
if
(
HB_LIKELY
(
!
is_reverse
()))
{
if
(
HB_LIKELY
(
!
is_reverse
()))
{
/* in/out forward substitution */
_hb_buffer_clear_output
(
buffer
);
buffer
->
in_pos
=
0
;
while
(
buffer
->
in_pos
<
buffer
->
in_length
)
{
while
(
buffer
->
in_pos
<
buffer
->
in_length
)
{
if
((
~
IN_PROPERTIES
(
buffer
->
in_pos
)
&
mask
)
&&
apply_once
(
layout
,
buffer
))
ret
=
true
;
...
...
@@ -747,19 +761,22 @@ struct SubstLookup : Lookup {
if
(
ret
)
_hb_buffer_swap
(
buffer
);
}
else
{
}
else
{
/* in-place backward substitution */
buffer
->
in_pos
=
buffer
->
in_length
-
1
;
do
{
do
{
if
((
~
IN_PROPERTIES
(
buffer
->
in_pos
)
&
mask
)
&&
apply_once
(
layout
,
buffer
))
ret
=
true
;
else
buffer
->
in_pos
--
;
}
while
((
int
)
buffer
->
in_pos
>=
0
);
}
while
((
int
)
buffer
->
in_pos
>=
0
);
}
return
ret
;
...
...
@@ -772,20 +789,23 @@ ASSERT_SIZE (SubstLookup, 6);
* GSUB
*/
struct
GSUB
:
GSUBGPOS
{
struct
GSUB
:
GSUBGPOS
{
static
const
hb_tag_t
Tag
=
HB_TAG
(
'G'
,
'S'
,
'U'
,
'B'
);
STATIC_DEFINE_GET_FOR_DATA
(
GSUB
);
/* XXX check version here? */
inline
const
SubstLookup
&
get_lookup
(
unsigned
int
i
)
const
{
return
(
SubstLookup
&
)(((
GSUBGPOS
*
)
this
)
->
get_lookup
(
i
));
inline
const
SubstLookup
&
get_lookup
(
unsigned
int
i
)
const
{
return
(
const
SubstLookup
&
)
GSUBGPOS
::
get_lookup
(
i
);
}
inline
bool
substitute_lookup
(
hb_ot_layout_t
*
layout
,
hb_buffer_t
*
buffer
,
unsigned
int
lookup_index
,
hb_ot_layout_feature_mask_t
mask
)
const
{
hb_ot_layout_feature_mask_t
mask
)
const
{
return
get_lookup
(
lookup_index
).
apply_string
(
layout
,
buffer
,
mask
);
}
...
...
@@ -795,7 +815,8 @@ ASSERT_SIZE (GSUB, 10);
/* Out-of-class implementation for methods recursing */
inline
bool
ExtensionSubstFormat1
::
apply
(
APPLY_ARG_DEF
)
const
{
inline
bool
ExtensionSubstFormat1
::
apply
(
APPLY_ARG_DEF
)
const
{
unsigned
int
lookup_type
=
get_type
();
if
(
HB_UNLIKELY
(
lookup_type
==
GSUB_Extension
))
...
...
@@ -804,7 +825,8 @@ inline bool ExtensionSubstFormat1::apply (APPLY_ARG_DEF) const {
return
((
SubstLookupSubTable
&
)
*
(((
char
*
)
this
)
+
get_offset
())).
apply
(
APPLY_ARG
,
lookup_type
);
}
static
inline
bool
substitute_lookup
(
APPLY_ARG_DEF
,
unsigned
int
lookup_index
)
{
static
inline
bool
substitute_lookup
(
APPLY_ARG_DEF
,
unsigned
int
lookup_index
)
{
const
GSUB
&
gsub
=
*
(
layout
->
gsub
);
const
SubstLookup
&
l
=
gsub
.
get_lookup
(
lookup_index
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录