mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-15 21:14:35 +02:00
Allocate shape_buffer on the heap so it works with arbitrary input length
This commit is contained in:
@@ -40,7 +40,7 @@ typedef struct RunFont {
|
|||||||
|
|
||||||
static hb_buffer_t *harfbuzz_buffer = NULL;
|
static hb_buffer_t *harfbuzz_buffer = NULL;
|
||||||
static hb_feature_t hb_features[3] = {{0}};
|
static hb_feature_t hb_features[3] = {{0}};
|
||||||
static char_type shape_buffer[4096] = {0};
|
static struct { char_type *codepoints; size_t capacity; } shape_buffer = {0};
|
||||||
static size_t max_texture_size = 1024, max_array_len = 1024;
|
static size_t max_texture_size = 1024, max_array_len = 1024;
|
||||||
typedef enum { LIGA_FEATURE, DLIG_FEATURE, CALT_FEATURE } HBFeature;
|
typedef enum { LIGA_FEATURE, DLIG_FEATURE, CALT_FEATURE } HBFeature;
|
||||||
|
|
||||||
@@ -1105,14 +1105,17 @@ static void
|
|||||||
load_hb_buffer(CPUCell *first_cpu_cell, index_type num_cells, const TextCache *tc, ListOfChars *lc) {
|
load_hb_buffer(CPUCell *first_cpu_cell, index_type num_cells, const TextCache *tc, ListOfChars *lc) {
|
||||||
size_t num = 0;
|
size_t num = 0;
|
||||||
hb_buffer_clear_contents(harfbuzz_buffer);
|
hb_buffer_clear_contents(harfbuzz_buffer);
|
||||||
|
// Although hb_buffer_add_codepoints is supposedly an append, we have to
|
||||||
|
// add all text in one call otherwise it breaks shaping, presumably because
|
||||||
|
// of context??
|
||||||
for (; num_cells; first_cpu_cell++, num_cells--) {
|
for (; num_cells; first_cpu_cell++, num_cells--) {
|
||||||
if (first_cpu_cell->is_multicell && first_cpu_cell->x) continue;
|
if (first_cpu_cell->is_multicell && first_cpu_cell->x) continue;
|
||||||
text_in_cell(first_cpu_cell, tc, lc);
|
text_in_cell(first_cpu_cell, tc, lc);
|
||||||
const size_t count = MIN(lc->count, arraysz(shape_buffer) - num);
|
ensure_space_for((&shape_buffer), codepoints, char_type, lc->count + num, capacity, 512, false);
|
||||||
memcpy(shape_buffer + num, lc->chars, count * sizeof(shape_buffer[0]));
|
memcpy(shape_buffer.codepoints + num, lc->chars, lc->count * sizeof(shape_buffer.codepoints[0]));
|
||||||
num += count;
|
num += lc->count;
|
||||||
}
|
}
|
||||||
hb_buffer_add_codepoints(harfbuzz_buffer, shape_buffer, num, 0, num);
|
hb_buffer_add_codepoints(harfbuzz_buffer, shape_buffer.codepoints, num, 0, num);
|
||||||
hb_buffer_guess_segment_properties(harfbuzz_buffer);
|
hb_buffer_guess_segment_properties(harfbuzz_buffer);
|
||||||
if (OPT(force_ltr)) hb_buffer_set_direction(harfbuzz_buffer, HB_DIRECTION_LTR);
|
if (OPT(force_ltr)) hb_buffer_set_direction(harfbuzz_buffer, HB_DIRECTION_LTR);
|
||||||
}
|
}
|
||||||
@@ -2055,6 +2058,7 @@ finalize(void) {
|
|||||||
free(global_glyph_render_scratch.sprite_positions);
|
free(global_glyph_render_scratch.sprite_positions);
|
||||||
if (global_glyph_render_scratch.lc) { cleanup_list_of_chars(global_glyph_render_scratch.lc); free(global_glyph_render_scratch.lc); }
|
if (global_glyph_render_scratch.lc) { cleanup_list_of_chars(global_glyph_render_scratch.lc); free(global_glyph_render_scratch.lc); }
|
||||||
global_glyph_render_scratch = (GlyphRenderScratch){0};
|
global_glyph_render_scratch = (GlyphRenderScratch){0};
|
||||||
|
free(shape_buffer.codepoints); zero_at_ptr(&shape_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject*
|
static PyObject*
|
||||||
|
|||||||
Reference in New Issue
Block a user