From c6cacd2b2d397df7e73a8db166727f1ca405713b Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 17 Sep 2021 19:07:55 -0400 Subject: [PATCH 1/2] ngl: Use exact device scales for glyphs We are rendering the glyphs on a larger surface, and we should avoid introducing unnecessary rounding errors here. Also, I've found that we always need to enlarge the surface by one pixels in each direction to avoid cutting off the tops of large glyphs. --- gsk/ngl/gsknglglyphlibrary.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/gsk/ngl/gsknglglyphlibrary.c b/gsk/ngl/gsknglglyphlibrary.c index 9c184ed0f7..33c86cc967 100644 --- a/gsk/ngl/gsknglglyphlibrary.c +++ b/gsk/ngl/gsknglglyphlibrary.c @@ -132,7 +132,8 @@ gsk_ngl_glyph_library_create_surface (GskNglGlyphLibrary *self, int stride, int width, int height, - double device_scale) + int uwidth, + int uheight) { cairo_surface_t *surface; gsize n_bytes; @@ -153,7 +154,7 @@ gsk_ngl_glyph_library_create_surface (GskNglGlyphLibrary *self, surface = cairo_image_surface_create_for_data (self->surface_data, CAIRO_FORMAT_ARGB32, width, height, stride); - cairo_surface_set_device_scale (surface, device_scale, device_scale); + cairo_surface_set_device_scale (surface, width / (double)uwidth, height / (double)uheight); return surface; } @@ -192,7 +193,8 @@ gsk_ngl_glyph_library_upload_glyph (GskNglGlyphLibrary *self, int y, int width, int height, - double device_scale) + int uwidth, + int uheight) { GskNglTextureLibrary *tl = (GskNglTextureLibrary *)self; G_GNUC_UNUSED gint64 start_time = GDK_PROFILER_CURRENT_TIME; @@ -220,7 +222,7 @@ gsk_ngl_glyph_library_upload_glyph (GskNglGlyphLibrary *self, "Uploading glyph %d", key->glyph); - surface = gsk_ngl_glyph_library_create_surface (self, stride, width, height, device_scale); + surface = gsk_ngl_glyph_library_create_surface (self, stride, width, height, uwidth, uheight); render_glyph (surface, scaled_font, key, value); texture_id = GSK_NGL_TEXTURE_ATLAS_ENTRY_TEXTURE (value); @@ -289,16 +291,10 @@ gsk_ngl_glyph_library_add (GskNglGlyphLibrary *self, pango_font_get_glyph_extents (key->font, key->glyph, &ink_rect, NULL); pango_extents_to_pixels (&ink_rect, NULL); - if (key->xshift != 0) - { - ink_rect.x -= 1; - ink_rect.width += 2; - } - if (key->yshift != 0) - { - ink_rect.y -= 1; - ink_rect.height += 2; - } + ink_rect.x -= 1; + ink_rect.width += 2; + ink_rect.y -= 1; + ink_rect.height += 2; width = (int) ceil (ink_rect.width * key->scale / 1024.0); height = (int) ceil (ink_rect.height * key->scale / 1024.0); @@ -321,7 +317,8 @@ gsk_ngl_glyph_library_add (GskNglGlyphLibrary *self, packed_y + 1, width, height, - key->scale / 1024.0); + ink_rect.width, + ink_rect.height); *out_value = value; From 7e4b2b971ff9b3d53c56fd96632e351cff8749bb Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 17 Sep 2021 19:11:06 -0400 Subject: [PATCH 2/2] Revert "gsk: Stop enlarging text bounding boxes" This reverts commit 87af45403ace1047b91ddbab98d9d5a5e15b84eb. I've found that this change is needed to ensure that the bounding boxes of text nodes encompass all the glyphd drawing. Without it, we overdraw the widget boundaries and cut off glyphs. --- gsk/gskrendernodeimpl.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index 18cbcd185a..fd2a9e5d44 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -4477,10 +4477,10 @@ gsk_text_node_new (PangoFont *font, self->num_glyphs = n; graphene_rect_init (&node->bounds, - offset->x + ink_rect.x, - offset->y + ink_rect.y, - ink_rect.width, - ink_rect.height); + offset->x + ink_rect.x - 1, + offset->y + ink_rect.y - 1, + ink_rect.width + 2, + ink_rect.height + 2); return node; }