[gtk/glyph-memdup] gl: Avoid a memdup in glyph upload
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/glyph-memdup] gl: Avoid a memdup in glyph upload
- Date: Mon, 3 Jun 2019 02:48:37 +0000 (UTC)
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]