summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Ewins <Brian.Ewins@gmail.com>2007-06-18 00:07:33 +0100
committerCarl Worth <cworth@cworth.org>2007-11-26 21:24:50 -0800
commit6e4ff01d0ba40576943c76da638fe0026baab62b (patch)
tree65648ad27f386298558b1caad491553c63deabe0
parentca132774c463f75b11b297c5b2b034ee669115ac (diff)
downloadcairo-6e4ff01d0ba40576943c76da638fe0026baab62b.tar.gz
do not ignore errors, return NULL instead (moz#874315)
In the quartz backend there are occasional errors where returning NULL can be used to signal that an error has occured. Mozilla bug #874315. (cherry picked from commit 6fec51990e90901ebafbb872a9e618cb70d17911)
-rw-r--r--src/cairo-quartz-surface.c37
1 files changed, 28 insertions, 9 deletions
diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c
index 48e57d5e2..5b57d2810 100644
--- a/src/cairo-quartz-surface.c
+++ b/src/cairo-quartz-surface.c
@@ -437,17 +437,23 @@ _cairo_quartz_surface_to_quartz (cairo_surface_t *target, cairo_surface_t *pat_s
cairo_surface_t *ref_type = target;
cairo_surface_t *new_surf = NULL;
cairo_rectangle_int16_t rect;
+ cairo_status_t status;
+
if (ref_type == NULL)
ref_type = cairo_quartz_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
- _cairo_surface_get_extents (pat_surf, &rect);
+ status = _cairo_surface_get_extents (pat_surf, &rect);
+ if (status)
+ return NULL;
- _cairo_surface_clone_similar (ref_type, pat_surf, rect.x, rect.y,
+ status = _cairo_surface_clone_similar (ref_type, pat_surf, rect.x, rect.y,
rect.width, rect.height, &new_surf);
-
if (target == NULL)
cairo_surface_destroy(ref_type);
+ if (status)
+ return NULL;
+
quartz_surf = (cairo_quartz_surface_t *) new_surf;
} else {
/* If it's a quartz surface, we can try to see if it's a CGBitmapContext;
@@ -455,7 +461,6 @@ _cairo_quartz_surface_to_quartz (cairo_surface_t *target, cairo_surface_t *pat_s
*/
cairo_surface_reference (pat_surf);
quartz_surf = (cairo_quartz_surface_t*) pat_surf;
-
}
return quartz_surf;
@@ -468,10 +473,15 @@ SurfacePatternDrawFunc (void *info, CGContextRef context)
cairo_surface_pattern_t *spat = (cairo_surface_pattern_t *) info;
cairo_surface_t *pat_surf = spat->surface;
- cairo_quartz_surface_t *quartz_surf = _cairo_quartz_surface_to_quartz (NULL, pat_surf);
- CGImageRef img = CGBitmapContextCreateImage (quartz_surf->cgContext);
+ cairo_quartz_surface_t *quartz_surf;
+ CGImageRef img;
CGRect imageBounds;
+ quartz_surf = _cairo_quartz_surface_to_quartz (NULL, pat_surf);
+ if (!quartz_surf)
+ return;
+
+ img = CGBitmapContextCreateImage (quartz_surf->cgContext);
if (!img) {
// ... give up.
ND((stderr, "CGBitmapContextCreateImage failed\n"));
@@ -554,6 +564,7 @@ _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (cairo_quartz_surface_t
(CGFunctionReleaseInfoCallback) cairo_pattern_destroy };
CGPatternRef cgpat;
float rw, rh;
+ cairo_status_t status;
cairo_pattern_union_t *snap_pattern = NULL;
cairo_pattern_t *target_pattern = abspat;
@@ -566,7 +577,10 @@ _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (cairo_quartz_surface_t
spat = (cairo_surface_pattern_t *) abspat;
pat_surf = spat->surface;
- _cairo_surface_get_extents (pat_surf, &extents);
+ status = _cairo_surface_get_extents (pat_surf, &extents);
+ if (status)
+ return NULL;
+
pbounds.origin.x = 0;
pbounds.origin.y = 0;
@@ -672,12 +686,17 @@ _cairo_quartz_setup_source (cairo_quartz_surface_t *surface,
{
cairo_surface_pattern_t *spat = (cairo_surface_pattern_t *) source;
cairo_surface_t *pat_surf = spat->surface;
- cairo_quartz_surface_t *quartz_surf = _cairo_quartz_surface_to_quartz ((cairo_surface_t *) surface, pat_surf);
- CGImageRef img = CGBitmapContextCreateImage (quartz_surf->cgContext);
+ cairo_quartz_surface_t *quartz_surf;
+ CGImageRef img;
cairo_matrix_t m = spat->base.matrix;
cairo_rectangle_int16_t extents;
cairo_status_t status;
+ quartz_surf = _cairo_quartz_surface_to_quartz ((cairo_surface_t *) surface, pat_surf);
+ if (!quartz_surf)
+ return DO_UNSUPPORTED;
+
+ img = CGBitmapContextCreateImage (quartz_surf->cgContext);
if (!img)
return DO_UNSUPPORTED;