Merge branch 'glyph-memdup' into 'master'

gl: Avoid a memdup in glyph upload

See merge request GNOME/gtk!907
This commit is contained in:
Matthias Clasen 2019-06-03 03:07:31 +00:00
commit 286fd742a6

View File

@ -215,6 +215,8 @@ render_glyph (const GskGLGlyphAtlas *atlas,
PangoGlyphString glyph_string; PangoGlyphString glyph_string;
PangoGlyphInfo glyph_info; PangoGlyphInfo glyph_info;
int surface_width, surface_height; int surface_width, surface_height;
int stride;
unsigned char *data;
scaled_font = pango_cairo_font_get_scaled_font ((PangoCairoFont *)key->font); 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)) 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) if (surface_width > atlas->width || surface_height > atlas->height)
return FALSE; 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); cairo_surface_set_device_scale (surface, key->scale / 1024.0, key->scale / 1024.0);
cr = cairo_create (surface); cr = cairo_create (surface);
@ -255,8 +261,7 @@ render_glyph (const GskGLGlyphAtlas *atlas,
region->width = cairo_image_surface_get_width (surface); region->width = cairo_image_surface_get_width (surface);
region->height = cairo_image_surface_get_height (surface); region->height = cairo_image_surface_get_height (surface);
region->stride = cairo_image_surface_get_stride (surface); region->stride = cairo_image_surface_get_stride (surface);
region->data = g_memdup (cairo_image_surface_get_data (surface), region->data = data;
region->stride * region->height * sizeof (guchar));
region->x = (gsize)(value->tx * atlas->width); region->x = (gsize)(value->tx * atlas->width);
region->y = (gsize)(value->ty * atlas->height); region->y = (gsize)(value->ty * atlas->height);