1
0
mirror of https://github.com/godotengine/godot.git synced 2025-12-01 16:38:31 +00:00

HarfBuzz: Update to version 3.2.0

This commit is contained in:
bruvzg
2021-12-15 14:56:47 +02:00
parent e664d195cb
commit b63aced768
35 changed files with 731 additions and 415 deletions

View File

@@ -201,9 +201,55 @@ struct hb_buffer_t
unsigned int cluster);
HB_INTERNAL void add_info (const hb_glyph_info_t &glyph_info);
HB_INTERNAL void reverse_range (unsigned int start, unsigned int end);
HB_INTERNAL void reverse ();
HB_INTERNAL void reverse_clusters ();
void reverse_range (unsigned start, unsigned end)
{
hb_array_t<hb_glyph_info_t> (info, len).reverse (start, end);
if (have_positions)
hb_array_t<hb_glyph_position_t> (pos, len).reverse (start, end);
}
void reverse () { reverse_range (0, len); }
template <typename FuncType>
void reverse_groups (const FuncType& group,
bool merge_clusters = false)
{
if (unlikely (!len))
return;
unsigned start = 0;
unsigned i;
for (i = 1; i < len; i++)
{
if (!group (info[i - 1], info[i]))
{
if (merge_clusters)
this->merge_clusters (start, i);
reverse_range (start, i);
start = i;
}
}
if (merge_clusters)
this->merge_clusters (start, i);
reverse_range (start, i);
reverse ();
}
template <typename FuncType>
unsigned group_end (unsigned start, const FuncType& group) const
{
while (++start < len && group (info[start - 1], info[start]))
;
return start;
}
static bool _cluster_group_func (const hb_glyph_info_t& a,
const hb_glyph_info_t& b)
{ return a.cluster == b.cluster; }
void reverse_clusters () { reverse_groups (_cluster_group_func); }
HB_INTERNAL void guess_segment_properties ();
HB_INTERNAL void swap_buffers ();
@@ -428,10 +474,10 @@ struct hb_buffer_t
inf.cluster = cluster;
}
unsigned int
_unsafe_to_break_find_min_cluster (const hb_glyph_info_t *infos,
unsigned int start, unsigned int end,
unsigned int cluster) const
static unsigned
_infos_find_min_cluster (const hb_glyph_info_t *infos,
unsigned start, unsigned end,
unsigned cluster)
{
for (unsigned int i = start; i < end; i++)
cluster = hb_min (cluster, infos[i].cluster);
@@ -450,36 +496,24 @@ struct hb_buffer_t
}
}
void unsafe_to_break_all () { unsafe_to_break_impl (0, len); }
void safe_to_break_all ()
void clear_glyph_flags (hb_mask_t mask = 0)
{
for (unsigned int i = 0; i < len; i++)
info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
info[i].mask = (info[i].mask & ~HB_GLYPH_FLAG_DEFINED) | (mask & HB_GLYPH_FLAG_DEFINED);
}
};
DECLARE_NULL_INSTANCE (hb_buffer_t);
/* Loop over clusters. Duplicated in foreach_syllable(). */
#define foreach_cluster(buffer, start, end) \
#define foreach_group(buffer, start, end, group_func) \
for (unsigned int \
_count = buffer->len, \
start = 0, end = _count ? _next_cluster (buffer, 0) : 0; \
start = 0, end = _count ? buffer->group_end (0, group_func) : 0; \
start < _count; \
start = end, end = _next_cluster (buffer, start))
start = end, end = buffer->group_end (start, group_func))
static inline unsigned int
_next_cluster (hb_buffer_t *buffer, unsigned int start)
{
hb_glyph_info_t *info = buffer->info;
unsigned int count = buffer->len;
unsigned int cluster = info[start].cluster;
while (++start < count && cluster == info[start].cluster)
;
return start;
}
#define foreach_cluster(buffer, start, end) \
foreach_group (buffer, start, end, hb_buffer_t::_cluster_group_func)
#define HB_BUFFER_XALLOCATE_VAR(b, func, var) \