提交 7b7129c7 编写于 作者: B Behdad Esfahbod

Add hb_frozen_set_t

I experimented with replacing use of hb_set_digest_t with this new
hb_frozen_set_t, hoping to get a huge speedup for busy lookups
(like kern lookup in Roboto), but I only got 6% speendup in Roboto
and 4% in NotoNastaliqUrduDraft :(.
上级 241eac95
......@@ -145,6 +145,8 @@ typedef hb_set_digest_combiner_t
struct hb_set_t
{
friend struct hb_frozen_set_t;
hb_object_header_t header;
ASSERT_POD ();
bool in_error;
......@@ -326,7 +328,7 @@ struct hb_set_t
static const hb_codepoint_t INVALID = HB_SET_VALUE_INVALID;
elt_t &elt (hb_codepoint_t g) { return elts[g >> SHIFT]; }
elt_t elt (hb_codepoint_t g) const { return elts[g >> SHIFT]; }
elt_t const &elt (hb_codepoint_t g) const { return elts[g >> SHIFT]; }
elt_t mask (hb_codepoint_t g) const { return elt_t (1) << (g & MASK); }
elt_t elts[ELTS]; /* XXX 8kb */
......@@ -335,6 +337,59 @@ struct hb_set_t
ASSERT_STATIC (sizeof (elt_t) * 8 * ELTS > MAX_G);
};
struct hb_frozen_set_t
{
static const unsigned int SHIFT = hb_set_t::SHIFT;
static const unsigned int BITS = hb_set_t::BITS;
static const unsigned int MASK = hb_set_t::MASK;
typedef hb_set_t::elt_t elt_t;
inline void init (const hb_set_t &set)
{
start = count = 0;
elts = NULL;
unsigned int max = set.get_max ();
if (max == set.INVALID)
return;
unsigned int min = set.get_min ();
const elt_t &min_elt = set.elt (min);
const elt_t &max_elt = set.elt (max);
start = min & ~MASK;
count = max - start + 1;
unsigned int num_elts = (count + BITS - 1) / BITS;
unsigned int elts_size = num_elts * sizeof (elt_t);
elts = (elt_t *) malloc (elts_size);
if (unlikely (!elts))
{
start = count = 0;
return;
}
memcpy (elts, &min_elt, elts_size);
}
inline void fini (void)
{
if (elts)
free (elts);
}
inline bool has (hb_codepoint_t g) const
{
/* hb_codepoint_t is unsigned. */
g -= start;
if (unlikely (g > count)) return false;
return !!(elt (g) & mask (g));
}
elt_t const &elt (hb_codepoint_t g) const { return elts[g >> SHIFT]; }
elt_t mask (hb_codepoint_t g) const { return elt_t (1) << (g & MASK); }
private:
hb_codepoint_t start, count;
elt_t *elts;
};
#endif /* HB_SET_PRIVATE_HH */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册