diff options
Diffstat (limited to 'src/cairo-image-surface.c')
-rw-r--r-- | src/cairo-image-surface.c | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c index ea6b44905..9006492bb 100644 --- a/src/cairo-image-surface.c +++ b/src/cairo-image-surface.c @@ -861,7 +861,7 @@ _cairo_image_surface_unset_clip_region (cairo_image_surface_t *surface) pixman_image_set_clip_region32 (surface->pixman_image, NULL); } -#if HAS_ATOMIC_OPS +#if PIXMAN_HAS_ATOMIC_OPS static pixman_image_t *__pixman_transparent_image; static pixman_image_t *__pixman_black_image; static pixman_image_t *__pixman_white_image; @@ -955,23 +955,6 @@ _pixman_white_image (void) return image; } -#else -static pixman_image_t * -_pixman_transparent_image (void) -{ - return _pixman_image_for_solid (&_cairo_pattern_clear); -} -static pixman_image_t * -_pixman_black_image (void) -{ - return _pixman_image_for_solid (&_cairo_pattern_black); -} -static pixman_image_t * -_pixman_white_image (void) -{ - return _pixman_image_for_solid (&_cairo_pattern_white); -} -#endif static uint32_t hars_petruska_f54_1_random (void) @@ -988,13 +971,33 @@ static struct { } cache[16]; static int n_cached; +#else /* !PIXMAN_HAS_ATOMIC_OPS */ +static pixman_image_t * +_pixman_transparent_image (void) +{ + return _pixman_image_for_solid (&_cairo_pattern_clear); +} + +static pixman_image_t * +_pixman_black_image (void) +{ + return _pixman_image_for_solid (&_cairo_pattern_black); +} + +static pixman_image_t * +_pixman_white_image (void) +{ + return _pixman_image_for_solid (&_cairo_pattern_white); +} +#endif /* !PIXMAN_HAS_ATOMIC_OPS */ + void _cairo_image_reset_static_data (void) { +#if PIXMAN_HAS_ATOMIC_OPS while (n_cached) pixman_image_unref (cache[--n_cached].image); -#if HAS_ATOMIC_OPS if (__pixman_transparent_image) { pixman_image_unref (__pixman_transparent_image); __pixman_transparent_image = NULL; @@ -1017,9 +1020,10 @@ _pixman_image_for_solid (const cairo_solid_pattern_t *pattern) { pixman_color_t color; pixman_image_t *image; + +#if PIXMAN_HAS_ATOMIC_OPS int i; -#if HAS_ATOMIC_OPS if (pattern->color.alpha_short <= 0x00ff) return _pixman_transparent_image (); @@ -1038,7 +1042,6 @@ _pixman_image_for_solid (const cairo_solid_pattern_t *pattern) return _pixman_white_image (); } } -#endif CAIRO_MUTEX_LOCK (_cairo_image_solid_cache_mutex); for (i = 0; i < n_cached; i++) { @@ -1047,6 +1050,7 @@ _pixman_image_for_solid (const cairo_solid_pattern_t *pattern) goto UNLOCK; } } +#endif color.red = pattern->color.red_short; color.green = pattern->color.green_short; @@ -1054,6 +1058,7 @@ _pixman_image_for_solid (const cairo_solid_pattern_t *pattern) color.alpha = pattern->color.alpha_short; image = pixman_image_create_solid_fill (&color); +#if PIXMAN_HAS_ATOMIC_OPS if (image == NULL) goto UNLOCK; @@ -1068,6 +1073,7 @@ _pixman_image_for_solid (const cairo_solid_pattern_t *pattern) UNLOCK: CAIRO_MUTEX_UNLOCK (_cairo_image_solid_cache_mutex); +#endif return image; } @@ -1302,6 +1308,7 @@ _pixman_image_for_surface (const cairo_surface_pattern_t *pattern, extend = pattern->base.extend; filter = sampled_area (pattern, extents, &sample); + *ix = *iy = 0; pixman_image = NULL; if (pattern->surface->type == CAIRO_SURFACE_TYPE_IMAGE && (! is_mask || ! pattern->base.has_component_alpha || @@ -1339,6 +1346,7 @@ _pixman_image_for_surface (const cairo_surface_pattern_t *pattern, } } +#if PIXMAN_HAS_ATOMIC_OPS /* avoid allocating a 'pattern' image if we can reuse the original */ *ix = *iy = 0; if (extend == CAIRO_EXTEND_NONE && @@ -1347,6 +1355,7 @@ _pixman_image_for_surface (const cairo_surface_pattern_t *pattern, { return pixman_image_ref (source->pixman_image); } +#endif pixman_image = pixman_image_create_bits (source->pixman_format, source->width, @@ -1381,6 +1390,7 @@ _pixman_image_for_surface (const cairo_surface_pattern_t *pattern, } } +#if PIXMAN_HAS_ATOMIC_OPS *ix = sub->extents.x; *iy = sub->extents.y; if (is_contained && @@ -1389,13 +1399,17 @@ _pixman_image_for_surface (const cairo_surface_pattern_t *pattern, { return pixman_image_ref (source->pixman_image); } +#endif /* Avoid sub-byte offsets, force a copy in that case. */ if (PIXMAN_FORMAT_BPP (source->pixman_format) >= 8) { + void *data = source->data + + sub->extents.x * PIXMAN_FORMAT_BPP(source->pixman_format)/8 + + sub->extents.y * source->stride; pixman_image = pixman_image_create_bits (source->pixman_format, sub->extents.width, sub->extents.height, - (uint32_t *) (source->data + sub->extents.x * PIXMAN_FORMAT_BPP(source->pixman_format)/8 + sub->extents.y * source->stride), + data, source->stride); if (unlikely (pixman_image == NULL)) return NULL; @@ -1403,8 +1417,6 @@ _pixman_image_for_surface (const cairo_surface_pattern_t *pattern, } } - *ix = *iy = 0; - if (pixman_image == NULL) { struct acquire_source_cleanup *cleanup; cairo_image_surface_t *image; |