michael@0: From: Robert O'Callahan michael@0: Bug 593270. Part 2: Treat EXTEND_PAD like EXTEND_NONE when painting. r=jrmuizel,a=joe michael@0: michael@0: diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c michael@0: --- a/gfx/cairo/cairo/src/cairo-quartz-surface.c michael@0: +++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c michael@0: @@ -1464,35 +1464,35 @@ static void michael@0: _cairo_quartz_setup_surface_source (cairo_quartz_surface_t *surface, michael@0: const cairo_surface_pattern_t *spat, michael@0: cairo_rectangle_int_t *extents, michael@0: cairo_quartz_drawing_state_t *state) michael@0: { michael@0: const cairo_pattern_t *source = &spat->base; michael@0: CGContextRef context = state->context; michael@0: michael@0: - if (source->extend == CAIRO_EXTEND_NONE || michael@0: + if (source->extend == CAIRO_EXTEND_NONE || source->extend == CAIRO_EXTEND_PAD || michael@0: (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT)) michael@0: { michael@0: cairo_surface_t *pat_surf = spat->surface; michael@0: CGImageRef img; michael@0: cairo_matrix_t m = spat->base.matrix; michael@0: cairo_rectangle_int_t extents; michael@0: CGAffineTransform xform; michael@0: CGRect srcRect; michael@0: cairo_fixed_t fw, fh; michael@0: cairo_bool_t is_bounded; michael@0: + cairo_bool_t repeat = source->extend == CAIRO_EXTEND_REPEAT; michael@0: cairo_status_t status; michael@0: michael@0: cairo_matrix_invert(&m); michael@0: _cairo_quartz_cairo_matrix_to_quartz (&m, &state->transform); michael@0: michael@0: /* Draw nonrepeating CGLayer surface using DO_LAYER */ michael@0: - if (source->extend == CAIRO_EXTEND_NONE || michael@0: - (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT)) michael@0: + if (!repeat && cairo_surface_get_type (pat_surf) == CAIRO_SURFACE_TYPE_QUARTZ) { michael@0: cairo_quartz_surface_t *quartz_surf = (cairo_quartz_surface_t *) pat_surf; michael@0: if (quartz_surf->cgLayer) { michael@0: state->imageRect = CGRectMake (0, 0, quartz_surf->extents.width, quartz_surf->extents.height); michael@0: state->layer = quartz_surf->cgLayer; michael@0: state->action = DO_LAYER; michael@0: return; michael@0: } michael@0: } michael@0: @@ -1510,17 +1510,17 @@ _cairo_quartz_setup_surface_source (cair michael@0: /* XXXroc what is this for? */ michael@0: CGContextSetRGBFillColor (surface->cgContext, 0, 0, 0, 1); michael@0: michael@0: state->image = img; michael@0: michael@0: is_bounded = _cairo_surface_get_extents (pat_surf, &extents); michael@0: assert (is_bounded); michael@0: michael@0: - if (source->extend == CAIRO_EXTEND_NONE) { michael@0: + if (!repeat) { michael@0: state->imageRect = CGRectMake (0, 0, extents.width, extents.height); michael@0: state->action = DO_IMAGE; michael@0: return; michael@0: } michael@0: michael@0: /* Quartz seems to tile images at pixel-aligned regions only -- this michael@0: * leads to seams if the image doesn't end up scaling to fill the michael@0: * space exactly. The CGPattern tiling approach doesn't have this