[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