You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-24 15:26:15 +00:00
HarfBuzz: Update to version 4.2.0
This commit is contained in:
102
thirdparty/harfbuzz/src/hb-bit-set.hh
vendored
102
thirdparty/harfbuzz/src/hb-bit-set.hh
vendored
@@ -203,7 +203,7 @@ struct hb_bit_set_t
|
||||
bool set_sorted_array (bool v, const T *array, unsigned int count, unsigned int stride=sizeof(T))
|
||||
{
|
||||
if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
|
||||
if (!count) return true;
|
||||
if (unlikely (!count)) return true;
|
||||
dirty ();
|
||||
hb_codepoint_t g = *array;
|
||||
hb_codepoint_t last_g = g;
|
||||
@@ -222,7 +222,7 @@ struct hb_bit_set_t
|
||||
if (v || page) /* The v check is to optimize out the page check if v is true. */
|
||||
page->add (g);
|
||||
|
||||
array = (const T *) ((const char *) array + stride);
|
||||
array = &StructAtOffsetUnaligned<T> (array, stride);
|
||||
count--;
|
||||
}
|
||||
while (count && (g = *array, g < end));
|
||||
@@ -700,6 +700,99 @@ struct hb_bit_set_t
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned int next_many (hb_codepoint_t codepoint,
|
||||
hb_codepoint_t *out,
|
||||
unsigned int size) const
|
||||
{
|
||||
// By default, start at the first bit of the first page of values.
|
||||
unsigned int start_page = 0;
|
||||
unsigned int start_page_value = 0;
|
||||
if (unlikely (codepoint != INVALID))
|
||||
{
|
||||
const auto* page_map_array = page_map.arrayZ;
|
||||
unsigned int major = get_major (codepoint);
|
||||
unsigned int i = last_page_lookup;
|
||||
if (unlikely (i >= page_map.length || page_map_array[i].major != major))
|
||||
{
|
||||
page_map.bfind (major, &i, HB_NOT_FOUND_STORE_CLOSEST);
|
||||
if (i >= page_map.length)
|
||||
return 0; // codepoint is greater than our max element.
|
||||
}
|
||||
start_page = i;
|
||||
start_page_value = page_remainder (codepoint + 1);
|
||||
if (unlikely (start_page_value == 0))
|
||||
{
|
||||
// The export-after value was last in the page. Start on next page.
|
||||
start_page++;
|
||||
start_page_value = 0;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int initial_size = size;
|
||||
for (unsigned int i = start_page; i < page_map.length && size; i++)
|
||||
{
|
||||
uint32_t base = major_start (page_map[i].major);
|
||||
unsigned int n = pages[page_map[i].index].write (base, start_page_value, out, size);
|
||||
out += n;
|
||||
size -= n;
|
||||
start_page_value = 0;
|
||||
}
|
||||
return initial_size - size;
|
||||
}
|
||||
|
||||
unsigned int next_many_inverted (hb_codepoint_t codepoint,
|
||||
hb_codepoint_t *out,
|
||||
unsigned int size) const
|
||||
{
|
||||
unsigned int initial_size = size;
|
||||
// By default, start at the first bit of the first page of values.
|
||||
unsigned int start_page = 0;
|
||||
unsigned int start_page_value = 0;
|
||||
if (unlikely (codepoint != INVALID))
|
||||
{
|
||||
const auto* page_map_array = page_map.arrayZ;
|
||||
unsigned int major = get_major (codepoint);
|
||||
unsigned int i = last_page_lookup;
|
||||
if (unlikely (i >= page_map.length || page_map_array[i].major != major))
|
||||
{
|
||||
page_map.bfind(major, &i, HB_NOT_FOUND_STORE_CLOSEST);
|
||||
if (unlikely (i >= page_map.length))
|
||||
{
|
||||
// codepoint is greater than our max element.
|
||||
while (++codepoint != INVALID && size)
|
||||
{
|
||||
*out++ = codepoint;
|
||||
size--;
|
||||
}
|
||||
return initial_size - size;
|
||||
}
|
||||
}
|
||||
start_page = i;
|
||||
start_page_value = page_remainder (codepoint + 1);
|
||||
if (unlikely (start_page_value == 0))
|
||||
{
|
||||
// The export-after value was last in the page. Start on next page.
|
||||
start_page++;
|
||||
start_page_value = 0;
|
||||
}
|
||||
}
|
||||
|
||||
hb_codepoint_t next_value = codepoint + 1;
|
||||
for (unsigned int i=start_page; i<page_map.length && size; i++)
|
||||
{
|
||||
uint32_t base = major_start (page_map[i].major);
|
||||
unsigned int n = pages[page_map[i].index].write_inverted (base, start_page_value, out, size, &next_value);
|
||||
out += n;
|
||||
size -= n;
|
||||
start_page_value = 0;
|
||||
}
|
||||
while (next_value < HB_SET_VALUE_INVALID && size) {
|
||||
*out++ = next_value++;
|
||||
size--;
|
||||
}
|
||||
return initial_size - size;
|
||||
}
|
||||
|
||||
bool has_population () const { return population != UINT_MAX; }
|
||||
unsigned int get_population () const
|
||||
{
|
||||
@@ -809,8 +902,9 @@ struct hb_bit_set_t
|
||||
}
|
||||
page_t &page_at (unsigned int i) { return pages[page_map[i].index]; }
|
||||
const page_t &page_at (unsigned int i) const { return pages[page_map[i].index]; }
|
||||
unsigned int get_major (hb_codepoint_t g) const { return g / page_t::PAGE_BITS; }
|
||||
hb_codepoint_t major_start (unsigned int major) const { return major * page_t::PAGE_BITS; }
|
||||
unsigned int get_major (hb_codepoint_t g) const { return g >> page_t::PAGE_BITS_LOG_2; }
|
||||
unsigned int page_remainder (hb_codepoint_t g) const { return g & page_t::PAGE_BITMASK; }
|
||||
hb_codepoint_t major_start (unsigned int major) const { return major << page_t::PAGE_BITS_LOG_2; }
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user