summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Muizelaar <jmuizelaar@mozilla.com>2008-12-10 17:02:55 -0500
committerJeff Muizelaar <jmuizelaar@mozilla.com>2008-12-10 17:41:45 -0500
commitd93bf10edc7e432349524221a3d1b0f0b2ec8090 (patch)
tree48c433c18366f54560fc4e2566fb5de43239cec2
parent673640a3b3931995897b01d49c5dd8d82b50dac2 (diff)
[quartz] Create a copy of the pattern so that the reference counts are balanced
The pattern could be stack allocated so we can't take a reference to it; instead make a copy. Based on a patch by Paolo Bonzini.
-rw-r--r--src/cairo-quartz-surface.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c
index 41fde0be..163c9fba 100644
--- a/src/cairo-quartz-surface.c
+++ b/src/cairo-quartz-surface.c
@@ -682,13 +682,19 @@ ComputeGradientValue (void *info, const float *in, float *out)
static CGFunctionRef
CreateGradientFunction (cairo_gradient_pattern_t *gpat)
{
+ cairo_pattern_t *pat;
float input_value_range[2] = { 0.f, 1.f };
float output_value_ranges[8] = { 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f };
CGFunctionCallbacks callbacks = {
0, ComputeGradientValue, (CGFunctionReleaseInfoCallback) cairo_pattern_destroy
};
- return CGFunctionCreate (gpat,
+ if (_cairo_pattern_create_copy (&pat, &gpat->base))
+ /* quartz doesn't deal very well with malloc failing, so there's
+ * not much point in us trying either */
+ return NULL;
+
+ return CGFunctionCreate (pat,
1,
input_value_range,
4,
@@ -702,6 +708,7 @@ CreateRepeatingGradientFunction (cairo_quartz_surface_t *surface,
CGPoint *start, CGPoint *end,
CGAffineTransform matrix)
{
+ cairo_pattern_t *pat;
float input_value_range[2];
float output_value_ranges[8] = { 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f };
CGFunctionCallbacks callbacks = {
@@ -766,7 +773,12 @@ CreateRepeatingGradientFunction (cairo_quartz_surface_t *surface,
input_value_range[0] = 0.0 - 1.0 * rep_start;
input_value_range[1] = 1.0 + 1.0 * rep_end;
- return CGFunctionCreate (gpat,
+ if (_cairo_pattern_create_copy (&pat, &gpat->base))
+ /* quartz doesn't deal very well with malloc failing, so there's
+ * not much point in us trying either */
+ return NULL;
+
+ return CGFunctionCreate (pat,
1,
input_value_range,
4,