[gtk/glyph-memdup] gl: Avoid a memdup in glyph upload



commit 3c6c07e94deffb3346a10893bf3aeb477d561417
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Jun 3 02:46:12 2019 +0000

    gl: Avoid a memdup in glyph upload
    
    We don't need to dup the memory here if we
    set up the image surface properly. This won't
    matter for most glyphs, but some of them can
    be big.

 gsk/gl/gskglglyphcache.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)
---
diff --git a/gsk/gl/gskglglyphcache.c b/gsk/gl/gskglglyphcache.c
index eb2628fb86..7e01b2bbd9 100644
--- a/gsk/gl/gskglglyphcache.c
+++ b/gsk/gl/gskglglyphcache.c
@@ -215,6 +215,8 @@ render_glyph (const GskGLGlyphAtlas *atlas,
   PangoGlyphString glyph_string;
   PangoGlyphInfo glyph_info;
   int surface_width, surface_height;
+  int stride;
+  unsigned char *data;
 
   scaled_font = pango_cairo_font_get_scaled_font ((PangoCairoFont *)key->font);
   if (G_UNLIKELY (!scaled_font || cairo_scaled_font_status (scaled_font) != CAIRO_STATUS_SUCCESS))
@@ -228,7 +230,11 @@ render_glyph (const GskGLGlyphAtlas *atlas,
   if (surface_width > atlas->width || surface_height > atlas->height)
     return FALSE;
 
-  surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, surface_width, surface_height);
+  stride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32, surface_width);
+  data = g_malloc0 (stride * surface_height);
+  surface = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_ARGB32,
+                                                 surface_width, surface_height,
+                                                 stride);
   cairo_surface_set_device_scale (surface, key->scale / 1024.0, key->scale / 1024.0);
 
   cr = cairo_create (surface);
@@ -255,8 +261,7 @@ render_glyph (const GskGLGlyphAtlas *atlas,
   region->width = cairo_image_surface_get_width (surface);
   region->height = cairo_image_surface_get_height (surface);
   region->stride = cairo_image_surface_get_stride (surface);
-  region->data = g_memdup (cairo_image_surface_get_data (surface),
-                           region->stride * region->height * sizeof (guchar));
+  region->data = data;
   region->x = (gsize)(value->tx * atlas->width);
   region->y = (gsize)(value->ty * atlas->height);
 


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