[Commit] cairo/src cairo.c, 1.7, 1.8 cairo.h, 1.9, 1.10 cairo_gstate.c, 1.7, 1.8 cairoint.h, 1.13, 1.14

Carl Worth commit at keithp.com
Thu Sep 4 17:27:37 PDT 2003


Committed by: cworth

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

Modified Files:
	cairo.c cairo.h cairo_gstate.c cairoint.h 
Log Message:
Fixed bugs if cairo_stroke/fill called before
cairo_set_rgb_color or cairo_set_target.
Also fixed bug when cairo_set_rgb_color is called before cairo_set_target.

Index: cairo.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- cairo.c	4 Sep 2003 13:52:01 -0000	1.7
+++ cairo.c	4 Sep 2003 23:27:35 -0000	1.8
@@ -156,7 +156,7 @@
 void
 cairo_set_target_surface (cairo_t *cr, cairo_surface_t *surface)
 {
-    if (cr->status)
+    if (cr->status && cr->status != CAIRO_STATUS_NO_TARGET_SURFACE)
 	return;
 
     cr->status = _cairo_gstate_set_target_surface (cr->gstate, surface);
@@ -170,7 +170,7 @@
 {
     cairo_surface_t *surface;
 
-    if (cr->status)
+    if (cr->status && cr->status != CAIRO_STATUS_NO_TARGET_SURFACE)
 	return;
 
     surface = cairo_surface_create_for_drawable (dpy, drawable,
@@ -197,7 +197,7 @@
 {
     cairo_surface_t *surface;
 
-    if (cr->status)
+    if (cr->status && cr->status != CAIRO_STATUS_NO_TARGET_SURFACE)
 	return;
 
     surface = cairo_surface_create_for_image (data,
@@ -734,6 +734,8 @@
 	return "no current point defined";
     case CAIRO_STATUS_INVALID_MATRIX:
 	return "invalid matrix (not invertible)";
+    case CAIRO_STATUS_NO_TARGET_SURFACE:
+	return "no target surface has been set";
     }
 
     return "";

Index: cairo.h
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- cairo.h	4 Sep 2003 18:21:15 -0000	1.9
+++ cairo.h	4 Sep 2003 23:27:35 -0000	1.10
@@ -389,7 +389,8 @@
     CAIRO_STATUS_INVALID_RESTORE,
     CAIRO_STATUS_INVALID_POP_GROUP,
     CAIRO_STATUS_NO_CURRENT_POINT,
-    CAIRO_STATUS_INVALID_MATRIX
+    CAIRO_STATUS_INVALID_MATRIX,
+    CAIRO_STATUS_NO_TARGET_SURFACE
 } cairo_status_t;
 
 extern cairo_status_t __external_linkage

Index: cairo_gstate.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_gstate.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- cairo_gstate.c	4 Sep 2003 13:52:01 -0000	1.7
+++ cairo_gstate.c	4 Sep 2003 23:27:35 -0000	1.8
@@ -34,6 +34,9 @@
 _cairo_gstate_set_current_pt (cairo_gstate_t *gstate, double x, double y);
 
 static cairo_status_t
+_cairo_gstate_ensure_source (cairo_gstate_t *gstate);
+
+static cairo_status_t
 _cairo_gstate_clip_and_composite_trapezoids (cairo_gstate_t *gstate,
 					     cairo_surface_t *src,
 					     cairo_operator_t operator,
@@ -74,10 +77,10 @@
     _cairo_font_init (&gstate->font);
 
     gstate->surface = NULL;
-    gstate->solid = NULL;
-    gstate->pattern = NULL;
-    gstate->pattern_offset.x = 0.0;
-    gstate->pattern_offset.y = 0.0;
+    gstate->source = NULL;
+    gstate->source_offset.x = 0.0;
+    gstate->source_offset.y = 0.0;
+    gstate->source_is_solid = 1;
 
     gstate->clip.surface = NULL;
 
@@ -115,8 +118,7 @@
 	goto CLEANUP_DASHES;
 
     _cairo_surface_reference (gstate->surface);
-    _cairo_surface_reference (gstate->solid);
-    _cairo_surface_reference (gstate->pattern);
+    _cairo_surface_reference (gstate->source);
     _cairo_surface_reference (gstate->clip.surface);
     
     status = _cairo_path_init_copy (&gstate->path, &other->path);
@@ -148,11 +150,9 @@
     cairo_surface_destroy (gstate->surface);
     gstate->surface = NULL;
 
-    cairo_surface_destroy (gstate->solid);
-    gstate->solid = NULL;
-
-    cairo_surface_destroy (gstate->pattern);
-    gstate->pattern = NULL;
+    cairo_surface_destroy (gstate->source);
+    gstate->source = NULL;
+    gstate->source_is_solid = 1;
 
     cairo_surface_destroy (gstate->clip.surface);
     gstate->clip.surface = NULL;
@@ -313,14 +313,16 @@
 cairo_status_t
 _cairo_gstate_set_pattern (cairo_gstate_t *gstate, cairo_surface_t *pattern)
 {
-    cairo_surface_destroy (gstate->pattern);
+    cairo_surface_destroy (gstate->source);
 
-    gstate->pattern = pattern;
-    _cairo_surface_reference (gstate->pattern);
+    gstate->source = pattern;
+    gstate->source_is_solid = 0;
+
+    _cairo_surface_reference (gstate->source);
 
     _cairo_gstate_current_point (gstate,
-				 &gstate->pattern_offset.x,
-				 &gstate->pattern_offset.y);
+				 &gstate->source_offset.x,
+				 &gstate->source_offset.y);
 
     return CAIRO_STATUS_SUCCESS;
 }
@@ -344,15 +346,12 @@
 {
     _cairo_color_set_rgb (&gstate->color, red, green, blue);
 
-    cairo_surface_destroy (gstate->pattern);
-    gstate->pattern = NULL;
+    cairo_surface_destroy (gstate->source);
 
-    cairo_surface_destroy (gstate->solid);
-    gstate->solid = cairo_surface_create_similar_solid (gstate->surface, CAIRO_FORMAT_ARGB32,
-							1, 1,
-							red, green, blue,
-							gstate->alpha);
-    cairo_surface_set_repeat (gstate->solid, 1);
+    gstate->source = NULL;
+    gstate->source_offset.x = 0;
+    gstate->source_offset.y = 0;
+    gstate->source_is_solid = 1;
 
     return CAIRO_STATUS_SUCCESS;
 }
@@ -379,6 +378,7 @@
     return gstate->tolerance;
 }
 
+/* XXX: Need to fix this so it does the right thing after set_pattern. */
 cairo_status_t
 _cairo_gstate_set_alpha (cairo_gstate_t *gstate, double alpha)
 {
@@ -386,15 +386,11 @@
 
     _cairo_color_set_alpha (&gstate->color, alpha);
 
-    cairo_surface_destroy (gstate->solid);
-    gstate->solid = cairo_surface_create_similar_solid (gstate->surface,
-							CAIRO_FORMAT_ARGB32,
-							1, 1,
-							gstate->color.red,
-							gstate->color.green,
-							gstate->color.blue,
-							gstate->color.alpha);
-    cairo_surface_set_repeat (gstate->solid, 1);
+    cairo_surface_destroy (gstate->source);
+
+    gstate->source = NULL;
+    gstate->source_offset.x = 0;
+    gstate->source_offset.y = 0;
 
     return CAIRO_STATUS_SUCCESS;
 }
@@ -806,12 +802,40 @@
     return CAIRO_STATUS_SUCCESS;
 }
 
+static cairo_status_t
+_cairo_gstate_ensure_source (cairo_gstate_t *gstate)
+{
+    if (gstate->source)
+	return CAIRO_STATUS_SUCCESS;
+
+    if (gstate->surface == NULL)
+	return CAIRO_STATUS_NO_TARGET_SURFACE;
+
+    gstate->source = cairo_surface_create_similar_solid (gstate->surface,
+							 CAIRO_FORMAT_ARGB32,
+							 1, 1,
+							 gstate->color.red,
+							 gstate->color.green,
+							 gstate->color.blue,
+							 gstate->color.alpha);
+    if (gstate->source == NULL)
+	return CAIRO_STATUS_NO_MEMORY;
+
+    cairo_surface_set_repeat (gstate->source, 1);
+
+    return CAIRO_STATUS_SUCCESS;
+}
+
 cairo_status_t
 _cairo_gstate_stroke (cairo_gstate_t *gstate)
 {
     cairo_status_t status;
     cairo_traps_t traps;
-    cairo_matrix_t user_to_pattern, device_to_pattern;
+    cairo_matrix_t user_to_source, device_to_source;
+
+    status = _cairo_gstate_ensure_source (gstate);
+    if (status)
+	return status;
 
     _cairo_pen_init (&gstate->pen_regular, gstate->line_width / 2.0, gstate);
 
@@ -823,21 +847,21 @@
 	return status;
     }
 
-    if (gstate->pattern) {
-	cairo_surface_get_matrix (gstate->pattern, &user_to_pattern);
-	cairo_matrix_multiply (&device_to_pattern, &gstate->ctm_inverse, &user_to_pattern);
-	cairo_surface_set_matrix (gstate->pattern, &device_to_pattern);
+    if (! gstate->source_is_solid) {
+	cairo_surface_get_matrix (gstate->source, &user_to_source);
+	cairo_matrix_multiply (&device_to_source, &gstate->ctm_inverse, &user_to_source);
+	cairo_surface_set_matrix (gstate->source, &device_to_source);
     }
 
     _cairo_gstate_clip_and_composite_trapezoids (gstate,
-						 gstate->pattern ? gstate->pattern : gstate->solid,
+						 gstate->source,
 						 gstate->operator,
 						 gstate->surface,
 						 &traps);
 
-    /* restore the matrix originally in the pattern surface */
-    if (gstate->pattern)
-	cairo_surface_set_matrix (gstate->pattern, &user_to_pattern);
+    /* restore the matrix originally in the source surface */
+    if (! gstate->source_is_solid)
+	cairo_surface_set_matrix (gstate->source, &user_to_source);
 
     _cairo_traps_fini (&traps);
 
@@ -929,8 +953,8 @@
 
 	_cairo_surface_composite_trapezoids (gstate->operator,
 					     src, dst,
-					     XFixedToDouble (xoff) - gstate->pattern_offset.x,
-					     XFixedToDouble (yoff) - gstate->pattern_offset.y,
+					     XFixedToDouble (xoff) - gstate->source_offset.x,
+					     XFixedToDouble (yoff) - gstate->source_offset.y,
 					     traps->traps,
 					     traps->num_traps);
     }
@@ -943,7 +967,11 @@
 {
     cairo_status_t status;
     cairo_traps_t traps;
-    cairo_matrix_t user_to_pattern, device_to_pattern;
+    cairo_matrix_t user_to_source, device_to_source;
+
+    status = _cairo_gstate_ensure_source (gstate);
+    if (status)
+	return status;
 
     _cairo_traps_init (&traps);
 
@@ -953,21 +981,21 @@
 	return status;
     }
 
-    if (gstate->pattern) {
-	cairo_surface_get_matrix (gstate->pattern, &user_to_pattern);
-	cairo_matrix_multiply (&device_to_pattern, &gstate->ctm_inverse, &user_to_pattern);
-	cairo_surface_set_matrix (gstate->pattern, &device_to_pattern);
+    if (! gstate->source_is_solid) {
+	cairo_surface_get_matrix (gstate->source, &user_to_source);
+	cairo_matrix_multiply (&device_to_source, &gstate->ctm_inverse, &user_to_source);
+	cairo_surface_set_matrix (gstate->source, &device_to_source);
     }
 
     _cairo_gstate_clip_and_composite_trapezoids (gstate,
-						 gstate->pattern ? gstate->pattern : gstate->solid,
+						 gstate->source,
 						 gstate->operator,
 						 gstate->surface,
 						 &traps);
 
-    /* restore the matrix originally in the pattern surface */
-    if (gstate->pattern)
-	cairo_surface_set_matrix (gstate->pattern, &user_to_pattern);
+    /* restore the matrix originally in the source surface */
+    if (! gstate->source_is_solid)
+	cairo_surface_set_matrix (gstate->source, &user_to_source);
 
     _cairo_traps_fini (&traps);
 
@@ -1095,7 +1123,7 @@
     /* XXX: Need to make a generic (non-Xft) backend for text. */
     XftTextRenderUtf8 (gstate->surface->dpy,
 		       gstate->operator,
-		       gstate->solid->picture,
+		       gstate->source->picture,
 		       xft_font,
 		       gstate->surface->picture,
 		       0, 0,

Index: cairoint.h
===================================================================
RCS file: /local/src/CVS/cairo/src/cairoint.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- cairoint.h	4 Sep 2003 18:54:09 -0000	1.13
+++ cairoint.h	4 Sep 2003 23:27:35 -0000	1.14
@@ -341,9 +341,10 @@
     cairo_font_t font;
 
     cairo_surface_t *surface;
-    cairo_surface_t *solid;
-    cairo_surface_t *pattern;
-    cairo_point_double_t pattern_offset;
+
+    cairo_surface_t *source;
+    cairo_point_double_t source_offset;
+    int source_is_solid;
 
     cairo_clip_rec_t clip;
 




More information about the Commit mailing list