diff options
author | Andrea Canciani <ranma42@gmail.com> | 2011-01-08 15:30:20 +0100 |
---|---|---|
committer | Andrea Canciani <ranma42@gmail.com> | 2011-02-15 08:08:00 +0100 |
commit | 6e21419e7eec8d8a98fda7d51c12034175aca48a (patch) | |
tree | c40c20f0683f5976e2bb960a1857ad523e8e0385 | |
parent | d866bb0405bc989666f886e2c0e293a1fe718d74 (diff) |
quartz: create common color[space]s just once
-rw-r--r-- | src/cairo-quartz-surface.c | 77 |
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) { |