Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
11138ccf
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看板
提交
11138ccf
编写于
4月 05, 2012
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add normalize mode
In preparation for Hangul shaper.
上级
6769f21d
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
102 addition
and
61 deletion
+102
-61
src/Makefile.am
src/Makefile.am
+1
-0
src/hb-ot-layout-common-private.hh
src/hb-ot-layout-common-private.hh
+0
-1
src/hb-ot-shape-complex-arabic.cc
src/hb-ot-shape-complex-arabic.cc
+3
-3
src/hb-ot-shape-complex-indic.cc
src/hb-ot-shape-complex-indic.cc
+3
-3
src/hb-ot-shape-complex-misc.cc
src/hb-ot-shape-complex-misc.cc
+4
-4
src/hb-ot-shape-complex-private.hh
src/hb-ot-shape-complex-private.hh
+7
-6
src/hb-ot-shape-normalize-private.hh
src/hb-ot-shape-normalize-private.hh
+46
-0
src/hb-ot-shape-normalize.cc
src/hb-ot-shape-normalize.cc
+35
-38
src/hb-ot-shape-private.hh
src/hb-ot-shape-private.hh
+2
-5
src/hb-ot-shape.cc
src/hb-ot-shape.cc
+1
-1
未找到文件。
src/Makefile.am
浏览文件 @
11138ccf
...
@@ -70,6 +70,7 @@ HBSOURCES += \
...
@@ -70,6 +70,7 @@ HBSOURCES += \
hb-ot-shape-complex-indic-table.hh
\
hb-ot-shape-complex-indic-table.hh
\
hb-ot-shape-complex-misc.cc
\
hb-ot-shape-complex-misc.cc
\
hb-ot-shape-complex-private.hh
\
hb-ot-shape-complex-private.hh
\
hb-ot-shape-normalize-private.hh
\
hb-ot-shape-normalize.cc
\
hb-ot-shape-normalize.cc
\
hb-ot-shape-private.hh
\
hb-ot-shape-private.hh
\
$(NULL)
$(NULL)
...
...
src/hb-ot-layout-common-private.hh
浏览文件 @
11138ccf
...
@@ -30,7 +30,6 @@
...
@@ -30,7 +30,6 @@
#define HB_OT_LAYOUT_COMMON_PRIVATE_HH
#define HB_OT_LAYOUT_COMMON_PRIVATE_HH
#include "hb-ot-layout-private.hh"
#include "hb-ot-layout-private.hh"
#include "hb-open-type-private.hh"
#include "hb-open-type-private.hh"
...
...
src/hb-ot-shape-complex-arabic.cc
浏览文件 @
11138ccf
...
@@ -183,10 +183,10 @@ _hb_ot_shape_complex_collect_features_arabic (hb_ot_map_builder_t *map, const hb
...
@@ -183,10 +183,10 @@ _hb_ot_shape_complex_collect_features_arabic (hb_ot_map_builder_t *map, const hb
map
->
add_bool_feature
(
HB_TAG
(
'c'
,
's'
,
'w'
,
'h'
));
map
->
add_bool_feature
(
HB_TAG
(
'c'
,
's'
,
'w'
,
'h'
));
}
}
bool
hb_ot_shape_normalization_mode_t
_hb_ot_shape_complex_
prefer_decomposed
_arabic
(
void
)
_hb_ot_shape_complex_
normalization_preference
_arabic
(
void
)
{
{
return
FALSE
;
return
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS
;
}
}
void
void
...
...
src/hb-ot-shape-complex-indic.cc
浏览文件 @
11138ccf
...
@@ -369,11 +369,11 @@ _hb_ot_shape_complex_collect_features_indic (hb_ot_map_builder_t *map, const hb_
...
@@ -369,11 +369,11 @@ _hb_ot_shape_complex_collect_features_indic (hb_ot_map_builder_t *map, const hb_
}
}
bool
hb_ot_shape_normalization_mode_t
_hb_ot_shape_complex_
prefer_decomposed
_indic
(
void
)
_hb_ot_shape_complex_
normalization_preference
_indic
(
void
)
{
{
/* We want split matras decomposed by the common shaping logic. */
/* We want split matras decomposed by the common shaping logic. */
return
TRUE
;
return
HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED
;
}
}
...
...
src/hb-ot-shape-complex-misc.cc
浏览文件 @
11138ccf
...
@@ -27,7 +27,7 @@
...
@@ -27,7 +27,7 @@
#include "hb-ot-shape-complex-private.hh"
#include "hb-ot-shape-complex-private.hh"
/* TODO Add kana, hangul, and other small s
ah
pers here */
/* TODO Add kana, hangul, and other small s
ha
pers here */
/* When adding trivial shapers, eg. kana, hangul, etc, we can either
/* When adding trivial shapers, eg. kana, hangul, etc, we can either
* add a full shaper enum value for them, or switch on the script in
* add a full shaper enum value for them, or switch on the script in
...
@@ -41,10 +41,10 @@ _hb_ot_shape_complex_collect_features_default (hb_ot_map_builder_t *map, const h
...
@@ -41,10 +41,10 @@ _hb_ot_shape_complex_collect_features_default (hb_ot_map_builder_t *map, const h
{
{
}
}
bool
hb_ot_shape_normalization_mode_t
_hb_ot_shape_complex_
prefer_decomposed
_default
(
void
)
_hb_ot_shape_complex_
normalization_preference
_default
(
void
)
{
{
return
FALSE
;
return
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS
;
}
}
void
void
...
...
src/hb-ot-shape-complex-private.hh
浏览文件 @
11138ccf
...
@@ -30,6 +30,7 @@
...
@@ -30,6 +30,7 @@
#include "hb-private.hh"
#include "hb-private.hh"
#include "hb-ot-map-private.hh"
#include "hb-ot-map-private.hh"
#include "hb-ot-shape-normalize-private.hh"
...
@@ -227,26 +228,26 @@ hb_ot_shape_complex_collect_features (hb_ot_complex_shaper_t shaper,
...
@@ -227,26 +228,26 @@ hb_ot_shape_complex_collect_features (hb_ot_complex_shaper_t shaper,
/*
/*
*
prefer_decomposed
()
*
normalization_preference
()
*
*
* Called during shape_execute().
* Called during shape_execute().
*
*
* Shapers should return TRUE if it prefers decomposed (NFD) input rather than precomposed (NFC).
* Shapers should return TRUE if it prefers decomposed (NFD) input rather than precomposed (NFC).
*/
*/
typedef
bool
hb_ot_shape_complex_prefer_decomposed
_func_t
(
void
);
typedef
hb_ot_shape_normalization_mode_t
hb_ot_shape_complex_normalization_preference
_func_t
(
void
);
#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
HB_INTERNAL hb_ot_shape_complex_
prefer_decomposed_func_t _hb_ot_shape_complex_prefer_decomposed
_##name;
HB_INTERNAL hb_ot_shape_complex_
normalization_preference_func_t _hb_ot_shape_complex_normalization_preference
_##name;
HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
#undef HB_COMPLEX_SHAPER_IMPLEMENT
#undef HB_COMPLEX_SHAPER_IMPLEMENT
static
inline
bool
static
inline
hb_ot_shape_normalization_mode_t
hb_ot_shape_complex_
prefer_decomposed
(
hb_ot_complex_shaper_t
shaper
)
hb_ot_shape_complex_
normalization_preference
(
hb_ot_complex_shaper_t
shaper
)
{
{
switch
(
shaper
)
{
switch
(
shaper
)
{
default:
default:
#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
#define HB_COMPLEX_SHAPER_IMPLEMENT(name) \
case hb_ot_complex_shaper_##name: return _hb_ot_shape_complex_
prefer_decomposed
_##name ();
case hb_ot_complex_shaper_##name: return _hb_ot_shape_complex_
normalization_preference
_##name ();
HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
#undef HB_COMPLEX_SHAPER_IMPLEMENT
#undef HB_COMPLEX_SHAPER_IMPLEMENT
}
}
...
...
src/hb-ot-shape-normalize-private.hh
0 → 100644
浏览文件 @
11138ccf
/*
* Copyright © 2012 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.
*
* Google Author(s): Behdad Esfahbod
*/
#ifndef HB_OT_SHAPE_NORMALIZE_PRIVATE_HH
#define HB_OT_SHAPE_NORMALIZE_PRIVATE_HH
#include "hb-private.hh"
#include "hb-font.h"
#include "hb-buffer.h"
enum
hb_ot_shape_normalization_mode_t
{
HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED
,
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS
,
/* never composes base-to-base */
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_FULL
/* including base-to-base composition */
};
HB_INTERNAL
void
_hb_ot_shape_normalize
(
hb_font_t
*
font
,
hb_buffer_t
*
buffer
,
hb_ot_shape_normalization_mode_t
mode
);
#endif
/* HB_OT_SHAPE_NORMALIZE_PRIVATE_HH */
src/hb-ot-shape-normalize.cc
浏览文件 @
11138ccf
/*
/*
* Copyright © 2011 Google, Inc.
* Copyright © 2011
,2012
Google, Inc.
*
*
* This is part of HarfBuzz, a text shaping library.
* This is part of HarfBuzz, a text shaping library.
*
*
...
@@ -24,8 +24,8 @@
...
@@ -24,8 +24,8 @@
* Google Author(s): Behdad Esfahbod
* Google Author(s): Behdad Esfahbod
*/
*/
#include "hb-ot-shape-normalize-private.hh"
#include "hb-ot-shape-private.hh"
#include "hb-ot-shape-private.hh"
#include "hb-ot-shape-complex-private.hh"
/*
/*
...
@@ -69,45 +69,43 @@
...
@@ -69,45 +69,43 @@
*/
*/
static
void
static
void
output_glyph
(
hb_
ot_shape_context_t
*
c
,
output_glyph
(
hb_
font_t
*
font
,
hb_buffer_t
*
buffer
,
hb_codepoint_t
glyph
)
hb_codepoint_t
glyph
)
{
{
hb_buffer_t
*
buffer
=
c
->
buffer
;
buffer
->
output_glyph
(
glyph
);
buffer
->
output_glyph
(
glyph
);
hb_glyph_info_set_unicode_props
(
&
buffer
->
out_info
[
buffer
->
out_len
-
1
],
buffer
->
unicode
);
hb_glyph_info_set_unicode_props
(
&
buffer
->
out_info
[
buffer
->
out_len
-
1
],
buffer
->
unicode
);
}
}
static
bool
static
bool
decompose
(
hb_
ot_shape_context_t
*
c
,
decompose
(
hb_
font_t
*
font
,
hb_buffer_t
*
buffer
,
bool
shortest
,
bool
shortest
,
hb_codepoint_t
ab
)
hb_codepoint_t
ab
)
{
{
hb_codepoint_t
a
,
b
,
glyph
;
hb_codepoint_t
a
,
b
,
glyph
;
if
(
!
hb_unicode_decompose
(
c
->
buffer
->
unicode
,
ab
,
&
a
,
&
b
)
||
if
(
!
hb_unicode_decompose
(
buffer
->
unicode
,
ab
,
&
a
,
&
b
)
||
(
b
&&
!
hb_font_get_glyph
(
c
->
font
,
b
,
0
,
&
glyph
)))
(
b
&&
!
hb_font_get_glyph
(
font
,
b
,
0
,
&
glyph
)))
return
FALSE
;
return
FALSE
;
bool
has_a
=
hb_font_get_glyph
(
c
->
font
,
a
,
0
,
&
glyph
);
bool
has_a
=
hb_font_get_glyph
(
font
,
a
,
0
,
&
glyph
);
if
(
shortest
&&
has_a
)
{
if
(
shortest
&&
has_a
)
{
/* Output a and b */
/* Output a and b */
output_glyph
(
c
,
a
);
output_glyph
(
font
,
buffer
,
a
);
if
(
b
)
if
(
b
)
output_glyph
(
c
,
b
);
output_glyph
(
font
,
buffer
,
b
);
return
TRUE
;
return
TRUE
;
}
}
if
(
decompose
(
c
,
shortest
,
a
))
{
if
(
decompose
(
font
,
buffer
,
shortest
,
a
))
{
if
(
b
)
if
(
b
)
output_glyph
(
c
,
b
);
output_glyph
(
font
,
buffer
,
b
);
return
TRUE
;
return
TRUE
;
}
}
if
(
has_a
)
{
if
(
has_a
)
{
output_glyph
(
c
,
a
);
output_glyph
(
font
,
buffer
,
a
);
if
(
b
)
if
(
b
)
output_glyph
(
c
,
b
);
output_glyph
(
font
,
buffer
,
b
);
return
TRUE
;
return
TRUE
;
}
}
...
@@ -115,44 +113,44 @@ decompose (hb_ot_shape_context_t *c,
...
@@ -115,44 +113,44 @@ decompose (hb_ot_shape_context_t *c,
}
}
static
void
static
void
decompose_current_glyph
(
hb_
ot_shape_context_t
*
c
,
decompose_current_glyph
(
hb_
font_t
*
font
,
hb_buffer_t
*
buffer
,
bool
shortest
)
bool
shortest
)
{
{
if
(
decompose
(
c
,
shortest
,
c
->
buffer
->
info
[
c
->
buffer
->
idx
].
codepoint
))
if
(
decompose
(
font
,
buffer
,
shortest
,
buffer
->
info
[
buffer
->
idx
].
codepoint
))
c
->
buffer
->
skip_glyph
();
buffer
->
skip_glyph
();
else
else
c
->
buffer
->
next_glyph
();
buffer
->
next_glyph
();
}
}
static
void
static
void
decompose_single_char_cluster
(
hb_
ot_shape_context_t
*
c
,
decompose_single_char_cluster
(
hb_
font_t
*
font
,
hb_buffer_t
*
buffer
,
bool
will_recompose
)
bool
will_recompose
)
{
{
hb_codepoint_t
glyph
;
hb_codepoint_t
glyph
;
/* If recomposing and font supports this, we're good to go */
/* If recomposing and font supports this, we're good to go */
if
(
will_recompose
&&
hb_font_get_glyph
(
c
->
font
,
c
->
buffer
->
info
[
c
->
buffer
->
idx
].
codepoint
,
0
,
&
glyph
))
{
if
(
will_recompose
&&
hb_font_get_glyph
(
font
,
buffer
->
info
[
buffer
->
idx
].
codepoint
,
0
,
&
glyph
))
{
c
->
buffer
->
next_glyph
();
buffer
->
next_glyph
();
return
;
return
;
}
}
decompose_current_glyph
(
c
,
will_recompose
);
decompose_current_glyph
(
font
,
buffer
,
will_recompose
);
}
}
static
void
static
void
decompose_multi_char_cluster
(
hb_
ot_shape_context_t
*
c
,
decompose_multi_char_cluster
(
hb_
font_t
*
font
,
hb_buffer_t
*
buffer
,
unsigned
int
end
)
unsigned
int
end
)
{
{
/* TODO Currently if there's a variation-selector we give-up, it's just too hard. */
/* TODO Currently if there's a variation-selector we give-up, it's just too hard. */
for
(
unsigned
int
i
=
c
->
buffer
->
idx
;
i
<
end
;
i
++
)
for
(
unsigned
int
i
=
buffer
->
idx
;
i
<
end
;
i
++
)
if
(
unlikely
(
_hb_unicode_is_variation_selector
(
c
->
buffer
->
info
[
i
].
codepoint
)))
{
if
(
unlikely
(
_hb_unicode_is_variation_selector
(
buffer
->
info
[
i
].
codepoint
)))
{
while
(
c
->
buffer
->
idx
<
end
)
while
(
buffer
->
idx
<
end
)
c
->
buffer
->
next_glyph
();
buffer
->
next_glyph
();
return
;
return
;
}
}
while
(
c
->
buffer
->
idx
<
end
)
while
(
buffer
->
idx
<
end
)
decompose_current_glyph
(
c
,
FALSE
);
decompose_current_glyph
(
font
,
buffer
,
FALSE
);
}
}
static
int
static
int
...
@@ -165,10 +163,10 @@ compare_combining_class (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
...
@@ -165,10 +163,10 @@ compare_combining_class (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
}
}
void
void
_hb_ot_shape_normalize
(
hb_ot_shape_context_t
*
c
)
_hb_ot_shape_normalize
(
hb_font_t
*
font
,
hb_buffer_t
*
buffer
,
hb_ot_shape_normalization_mode_t
mode
)
{
{
hb_buffer_t
*
buffer
=
c
->
buffer
;
bool
recompose
=
mode
!=
HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED
;
bool
recompose
=
!
hb_ot_shape_complex_prefer_decomposed
(
c
->
plan
->
shaper
);
bool
has_multichar_clusters
=
FALSE
;
bool
has_multichar_clusters
=
FALSE
;
unsigned
int
count
;
unsigned
int
count
;
...
@@ -191,9 +189,9 @@ _hb_ot_shape_normalize (hb_ot_shape_context_t *c)
...
@@ -191,9 +189,9 @@ _hb_ot_shape_normalize (hb_ot_shape_context_t *c)
break
;
break
;
if
(
buffer
->
idx
+
1
==
end
)
if
(
buffer
->
idx
+
1
==
end
)
decompose_single_char_cluster
(
c
,
recompose
);
decompose_single_char_cluster
(
font
,
buffer
,
recompose
);
else
{
else
{
decompose_multi_char_cluster
(
c
,
end
);
decompose_multi_char_cluster
(
font
,
buffer
,
end
);
has_multichar_clusters
=
TRUE
;
has_multichar_clusters
=
TRUE
;
}
}
}
}
...
@@ -265,11 +263,11 @@ _hb_ot_shape_normalize (hb_ot_shape_context_t *c)
...
@@ -265,11 +263,11 @@ _hb_ot_shape_normalize (hb_ot_shape_context_t *c)
hb_codepoint_t
composed
,
glyph
;
hb_codepoint_t
composed
,
glyph
;
if
((
buffer
->
out_info
[
buffer
->
out_len
-
1
].
combining_class
()
>=
if
((
buffer
->
out_info
[
buffer
->
out_len
-
1
].
combining_class
()
>=
buffer
->
info
[
buffer
->
idx
].
combining_class
())
||
buffer
->
info
[
buffer
->
idx
].
combining_class
())
||
!
hb_unicode_compose
(
c
->
buffer
->
unicode
,
!
hb_unicode_compose
(
buffer
->
unicode
,
buffer
->
out_info
[
starter
].
codepoint
,
buffer
->
out_info
[
starter
].
codepoint
,
buffer
->
info
[
buffer
->
idx
].
codepoint
,
buffer
->
info
[
buffer
->
idx
].
codepoint
,
&
composed
)
||
&
composed
)
||
!
hb_font_get_glyph
(
c
->
font
,
composed
,
0
,
&
glyph
))
!
hb_font_get_glyph
(
font
,
composed
,
0
,
&
glyph
))
{
{
/* Blocked, or doesn't compose. */
/* Blocked, or doesn't compose. */
buffer
->
next_glyph
();
buffer
->
next_glyph
();
...
@@ -285,4 +283,3 @@ _hb_ot_shape_normalize (hb_ot_shape_context_t *c)
...
@@ -285,4 +283,3 @@ _hb_ot_shape_normalize (hb_ot_shape_context_t *c)
buffer
->
swap_buffers
();
buffer
->
swap_buffers
();
}
}
src/hb-ot-shape-private.hh
浏览文件 @
11138ccf
...
@@ -33,11 +33,9 @@
...
@@ -33,11 +33,9 @@
#include "hb-ot-map-private.hh"
#include "hb-ot-map-private.hh"
#include "hb-ot-shape-complex-private.hh"
#include "hb-ot-shape-complex-private.hh"
#include "hb-ot-shape-normalize-private.hh"
enum
hb_ot_complex_shaper_t
;
struct
hb_ot_shape_plan_t
struct
hb_ot_shape_plan_t
{
{
friend
struct
hb_ot_shape_planner_t
;
friend
struct
hb_ot_shape_planner_t
;
...
@@ -99,7 +97,6 @@ hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_unicode_funcs_t *unic
...
@@ -99,7 +97,6 @@ hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_unicode_funcs_t *unic
HB_INTERNAL
void
_hb_set_unicode_props
(
hb_buffer_t
*
buffer
);
HB_INTERNAL
void
_hb_set_unicode_props
(
hb_buffer_t
*
buffer
);
HB_INTERNAL
void
_hb_ot_shape_normalize
(
hb_ot_shape_context_t
*
c
);
#include "hb-ot-shape-complex-private.hh"
#endif
/* HB_OT_SHAPE_PRIVATE_HH */
#endif
/* HB_OT_SHAPE_PRIVATE_HH */
src/hb-ot-shape.cc
浏览文件 @
11138ccf
...
@@ -362,7 +362,7 @@ hb_ot_shape_execute_internal (hb_ot_shape_context_t *c)
...
@@ -362,7 +362,7 @@ hb_ot_shape_execute_internal (hb_ot_shape_context_t *c)
hb_ensure_native_direction
(
c
->
buffer
);
hb_ensure_native_direction
(
c
->
buffer
);
_hb_ot_shape_normalize
(
c
);
_hb_ot_shape_normalize
(
c
->
font
,
c
->
buffer
,
hb_ot_shape_complex_normalization_preference
(
c
->
plan
->
shaper
)
);
hb_ot_shape_setup_masks
(
c
);
hb_ot_shape_setup_masks
(
c
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录