summaryrefslogtreecommitdiff
path: root/Build/source/libs/cairo/cairo-src/src/cairo-xlib-render-compositor.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/cairo/cairo-src/src/cairo-xlib-render-compositor.c')
-rw-r--r--Build/source/libs/cairo/cairo-src/src/cairo-xlib-render-compositor.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/Build/source/libs/cairo/cairo-src/src/cairo-xlib-render-compositor.c b/Build/source/libs/cairo/cairo-src/src/cairo-xlib-render-compositor.c
index 8a1ec7bd731..0db59a8a6f5 100644
--- a/Build/source/libs/cairo/cairo-src/src/cairo-xlib-render-compositor.c
+++ b/Build/source/libs/cairo/cairo-src/src/cairo-xlib-render-compositor.c
@@ -965,7 +965,7 @@ _cairo_xlib_font_fini (cairo_scaled_font_private_t *abstract_private,
cairo_list_del (&priv->link);
status = _cairo_xlib_display_acquire (priv->device, &display);
- if (status)
+ if (unlikely (status)) /* this should be impossible but leak just in case */
goto BAIL;
for (i = 0; i < NUM_GLYPHSETS; i++) {
@@ -978,7 +978,7 @@ _cairo_xlib_font_fini (cairo_scaled_font_private_t *abstract_private,
cairo_device_release (&display->base);
BAIL:
- cairo_device_destroy (&display->base);
+ cairo_device_destroy (priv->device);
free (priv);
}
@@ -989,7 +989,7 @@ _cairo_xlib_font_create (cairo_xlib_display_t *display,
cairo_xlib_font_t *priv;
int i;
- priv = malloc (sizeof (cairo_xlib_font_t));
+ priv = _cairo_malloc (sizeof (cairo_xlib_font_t));
if (unlikely (priv == NULL))
return NULL;
@@ -1089,7 +1089,7 @@ _cairo_xlib_glyph_attach (cairo_xlib_display_t *display,
{
cairo_xlib_glyph_private_t *priv;
- priv = malloc (sizeof (*priv));
+ priv = _cairo_malloc (sizeof (*priv));
if (unlikely (priv == NULL))
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
@@ -1290,7 +1290,7 @@ _cairo_xlib_surface_add_glyph (cairo_xlib_display_t *display,
if (c == 0)
break;
- new = malloc (c);
+ new = _cairo_malloc (c);
if (!new) {
status = _cairo_error (CAIRO_STATUS_NO_MEMORY);
goto BAIL;
@@ -1318,7 +1318,7 @@ _cairo_xlib_surface_add_glyph (cairo_xlib_display_t *display,
if (c == 0)
break;
- new = malloc (4 * c);
+ new = _cairo_malloc (4 * c);
if (unlikely (new == NULL)) {
status = _cairo_error (CAIRO_STATUS_NO_MEMORY);
goto BAIL;
@@ -1725,9 +1725,10 @@ composite_glyphs (void *surface,
const cairo_compositor_t *
_cairo_xlib_mask_compositor_get (void)
{
+ static cairo_atomic_once_t once = CAIRO_ATOMIC_ONCE_INIT;
static cairo_mask_compositor_t compositor;
- if (compositor.base.delegate == NULL) {
+ if (_cairo_atomic_init_once_enter(&once)) {
_cairo_mask_compositor_init (&compositor,
_cairo_xlib_fallback_compositor_get ());
@@ -1745,6 +1746,8 @@ _cairo_xlib_mask_compositor_get (void)
compositor.composite_boxes = composite_boxes;
compositor.check_composite_glyphs = check_composite_glyphs;
compositor.composite_glyphs = composite_glyphs;
+
+ _cairo_atomic_init_once_leave(&once);
}
return &compositor.base;
@@ -1827,6 +1830,9 @@ composite_traps (void *abstract_dst,
//X_DEBUG ((display->display, "composite_trapezoids (dst=%x)", (unsigned int) dst->drawable));
+ if (traps->num_traps == 0)
+ return CAIRO_STATUS_SUCCESS;
+
if (dst->base.is_clear &&
(op == CAIRO_OPERATOR_OVER || op == CAIRO_OPERATOR_ADD))
{
@@ -1973,9 +1979,10 @@ composite_tristrip (void *abstract_dst,
const cairo_compositor_t *
_cairo_xlib_traps_compositor_get (void)
{
+ static cairo_atomic_once_t once = CAIRO_ATOMIC_ONCE_INIT;
static cairo_traps_compositor_t compositor;
- if (compositor.base.delegate == NULL) {
+ if (_cairo_atomic_init_once_enter(&once)) {
_cairo_traps_compositor_init (&compositor,
_cairo_xlib_mask_compositor_get ());
@@ -1997,6 +2004,8 @@ _cairo_xlib_traps_compositor_get (void)
compositor.composite_tristrip = composite_tristrip;
compositor.check_composite_glyphs = check_composite_glyphs;
compositor.composite_glyphs = composite_glyphs;
+
+ _cairo_atomic_init_once_leave(&once);
}
return &compositor.base;