[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