[Commit] cairo/src cairo.c, 1.16, 1.17 cairo_gstate.c, 1.15, 1.16 cairoint.h, 1.23, 1.24

Carl Worth commit at keithp.com
Tue Sep 30 14:15:11 PDT 2003


Committed by: cworth

Update of /local/src/CVS/cairo/src
In directory home.keithp.com:/tmp/cvs-serv17383/src

Modified Files:
	cairo.c cairo_gstate.c cairoint.h 
Log Message:
Fixed horribly botched implementation of cairo_copy.

Index: cairo.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- cairo.c	30 Sep 2003 18:39:07 -0000	1.16
+++ cairo.c	30 Sep 2003 20:15:09 -0000	1.17
@@ -122,12 +122,13 @@
 void
 cairo_copy (cairo_t *dest, cairo_t *src)
 {
-    *dest = *src;
-    dest->ref_count = 0;
+    if (dest->status)
+	return;
 
-    dest->gstate = _cairo_gstate_clone (src->gstate);
-    if (dest->gstate == NULL)
-	dest->status = CAIRO_STATUS_NO_MEMORY;
+    if (src->status)
+	dest->status = src->status;
+
+    dest->status = _cairo_gstate_copy (dest->gstate, src->gstate);
 }
 
 /* XXX: I want to rethink this API

Index: cairo_gstate.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_gstate.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- cairo_gstate.c	29 Sep 2003 15:36:30 -0000	1.15
+++ cairo_gstate.c	30 Sep 2003 20:15:09 -0000	1.16
@@ -106,8 +106,14 @@
 _cairo_gstate_init_copy (cairo_gstate_t *gstate, cairo_gstate_t *other)
 {
     cairo_status_t status;
+    cairo_gstate_t *next;
     
+    /* Copy all members, but don't smash the next pointer */
+    next = gstate->next;
     *gstate = *other;
+    gstate->next = next;
+
+    /* Now fix up pointer data that needs to be cloned/referenced */
     if (other->dash) {
 	gstate->dash = malloc (other->num_dashes * sizeof (double));
 	if (gstate->dash == NULL)
@@ -200,6 +206,21 @@
     return clone;
 }
 
+cairo_status_t
+_cairo_gstate_copy (cairo_gstate_t *dest, cairo_gstate_t *src)
+{
+    cairo_status_t status;
+    cairo_gstate_t *next;
+
+    /* Preserve next pointer over fini/init */
+    next = dest->next;
+    _cairo_gstate_fini (dest);
+    status = _cairo_gstate_init_copy (dest, src);
+    dest->next = next;
+
+    return status;
+}
+
 /* Push rendering off to an off-screen group. */
 /* XXX: Rethinking this API
 cairo_status_t

Index: cairoint.h
===================================================================
RCS file: /local/src/CVS/cairo/src/cairoint.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- cairoint.h	30 Sep 2003 14:58:59 -0000	1.23
+++ cairoint.h	30 Sep 2003 20:15:09 -0000	1.24
@@ -408,6 +408,9 @@
 _cairo_gstate_clone (cairo_gstate_t *gstate);
 
 extern cairo_status_t __internal_linkage
+_cairo_gstate_copy (cairo_gstate_t *dest, cairo_gstate_t *src);
+
+extern cairo_status_t __internal_linkage
 _cairo_gstate_begin_group (cairo_gstate_t *gstate);
 
 extern cairo_status_t __internal_linkage




More information about the Commit mailing list