Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
826a1daf
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
826a1daf
编写于
10月 15, 2017
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Move set-digests into their own header file
上级
3c13e153
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
146 addition
and
114 deletion
+146
-114
src/Makefile.sources
src/Makefile.sources
+1
-0
src/hb-ot-layout-private.hh
src/hb-ot-layout-private.hh
+1
-1
src/hb-set-digest-private.hh
src/hb-set-digest-private.hh
+144
-0
src/hb-set-private.hh
src/hb-set-private.hh
+0
-113
未找到文件。
src/Makefile.sources
浏览文件 @
826a1daf
...
...
@@ -30,6 +30,7 @@ HB_BASE_sources = \
hb-ot-post-table.hh
\
hb-ot-tag.cc
\
hb-private.hh
\
hb-set-digest-private.hh
\
hb-set-private.hh
\
hb-set.cc
\
hb-shape.cc
\
...
...
src/hb-ot-layout-private.hh
浏览文件 @
826a1daf
...
...
@@ -33,7 +33,7 @@
#include "hb-font-private.hh"
#include "hb-buffer-private.hh"
#include "hb-set-private.hh"
#include "hb-set-
digest-
private.hh"
#include "hb-open-type-private.hh"
...
...
src/hb-set-digest-private.hh
0 → 100644
浏览文件 @
826a1daf
/*
* 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_SET_DIGEST_PRIVATE_HH
#define HB_SET_DIGEST_PRIVATE_HH
#include "hb-private.hh"
/*
* The set digests here implement various "filters" that support
* "approximate member query". Conceptually these are like Bloom
* Filter and Quotient Filter, however, much smaller, faster, and
* designed to fit the requirements of our uses for glyph coverage
* queries.
*
* Our filters are highly accurate if the lookup covers fairly local
* set of glyphs, but fully flooded and ineffective if coverage is
* all over the place.
*
* The frozen-set can be used instead of a digest, to trade more
* memory for 100% accuracy, but in practice, that doesn't look like
* an attractive trade-off.
*/
template
<
typename
mask_t
,
unsigned
int
shift
>
struct
hb_set_digest_lowest_bits_t
{
ASSERT_POD
();
static
const
unsigned
int
mask_bytes
=
sizeof
(
mask_t
);
static
const
unsigned
int
mask_bits
=
sizeof
(
mask_t
)
*
8
;
static
const
unsigned
int
num_bits
=
0
+
(
mask_bytes
>=
1
?
3
:
0
)
+
(
mask_bytes
>=
2
?
1
:
0
)
+
(
mask_bytes
>=
4
?
1
:
0
)
+
(
mask_bytes
>=
8
?
1
:
0
)
+
(
mask_bytes
>=
16
?
1
:
0
)
+
0
;
static_assert
((
shift
<
sizeof
(
hb_codepoint_t
)
*
8
),
""
);
static_assert
((
shift
+
num_bits
<=
sizeof
(
hb_codepoint_t
)
*
8
),
""
);
inline
void
init
(
void
)
{
mask
=
0
;
}
inline
void
add
(
hb_codepoint_t
g
)
{
mask
|=
mask_for
(
g
);
}
inline
void
add_range
(
hb_codepoint_t
a
,
hb_codepoint_t
b
)
{
if
((
b
>>
shift
)
-
(
a
>>
shift
)
>=
mask_bits
-
1
)
mask
=
(
mask_t
)
-
1
;
else
{
mask_t
ma
=
mask_for
(
a
);
mask_t
mb
=
mask_for
(
b
);
mask
|=
mb
+
(
mb
-
ma
)
-
(
mb
<
ma
);
}
}
inline
bool
may_have
(
hb_codepoint_t
g
)
const
{
return
!!
(
mask
&
mask_for
(
g
));
}
private:
static
inline
mask_t
mask_for
(
hb_codepoint_t
g
)
{
return
((
mask_t
)
1
)
<<
((
g
>>
shift
)
&
(
mask_bits
-
1
));
}
mask_t
mask
;
};
template
<
typename
head_t
,
typename
tail_t
>
struct
hb_set_digest_combiner_t
{
ASSERT_POD
();
inline
void
init
(
void
)
{
head
.
init
();
tail
.
init
();
}
inline
void
add
(
hb_codepoint_t
g
)
{
head
.
add
(
g
);
tail
.
add
(
g
);
}
inline
void
add_range
(
hb_codepoint_t
a
,
hb_codepoint_t
b
)
{
head
.
add_range
(
a
,
b
);
tail
.
add_range
(
a
,
b
);
}
inline
bool
may_have
(
hb_codepoint_t
g
)
const
{
return
head
.
may_have
(
g
)
&&
tail
.
may_have
(
g
);
}
private:
head_t
head
;
tail_t
tail
;
};
/*
* hb_set_digest_t
*
* This is a combination of digests that performs "best".
* There is not much science to this: it's a result of intuition
* and testing.
*/
typedef
hb_set_digest_combiner_t
<
hb_set_digest_lowest_bits_t
<
unsigned
long
,
4
>
,
hb_set_digest_combiner_t
<
hb_set_digest_lowest_bits_t
<
unsigned
long
,
0
>
,
hb_set_digest_lowest_bits_t
<
unsigned
long
,
9
>
>
>
hb_set_digest_t
;
#endif
/* HB_SET_DIGEST_PRIVATE_HH */
src/hb-set-private.hh
浏览文件 @
826a1daf
...
...
@@ -31,119 +31,6 @@
#include "hb-object-private.hh"
/*
* The set digests here implement various "filters" that support
* "approximate member query". Conceptually these are like Bloom
* Filter and Quotient Filter, however, much smaller, faster, and
* designed to fit the requirements of our uses for glyph coverage
* queries.
*
* Our filters are highly accurate if the lookup covers fairly local
* set of glyphs, but fully flooded and ineffective if coverage is
* all over the place.
*
* The frozen-set can be used instead of a digest, to trade more
* memory for 100% accuracy, but in practice, that doesn't look like
* an attractive trade-off.
*/
template
<
typename
mask_t
,
unsigned
int
shift
>
struct
hb_set_digest_lowest_bits_t
{
ASSERT_POD
();
static
const
unsigned
int
mask_bytes
=
sizeof
(
mask_t
);
static
const
unsigned
int
mask_bits
=
sizeof
(
mask_t
)
*
8
;
static
const
unsigned
int
num_bits
=
0
+
(
mask_bytes
>=
1
?
3
:
0
)
+
(
mask_bytes
>=
2
?
1
:
0
)
+
(
mask_bytes
>=
4
?
1
:
0
)
+
(
mask_bytes
>=
8
?
1
:
0
)
+
(
mask_bytes
>=
16
?
1
:
0
)
+
0
;
static_assert
((
shift
<
sizeof
(
hb_codepoint_t
)
*
8
),
""
);
static_assert
((
shift
+
num_bits
<=
sizeof
(
hb_codepoint_t
)
*
8
),
""
);
inline
void
init
(
void
)
{
mask
=
0
;
}
inline
void
add
(
hb_codepoint_t
g
)
{
mask
|=
mask_for
(
g
);
}
inline
void
add_range
(
hb_codepoint_t
a
,
hb_codepoint_t
b
)
{
if
((
b
>>
shift
)
-
(
a
>>
shift
)
>=
mask_bits
-
1
)
mask
=
(
mask_t
)
-
1
;
else
{
mask_t
ma
=
mask_for
(
a
);
mask_t
mb
=
mask_for
(
b
);
mask
|=
mb
+
(
mb
-
ma
)
-
(
mb
<
ma
);
}
}
inline
bool
may_have
(
hb_codepoint_t
g
)
const
{
return
!!
(
mask
&
mask_for
(
g
));
}
private:
static
inline
mask_t
mask_for
(
hb_codepoint_t
g
)
{
return
((
mask_t
)
1
)
<<
((
g
>>
shift
)
&
(
mask_bits
-
1
));
}
mask_t
mask
;
};
template
<
typename
head_t
,
typename
tail_t
>
struct
hb_set_digest_combiner_t
{
ASSERT_POD
();
inline
void
init
(
void
)
{
head
.
init
();
tail
.
init
();
}
inline
void
add
(
hb_codepoint_t
g
)
{
head
.
add
(
g
);
tail
.
add
(
g
);
}
inline
void
add_range
(
hb_codepoint_t
a
,
hb_codepoint_t
b
)
{
head
.
add_range
(
a
,
b
);
tail
.
add_range
(
a
,
b
);
}
inline
bool
may_have
(
hb_codepoint_t
g
)
const
{
return
head
.
may_have
(
g
)
&&
tail
.
may_have
(
g
);
}
private:
head_t
head
;
tail_t
tail
;
};
/*
* hb_set_digest_t
*
* This is a combination of digests that performs "best".
* There is not much science to this: it's a result of intuition
* and testing.
*/
typedef
hb_set_digest_combiner_t
<
hb_set_digest_lowest_bits_t
<
unsigned
long
,
4
>
,
hb_set_digest_combiner_t
<
hb_set_digest_lowest_bits_t
<
unsigned
long
,
0
>
,
hb_set_digest_lowest_bits_t
<
unsigned
long
,
9
>
>
>
hb_set_digest_t
;
/*
* hb_set_t
*/
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录