[gtk/more-glyph-drawing-fixes: 1/2] ngl: Use exact device scales for glyphs




commit c6cacd2b2d397df7e73a8db166727f1ca405713b
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Sep 17 19:07:55 2021 -0400

    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;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]