[cairo-commit] 3 commits - src/cairo-quartz-surface.c
Brian Ewins
brianewins at kemper.freedesktop.org
Sat Oct 20 15:43:28 PDT 2007
src/cairo-quartz-surface.c | 82 ++++++++++++++++++++++++---------------------
1 file changed, 45 insertions(+), 37 deletions(-)
New commits:
commit 8f6abdbc26ee15451b5a386610f7d5a7a9114d63
Author: Brian Ewins <Brian.Ewins at gmail.com>
Date: Sat Oct 20 23:41:46 2007 +0100
[quartz] return status instead of CGPatternRef
Returning status improves error handling, since
returning NULL doesn't let us distinguish different
types of error.
diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c
index 9638d50..77911de 100644
--- a/src/cairo-quartz-surface.c
+++ b/src/cairo-quartz-surface.c
@@ -555,9 +555,10 @@ _init_pattern_with_snapshot (cairo_pattern_t *pattern,
return CAIRO_STATUS_SUCCESS;
}
-static CGPatternRef
+static cairo_int_status_t
_cairo_quartz_cairo_repeating_surface_pattern_to_quartz (cairo_quartz_surface_t *dest,
- cairo_pattern_t *abspat)
+ cairo_pattern_t *abspat,
+ CGPatternRef *cgpat)
{
cairo_surface_pattern_t *spat;
cairo_surface_t *pat_surf;
@@ -568,7 +569,6 @@ _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (cairo_quartz_surface_t
CGPatternCallbacks cb = { 0,
SurfacePatternDrawFunc,
(CGFunctionReleaseInfoCallback) cairo_pattern_destroy };
- CGPatternRef cgpat;
float rw, rh;
cairo_status_t status;
@@ -578,14 +578,14 @@ _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (cairo_quartz_surface_t
cairo_matrix_t m;
/* SURFACE is the only type we'll handle here */
if (abspat->type != CAIRO_PATTERN_TYPE_SURFACE)
- return NULL;
+ return CAIRO_INT_STATUS_UNSUPPORTED;
spat = (cairo_surface_pattern_t *) abspat;
pat_surf = spat->surface;
status = _cairo_surface_get_extents (pat_surf, &extents);
if (status)
- return NULL;
+ return status;
pbounds.origin.x = 0;
pbounds.origin.y = 0;
@@ -638,14 +638,14 @@ _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (cairo_quartz_surface_t
target_pattern = abspat;
}
- cgpat = CGPatternCreate (target_pattern,
+ *cgpat = CGPatternCreate (target_pattern,
pbounds,
ptransform,
rw, rh,
kCGPatternTilingConstantSpacing, /* kCGPatternTilingNoDistortion, */
TRUE,
&cb);
- return cgpat;
+ return CAIRO_STATUS_SUCCESS;
}
typedef enum {
@@ -726,9 +726,11 @@ _cairo_quartz_setup_source (cairo_quartz_surface_t *surface,
} else if (source->type == CAIRO_PATTERN_TYPE_SURFACE) {
float patternAlpha = 1.0f;
CGColorSpaceRef patternSpace;
+ CGPatternRef pattern;
+ cairo_int_status_t status;
- CGPatternRef pattern = _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (surface, source);
- if (!pattern)
+ status = _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (surface, source, &pattern);
+ if (status)
return DO_UNSUPPORTED;
// Save before we change the pattern, colorspace, etc. so that
commit cfb26fdf0f490b4902106b50d02628cffd53a0eb
Author: Brian Ewins <Brian.Ewins at gmail.com>
Date: Sat Oct 20 23:41:32 2007 +0100
[quartz] return status instead of cairo_quartz_surface_t
Returning status improves error handling, since
returning NULL doesn't let us distinguish different
types of error.
diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c
index ea1611a..9638d50 100644
--- a/src/cairo-quartz-surface.c
+++ b/src/cairo-quartz-surface.c
@@ -427,10 +427,11 @@ _cairo_quartz_cairo_gradient_pattern_to_quartz (cairo_pattern_t *abspat,
}
/* generic cairo surface -> cairo_quartz_surface_t function */
-static cairo_quartz_surface_t *
-_cairo_quartz_surface_to_quartz (cairo_surface_t *target, cairo_surface_t *pat_surf)
+static cairo_int_status_t
+_cairo_quartz_surface_to_quartz (cairo_surface_t *target,
+ cairo_surface_t *pat_surf,
+ cairo_quartz_surface_t **quartz_surf)
{
- cairo_quartz_surface_t *quartz_surf = NULL;
if (cairo_surface_get_type(pat_surf) != CAIRO_SURFACE_TYPE_QUARTZ) {
/* XXXtodo/perf don't use clone if the source surface is an image surface! Instead,
@@ -447,7 +448,7 @@ _cairo_quartz_surface_to_quartz (cairo_surface_t *target, cairo_surface_t *pat_s
status = _cairo_surface_get_extents (pat_surf, &rect);
if (status)
- return NULL;
+ return status;
status = _cairo_surface_clone_similar (ref_type, pat_surf, rect.x, rect.y,
rect.width, rect.height, &new_surf);
@@ -455,18 +456,18 @@ _cairo_quartz_surface_to_quartz (cairo_surface_t *target, cairo_surface_t *pat_s
cairo_surface_destroy(ref_type);
if (status)
- return NULL;
+ return status;
- quartz_surf = (cairo_quartz_surface_t *) new_surf;
+ *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;
* we do this when we call CGBitmapContextCreateImage below.
*/
cairo_surface_reference (pat_surf);
- quartz_surf = (cairo_quartz_surface_t*) pat_surf;
+ *quartz_surf = (cairo_quartz_surface_t*) pat_surf;
}
- return quartz_surf;
+ return CAIRO_STATUS_SUCCESS;
}
/* Generic cairo_pattern -> CGPattern function */
@@ -475,13 +476,14 @@ SurfacePatternDrawFunc (void *info, CGContextRef context)
{
cairo_surface_pattern_t *spat = (cairo_surface_pattern_t *) info;
cairo_surface_t *pat_surf = spat->surface;
+ cairo_int_status_t status;
cairo_quartz_surface_t *quartz_surf;
CGImageRef img;
CGRect imageBounds;
- quartz_surf = _cairo_quartz_surface_to_quartz (NULL, pat_surf);
- if (!quartz_surf)
+ status = _cairo_quartz_surface_to_quartz (NULL, pat_surf, &quartz_surf);
+ if (status)
return;
img = CGBitmapContextCreateImage (quartz_surf->cgContext);
@@ -699,8 +701,8 @@ _cairo_quartz_setup_source (cairo_quartz_surface_t *surface,
cairo_rectangle_int_t extents;
cairo_status_t status;
- quartz_surf = _cairo_quartz_surface_to_quartz ((cairo_surface_t *) surface, pat_surf);
- if (!quartz_surf)
+ status = _cairo_quartz_surface_to_quartz ((cairo_surface_t *) surface, pat_surf, &quartz_surf);
+ if (status)
return DO_UNSUPPORTED;
img = CGBitmapContextCreateImage (quartz_surf->cgContext);
@@ -1507,7 +1509,7 @@ _cairo_quartz_surface_show_glyphs (void *abstract_surface,
}
#endif /* CAIRO_HAS_ATSUI_FONT */
-static cairo_status_t
+static cairo_int_status_t
_cairo_quartz_surface_mask_with_surface (cairo_quartz_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
@@ -1524,7 +1526,9 @@ _cairo_quartz_surface_mask_with_surface (cairo_quartz_surface_t *surface,
if (status)
return status;
- quartz_surf = _cairo_quartz_surface_to_quartz (NULL, pat_surf);
+ status = _cairo_quartz_surface_to_quartz (NULL, pat_surf, &quartz_surf);
+ if (status)
+ return status;
img = CGBitmapContextCreateImage (quartz_surf->cgContext);
if (!img) {
commit dec3099585eeb184ed51b5c720eb891314d7ea51
Author: Brian Ewins <Brian.Ewins at gmail.com>
Date: Sat Oct 20 22:45:30 2007 +0100
[quartz] return status instead of CGShadingRef
Returning status improves error handling, since
returning NULL doesn't let us distinguish different
types of error. Suggested by Chris Wilson.
diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c
index 9a27612..ea1611a 100644
--- a/src/cairo-quartz-surface.c
+++ b/src/cairo-quartz-surface.c
@@ -338,22 +338,23 @@ CreateGradientFunction (cairo_gradient_pattern_t *gpat)
&callbacks);
}
-static CGShadingRef
-_cairo_quartz_cairo_gradient_pattern_to_quartz (cairo_pattern_t *abspat)
+static cairo_int_status_t
+_cairo_quartz_cairo_gradient_pattern_to_quartz (cairo_pattern_t *abspat,
+ CGShadingRef *shading)
{
cairo_matrix_t mat;
double x0, y0;
if (abspat->type != CAIRO_PATTERN_TYPE_LINEAR &&
abspat->type != CAIRO_PATTERN_TYPE_RADIAL)
- return NULL;
+ return CAIRO_INT_STATUS_UNSUPPORTED;
/* bandaid for mozilla bug 379321, also visible in the
* linear-gradient-reflect test.
*/
if (abspat->extend == CAIRO_EXTEND_REFLECT ||
abspat->extend == CAIRO_EXTEND_REPEAT)
- return NULL;
+ return CAIRO_INT_STATUS_UNSUPPORTED;
/* We can only do this if we have an identity pattern matrix;
* otherwise fall back through to the generic pattern case.
@@ -364,14 +365,13 @@ _cairo_quartz_cairo_gradient_pattern_to_quartz (cairo_pattern_t *abspat)
*/
cairo_pattern_get_matrix (abspat, &mat);
if (mat.xx != 1.0 || mat.yy != 1.0 || mat.xy != 0.0 || mat.yx != 0.0)
- return NULL;
+ return CAIRO_INT_STATUS_UNSUPPORTED;
x0 = mat.x0;
y0 = mat.y0;
if (abspat->type == CAIRO_PATTERN_TYPE_LINEAR) {
cairo_linear_pattern_t *lpat = (cairo_linear_pattern_t*) abspat;
- CGShadingRef shading;
CGPoint start, end;
CGFunctionRef gradFunc;
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
@@ -384,19 +384,18 @@ _cairo_quartz_cairo_gradient_pattern_to_quartz (cairo_pattern_t *abspat)
cairo_pattern_reference (abspat);
gradFunc = CreateGradientFunction ((cairo_gradient_pattern_t*) lpat);
- shading = CGShadingCreateAxial (rgb,
+ *shading = CGShadingCreateAxial (rgb,
start, end,
gradFunc,
extend, extend);
CGColorSpaceRelease(rgb);
CGFunctionRelease(gradFunc);
- return shading;
+ return CAIRO_STATUS_SUCCESS;
}
if (abspat->type == CAIRO_PATTERN_TYPE_RADIAL) {
cairo_radial_pattern_t *rpat = (cairo_radial_pattern_t*) abspat;
- CGShadingRef shading;
CGPoint start, end;
CGFunctionRef gradFunc;
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
@@ -409,7 +408,7 @@ _cairo_quartz_cairo_gradient_pattern_to_quartz (cairo_pattern_t *abspat)
cairo_pattern_reference (abspat);
gradFunc = CreateGradientFunction ((cairo_gradient_pattern_t*) rpat);
- shading = CGShadingCreateRadial (rgb,
+ *shading = CGShadingCreateRadial (rgb,
start,
_cairo_fixed_to_double (rpat->r1),
end,
@@ -419,12 +418,12 @@ _cairo_quartz_cairo_gradient_pattern_to_quartz (cairo_pattern_t *abspat)
CGColorSpaceRelease(rgb);
CGFunctionRelease(gradFunc);
- return shading;
+ return CAIRO_STATUS_SUCCESS;
}
/* Shouldn't be reached */
ASSERT_NOT_REACHED;
- return NULL;
+ return CAIRO_STATUS_SUCCESS;
}
/* generic cairo surface -> cairo_quartz_surface_t function */
@@ -679,8 +678,11 @@ _cairo_quartz_setup_source (cairo_quartz_surface_t *surface,
} else if (source->type == CAIRO_PATTERN_TYPE_LINEAR ||
source->type == CAIRO_PATTERN_TYPE_RADIAL)
{
- CGShadingRef shading = _cairo_quartz_cairo_gradient_pattern_to_quartz (source);
- if (!shading)
+ CGShadingRef shading = NULL;
+ cairo_int_status_t status;
+
+ status = _cairo_quartz_cairo_gradient_pattern_to_quartz (source, &shading);
+ if (status)
return DO_UNSUPPORTED;
surface->sourceShading = shading;
More information about the cairo-commit
mailing list