summaryrefslogtreecommitdiff
path: root/src/cairo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cairo.c')
-rw-r--r--src/cairo.c400
1 files changed, 231 insertions, 169 deletions
diff --git a/src/cairo.c b/src/cairo.c
index 56da06eaa..b4fc5464f 100644
--- a/src/cairo.c
+++ b/src/cairo.c
@@ -62,34 +62,52 @@ static const cairo_t cairo_nil = {
* a bit of a pain, but it should be easy to always catch as long as
* one adds a new test case to test a trigger of the new status value.
*/
-#define CAIRO_STATUS_LAST_STATUS CAIRO_STATUS_PATTERN_TYPE_MISMATCH
+#define CAIRO_STATUS_LAST_STATUS CAIRO_STATUS_FILE_NOT_FOUND
/**
* _cairo_error:
+ * @status: a status value indicating an error, (eg. not
+ * CAIRO_STATUS_SUCCESS)
+ *
+ * Checks that status is an error status, but does nothing else.
+ *
+ * All assignments of an error status to any user-visible object
+ * within the cairo application should result in a call to
+ * _cairo_error().
+ *
+ * The purpose of this function is to allow the user to set a
+ * breakpoint in _cairo_error() to generate a stack trace for when the
+ * user causes cairo to detect an error.
+ **/
+void
+_cairo_error (cairo_status_t status)
+{
+ assert (status > CAIRO_STATUS_SUCCESS &&
+ status <= CAIRO_STATUS_LAST_STATUS);
+}
+
+/**
+ * _cairo_set_error:
* @cr: a cairo context
* @status: a status value indicating an error, (eg. not
* CAIRO_STATUS_SUCCESS)
*
- * Sets cr->status to @status.
+ * Sets cr->status to @status and calls _cairo_error;
*
* All assignments of an error status to cr->status should happen
- * either inside of _cairo_error(), or else _cairo_error() should be
+ * through _cairo_set_error() or else _cairo_error() should be
* called immediately after the assignment.
*
* The purpose of this function is to allow the user to set a
* breakpoint in _cairo_error() to generate a stack trace for when the
* user causes cairo to detect an error.
- *
- * _cairo_error also calls the error notify callback function that the
- * user may have set with cairo_set_error_notify.
**/
static void
-_cairo_error (cairo_t *cr, cairo_status_t status)
+_cairo_set_error (cairo_t *cr, cairo_status_t status)
{
- assert (status > CAIRO_STATUS_SUCCESS &&
- status <= CAIRO_STATUS_LAST_STATUS);
-
cr->status = status;
+
+ _cairo_error (status);
}
/**
@@ -142,13 +160,13 @@ cairo_create (cairo_surface_t *target)
if (target == NULL) {
cr->gstate = NULL;
- _cairo_error (cr, CAIRO_STATUS_NULL_POINTER);
+ _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
return cr;
}
cr->gstate = _cairo_gstate_create (target);
if (cr->gstate == NULL)
- _cairo_error (cr, CAIRO_STATUS_NO_MEMORY);
+ _cairo_set_error (cr, CAIRO_STATUS_NO_MEMORY);
return cr;
}
@@ -222,14 +240,14 @@ cairo_save (cairo_t *cr)
cairo_gstate_t *top;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
top = _cairo_gstate_clone (cr->gstate);
if (top == NULL) {
- _cairo_error (cr, CAIRO_STATUS_NO_MEMORY);
+ _cairo_set_error (cr, CAIRO_STATUS_NO_MEMORY);
return;
}
@@ -252,7 +270,7 @@ cairo_restore (cairo_t *cr)
cairo_gstate_t *top;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -262,7 +280,7 @@ cairo_restore (cairo_t *cr)
_cairo_gstate_destroy (top);
if (cr->gstate == NULL)
- _cairo_error (cr, CAIRO_STATUS_INVALID_RESTORE);
+ _cairo_set_error (cr, CAIRO_STATUS_INVALID_RESTORE);
}
slim_hidden_def(cairo_restore);
@@ -311,13 +329,13 @@ void
cairo_set_operator (cairo_t *cr, cairo_operator_t op)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_set_operator (cr->gstate, op);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -341,7 +359,7 @@ cairo_set_source_rgb (cairo_t *cr, double red, double green, double blue)
cairo_pattern_t *pattern;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -374,7 +392,7 @@ cairo_set_source_rgba (cairo_t *cr,
cairo_pattern_t *pattern;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -416,7 +434,7 @@ cairo_set_source_surface (cairo_t *cr,
cairo_matrix_t matrix;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -447,23 +465,23 @@ void
cairo_set_source (cairo_t *cr, cairo_pattern_t *source)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
if (source == NULL) {
- _cairo_error (cr, CAIRO_STATUS_NULL_POINTER);
+ _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
return;
}
if (source->status) {
- _cairo_error (cr, source->status);
+ _cairo_set_error (cr, source->status);
return;
}
cr->status = _cairo_gstate_set_source (cr->gstate, source);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -479,12 +497,8 @@ cairo_set_source (cairo_t *cr, cairo_pattern_t *source)
cairo_pattern_t *
cairo_get_source (cairo_t *cr)
{
- if (cr->status) {
- cairo_pattern_t *pattern;
- pattern = _cairo_pattern_create_in_error (cr->status);
- _cairo_error (cr, cr->status);
- return pattern;
- }
+ if (cr->status)
+ return (cairo_pattern_t*) &cairo_solid_pattern_nil.base;
return _cairo_gstate_get_source (cr->gstate);
}
@@ -506,7 +520,7 @@ void
cairo_set_tolerance (cairo_t *cr, double tolerance)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -514,7 +528,7 @@ cairo_set_tolerance (cairo_t *cr, double tolerance)
cr->status = _cairo_gstate_set_tolerance (cr->gstate, tolerance);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -532,13 +546,13 @@ void
cairo_set_fill_rule (cairo_t *cr, cairo_fill_rule_t fill_rule)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_set_fill_rule (cr->gstate, fill_rule);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -559,7 +573,7 @@ void
cairo_set_line_width (cairo_t *cr, double width)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -567,7 +581,7 @@ cairo_set_line_width (cairo_t *cr, double width)
cr->status = _cairo_gstate_set_line_width (cr->gstate, width);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -588,13 +602,13 @@ void
cairo_set_line_cap (cairo_t *cr, cairo_line_cap_t line_cap)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_set_line_cap (cr->gstate, line_cap);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -615,39 +629,39 @@ void
cairo_set_line_join (cairo_t *cr, cairo_line_join_t line_join)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_set_line_join (cr->gstate, line_join);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
void
cairo_set_dash (cairo_t *cr, double *dashes, int ndash, double offset)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_set_dash (cr->gstate, dashes, ndash, offset);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
void
cairo_set_miter_limit (cairo_t *cr, double limit)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_set_miter_limit (cr->gstate, limit);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
@@ -667,13 +681,13 @@ void
cairo_translate (cairo_t *cr, double tx, double ty)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_translate (cr->gstate, tx, ty);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -691,13 +705,13 @@ void
cairo_scale (cairo_t *cr, double sx, double sy)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_scale (cr->gstate, sx, sy);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
@@ -717,13 +731,13 @@ void
cairo_rotate (cairo_t *cr, double angle)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_rotate (cr->gstate, angle);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -740,13 +754,13 @@ cairo_transform (cairo_t *cr,
const cairo_matrix_t *matrix)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_transform (cr->gstate, matrix);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -762,13 +776,13 @@ cairo_set_matrix (cairo_t *cr,
const cairo_matrix_t *matrix)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_set_matrix (cr->gstate, matrix);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -784,13 +798,13 @@ void
cairo_identity_matrix (cairo_t *cr)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_identity_matrix (cr->gstate);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -807,13 +821,13 @@ void
cairo_user_to_device (cairo_t *cr, double *x, double *y)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_user_to_device (cr->gstate, x, y);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -831,13 +845,13 @@ void
cairo_user_to_device_distance (cairo_t *cr, double *dx, double *dy)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_user_to_device_distance (cr->gstate, dx, dy);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -854,13 +868,13 @@ void
cairo_device_to_user (cairo_t *cr, double *x, double *y)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_device_to_user (cr->gstate, x, y);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -878,20 +892,20 @@ void
cairo_device_to_user_distance (cairo_t *cr, double *dx, double *dy)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_device_to_user_distance (cr->gstate, dx, dy);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
void
cairo_new_path (cairo_t *cr)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -905,7 +919,7 @@ cairo_move_to (cairo_t *cr, double x, double y)
cairo_fixed_t x_fixed, y_fixed;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -915,7 +929,7 @@ cairo_move_to (cairo_t *cr, double x, double y)
cr->status = _cairo_path_fixed_move_to (&cr->path, x_fixed, y_fixed);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
slim_hidden_def(cairo_move_to);
@@ -925,7 +939,7 @@ cairo_line_to (cairo_t *cr, double x, double y)
cairo_fixed_t x_fixed, y_fixed;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -935,7 +949,7 @@ cairo_line_to (cairo_t *cr, double x, double y)
cr->status = _cairo_path_fixed_line_to (&cr->path, x_fixed, y_fixed);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
void
@@ -949,7 +963,7 @@ cairo_curve_to (cairo_t *cr,
cairo_fixed_t x3_fixed, y3_fixed;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -971,7 +985,7 @@ cairo_curve_to (cairo_t *cr,
x2_fixed, y2_fixed,
x3_fixed, y3_fixed);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -1014,7 +1028,7 @@ cairo_arc (cairo_t *cr,
double angle1, double angle2)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1054,7 +1068,7 @@ cairo_arc_negative (cairo_t *cr,
double angle1, double angle2)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1096,7 +1110,7 @@ cairo_rel_move_to (cairo_t *cr, double dx, double dy)
cairo_fixed_t dx_fixed, dy_fixed;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1106,7 +1120,7 @@ cairo_rel_move_to (cairo_t *cr, double dx, double dy)
cr->status = _cairo_path_fixed_rel_move_to (&cr->path, dx_fixed, dy_fixed);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
void
@@ -1115,7 +1129,7 @@ cairo_rel_line_to (cairo_t *cr, double dx, double dy)
cairo_fixed_t dx_fixed, dy_fixed;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1125,7 +1139,7 @@ cairo_rel_line_to (cairo_t *cr, double dx, double dy)
cr->status = _cairo_path_fixed_rel_line_to (&cr->path, dx_fixed, dy_fixed);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
slim_hidden_def(cairo_rel_line_to);
@@ -1140,7 +1154,7 @@ cairo_rel_curve_to (cairo_t *cr,
cairo_fixed_t dx3_fixed, dy3_fixed;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1162,7 +1176,7 @@ cairo_rel_curve_to (cairo_t *cr,
dx2_fixed, dy2_fixed,
dx3_fixed, dy3_fixed);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
void
@@ -1171,7 +1185,7 @@ cairo_rectangle (cairo_t *cr,
double width, double height)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1191,7 +1205,7 @@ cairo_stroke_to_path (cairo_t *cr)
cr->status = _cairo_gstate_stroke_path (cr->gstate);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
*/
@@ -1199,13 +1213,13 @@ void
cairo_close_path (cairo_t *cr)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_path_fixed_close_path (&cr->path);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
slim_hidden_def(cairo_close_path);
@@ -1220,13 +1234,13 @@ void
cairo_paint (cairo_t *cr)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_paint (cr->gstate);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -1247,7 +1261,7 @@ cairo_paint_with_alpha (cairo_t *cr,
cairo_pattern_union_t pattern;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1261,7 +1275,7 @@ cairo_paint_with_alpha (cairo_t *cr,
cr->status = _cairo_gstate_mask (cr->gstate, &pattern.base);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
_cairo_pattern_fini (&pattern.base);
}
@@ -1281,23 +1295,23 @@ cairo_mask (cairo_t *cr,
cairo_pattern_t *pattern)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
if (pattern == NULL) {
- _cairo_error (cr, CAIRO_STATUS_NULL_POINTER);
+ _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
return;
}
if (pattern->status) {
- _cairo_error (cr, pattern->status);
+ _cairo_set_error (cr, pattern->status);
return;
}
cr->status = _cairo_gstate_mask (cr->gstate, pattern);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -1322,7 +1336,7 @@ cairo_mask_surface (cairo_t *cr,
cairo_matrix_t matrix;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1372,13 +1386,13 @@ void
cairo_stroke_preserve (cairo_t *cr)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_stroke (cr->gstate, &cr->path);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
slim_hidden_def(cairo_stroke_preserve);
@@ -1413,13 +1427,13 @@ void
cairo_fill_preserve (cairo_t *cr)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_fill (cr->gstate, &cr->path);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
slim_hidden_def(cairo_fill_preserve);
@@ -1427,26 +1441,26 @@ void
cairo_copy_page (cairo_t *cr)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_copy_page (cr->gstate);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
void
cairo_show_page (cairo_t *cr)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_show_page (cr->gstate);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
cairo_bool_t
@@ -1455,7 +1469,7 @@ cairo_in_stroke (cairo_t *cr, double x, double y)
int inside;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return 0;
}
@@ -1463,20 +1477,20 @@ cairo_in_stroke (cairo_t *cr, double x, double y)
&cr->path,
x, y, &inside);
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return 0;
}
return inside;
}
-int
+cairo_bool_t
cairo_in_fill (cairo_t *cr, double x, double y)
{
int inside;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return 0;
}
@@ -1484,7 +1498,7 @@ cairo_in_fill (cairo_t *cr, double x, double y)
&cr->path,
x, y, &inside);
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return 0;
}
@@ -1496,7 +1510,7 @@ cairo_stroke_extents (cairo_t *cr,
double *x1, double *y1, double *x2, double *y2)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1504,7 +1518,7 @@ cairo_stroke_extents (cairo_t *cr,
&cr->path,
x1, y1, x2, y2);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
void
@@ -1512,7 +1526,7 @@ cairo_fill_extents (cairo_t *cr,
double *x1, double *y1, double *x2, double *y2)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1520,7 +1534,7 @@ cairo_fill_extents (cairo_t *cr,
&cr->path,
x1, y1, x2, y2);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -1579,13 +1593,13 @@ void
cairo_clip_preserve (cairo_t *cr)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_clip (cr->gstate, &cr->path);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
slim_hidden_def(cairo_clip_preserve);
@@ -1609,13 +1623,13 @@ void
cairo_reset_clip (cairo_t *cr)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_reset_clip (cr->gstate);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -1640,13 +1654,13 @@ cairo_select_font_face (cairo_t *cr,
cairo_font_weight_t weight)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_select_font_face (cr->gstate, family, slant, weight);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -1666,15 +1680,15 @@ cairo_get_font_face (cairo_t *cr)
cairo_font_face_t *font_face;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return NULL;
}
cr->status = _cairo_gstate_get_font_face (cr->gstate, &font_face);
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
/* XXX: When available:
- return _cairo_font_face_create_in_error (cr->status);
+ return _cairo_font_face_nil;
*/
return NULL;
}
@@ -1695,13 +1709,13 @@ cairo_font_extents (cairo_t *cr,
cairo_font_extents_t *extents)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_get_font_extents (cr->gstate, extents);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -1718,13 +1732,13 @@ cairo_set_font_face (cairo_t *cr,
cairo_font_face_t *font_face)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_set_font_face (cr->gstate, font_face);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -1742,13 +1756,13 @@ void
cairo_set_font_size (cairo_t *cr, double size)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_set_font_size (cr->gstate, size);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -1769,13 +1783,13 @@ cairo_set_font_matrix (cairo_t *cr,
const cairo_matrix_t *matrix)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_set_font_matrix (cr->gstate, matrix);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -1793,6 +1807,49 @@ cairo_get_font_matrix (cairo_t *cr, cairo_matrix_t *matrix)
}
/**
+ * cairo_set_font_options:
+ * @cr: a #cairo_t
+ * @options: font options to use
+ *
+ * Sets a set of custom font rendering options for the #cairo_t.
+ * Rendering options are derived by merging these options with the
+ * options derived from underlying surface; if the value in @options
+ * has a default value (like %CAIRO_ANTIALIAS_DEFAULT), then the value
+ * from the surface is used.
+ **/
+void
+cairo_set_font_options (cairo_t *cr,
+ const cairo_font_options_t *options)
+{
+ if (cr->status) {
+ _cairo_set_error (cr, cr->status);
+ return;
+ }
+
+ cr->status = _cairo_gstate_set_font_options (cr->gstate, options);
+ if (cr->status)
+ _cairo_set_error (cr, cr->status);
+}
+
+/**
+ * cairo_get_font_options:
+ * @cr: a #cairo_t
+ * @options: a #cairo_font_options_t object into which to store
+ * the retrieved options. All existing values are overwritten
+ *
+ * Retrieves font rendering options set via #cairo_set_font_options.
+ * Note that the returned options do not include any options derived
+ * from the underlying surface; they are literally the options
+ * passed to cairo_set_font_options().
+ **/
+void
+cairo_get_font_options (cairo_t *cr,
+ cairo_font_options_t *options)
+{
+ _cairo_gstate_get_font_options (cr->gstate, options);
+}
+
+/**
* cairo_text_extents:
* @cr: a #cairo_t
* @utf8: a string of text, encoded in utf-8
@@ -1822,7 +1879,7 @@ cairo_text_extents (cairo_t *cr,
double x, y;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1845,7 +1902,7 @@ cairo_text_extents (cairo_t *cr,
if (cr->status) {
if (glyphs)
free (glyphs);
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1854,7 +1911,7 @@ cairo_text_extents (cairo_t *cr,
free (glyphs);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -1882,14 +1939,14 @@ cairo_glyph_extents (cairo_t *cr,
cairo_text_extents_t *extents)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_glyph_extents (cr->gstate, glyphs, num_glyphs,
extents);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
void
@@ -1900,7 +1957,7 @@ cairo_show_text (cairo_t *cr, const char *utf8)
double x, y;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1916,7 +1973,7 @@ cairo_show_text (cairo_t *cr, const char *utf8)
if (cr->status) {
if (glyphs)
free (glyphs);
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1926,20 +1983,20 @@ cairo_show_text (cairo_t *cr, const char *utf8)
free (glyphs);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
void
cairo_show_glyphs (cairo_t *cr, cairo_glyph_t *glyphs, int num_glyphs)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
cr->status = _cairo_gstate_show_glyphs (cr->gstate, glyphs, num_glyphs);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
void
@@ -1950,7 +2007,7 @@ cairo_text_path (cairo_t *cr, const char *utf8)
double x, y;
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1963,7 +2020,7 @@ cairo_text_path (cairo_t *cr, const char *utf8)
if (cr->status) {
if (glyphs)
free (glyphs);
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1974,7 +2031,7 @@ cairo_text_path (cairo_t *cr, const char *utf8)
free (glyphs);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
@@ -1982,7 +2039,7 @@ void
cairo_glyph_path (cairo_t *cr, cairo_glyph_t *glyphs, int num_glyphs)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
@@ -1990,7 +2047,7 @@ cairo_glyph_path (cairo_t *cr, cairo_glyph_t *glyphs, int num_glyphs)
glyphs, num_glyphs,
&cr->path);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
/**
@@ -2156,20 +2213,19 @@ cairo_get_matrix (cairo_t *cr, cairo_matrix_t *matrix)
* Gets the target surface for the cairo context as passed to
* cairo_create().
*
- * Return value: the target surface, (or NULL if @cr is in an error
- * state). This object is owned by cairo. To keep a reference to it,
- * you must call cairo_surface_reference().
+ * Return value: the target surface. This object is owned by cairo. To
+ * keep a reference to it, you must call cairo_surface_reference().
+ *
+ * This function will always return a valid pointer, but the result
+ * can be a "nil" surface if @cr is already in an error state,
+ * (ie. cairo_status(cr) != CAIRO_STATUS_SUCCESS). A nil surface is
+ * indicated by cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS.
**/
cairo_surface_t *
cairo_get_target (cairo_t *cr)
{
- if (cr->status) {
- _cairo_error (cr, cr->status);
- /* XXX: Should be as follows when available:
- return _cairo_surface_create_in_error ();
- */
- return NULL;
- }
+ if (cr->status)
+ return (cairo_surface_t*) &_cairo_surface_nil;
return _cairo_gstate_get_target (cr->gstate);
}
@@ -2190,20 +2246,18 @@ cairo_get_target (cairo_t *cr)
* will have no data, (data==NULL and num_data==0), if either of the
* following conditions hold:
*
- * 1) If there is insufficient memory to copy the path. In this case
- * path->status will be set to CAIRO_STATUS_NO_MEMORY.
+ * 1) If there is insufficient memory to copy the path.
*
- * 2) If @cr is already in an error state. In this case path->status
- * will contain the same status that would be returned by
- * cairo_status(cr).
+ * 2) If @cr is already in an error state.
+ *
+ * In either case, path->status will be set to CAIRO_STATUS_NO_MEMORY,
+ * (regardless of what the error status in @cr might have been).
**/
cairo_path_t *
cairo_copy_path (cairo_t *cr)
{
- if (cr->status) {
- _cairo_error (cr, cr->status);
- return _cairo_path_data_create_in_error (cr->status);
- }
+ if (cr->status)
+ return &cairo_path_nil;
return _cairo_path_data_create (&cr->path, cr->gstate);
}
@@ -2242,7 +2296,7 @@ cairo_path_t *
cairo_copy_path_flat (cairo_t *cr)
{
if (cr->status)
- return _cairo_path_data_create_in_error (cr->status);
+ return &cairo_path_nil;
else
return _cairo_path_data_create_flat (&cr->path, cr->gstate);
}
@@ -2264,31 +2318,31 @@ cairo_append_path (cairo_t *cr,
cairo_path_t *path)
{
if (cr->status) {
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
return;
}
if (path == NULL) {
- _cairo_error (cr, CAIRO_STATUS_NULL_POINTER);
+ _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
return;
}
if (path->status) {
if (path->status <= CAIRO_STATUS_LAST_STATUS)
- _cairo_error (cr, path->status);
+ _cairo_set_error (cr, path->status);
else
- _cairo_error (cr, CAIRO_STATUS_INVALID_STATUS);
+ _cairo_set_error (cr, CAIRO_STATUS_INVALID_STATUS);
return;
}
if (path->data == NULL) {
- _cairo_error (cr, CAIRO_STATUS_NULL_POINTER);
+ _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER);
return;
}
cr->status = _cairo_path_data_append_to_context (path, cr);
if (cr->status)
- _cairo_error (cr, cr->status);
+ _cairo_set_error (cr, cr->status);
}
cairo_status_t
@@ -2314,7 +2368,7 @@ cairo_status_to_string (cairo_status_t status)
case CAIRO_STATUS_INVALID_MATRIX:
return "invalid matrix (not invertible)";
case CAIRO_STATUS_INVALID_STATUS:
- return " invalid value for an input cairo_status_t";
+ return "invalid value for an input cairo_status_t";
case CAIRO_STATUS_NULL_POINTER:
return "NULL pointer";
case CAIRO_STATUS_INVALID_STRING:
@@ -2331,6 +2385,14 @@ cairo_status_to_string (cairo_status_t status)
return "the surface type is not appropriate for the operation";
case CAIRO_STATUS_PATTERN_TYPE_MISMATCH:
return "the pattern type is not appropriate for the operation";
+ case CAIRO_STATUS_INVALID_CONTENT:
+ return "invalid value for an input cairo_content_t";
+ case CAIRO_STATUS_INVALID_FORMAT:
+ return "invalid value for an input cairo_format_t";
+ case CAIRO_STATUS_INVALID_VISUAL:
+ return "invalid value for an input Visual*";
+ case CAIRO_STATUS_FILE_NOT_FOUND:
+ return "file not found";
}
return "<unknown error status>";