From: Matthias Clasen Date: Fri, 17 Sep 2021 23:07:55 +0000 (-0400) Subject: ngl: Use exact device scales for glyphs X-Git-Tag: archive/raspbian/4.6.5+ds-1+rpi1~1^2~19^2~5^2~333^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c6cacd2b2d397df7e73a8db166727f1ca405713b;p=gtk4.git 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. --- 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;