Dont assume all sprites are rendered if the first one is

This commit is contained in:
Kovid Goyal 2021-05-06 20:20:38 +05:30
parent 6eab138d68
commit f6e33406d7
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -642,11 +642,13 @@ static inline void
render_group(FontGroup *fg, unsigned int num_cells, unsigned int num_glyphs, CPUCell *cpu_cells, GPUCell *gpu_cells, hb_glyph_info_t *info, hb_glyph_position_t *positions, Font *font, glyph_index *glyphs, unsigned glyph_count, bool center_glyph) { render_group(FontGroup *fg, unsigned int num_cells, unsigned int num_glyphs, CPUCell *cpu_cells, GPUCell *gpu_cells, hb_glyph_info_t *info, hb_glyph_position_t *positions, Font *font, glyph_index *glyphs, unsigned glyph_count, bool center_glyph) {
#define sprite_positions global_glyph_render_scratch.sprite_positions #define sprite_positions global_glyph_render_scratch.sprite_positions
int error = 0; int error = 0;
bool all_rendered = true;
for (unsigned int i = 0; i < num_cells; i++) { for (unsigned int i = 0; i < num_cells; i++) {
sprite_positions[i] = sprite_position_for(fg, font, glyphs, glyph_count, (uint8_t)i, &error); sprite_positions[i] = sprite_position_for(fg, font, glyphs, glyph_count, (uint8_t)i, &error);
if (error != 0) { sprite_map_set_error(error); PyErr_Print(); return; } if (error != 0) { sprite_map_set_error(error); PyErr_Print(); return; }
if (!sprite_positions[i]->rendered) all_rendered = false;
} }
if (sprite_positions[0]->rendered) { if (all_rendered) {
for (unsigned int i = 0; i < num_cells; i++) { set_cell_sprite(gpu_cells + i, sprite_positions[i]); } for (unsigned int i = 0; i < num_cells; i++) { set_cell_sprite(gpu_cells + i, sprite_positions[i]); }
return; return;
} }
@ -657,11 +659,13 @@ render_group(FontGroup *fg, unsigned int num_cells, unsigned int num_glyphs, CPU
if (PyErr_Occurred()) PyErr_Print(); if (PyErr_Occurred()) PyErr_Print();
for (unsigned int i = 0; i < num_cells; i++) { for (unsigned int i = 0; i < num_cells; i++) {
sprite_positions[i]->rendered = true;
sprite_positions[i]->colored = was_colored;
set_cell_sprite(gpu_cells + i, sprite_positions[i]); set_cell_sprite(gpu_cells + i, sprite_positions[i]);
pixel *buf = num_cells == 1 ? fg->canvas.buf : extract_cell_from_canvas(fg, i, num_cells); if (!sprite_positions[i]->rendered) {
current_send_sprite_to_gpu((FONTS_DATA_HANDLE)fg, sprite_positions[i]->x, sprite_positions[i]->y, sprite_positions[i]->z, buf); sprite_positions[i]->rendered = true;
sprite_positions[i]->colored = was_colored;
pixel *buf = num_cells == 1 ? fg->canvas.buf : extract_cell_from_canvas(fg, i, num_cells);
current_send_sprite_to_gpu((FONTS_DATA_HANDLE)fg, sprite_positions[i]->x, sprite_positions[i]->y, sprite_positions[i]->z, buf);
}
} }
#undef sprite_positions #undef sprite_positions
} }