summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrea Canciani <ranma42@gmail.com>2011-01-08 15:30:20 +0100
committerAndrea Canciani <ranma42@gmail.com>2011-02-15 08:08:00 +0100
commit6e21419e7eec8d8a98fda7d51c12034175aca48a (patch)
treec40c20f0683f5976e2bb960a1857ad523e8e0385
parentd866bb0405bc989666f886e2c0e293a1fe718d74 (diff)
quartz: create common color[space]s just once
-rw-r--r--src/cairo-quartz-surface.c77
1 files changed, 47 insertions, 30 deletions
diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c
index bb7be483b..20ddb5951 100644
--- a/src/cairo-quartz-surface.c
+++ b/src/cairo-quartz-surface.c
@@ -116,6 +116,12 @@ static bool (*CGContextGetAllowsFontSmoothingPtr) (CGContextRef) = NULL;
static cairo_bool_t _cairo_quartz_symbol_lookup_done = FALSE;
+static CGColorSpaceRef cgColorSpaceDeviceRGB = NULL;
+
+static CGColorRef cgColorClear = NULL;
+static CGColorRef cgColorBlack = NULL;
+static CGColorRef cgColorWhite = NULL;
+
/*
* Utility functions
*/
@@ -140,6 +146,21 @@ static void quartz_ensure_symbols (void)
if (likely (_cairo_quartz_symbol_lookup_done))
return;
+ cgColorSpaceDeviceRGB = CGColorSpaceCreateDeviceRGB ();
+
+ {
+ cairo_quartz_float_t components[4];
+
+ components[0] = components[1] = components[2] = components[3] = 0.0;
+ cgColorClear = CGColorCreate (cgColorSpaceDeviceRGB, components);
+
+ components[3] = 1.0;
+ cgColorBlack = CGColorCreate (cgColorSpaceDeviceRGB, components);
+
+ components[0] = components[1] = components[2] = 1.0;
+ cgColorWhite = CGColorCreate (cgColorSpaceDeviceRGB, components);
+ }
+
CGContextDrawTiledImagePtr = dlsym (RTLD_DEFAULT, "CGContextDrawTiledImage");
CGContextGetTypePtr = dlsym (RTLD_DEFAULT, "CGContextGetType");
CGContextCopyPathPtr = dlsym (RTLD_DEFAULT, "CGContextCopyPath");
@@ -169,7 +190,7 @@ _cairo_quartz_create_cgimage (cairo_format_t format,
switch (format) {
case CAIRO_FORMAT_ARGB32:
if (colorSpace == NULL)
- colorSpace = CGColorSpaceCreateDeviceRGB ();
+ colorSpace = cgColorSpaceDeviceRGB;
bitinfo |= kCGImageAlphaPremultipliedFirst;
bitsPerComponent = 8;
bitsPerPixel = 32;
@@ -177,7 +198,7 @@ _cairo_quartz_create_cgimage (cairo_format_t format,
case CAIRO_FORMAT_RGB24:
if (colorSpace == NULL)
- colorSpace = CGColorSpaceCreateDeviceRGB ();
+ colorSpace = cgColorSpaceDeviceRGB;
bitinfo |= kCGImageAlphaNoneSkipFirst;
bitsPerComponent = 8;
bitsPerPixel = 32;
@@ -238,9 +259,6 @@ FINISH:
CGDataProviderRelease (dataProvider);
- if (colorSpace != colorSpaceOverride)
- CGColorSpaceRelease (colorSpace);
-
return image;
}
@@ -1033,7 +1051,6 @@ _cairo_quartz_setup_gradient_source (cairo_quartz_drawing_state_t *state,
cairo_matrix_t mat;
cairo_circle_double_t start, end;
CGFunctionRef gradFunc;
- CGColorSpaceRef rgb;
bool extend = gradient->base.extend != CAIRO_EXTEND_NONE;
assert (gradient->n_stops > 0);
@@ -1050,10 +1067,8 @@ _cairo_quartz_setup_gradient_source (cairo_quartz_drawing_state_t *state,
if (unlikely (gradFunc == NULL))
return CAIRO_INT_STATUS_UNSUPPORTED;
- rgb = CGColorSpaceCreateDeviceRGB ();
-
if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) {
- state->shading = CGShadingCreateAxial (rgb,
+ state->shading = CGShadingCreateAxial (cgColorSpaceDeviceRGB,
CGPointMake (start.center.x,
start.center.y),
CGPointMake (end.center.x,
@@ -1061,7 +1076,7 @@ _cairo_quartz_setup_gradient_source (cairo_quartz_drawing_state_t *state,
gradFunc,
extend, extend);
} else {
- state->shading = CGShadingCreateRadial (rgb,
+ state->shading = CGShadingCreateRadial (cgColorSpaceDeviceRGB,
CGPointMake (start.center.x,
start.center.y),
MAX (start.radius, 0),
@@ -1072,7 +1087,6 @@ _cairo_quartz_setup_gradient_source (cairo_quartz_drawing_state_t *state,
extend, extend);
}
- CGColorSpaceRelease (rgb);
CGFunctionRelease (gradFunc);
state->action = DO_SHADING;
@@ -1119,8 +1133,6 @@ _cairo_quartz_setup_state (cairo_quartz_drawing_state_t *state,
state->filter = _cairo_quartz_filter_to_quartz (source->filter);
if (op == CAIRO_OPERATOR_CLEAR) {
- CGContextSetRGBFillColor (state->cgDrawContext, 0, 0, 0, 1);
-
state->action = DO_DIRECT;
return CAIRO_STATUS_SUCCESS;
}
@@ -1158,17 +1170,21 @@ _cairo_quartz_setup_state (cairo_quartz_drawing_state_t *state,
if (source->type == CAIRO_PATTERN_TYPE_SOLID) {
cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) source;
+ CGColorRef color;
+ cairo_quartz_float_t components[4];
+
+ /* TODO: use clear/white/black */
+ components[0] = solid->color.red;
+ components[1] = solid->color.green;
+ components[2] = solid->color.blue;
+ components[3] = solid->color.alpha;
+
+ color = CGColorCreate (cgColorSpaceDeviceRGB, components);
- CGContextSetRGBStrokeColor (state->cgDrawContext,
- solid->color.red,
- solid->color.green,
- solid->color.blue,
- solid->color.alpha);
- CGContextSetRGBFillColor (state->cgDrawContext,
- solid->color.red,
- solid->color.green,
- solid->color.blue,
- solid->color.alpha);
+ CGContextSetFillColorWithColor (state->cgDrawContext, color);
+ CGContextSetStrokeColorWithColor (state->cgDrawContext, color);
+
+ CGColorRelease (color);
state->action = DO_DIRECT;
return CAIRO_STATUS_SUCCESS;
@@ -2458,8 +2474,6 @@ _cairo_quartz_surface_create_internal (CGContextRef cgContext,
{
cairo_quartz_surface_t *surface;
- quartz_ensure_symbols ();
-
/* Init the base surface */
surface = malloc (sizeof (cairo_quartz_surface_t));
if (unlikely (surface == NULL))
@@ -2536,6 +2550,8 @@ cairo_quartz_surface_create_for_cg_context (CGContextRef cgContext,
{
cairo_quartz_surface_t *surf;
+ quartz_ensure_symbols ();
+
surf = _cairo_quartz_surface_create_internal (cgContext, CAIRO_CONTENT_COLOR_ALPHA,
width, height);
if (likely (!surf->base.status))
@@ -2572,6 +2588,8 @@ cairo_quartz_surface_create (cairo_format_t format,
int stride;
int bitsPerComponent;
+ quartz_ensure_symbols ();
+
// verify width and height of surface
if (!_cairo_quartz_verify_surface_size (width, height))
return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE));
@@ -2584,7 +2602,7 @@ cairo_quartz_surface_create (cairo_format_t format,
if (format == CAIRO_FORMAT_ARGB32 ||
format == CAIRO_FORMAT_RGB24)
{
- cgColorspace = CGColorSpaceCreateDeviceRGB ();
+ cgColorspace = cgColorSpaceDeviceRGB;
bitinfo = kCGBitmapByteOrder32Host;
if (format == CAIRO_FORMAT_ARGB32)
bitinfo |= kCGImageAlphaPremultipliedFirst;
@@ -2614,10 +2632,8 @@ cairo_quartz_surface_create (cairo_format_t format,
stride = (stride + 15) & ~15;
imageData = _cairo_malloc_ab (height, stride);
- if (unlikely (!imageData)) {
- CGColorSpaceRelease (cgColorspace);
+ if (unlikely (!imageData))
return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));
- }
/* zero the memory to match the image surface behaviour */
memset (imageData, 0, height * stride);
@@ -2629,7 +2645,6 @@ cairo_quartz_surface_create (cairo_format_t format,
stride,
cgColorspace,
bitinfo);
- CGColorSpaceRelease (cgColorspace);
if (!cgc) {
free (imageData);
@@ -2640,6 +2655,8 @@ cairo_quartz_surface_create (cairo_format_t format,
CGContextTranslateCTM (cgc, 0.0, height);
CGContextScaleCTM (cgc, 1.0, -1.0);
+ CGContextSetFillColorWithColor (cgc, cgColorBlack);
+
surf = _cairo_quartz_surface_create_internal (cgc, _cairo_content_from_format (format),
width, height);
if (surf->base.status) {