Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
4a31166b
T
Third Party Harfbuzz
项目概览
OpenHarmony
/
Third Party Harfbuzz
接近 2 年 前同步成功
通知
1
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看板
提交
4a31166b
编写于
7月 24, 2012
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[hb-old] Shovel out the line-breaking / word-segmentation stuff
上级
0bcbe88c
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
33 addition
and
750 deletion
+33
-750
src/hb-old/Makefile.am
src/hb-old/Makefile.am
+2
-8
src/hb-old/Makefile.in
src/hb-old/Makefile.in
+3
-10
src/hb-old/harfbuzz-external.h
src/hb-old/harfbuzz-external.h
+0
-66
src/hb-old/harfbuzz-indic.cpp
src/hb-old/harfbuzz-indic.cpp
+0
-26
src/hb-old/harfbuzz-khmer.c
src/hb-old/harfbuzz-khmer.c
+0
-25
src/hb-old/harfbuzz-myanmar.c
src/hb-old/harfbuzz-myanmar.c
+0
-28
src/hb-old/harfbuzz-shaper-private.h
src/hb-old/harfbuzz-shaper-private.h
+0
-12
src/hb-old/harfbuzz-shaper.cpp
src/hb-old/harfbuzz-shaper.cpp
+28
-375
src/hb-old/harfbuzz-shaper.h
src/hb-old/harfbuzz-shaper.h
+0
-31
src/hb-old/harfbuzz-thai.c
src/hb-old/harfbuzz-thai.c
+0
-111
src/hb-old/harfbuzz-tibetan.c
src/hb-old/harfbuzz-tibetan.c
+0
-26
src/hb-old/harfbuzz.c
src/hb-old/harfbuzz.c
+0
-32
未找到文件。
src/hb-old/Makefile.am
浏览文件 @
4a31166b
...
...
@@ -18,10 +18,7 @@ MAINSOURCES = \
harfbuzz-hebrew.c
\
harfbuzz-arabic.c
\
harfbuzz-hangul.c
\
harfbuzz-myanmar.c
\
harfbuzz-thai.c
EXTRA_SOURCES
=
harfbuzz.c
harfbuzz-myanmar.c
PUBLICHEADERS
=
\
harfbuzz.h
\
...
...
@@ -50,7 +47,4 @@ libhb_old_la_SOURCES = \
$(PUBLICHEADERS)
\
$(PRIVATEHEADERS)
EXTRA_DIST
=
\
README
\
COPYING
\
$(EXTRA_SOURCES)
EXTRA_DIST
=
README COPYING
src/hb-old/Makefile.in
浏览文件 @
4a31166b
...
...
@@ -52,7 +52,7 @@ am__objects_1 = harfbuzz-buffer.lo harfbuzz-stream.lo harfbuzz-gdef.lo \
harfbuzz-open.lo harfbuzz-shaper.lo harfbuzz-greek.lo
\
harfbuzz-tibetan.lo harfbuzz-khmer.lo harfbuzz-indic.lo
\
harfbuzz-hebrew.lo harfbuzz-arabic.lo harfbuzz-hangul.lo
\
harfbuzz-myanmar.lo
harfbuzz-thai.lo
harfbuzz-myanmar.lo
am__objects_2
=
am_libhb_old_la_OBJECTS
=
$(am__objects_1)
$(am__objects_2)
\
$(am__objects_2)
...
...
@@ -268,10 +268,8 @@ MAINSOURCES = \
harfbuzz-hebrew.c
\
harfbuzz-arabic.c
\
harfbuzz-hangul.c
\
harfbuzz-myanmar.c
\
harfbuzz-thai.c
harfbuzz-myanmar.c
EXTRA_SOURCES
=
harfbuzz.c
PUBLICHEADERS
=
\
harfbuzz.h
\
harfbuzz-buffer.h
\
...
...
@@ -299,11 +297,7 @@ libhb_old_la_SOURCES = \
$(PUBLICHEADERS)
\
$(PRIVATEHEADERS)
EXTRA_DIST
=
\
README
\
COPYING
\
$(EXTRA_SOURCES)
EXTRA_DIST
=
README COPYING
all
:
all-am
.SUFFIXES
:
...
...
@@ -371,7 +365,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/harfbuzz-open.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/harfbuzz-shaper.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/harfbuzz-stream.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/harfbuzz-thai.Plo@am__quote@
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/harfbuzz-tibetan.Plo@am__quote@
.c.o
:
...
...
src/hb-old/harfbuzz-external.h
浏览文件 @
4a31166b
...
...
@@ -35,21 +35,6 @@ HB_BEGIN_HEADER
*/
/*
see http://www.unicode.org/reports/tr14/tr14-19.html
we don't use the XX, AI and CB properties and map them to AL instead.
as we don't support any EBDIC based OS'es, NL is ignored and mapped to AL as well.
*/
typedef
enum
{
HB_LineBreak_OP
,
HB_LineBreak_CL
,
HB_LineBreak_QU
,
HB_LineBreak_GL
,
HB_LineBreak_NS
,
HB_LineBreak_EX
,
HB_LineBreak_SY
,
HB_LineBreak_IS
,
HB_LineBreak_PR
,
HB_LineBreak_PO
,
HB_LineBreak_NU
,
HB_LineBreak_AL
,
HB_LineBreak_ID
,
HB_LineBreak_IN
,
HB_LineBreak_HY
,
HB_LineBreak_BA
,
HB_LineBreak_BB
,
HB_LineBreak_B2
,
HB_LineBreak_ZW
,
HB_LineBreak_CM
,
HB_LineBreak_WJ
,
HB_LineBreak_H2
,
HB_LineBreak_H3
,
HB_LineBreak_JL
,
HB_LineBreak_JV
,
HB_LineBreak_JT
,
HB_LineBreak_SA
,
HB_LineBreak_SG
,
HB_LineBreak_SP
,
HB_LineBreak_CR
,
HB_LineBreak_LF
,
HB_LineBreak_BK
}
HB_LineBreakClass
;
typedef
enum
{
HB_Mark_NonSpacing
,
/* Mn */
...
...
@@ -90,62 +75,11 @@ typedef enum
HB_Symbol_Other
/* So */
}
HB_CharCategory
;
typedef
enum
{
HB_Grapheme_Other
,
HB_Grapheme_CR
,
HB_Grapheme_LF
,
HB_Grapheme_Control
,
HB_Grapheme_Extend
,
HB_Grapheme_L
,
HB_Grapheme_V
,
HB_Grapheme_T
,
HB_Grapheme_LV
,
HB_Grapheme_LVT
}
HB_GraphemeClass
;
typedef
enum
{
HB_Word_Other
,
HB_Word_Format
,
HB_Word_Katakana
,
HB_Word_ALetter
,
HB_Word_MidLetter
,
HB_Word_MidNum
,
HB_Word_Numeric
,
HB_Word_ExtendNumLet
}
HB_WordClass
;
typedef
enum
{
HB_Sentence_Other
,
HB_Sentence_Sep
,
HB_Sentence_Format
,
HB_Sentence_Sp
,
HB_Sentence_Lower
,
HB_Sentence_Upper
,
HB_Sentence_OLetter
,
HB_Sentence_Numeric
,
HB_Sentence_ATerm
,
HB_Sentence_STerm
,
HB_Sentence_Close
}
HB_SentenceClass
;
HB_GraphemeClass
HB_GetGraphemeClass
(
HB_UChar32
ch
);
HB_WordClass
HB_GetWordClass
(
HB_UChar32
ch
);
HB_SentenceClass
HB_GetSentenceClass
(
HB_UChar32
ch
);
HB_LineBreakClass
HB_GetLineBreakClass
(
HB_UChar32
ch
);
void
HB_GetGraphemeAndLineBreakClass
(
HB_UChar32
ch
,
HB_GraphemeClass
*
grapheme
,
HB_LineBreakClass
*
lineBreak
);
void
HB_GetUnicodeCharProperties
(
HB_UChar32
ch
,
HB_CharCategory
*
category
,
int
*
combiningClass
);
HB_CharCategory
HB_GetUnicodeCharCategory
(
HB_UChar32
ch
);
int
HB_GetUnicodeCharCombiningClass
(
HB_UChar32
ch
);
HB_UChar16
HB_GetMirroredChar
(
HB_UChar16
ch
);
void
*
HB_Library_Resolve
(
const
char
*
library
,
int
version
,
const
char
*
symbol
);
HB_END_HEADER
#endif
src/hb-old/harfbuzz-indic.cpp
浏览文件 @
4a31166b
...
...
@@ -1866,29 +1866,3 @@ HB_Bool HB_IndicShape(HB_ShaperItem *item)
item
->
num_glyphs
=
first_glyph
;
return
true
;
}
void
HB_IndicAttributes
(
HB_Script
script
,
const
HB_UChar16
*
text
,
hb_uint32
from
,
hb_uint32
len
,
HB_CharAttributes
*
attributes
)
{
int
end
=
from
+
len
;
const
HB_UChar16
*
uc
=
text
+
from
;
attributes
+=
from
;
hb_uint32
i
=
0
;
while
(
i
<
len
)
{
bool
invalid
;
hb_uint32
boundary
=
indic_nextSyllableBoundary
(
script
,
text
,
from
+
i
,
end
,
&
invalid
)
-
from
;
attributes
[
i
].
charStop
=
true
;
if
(
boundary
>
len
-
1
)
boundary
=
len
;
i
++
;
while
(
i
<
boundary
)
{
attributes
[
i
].
charStop
=
false
;
++
uc
;
++
i
;
}
assert
(
i
==
boundary
);
}
}
src/hb-old/harfbuzz-khmer.c
浏览文件 @
4a31166b
...
...
@@ -640,28 +640,3 @@ HB_Bool HB_KhmerShape(HB_ShaperItem *item)
item
->
num_glyphs
=
first_glyph
;
return
TRUE
;
}
void
HB_KhmerAttributes
(
HB_Script
script
,
const
HB_UChar16
*
text
,
hb_uint32
from
,
hb_uint32
len
,
HB_CharAttributes
*
attributes
)
{
int
end
=
from
+
len
;
const
HB_UChar16
*
uc
=
text
+
from
;
hb_uint32
i
=
0
;
HB_UNUSED
(
script
);
attributes
+=
from
;
while
(
i
<
len
)
{
HB_Bool
invalid
;
hb_uint32
boundary
=
khmer_nextSyllableBoundary
(
text
,
from
+
i
,
end
,
&
invalid
)
-
from
;
attributes
[
i
].
charStop
=
TRUE
;
if
(
boundary
>
len
-
1
)
boundary
=
len
;
i
++
;
while
(
i
<
boundary
)
{
attributes
[
i
].
charStop
=
FALSE
;
++
uc
;
++
i
;
}
assert
(
i
==
boundary
);
}
}
src/hb-old/harfbuzz-myanmar.c
浏览文件 @
4a31166b
...
...
@@ -509,31 +509,3 @@ HB_Bool HB_MyanmarShape(HB_ShaperItem *item)
item
->
num_glyphs
=
first_glyph
;
return
TRUE
;
}
void
HB_MyanmarAttributes
(
HB_Script
script
,
const
HB_UChar16
*
text
,
hb_uint32
from
,
hb_uint32
len
,
HB_CharAttributes
*
attributes
)
{
int
end
=
from
+
len
;
const
HB_UChar16
*
uc
=
text
+
from
;
hb_uint32
i
=
0
;
HB_UNUSED
(
script
);
attributes
+=
from
;
while
(
i
<
len
)
{
HB_Bool
invalid
;
hb_uint32
boundary
=
myanmar_nextSyllableBoundary
(
text
,
from
+
i
,
end
,
&
invalid
)
-
from
;
attributes
[
i
].
charStop
=
TRUE
;
if
(
i
)
attributes
[
i
-
1
].
lineBreakType
=
HB_Break
;
if
(
boundary
>
len
-
1
)
boundary
=
len
;
i
++
;
while
(
i
<
boundary
)
{
attributes
[
i
].
charStop
=
FALSE
;
++
uc
;
++
i
;
}
assert
(
i
==
boundary
);
}
}
src/hb-old/harfbuzz-shaper-private.h
浏览文件 @
4a31166b
...
...
@@ -93,11 +93,9 @@ typedef enum {
/* return true if ok. */
typedef
HB_Bool
(
*
HB_ShapeFunction
)(
HB_ShaperItem
*
shaper_item
);
typedef
void
(
*
HB_AttributeFunction
)(
HB_Script
script
,
const
HB_UChar16
*
string
,
hb_uint32
from
,
hb_uint32
len
,
HB_CharAttributes
*
attributes
);
typedef
struct
{
HB_ShapeFunction
shape
;
HB_AttributeFunction
charAttributes
;
}
HB_ScriptEngine
;
extern
const
HB_ScriptEngine
hb_scriptEngines
[];
...
...
@@ -112,16 +110,6 @@ extern HB_Bool HB_MyanmarShape(HB_ShaperItem *shaper_item);
extern
HB_Bool
HB_KhmerShape
(
HB_ShaperItem
*
shaper_item
);
extern
HB_Bool
HB_IndicShape
(
HB_ShaperItem
*
shaper_item
);
extern
void
HB_TibetanAttributes
(
HB_Script
script
,
const
HB_UChar16
*
string
,
hb_uint32
from
,
hb_uint32
len
,
HB_CharAttributes
*
attributes
);
extern
void
HB_MyanmarAttributes
(
HB_Script
script
,
const
HB_UChar16
*
string
,
hb_uint32
from
,
hb_uint32
len
,
HB_CharAttributes
*
attributes
);
extern
void
HB_KhmerAttributes
(
HB_Script
script
,
const
HB_UChar16
*
string
,
hb_uint32
from
,
hb_uint32
len
,
HB_CharAttributes
*
attributes
);
extern
void
HB_IndicAttributes
(
HB_Script
script
,
const
HB_UChar16
*
string
,
hb_uint32
from
,
hb_uint32
len
,
HB_CharAttributes
*
attributes
);
extern
void
HB_ThaiAttributes
(
HB_Script
script
,
const
HB_UChar16
*
string
,
hb_uint32
from
,
hb_uint32
len
,
HB_CharAttributes
*
attributes
);
typedef
struct
{
hb_uint32
tag
;
hb_uint32
property
;
...
...
src/hb-old/harfbuzz-shaper.cpp
浏览文件 @
4a31166b
...
...
@@ -32,205 +32,6 @@
#define HB_MIN(a, b) ((a) < (b) ? (a) : (b))
#define HB_MAX(a, b) ((a) > (b) ? (a) : (b))
// -----------------------------------------------------------------------------------------------------
//
// The line break algorithm. See http://www.unicode.org/reports/tr14/tr14-13.html
//
// -----------------------------------------------------------------------------------------------------
/* The Unicode algorithm does in our opinion allow line breaks at some
places they shouldn't be allowed. The following changes were thus
made in comparison to the Unicode reference:
EX->AL from DB to IB
SY->AL from DB to IB
SY->PO from DB to IB
SY->PR from DB to IB
SY->OP from DB to IB
AL->PR from DB to IB
AL->PO from DB to IB
PR->PR from DB to IB
PO->PO from DB to IB
PR->PO from DB to IB
PO->PR from DB to IB
HY->PO from DB to IB
HY->PR from DB to IB
HY->OP from DB to IB
NU->EX from PB to IB
EX->PO from DB to IB
*/
// The following line break classes are not treated by the table:
// AI, BK, CB, CR, LF, NL, SA, SG, SP, XX
enum
break_class
{
// the first 4 values have to agree with the enum in QCharAttributes
ProhibitedBreak
,
// PB in table
DirectBreak
,
// DB in table
IndirectBreak
,
// IB in table
CombiningIndirectBreak
,
// CI in table
CombiningProhibitedBreak
// CP in table
};
#define DB DirectBreak
#define IB IndirectBreak
#define CI CombiningIndirectBreak
#define CP CombiningProhibitedBreak
#define PB ProhibitedBreak
static
const
hb_uint8
breakTable
[
HB_LineBreak_JT
+
1
][
HB_LineBreak_JT
+
1
]
=
{
/* OP CL QU GL NS EX SY IS PR PO NU AL ID IN HY BA BB B2 ZW CM WJ H2 H3 JL JV JT */
/* OP */
{
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
,
CP
,
PB
,
PB
,
PB
,
PB
,
PB
,
PB
},
/* CL */
{
DB
,
PB
,
IB
,
IB
,
PB
,
PB
,
PB
,
PB
,
IB
,
IB
,
IB
,
IB
,
DB
,
DB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* QU */
{
PB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
PB
,
CI
,
PB
,
IB
,
IB
,
IB
,
IB
,
IB
},
/* GL */
{
IB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
PB
,
CI
,
PB
,
IB
,
IB
,
IB
,
IB
,
IB
},
/* NS */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* EX */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
IB
,
DB
,
IB
,
DB
,
DB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* SY */
{
IB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
IB
,
IB
,
IB
,
IB
,
DB
,
DB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* IS */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
DB
,
IB
,
IB
,
DB
,
DB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* PR */
{
IB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
IB
,
IB
,
IB
,
IB
,
IB
,
DB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
IB
,
IB
,
IB
,
IB
,
IB
},
/* PO */
{
IB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
IB
,
IB
,
IB
,
IB
,
DB
,
DB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* NU */
{
IB
,
PB
,
IB
,
IB
,
IB
,
IB
,
PB
,
PB
,
IB
,
IB
,
IB
,
IB
,
DB
,
IB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* AL */
{
IB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
IB
,
IB
,
IB
,
IB
,
DB
,
IB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* ID */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
IB
,
DB
,
DB
,
DB
,
IB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* IN */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
,
IB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* HY */
{
IB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
IB
,
IB
,
IB
,
DB
,
DB
,
DB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* BA */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* BB */
{
IB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
PB
,
CI
,
PB
,
IB
,
IB
,
IB
,
IB
,
IB
},
/* B2 */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
IB
,
IB
,
DB
,
PB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* ZW */
{
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* CM */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
DB
,
IB
,
IB
,
DB
,
IB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
DB
},
/* WJ */
{
IB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
IB
,
PB
,
CI
,
PB
,
IB
,
IB
,
IB
,
IB
,
IB
},
/* H2 */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
IB
,
DB
,
DB
,
DB
,
IB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
IB
,
IB
},
/* H3 */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
IB
,
DB
,
DB
,
DB
,
IB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
IB
},
/* JL */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
IB
,
DB
,
DB
,
DB
,
IB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
IB
,
IB
,
IB
,
IB
,
DB
},
/* JV */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
IB
,
DB
,
DB
,
DB
,
IB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
IB
,
IB
},
/* JT */
{
DB
,
PB
,
IB
,
IB
,
IB
,
PB
,
PB
,
PB
,
DB
,
IB
,
DB
,
DB
,
DB
,
IB
,
IB
,
IB
,
DB
,
DB
,
PB
,
CI
,
PB
,
DB
,
DB
,
DB
,
DB
,
IB
}
};
#undef DB
#undef IB
#undef CI
#undef CP
#undef PB
static
const
hb_uint8
graphemeTable
[
HB_Grapheme_LVT
+
1
][
HB_Grapheme_LVT
+
1
]
=
{
// Other, CR, LF, Control,Extend,L, V, T, LV, LVT
{
true
,
true
,
true
,
true
,
true
,
true
,
true
,
true
,
true
,
true
},
// Other,
{
true
,
true
,
true
,
true
,
true
,
true
,
true
,
true
,
true
,
true
},
// CR,
{
true
,
false
,
true
,
true
,
true
,
true
,
true
,
true
,
true
,
true
},
// LF,
{
true
,
true
,
true
,
true
,
true
,
true
,
true
,
true
,
true
,
true
},
// Control,
{
false
,
true
,
true
,
true
,
false
,
false
,
false
,
false
,
false
,
false
},
// Extend,
{
true
,
true
,
true
,
true
,
true
,
false
,
true
,
true
,
true
,
true
},
// L,
{
true
,
true
,
true
,
true
,
true
,
false
,
false
,
true
,
false
,
true
},
// V,
{
true
,
true
,
true
,
true
,
true
,
true
,
false
,
false
,
false
,
false
},
// T,
{
true
,
true
,
true
,
true
,
true
,
false
,
true
,
true
,
true
,
true
},
// LV,
{
true
,
true
,
true
,
true
,
true
,
false
,
true
,
true
,
true
,
true
},
// LVT
};
static
void
calcLineBreaks
(
const
HB_UChar16
*
uc
,
hb_uint32
len
,
HB_CharAttributes
*
charAttributes
)
{
if
(
!
len
)
return
;
// ##### can this fail if the first char is a surrogate?
HB_LineBreakClass
cls
;
HB_GraphemeClass
grapheme
;
HB_GetGraphemeAndLineBreakClass
(
*
uc
,
&
grapheme
,
&
cls
);
// handle case where input starts with an LF
if
(
cls
==
HB_LineBreak_LF
)
cls
=
HB_LineBreak_BK
;
charAttributes
[
0
].
whiteSpace
=
(
cls
==
HB_LineBreak_SP
||
cls
==
HB_LineBreak_BK
);
charAttributes
[
0
].
charStop
=
true
;
int
lcls
=
cls
;
for
(
hb_uint32
i
=
1
;
i
<
len
;
++
i
)
{
charAttributes
[
i
].
whiteSpace
=
false
;
charAttributes
[
i
].
charStop
=
true
;
HB_UChar32
code
=
uc
[
i
];
HB_GraphemeClass
ngrapheme
;
HB_LineBreakClass
ncls
;
HB_GetGraphemeAndLineBreakClass
(
code
,
&
ngrapheme
,
&
ncls
);
charAttributes
[
i
].
charStop
=
graphemeTable
[
ngrapheme
][
grapheme
];
// handle surrogates
if
(
ncls
==
HB_LineBreak_SG
)
{
if
(
HB_IsHighSurrogate
(
uc
[
i
])
&&
i
<
len
-
1
&&
HB_IsLowSurrogate
(
uc
[
i
+
1
]))
{
continue
;
}
else
if
(
HB_IsLowSurrogate
(
uc
[
i
])
&&
HB_IsHighSurrogate
(
uc
[
i
-
1
]))
{
code
=
HB_SurrogateToUcs4
(
uc
[
i
-
1
],
uc
[
i
]);
HB_GetGraphemeAndLineBreakClass
(
code
,
&
ngrapheme
,
&
ncls
);
charAttributes
[
i
].
charStop
=
false
;
}
else
{
ncls
=
HB_LineBreak_AL
;
}
}
// set white space and char stop flag
if
(
ncls
>=
HB_LineBreak_SP
)
charAttributes
[
i
].
whiteSpace
=
true
;
HB_LineBreakType
lineBreakType
=
HB_NoBreak
;
if
(
cls
>=
HB_LineBreak_LF
)
{
lineBreakType
=
HB_ForcedBreak
;
}
else
if
(
cls
==
HB_LineBreak_CR
)
{
lineBreakType
=
(
ncls
==
HB_LineBreak_LF
)
?
HB_NoBreak
:
HB_ForcedBreak
;
}
if
(
ncls
==
HB_LineBreak_SP
)
goto
next_no_cls_update
;
if
(
ncls
>=
HB_LineBreak_CR
)
goto
next
;
{
int
tcls
=
ncls
;
// for south east asian chars that require a complex (dictionary analysis), the unicode
// standard recommends to treat them as AL. thai_attributes and other attribute methods that
// do dictionary analysis can override
if
(
tcls
>=
HB_LineBreak_SA
)
tcls
=
HB_LineBreak_AL
;
if
(
cls
>=
HB_LineBreak_SA
)
cls
=
HB_LineBreak_AL
;
int
brk
=
breakTable
[
cls
][
tcls
];
switch
(
brk
)
{
case
DirectBreak
:
lineBreakType
=
HB_Break
;
if
(
uc
[
i
-
1
]
==
0xad
)
// soft hyphen
lineBreakType
=
HB_SoftHyphen
;
break
;
case
IndirectBreak
:
lineBreakType
=
(
lcls
==
HB_LineBreak_SP
)
?
HB_Break
:
HB_NoBreak
;
break
;
case
CombiningIndirectBreak
:
lineBreakType
=
HB_NoBreak
;
if
(
lcls
==
HB_LineBreak_SP
){
if
(
i
>
1
)
charAttributes
[
i
-
2
].
lineBreakType
=
HB_Break
;
}
else
{
goto
next_no_cls_update
;
}
break
;
case
CombiningProhibitedBreak
:
lineBreakType
=
HB_NoBreak
;
if
(
lcls
!=
HB_LineBreak_SP
)
goto
next_no_cls_update
;
case
ProhibitedBreak
:
default:
break
;
}
}
next:
cls
=
ncls
;
next_no_cls_update:
lcls
=
ncls
;
grapheme
=
ngrapheme
;
charAttributes
[
i
-
1
].
lineBreakType
=
lineBreakType
;
}
charAttributes
[
len
-
1
].
lineBreakType
=
HB_ForcedBreak
;
}
// --------------------------------------------------------------------------------------------------------------------------------------------
//
// Basic processing
...
...
@@ -582,210 +383,63 @@ HB_Bool HB_BasicShape(HB_ShaperItem *shaper_item)
const
HB_ScriptEngine
HB_ScriptEngines
[]
=
{
// Common
{
HB_BasicShape
,
0
},
{
HB_BasicShape
},
// Greek
{
HB_GreekShape
,
0
},
{
HB_GreekShape
},
// Cyrillic
{
HB_BasicShape
,
0
},
{
HB_BasicShape
},
// Armenian
{
HB_BasicShape
,
0
},
{
HB_BasicShape
},
// Hebrew
{
HB_HebrewShape
,
0
},
{
HB_HebrewShape
},
// Arabic
{
HB_ArabicShape
,
0
},
{
HB_ArabicShape
},
// Syriac
{
HB_ArabicShape
,
0
},
{
HB_ArabicShape
},
// Thaana
{
HB_BasicShape
,
0
},
{
HB_BasicShape
},
// Devanagari
{
HB_IndicShape
,
HB_IndicAttributes
},
{
HB_IndicShape
},
// Bengali
{
HB_IndicShape
,
HB_IndicAttributes
},
{
HB_IndicShape
},
// Gurmukhi
{
HB_IndicShape
,
HB_IndicAttributes
},
{
HB_IndicShape
},
// Gujarati
{
HB_IndicShape
,
HB_IndicAttributes
},
{
HB_IndicShape
},
// Oriya
{
HB_IndicShape
,
HB_IndicAttributes
},
{
HB_IndicShape
},
// Tamil
{
HB_IndicShape
,
HB_IndicAttributes
},
{
HB_IndicShape
},
// Telugu
{
HB_IndicShape
,
HB_IndicAttributes
},
{
HB_IndicShape
},
// Kannada
{
HB_IndicShape
,
HB_IndicAttributes
},
{
HB_IndicShape
},
// Malayalam
{
HB_IndicShape
,
HB_IndicAttributes
},
{
HB_IndicShape
},
// Sinhala
{
HB_IndicShape
,
HB_IndicAttributes
},
{
HB_IndicShape
},
// Thai
{
HB_BasicShape
,
HB_ThaiAttributes
},
{
HB_BasicShape
},
// Lao
{
HB_BasicShape
,
0
},
{
HB_BasicShape
},
// Tibetan
{
HB_TibetanShape
,
HB_TibetanAttributes
},
{
HB_TibetanShape
},
// Myanmar
{
HB_MyanmarShape
,
HB_MyanmarAttributes
},
{
HB_MyanmarShape
},
// Georgian
{
HB_BasicShape
,
0
},
{
HB_BasicShape
},
// Hangul
{
HB_HangulShape
,
0
},
{
HB_HangulShape
},
// Ogham
{
HB_BasicShape
,
0
},
{
HB_BasicShape
},
// Runic
{
HB_BasicShape
,
0
},
{
HB_BasicShape
},
// Khmer
{
HB_KhmerShape
,
HB_KhmerAttributes
},
{
HB_KhmerShape
},
// N'Ko
{
HB_ArabicShape
,
0
}
};
void
HB_GetCharAttributes
(
const
HB_UChar16
*
string
,
hb_uint32
stringLength
,
const
HB_ScriptItem
*
items
,
hb_uint32
numItems
,
HB_CharAttributes
*
attributes
)
{
calcLineBreaks
(
string
,
stringLength
,
attributes
);
for
(
hb_uint32
i
=
0
;
i
<
numItems
;
++
i
)
{
HB_Script
script
=
items
[
i
].
script
;
if
(
script
==
HB_Script_Inherited
)
script
=
HB_Script_Common
;
HB_AttributeFunction
attributeFunction
=
HB_ScriptEngines
[
script
].
charAttributes
;
if
(
!
attributeFunction
)
continue
;
attributeFunction
(
script
,
string
,
items
[
i
].
pos
,
items
[
i
].
length
,
attributes
);
}
}
enum
BreakRule
{
NoBreak
=
0
,
Break
=
1
,
Middle
=
2
};
static
const
hb_uint8
wordbreakTable
[
HB_Word_ExtendNumLet
+
1
][
HB_Word_ExtendNumLet
+
1
]
=
{
// Other Format Katakana ALetter MidLetter MidNum Numeric ExtendNumLet
{
Break
,
Break
,
Break
,
Break
,
Break
,
Break
,
Break
,
Break
},
// Other
{
Break
,
Break
,
Break
,
Break
,
Break
,
Break
,
Break
,
Break
},
// Format
{
Break
,
Break
,
NoBreak
,
Break
,
Break
,
Break
,
Break
,
NoBreak
},
// Katakana
{
Break
,
Break
,
Break
,
NoBreak
,
Middle
,
Break
,
NoBreak
,
NoBreak
},
// ALetter
{
Break
,
Break
,
Break
,
Break
,
Break
,
Break
,
Break
,
Break
},
// MidLetter
{
Break
,
Break
,
Break
,
Break
,
Break
,
Break
,
Break
,
Break
},
// MidNum
{
Break
,
Break
,
Break
,
NoBreak
,
Break
,
Middle
,
NoBreak
,
NoBreak
},
// Numeric
{
Break
,
Break
,
NoBreak
,
NoBreak
,
Break
,
Break
,
NoBreak
,
NoBreak
},
// ExtendNumLet
{
HB_ArabicShape
}
};
void
HB_GetWordBoundaries
(
const
HB_UChar16
*
string
,
hb_uint32
stringLength
,
const
HB_ScriptItem
*
/*items*/
,
hb_uint32
/*numItems*/
,
HB_CharAttributes
*
attributes
)
{
if
(
stringLength
==
0
)
return
;
unsigned
int
brk
=
HB_GetWordClass
(
string
[
0
]);
attributes
[
0
].
wordBoundary
=
true
;
for
(
hb_uint32
i
=
1
;
i
<
stringLength
;
++
i
)
{
if
(
!
attributes
[
i
].
charStop
)
{
attributes
[
i
].
wordBoundary
=
false
;
continue
;
}
hb_uint32
nbrk
=
HB_GetWordClass
(
string
[
i
]);
if
(
nbrk
==
HB_Word_Format
)
{
attributes
[
i
].
wordBoundary
=
(
HB_GetSentenceClass
(
string
[
i
-
1
])
==
HB_Sentence_Sep
);
continue
;
}
BreakRule
rule
=
(
BreakRule
)
wordbreakTable
[
brk
][
nbrk
];
if
(
rule
==
Middle
)
{
rule
=
Break
;
hb_uint32
lookahead
=
i
+
1
;
while
(
lookahead
<
stringLength
)
{
hb_uint32
testbrk
=
HB_GetWordClass
(
string
[
lookahead
]);
if
(
testbrk
==
HB_Word_Format
&&
HB_GetSentenceClass
(
string
[
lookahead
])
!=
HB_Sentence_Sep
)
{
++
lookahead
;
continue
;
}
if
(
testbrk
==
brk
)
{
rule
=
NoBreak
;
while
(
i
<
lookahead
)
attributes
[
i
++
].
wordBoundary
=
false
;
nbrk
=
testbrk
;
}
break
;
}
}
attributes
[
i
].
wordBoundary
=
(
rule
==
Break
);
brk
=
nbrk
;
}
}
enum
SentenceBreakStates
{
SB_Initial
,
SB_Upper
,
SB_UpATerm
,
SB_ATerm
,
SB_ATermC
,
SB_ACS
,
SB_STerm
,
SB_STermC
,
SB_SCS
,
SB_BAfter
,
SB_Break
,
SB_Look
};
static
const
hb_uint8
sentenceBreakTable
[
HB_Sentence_Close
+
1
][
HB_Sentence_Close
+
1
]
=
{
// Other Sep Format Sp Lower Upper OLetter Numeric ATerm STerm Close
{
SB_Initial
,
SB_BAfter
,
SB_Initial
,
SB_Initial
,
SB_Initial
,
SB_Upper
,
SB_Initial
,
SB_Initial
,
SB_ATerm
,
SB_STerm
,
SB_Initial
},
// SB_Initial,
{
SB_Initial
,
SB_BAfter
,
SB_Upper
,
SB_Initial
,
SB_Initial
,
SB_Upper
,
SB_Initial
,
SB_Initial
,
SB_UpATerm
,
SB_STerm
,
SB_Initial
},
// SB_Upper
{
SB_Look
,
SB_BAfter
,
SB_UpATerm
,
SB_ACS
,
SB_Initial
,
SB_Upper
,
SB_Break
,
SB_Initial
,
SB_ATerm
,
SB_STerm
,
SB_ATermC
},
// SB_UpATerm
{
SB_Look
,
SB_BAfter
,
SB_ATerm
,
SB_ACS
,
SB_Initial
,
SB_Break
,
SB_Break
,
SB_Initial
,
SB_ATerm
,
SB_STerm
,
SB_ATermC
},
// SB_ATerm
{
SB_Look
,
SB_BAfter
,
SB_ATermC
,
SB_ACS
,
SB_Initial
,
SB_Break
,
SB_Break
,
SB_Look
,
SB_ATerm
,
SB_STerm
,
SB_ATermC
},
// SB_ATermC,
{
SB_Look
,
SB_BAfter
,
SB_ACS
,
SB_ACS
,
SB_Initial
,
SB_Break
,
SB_Break
,
SB_Look
,
SB_ATerm
,
SB_STerm
,
SB_Look
},
// SB_ACS,
{
SB_Break
,
SB_BAfter
,
SB_STerm
,
SB_SCS
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_ATerm
,
SB_STerm
,
SB_STermC
},
// SB_STerm,
{
SB_Break
,
SB_BAfter
,
SB_STermC
,
SB_SCS
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_ATerm
,
SB_STerm
,
SB_STermC
},
// SB_STermC,
{
SB_Break
,
SB_BAfter
,
SB_SCS
,
SB_SCS
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_ATerm
,
SB_STerm
,
SB_Break
},
// SB_SCS,
{
SB_Break
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_Break
,
SB_Break
},
// SB_BAfter,
};
void
HB_GetSentenceBoundaries
(
const
HB_UChar16
*
string
,
hb_uint32
stringLength
,
const
HB_ScriptItem
*
/*items*/
,
hb_uint32
/*numItems*/
,
HB_CharAttributes
*
attributes
)
{
if
(
stringLength
==
0
)
return
;
hb_uint32
brk
=
sentenceBreakTable
[
SB_Initial
][
HB_GetSentenceClass
(
string
[
0
])];
attributes
[
0
].
sentenceBoundary
=
true
;
for
(
hb_uint32
i
=
1
;
i
<
stringLength
;
++
i
)
{
if
(
!
attributes
[
i
].
charStop
)
{
attributes
[
i
].
sentenceBoundary
=
false
;
continue
;
}
brk
=
sentenceBreakTable
[
brk
][
HB_GetSentenceClass
(
string
[
i
])];
if
(
brk
==
SB_Look
)
{
brk
=
SB_Break
;
hb_uint32
lookahead
=
i
+
1
;
while
(
lookahead
<
stringLength
)
{
hb_uint32
sbrk
=
HB_GetSentenceClass
(
string
[
lookahead
]);
if
(
sbrk
!=
HB_Sentence_Other
&&
sbrk
!=
HB_Sentence_Numeric
&&
sbrk
!=
HB_Sentence_Close
)
{
break
;
}
else
if
(
sbrk
==
HB_Sentence_Lower
)
{
brk
=
SB_Initial
;
break
;
}
++
lookahead
;
}
if
(
brk
==
SB_Initial
)
{
while
(
i
<
lookahead
)
attributes
[
i
++
].
sentenceBoundary
=
false
;
}
}
if
(
brk
==
SB_Break
)
{
attributes
[
i
].
sentenceBoundary
=
true
;
brk
=
sentenceBreakTable
[
SB_Initial
][
HB_GetSentenceClass
(
string
[
i
])];
}
else
{
attributes
[
i
].
sentenceBoundary
=
false
;
}
}
}
static
inline
char
*
tag_to_string
(
HB_UInt
tag
)
{
...
...
@@ -1335,4 +989,3 @@ HB_Bool HB_ShapeItem(HB_ShaperItem *shaper_item)
shaper_item
->
glyphIndicesPresent
=
false
;
return
result
;
}
src/hb-old/harfbuzz-shaper.h
浏览文件 @
4a31166b
...
...
@@ -130,37 +130,6 @@ typedef struct
hb_uint8
bidiLevel
;
}
HB_ScriptItem
;
typedef
enum
{
HB_NoBreak
,
HB_SoftHyphen
,
HB_Break
,
HB_ForcedBreak
}
HB_LineBreakType
;
typedef
struct
{
/*HB_LineBreakType*/
hb_bitfield
lineBreakType
:
2
;
/*HB_Bool*/
hb_bitfield
whiteSpace
:
1
;
/* A unicode whitespace character, except NBSP, ZWNBSP */
/*HB_Bool*/
hb_bitfield
charStop
:
1
;
/* Valid cursor position (for left/right arrow) */
/*HB_Bool*/
hb_bitfield
wordBoundary
:
1
;
/*HB_Bool*/
hb_bitfield
sentenceBoundary
:
1
;
hb_bitfield
unused
:
2
;
}
HB_CharAttributes
;
void
HB_GetCharAttributes
(
const
HB_UChar16
*
string
,
hb_uint32
stringLength
,
const
HB_ScriptItem
*
items
,
hb_uint32
numItems
,
HB_CharAttributes
*
attributes
);
/* requires HB_GetCharAttributes to be called before */
void
HB_GetWordBoundaries
(
const
HB_UChar16
*
string
,
hb_uint32
stringLength
,
const
HB_ScriptItem
*
items
,
hb_uint32
numItems
,
HB_CharAttributes
*
attributes
);
/* requires HB_GetCharAttributes to be called before */
void
HB_GetSentenceBoundaries
(
const
HB_UChar16
*
string
,
hb_uint32
stringLength
,
const
HB_ScriptItem
*
items
,
hb_uint32
numItems
,
HB_CharAttributes
*
attributes
);
typedef
enum
{
HB_LeftToRight
=
0
,
...
...
src/hb-old/harfbuzz-thai.c
已删除
100644 → 0
浏览文件 @
0bcbe88c
/*
* Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
*
* This is part of HarfBuzz, an OpenType Layout engine 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.
*/
#include "harfbuzz-shaper.h"
#include "harfbuzz-shaper-private.h"
#include "harfbuzz-external.h"
#include <assert.h>
#include <stdio.h>
typedef
int
(
*
th_brk_def
)(
const
char
*
,
int
[],
int
);
static
th_brk_def
th_brk
=
0
;
static
int
libthai_resolved
=
0
;
static
void
resolve_libthai
()
{
if
(
!
th_brk
)
th_brk
=
(
th_brk_def
)
HB_Library_Resolve
(
"thai"
,
0
,
"th_brk"
);
libthai_resolved
=
1
;
}
static
void
to_tis620
(
const
HB_UChar16
*
string
,
hb_uint32
len
,
const
char
*
cstr
)
{
hb_uint32
i
;
unsigned
char
*
result
=
(
unsigned
char
*
)
cstr
;
for
(
i
=
0
;
i
<
len
;
++
i
)
{
if
(
string
[
i
]
<=
0xa0
)
result
[
i
]
=
(
unsigned
char
)
string
[
i
];
if
(
string
[
i
]
>=
0xe01
&&
string
[
i
]
<=
0xe5b
)
result
[
i
]
=
(
unsigned
char
)(
string
[
i
]
-
0xe00
+
0xa0
);
else
result
[
i
]
=
'?'
;
}
result
[
len
]
=
0
;
}
static
void
thaiWordBreaks
(
const
HB_UChar16
*
string
,
hb_uint32
len
,
HB_CharAttributes
*
attributes
)
{
char
s
[
128
];
char
*
cstr
=
s
;
int
brp
[
128
];
int
*
break_positions
=
brp
;
hb_uint32
numbreaks
;
hb_uint32
i
;
if
(
!
libthai_resolved
)
resolve_libthai
();
if
(
!
th_brk
)
return
;
if
(
len
>=
128
)
cstr
=
(
char
*
)
malloc
(
len
*
sizeof
(
char
)
+
1
);
to_tis620
(
string
,
len
,
cstr
);
numbreaks
=
th_brk
(
cstr
,
break_positions
,
128
);
if
(
numbreaks
>
128
)
{
break_positions
=
(
int
*
)
malloc
(
numbreaks
*
sizeof
(
int
));
numbreaks
=
th_brk
(
cstr
,
break_positions
,
numbreaks
);
}
for
(
i
=
0
;
i
<
len
;
++
i
)
{
attributes
[
i
].
lineBreakType
=
HB_NoBreak
;
attributes
[
i
].
wordBoundary
=
FALSE
;
}
for
(
i
=
0
;
i
<
numbreaks
;
++
i
)
{
if
(
break_positions
[
i
]
>
0
)
{
attributes
[
break_positions
[
i
]
-
1
].
lineBreakType
=
HB_Break
;
attributes
[
break_positions
[
i
]
-
1
].
wordBoundary
=
TRUE
;
}
}
if
(
break_positions
!=
brp
)
free
(
break_positions
);
if
(
len
>=
128
)
free
(
cstr
);
}
void
HB_ThaiAttributes
(
HB_Script
script
,
const
HB_UChar16
*
text
,
hb_uint32
from
,
hb_uint32
len
,
HB_CharAttributes
*
attributes
)
{
assert
(
script
==
HB_Script_Thai
);
attributes
+=
from
;
thaiWordBreaks
(
text
+
from
,
len
,
attributes
);
}
src/hb-old/harfbuzz-tibetan.c
浏览文件 @
4a31166b
...
...
@@ -246,29 +246,3 @@ HB_Bool HB_TibetanShape(HB_ShaperItem *item)
item
->
num_glyphs
=
first_glyph
;
return
TRUE
;
}
void
HB_TibetanAttributes
(
HB_Script
script
,
const
HB_UChar16
*
text
,
hb_uint32
from
,
hb_uint32
len
,
HB_CharAttributes
*
attributes
)
{
int
end
=
from
+
len
;
const
HB_UChar16
*
uc
=
text
+
from
;
hb_uint32
i
=
0
;
HB_UNUSED
(
script
);
attributes
+=
from
;
while
(
i
<
len
)
{
HB_Bool
invalid
;
hb_uint32
boundary
=
tibetan_nextSyllableBoundary
(
text
,
from
+
i
,
end
,
&
invalid
)
-
from
;
attributes
[
i
].
charStop
=
TRUE
;
if
(
boundary
>
len
-
1
)
boundary
=
len
;
i
++
;
while
(
i
<
boundary
)
{
attributes
[
i
].
charStop
=
FALSE
;
++
uc
;
++
i
;
}
assert
(
i
==
boundary
);
}
}
src/hb-old/harfbuzz.c
已删除
100644 → 0
浏览文件 @
0bcbe88c
/*
* Copyright (C) 2006 Behdad Esfahbod
*
* This is part of HarfBuzz, an OpenType Layout engine 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.
*/
#define HB_INTERNAL static
#include "harfbuzz-buffer.c"
#include "harfbuzz-gdef.c"
#include "harfbuzz-gsub.c"
#include "harfbuzz-gpos.c"
#include "harfbuzz-impl.c"
#include "harfbuzz-open.c"
#include "harfbuzz-stream.c"
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录