From 1d50a188c4f40f4770d18587b3040f5cdf8128b4 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Sat, 29 Sep 2018 16:19:53 +0200 Subject: [PATCH] render_glyphs_in_cells: skip centering glyph for PUA --- kitty/fonts.c | 13 +++++++------ kitty/fonts.h | 2 +- kitty/freetype.c | 15 ++++++++------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/kitty/fonts.c b/kitty/fonts.c index 7c0f6ec68..772793a38 100644 --- a/kitty/fonts.c +++ b/kitty/fonts.c @@ -635,6 +635,11 @@ extract_cell_from_canvas(FontGroup *fg, unsigned int i, unsigned int num_cells) return ans; } +static inline bool +is_private_use(char_type ch) { + return (0xe000 <= ch && ch <= 0xf8ff) || (0xF0000 <= ch && ch <= 0xFFFFF) || (0x100000 <= ch && ch <= 0x10FFFF); +} + 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 glyph, ExtraGlyphs *extra_glyphs) { static SpritePosition* sprite_position[16]; @@ -651,7 +656,8 @@ render_group(FontGroup *fg, unsigned int num_cells, unsigned int num_glyphs, CPU clear_canvas(fg); bool was_colored = (gpu_cells->attrs & WIDTH_MASK) == 2 && is_emoji(cpu_cells->ch); - render_glyphs_in_cells(font->face, font->bold, font->italic, info, positions, num_glyphs, fg->canvas, fg->cell_width, fg->cell_height, num_cells, fg->baseline, &was_colored, (FONTS_DATA_HANDLE)fg); + bool center_glyph = !is_private_use(cpu_cells->ch); + render_glyphs_in_cells(font->face, font->bold, font->italic, info, positions, num_glyphs, fg->canvas, fg->cell_width, fg->cell_height, num_cells, fg->baseline, &was_colored, (FONTS_DATA_HANDLE)fg, center_glyph); if (PyErr_Occurred()) PyErr_Print(); for (unsigned int i = 0; i < num_cells; i++) { @@ -989,11 +995,6 @@ render_run(FontGroup *fg, CPUCell *first_cpu_cell, GPUCell *first_gpu_cell, inde } } -static inline bool -is_private_use(char_type ch) { - return (0xe000 <= ch && ch <= 0xf8ff) || (0xF0000 <= ch && ch <= 0xFFFFF) || (0x100000 <= ch && ch <= 0x10FFFF); -} - void render_line(FONTS_DATA_HANDLE fg_, Line *line) { #define RENDER if (run_font_idx != NO_FONT && i > first_cell_in_run) render_run(fg, line->cpu_cells + first_cell_in_run, line->gpu_cells + first_cell_in_run, i - first_cell_in_run, run_font_idx, false); diff --git a/kitty/fonts.h b/kitty/fonts.h index 0e5a7aacb..1a05f1b0c 100644 --- a/kitty/fonts.h +++ b/kitty/fonts.h @@ -21,7 +21,7 @@ bool is_glyph_empty(PyObject *, glyph_index); hb_font_t* harfbuzz_font_for_face(PyObject*); bool set_size_for_face(PyObject*, unsigned int, bool, FONTS_DATA_HANDLE); void cell_metrics(PyObject*, unsigned int*, unsigned int*, unsigned int*, unsigned int*, unsigned int*); -bool render_glyphs_in_cells(PyObject *f, bool bold, bool italic, hb_glyph_info_t *info, hb_glyph_position_t *positions, unsigned int num_glyphs, pixel *canvas, unsigned int cell_width, unsigned int cell_height, unsigned int num_cells, unsigned int baseline, bool *was_colored, FONTS_DATA_HANDLE); +bool render_glyphs_in_cells(PyObject *f, bool bold, bool italic, hb_glyph_info_t *info, hb_glyph_position_t *positions, unsigned int num_glyphs, pixel *canvas, unsigned int cell_width, unsigned int cell_height, unsigned int num_cells, unsigned int baseline, bool *was_colored, FONTS_DATA_HANDLE, bool center_glyph); PyObject* create_fallback_face(PyObject *base_face, CPUCell* cell, bool bold, bool italic, bool emoji_presentation, FONTS_DATA_HANDLE fg); PyObject* specialize_font_descriptor(PyObject *base_descriptor, FONTS_DATA_HANDLE); PyObject* face_from_path(const char *path, int index, FONTS_DATA_HANDLE); diff --git a/kitty/freetype.c b/kitty/freetype.c index a0aca4a13..42229aa2f 100644 --- a/kitty/freetype.c +++ b/kitty/freetype.c @@ -483,7 +483,7 @@ place_bitmap_in_canvas(pixel *cell, ProcessedBitmap *bm, size_t cell_width, size static const ProcessedBitmap EMPTY_PBM = {.factor = 1}; bool -render_glyphs_in_cells(PyObject *f, bool bold, bool italic, hb_glyph_info_t *info, hb_glyph_position_t *positions, unsigned int num_glyphs, pixel *canvas, unsigned int cell_width, unsigned int cell_height, unsigned int num_cells, unsigned int baseline, bool *was_colored, FONTS_DATA_HANDLE fg) { +render_glyphs_in_cells(PyObject *f, bool bold, bool italic, hb_glyph_info_t *info, hb_glyph_position_t *positions, unsigned int num_glyphs, pixel *canvas, unsigned int cell_width, unsigned int cell_height, unsigned int num_cells, unsigned int baseline, bool *was_colored, FONTS_DATA_HANDLE fg, bool center_glyph) { Face *self = (Face*)f; bool is_emoji = *was_colored; *was_colored = is_emoji && self->has_color; float x = 0.f, y = 0.f, x_offset = 0.f; @@ -507,12 +507,13 @@ render_glyphs_in_cells(PyObject *f, bool bold, bool italic, hb_glyph_info_t *inf if (bm.needs_free) free(bm.buf); } - // center the glyphs in the canvas - unsigned int right_edge = (unsigned int)x, delta; - // x_advance is wrong for colored bitmaps that have been downsampled - if (*was_colored) right_edge = num_glyphs == 1 ? bm.right_edge : canvas_width; - if (num_cells > 1 && right_edge < canvas_width && (delta = (canvas_width - right_edge) / 2) && delta > 1) { - right_shift_canvas(canvas, canvas_width, cell_height, delta); + if (center_glyph) { + unsigned int right_edge = (unsigned int)x, delta; + // x_advance is wrong for colored bitmaps that have been downsampled + if (*was_colored) right_edge = num_glyphs == 1 ? bm.right_edge : canvas_width; + if (num_cells > 1 && right_edge < canvas_width && (delta = (canvas_width - right_edge) / 2) && delta > 1) { + right_shift_canvas(canvas, canvas_width, cell_height, delta); + } } return true; }