gfx/cairo/quartz-fix-PAD.patch

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/cairo/quartz-fix-PAD.patch	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,64 @@
     1.4 +From: Robert O'Callahan <robert@ocallahan.org>
     1.5 +Bug 593270. Part 2: Treat EXTEND_PAD like EXTEND_NONE when painting. r=jrmuizel,a=joe
     1.6 +
     1.7 +diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c
     1.8 +--- a/gfx/cairo/cairo/src/cairo-quartz-surface.c
     1.9 ++++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c
    1.10 +@@ -1464,35 +1464,35 @@ static void
    1.11 + _cairo_quartz_setup_surface_source (cairo_quartz_surface_t *surface,
    1.12 + 				    const cairo_surface_pattern_t *spat,
    1.13 + 				    cairo_rectangle_int_t *extents,
    1.14 + 				    cairo_quartz_drawing_state_t *state)
    1.15 + {
    1.16 +     const cairo_pattern_t *source = &spat->base;
    1.17 +     CGContextRef context = state->context;
    1.18 + 
    1.19 +-    if (source->extend == CAIRO_EXTEND_NONE ||
    1.20 ++    if (source->extend == CAIRO_EXTEND_NONE || source->extend == CAIRO_EXTEND_PAD ||
    1.21 +         (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT))
    1.22 +     {
    1.23 + 	cairo_surface_t *pat_surf = spat->surface;
    1.24 + 	CGImageRef img;
    1.25 + 	cairo_matrix_t m = spat->base.matrix;
    1.26 + 	cairo_rectangle_int_t extents;
    1.27 + 	CGAffineTransform xform;
    1.28 + 	CGRect srcRect;
    1.29 + 	cairo_fixed_t fw, fh;
    1.30 + 	cairo_bool_t is_bounded;
    1.31 ++	cairo_bool_t repeat = source->extend == CAIRO_EXTEND_REPEAT;
    1.32 +         cairo_status_t status;
    1.33 + 
    1.34 +         cairo_matrix_invert(&m);
    1.35 +         _cairo_quartz_cairo_matrix_to_quartz (&m, &state->transform);
    1.36 + 
    1.37 +         /* Draw nonrepeating CGLayer surface using DO_LAYER */
    1.38 +-        if (source->extend == CAIRO_EXTEND_NONE ||
    1.39 +-            (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT))
    1.40 ++        if (!repeat && cairo_surface_get_type (pat_surf) == CAIRO_SURFACE_TYPE_QUARTZ) {
    1.41 +             cairo_quartz_surface_t *quartz_surf = (cairo_quartz_surface_t *) pat_surf;
    1.42 +             if (quartz_surf->cgLayer) {
    1.43 +          	state->imageRect = CGRectMake (0, 0, quartz_surf->extents.width, quartz_surf->extents.height);
    1.44 +                 state->layer = quartz_surf->cgLayer;
    1.45 +                 state->action = DO_LAYER;
    1.46 +                 return;
    1.47 +             }
    1.48 +         }
    1.49 +@@ -1510,17 +1510,17 @@ _cairo_quartz_setup_surface_source (cair
    1.50 +         /* XXXroc what is this for? */
    1.51 + 	CGContextSetRGBFillColor (surface->cgContext, 0, 0, 0, 1);
    1.52 + 
    1.53 + 	state->image = img;
    1.54 + 
    1.55 + 	is_bounded = _cairo_surface_get_extents (pat_surf, &extents);
    1.56 + 	assert (is_bounded);
    1.57 + 
    1.58 +-	if (source->extend == CAIRO_EXTEND_NONE) {
    1.59 ++	if (!repeat) {
    1.60 + 	    state->imageRect = CGRectMake (0, 0, extents.width, extents.height);
    1.61 + 	    state->action = DO_IMAGE;
    1.62 + 	    return;
    1.63 + 	}
    1.64 + 
    1.65 + 	/* Quartz seems to tile images at pixel-aligned regions only -- this
    1.66 + 	 * leads to seams if the image doesn't end up scaling to fill the
    1.67 + 	 * space exactly.  The CGPattern tiling approach doesn't have this

mercurial