summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cairo-surface.c7
-rw-r--r--src/cairo_surface.c7
-rw-r--r--src/cairoint.h1
3 files changed, 13 insertions, 2 deletions
diff --git a/src/cairo-surface.c b/src/cairo-surface.c
index 262ce61c..321402c6 100644
--- a/src/cairo-surface.c
+++ b/src/cairo-surface.c
@@ -114,6 +114,7 @@ cairo_surface_create_for_drawable (Display *dpy,
surface->gc = 0;
surface->drawable = drawable;
+ surface->owns_pixmap = 0;
surface->visual = visual;
if (! XRenderQueryVersion (dpy, &surface->render_major, &surface->render_minor)) {
@@ -207,6 +208,7 @@ cairo_surface_create_for_image (char *data,
surface->gc = 0;
surface->drawable = 0;
+ surface->owns_pixmap = 0;
surface->visual = NULL;
surface->render_major = -1;
surface->render_minor = -1;
@@ -276,7 +278,7 @@ cairo_surface_create_similar_solid (cairo_surface_t *other,
NULL,
format,
DefaultColormap (dpy, scr));
- XFreePixmap (surface->dpy, pix);
+ surface->owns_pixmap = 1;
} else {
char *data;
int stride;
@@ -326,6 +328,9 @@ cairo_surface_destroy (cairo_surface_t *surface)
if (surface->picture)
XRenderFreePicture (surface->dpy, surface->picture);
+ if (surface->owns_pixmap)
+ XFreePixmap (surface->dpy, surface->drawable);
+
if (surface->icformat)
IcFormatDestroy (surface->icformat);
diff --git a/src/cairo_surface.c b/src/cairo_surface.c
index 262ce61c..321402c6 100644
--- a/src/cairo_surface.c
+++ b/src/cairo_surface.c
@@ -114,6 +114,7 @@ cairo_surface_create_for_drawable (Display *dpy,
surface->gc = 0;
surface->drawable = drawable;
+ surface->owns_pixmap = 0;
surface->visual = visual;
if (! XRenderQueryVersion (dpy, &surface->render_major, &surface->render_minor)) {
@@ -207,6 +208,7 @@ cairo_surface_create_for_image (char *data,
surface->gc = 0;
surface->drawable = 0;
+ surface->owns_pixmap = 0;
surface->visual = NULL;
surface->render_major = -1;
surface->render_minor = -1;
@@ -276,7 +278,7 @@ cairo_surface_create_similar_solid (cairo_surface_t *other,
NULL,
format,
DefaultColormap (dpy, scr));
- XFreePixmap (surface->dpy, pix);
+ surface->owns_pixmap = 1;
} else {
char *data;
int stride;
@@ -326,6 +328,9 @@ cairo_surface_destroy (cairo_surface_t *surface)
if (surface->picture)
XRenderFreePicture (surface->dpy, surface->picture);
+ if (surface->owns_pixmap)
+ XFreePixmap (surface->dpy, surface->drawable);
+
if (surface->icformat)
IcFormatDestroy (surface->icformat);
diff --git a/src/cairoint.h b/src/cairoint.h
index 307b9703..7e7911d6 100644
--- a/src/cairoint.h
+++ b/src/cairoint.h
@@ -249,6 +249,7 @@ struct cairo_surface {
GC gc;
Drawable drawable;
Visual *visual;
+ int owns_pixmap;
int render_major;
int render_minor;