diff --git a/src/cairo-glitz-surface.c b/src/cairo-glitz-surface.c index 51448954a..592dd134a 100644 --- a/src/cairo-glitz-surface.c +++ b/src/cairo-glitz-surface.c @@ -817,7 +817,7 @@ _cairo_glitz_pattern_acquire_surface (cairo_pattern_t *pattern, (((int) (gradient->stops[i].color.green_short >> 8)) << 8) | (((int) (gradient->stops[i].color.blue_short >> 8))); - params[n_base_params + 3 * i + 0] = gradient->stops[i].x; + params[n_base_params + 3 * i + 0] = _cairo_fixed_16_16_from_double (gradient->stops[i].offset); params[n_base_params + 3 * i + 1] = i << 16; params[n_base_params + 3 * i + 2] = 0; } diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c index 8ec398770..bd67163de 100644 --- a/src/cairo-pattern.c +++ b/src/cairo-pattern.c @@ -821,7 +821,6 @@ _cairo_pattern_add_color_stop (cairo_gradient_pattern_t *pattern, double alpha) { cairo_gradient_stop_t *stops; - cairo_fixed_t x; unsigned int i; if (pattern->n_stops >= pattern->stops_size) { @@ -834,10 +833,9 @@ _cairo_pattern_add_color_stop (cairo_gradient_pattern_t *pattern, stops = pattern->stops; - x = _cairo_fixed_from_double (offset); for (i = 0; i < pattern->n_stops; i++) { - if (x < stops[i].x) + if (offset < stops[i].offset) { memmove (&stops[i + 1], &stops[i], sizeof (cairo_gradient_stop_t) * (pattern->n_stops - i)); @@ -846,7 +844,7 @@ _cairo_pattern_add_color_stop (cairo_gradient_pattern_t *pattern, } } - stops[i].x = x; + stops[i].offset = offset; stops[i].color.red = red; stops[i].color.green = green; @@ -1208,7 +1206,7 @@ _cairo_pattern_acquire_surface_for_gradient (cairo_gradient_pattern_t *pattern, } for (i = 0; i < pattern->n_stops; i++) { - pixman_stops[i].x = _cairo_fixed_to_16_16 (pattern->stops[i].x); + pixman_stops[i].x = _cairo_fixed_16_16_from_double (pattern->stops[i].offset); pixman_stops[i].color.red = pattern->stops[i].color.red_short; pixman_stops[i].color.green = pattern->stops[i].color.green_short; pixman_stops[i].color.blue = pattern->stops[i].color.blue_short; @@ -2155,7 +2153,7 @@ cairo_pattern_get_color_stop_rgba (cairo_pattern_t *pattern, return _cairo_error (CAIRO_STATUS_INVALID_INDEX); if (offset) - *offset = _cairo_fixed_to_double(gradient->stops[index].x); + *offset = gradient->stops[index].offset; if (red) *red = gradient->stops[index].color.red; if (green) diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index cce4b3c03..7dad2f5bf 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -1981,7 +1981,7 @@ _cairo_pdf_surface_emit_pattern_stops (cairo_pdf_surface_t *surface, stops[i].color[3] = pattern->stops[i].color.alpha; if (!CAIRO_ALPHA_IS_OPAQUE (stops[i].color[3])) emit_alpha = TRUE; - stops[i].offset = _cairo_fixed_to_double (pattern->stops[i].x); + stops[i].offset = pattern->stops[i].offset; } if (pattern->base.extend == CAIRO_EXTEND_REPEAT || @@ -2220,8 +2220,8 @@ _cairo_pdf_surface_emit_linear_pattern (cairo_pdf_surface_t *surface, assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_multiply (&pat_to_pdf, &pat_to_pdf, &surface->cairo_to_pdf); - first_stop = _cairo_fixed_to_double (gradient->stops[0].x); - last_stop = _cairo_fixed_to_double (gradient->stops[gradient->n_stops - 1].x); + first_stop = gradient->stops[0].offset; + last_stop = gradient->stops[gradient->n_stops - 1].offset; if (pattern->base.base.extend == CAIRO_EXTEND_REPEAT || pattern->base.base.extend == CAIRO_EXTEND_REFLECT) { diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c index bfe8b19d5..b77104883 100644 --- a/src/cairo-ps-surface.c +++ b/src/cairo-ps-surface.c @@ -2467,7 +2467,7 @@ _cairo_ps_surface_emit_pattern_stops (cairo_ps_surface_t *surface, stops[i].color[1] = stop->color.green; stops[i].color[2] = stop->color.blue; stops[i].color[3] = stop->color.alpha; - stops[i].offset = _cairo_fixed_to_double (pattern->stops[i].x); + stops[i].offset = pattern->stops[i].offset; } if (pattern->base.extend == CAIRO_EXTEND_REPEAT || @@ -2586,8 +2586,8 @@ _cairo_ps_surface_emit_linear_pattern (cairo_ps_surface_t *surface, assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_multiply (&pat_to_ps, &pat_to_ps, &surface->cairo_to_ps); - first_stop = _cairo_fixed_to_double (gradient->stops[0].x); - last_stop = _cairo_fixed_to_double (gradient->stops[gradient->n_stops - 1].x); + first_stop = gradient->stops[0].offset; + last_stop = gradient->stops[gradient->n_stops - 1].offset; if (pattern->base.base.extend == CAIRO_EXTEND_REPEAT || pattern->base.base.extend == CAIRO_EXTEND_REFLECT) { diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c index 4c2e9b5b7..5296eb529 100644 --- a/src/cairo-quartz-surface.c +++ b/src/cairo-quartz-surface.c @@ -556,7 +556,7 @@ ComputeGradientValue (void *info, const float *in, float *out) } for (i = 0; i < grad->n_stops; i++) { - if (_cairo_fixed_to_double (grad->stops[i].x) > fdist) + if (grad->stops[i].offset > fdist) break; } @@ -568,8 +568,8 @@ ComputeGradientValue (void *info, const float *in, float *out) out[2] = grad->stops[i].color.blue; out[3] = grad->stops[i].color.alpha; } else { - float ax = _cairo_fixed_to_double(grad->stops[i-1].x); - float bx = _cairo_fixed_to_double(grad->stops[i].x) - ax; + float ax = grad->stops[i-1].offset; + float bx = grad->stops[i].offset - ax; float bp = (fdist - ax)/bx; float ap = 1.0 - bp; diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index a610b127a..1b7b3e8f4 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -1294,7 +1294,7 @@ _cairo_svg_surface_emit_pattern_stops (cairo_output_stream_t *output, "\n", - _cairo_fixed_to_double (pattern->stops[0].x), + pattern->stops[0].offset, pattern->stops[0].color.red * 100.0, pattern->stops[0].color.green * 100.0, pattern->stops[0].color.blue * 100.0, @@ -1311,22 +1311,20 @@ _cairo_svg_surface_emit_pattern_stops (cairo_output_stream_t *output, for (i = 0; i < pattern->n_stops; i++) { if (reverse_stops) { stops[i] = pattern->stops[pattern->n_stops - i - 1]; - stops[i].x = _cairo_fixed_from_double (1.0 - _cairo_fixed_to_double (stops[i].x)); + stops[i].offset = 1.0 - stops[i].offset; } else stops[i] = pattern->stops[i]; if (emulate_reflect) { - stops[i].x /= 2; + stops[i].offset /= 2; if (i > 0 && i < (pattern->n_stops - 1)) { if (reverse_stops) { stops[i + pattern->n_stops - 1] = pattern->stops[i]; - stops[i + pattern->n_stops - 1].x = - _cairo_fixed_from_double (0.5 + 0.5 - * _cairo_fixed_to_double (stops[i + pattern->n_stops - 1].x)); + stops[i + pattern->n_stops - 1].offset = + 0.5 + 0.5 * stops[i + pattern->n_stops - 1].offset; } else { stops[i + pattern->n_stops - 1] = pattern->stops[pattern->n_stops - i - 1]; - stops[i + pattern->n_stops - 1].x = - _cairo_fixed_from_double (1 - 0.5 - * _cairo_fixed_to_double (stops [i + pattern->n_stops - 1].x)); + stops[i + pattern->n_stops - 1].offset = + 1 - 0.5 * stops[i + pattern->n_stops - 1].offset; } } } @@ -1338,8 +1336,7 @@ _cairo_svg_surface_emit_pattern_stops (cairo_output_stream_t *output, if (start_offset >= 0.0) for (i = 0; i < n_stops; i++) { - offset = start_offset + (1 - start_offset ) * - _cairo_fixed_to_double (stops[i].x); + offset = start_offset + (1 - start_offset ) * stops[i].offset; _cairo_output_stream_printf (output, "= -start_offset) { + if (stops[i].offset >= -start_offset) { if (i > 0) { - if (stops[i].x != stops[i-1].x) { + if (stops[i].offset != stops[i-1].offset) { double x0, x1; cairo_color_t *color0, *color1; - x0 = _cairo_fixed_to_double (stops[i-1].x); - x1 = _cairo_fixed_to_double (stops[i].x); + x0 = stops[i-1].offset; + x1 = stops[i].offset; color0 = &stops[i-1].color; color1 = &stops[i].color; offset_color_start.red = color0->red + (color1->red - color0->red) @@ -1405,7 +1402,7 @@ _cairo_svg_surface_emit_pattern_stops (cairo_output_stream_t *output, "\n", - _cairo_fixed_to_double (stops[i].x) + start_offset, + stops[i].offset + start_offset, stops[i].color.red * 100.0, stops[i].color.green * 100.0, stops[i].color.blue * 100.0, @@ -1416,7 +1413,7 @@ _cairo_svg_surface_emit_pattern_stops (cairo_output_stream_t *output, "\n", - 1.0 + _cairo_fixed_to_double (stops[i].x) + start_offset, + 1.0 + stops[i].offset + start_offset, stops[i].color.red * 100.0, stops[i].color.green * 100.0, stops[i].color.blue * 100.0, diff --git a/src/cairo-win32-printing-surface.c b/src/cairo-win32-printing-surface.c index d83b732f1..cc3a17b5b 100644 --- a/src/cairo-win32-printing-surface.c +++ b/src/cairo-win32-printing-surface.c @@ -757,7 +757,7 @@ _cairo_win32_printing_surface_paint_linear_pattern (cairo_win32_surface_t *surfa } stop = i%num_rects + 1; - vert[i*2+1].x = (LONG)(d*(range_start + i/num_rects + _cairo_fixed_to_double (pattern->base.stops[stop].x))); + vert[i*2+1].x = (LONG)(d*(range_start + i/num_rects + pattern->base.stops[stop].offset)); vert[i*2+1].y = (LONG) clip.bottom; if (extend == CAIRO_EXTEND_REFLECT && (range_start+(i/num_rects))%2) stop = num_rects - stop; diff --git a/src/cairoint.h b/src/cairoint.h index ea47ed5fc..9fa4bde97 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -790,7 +790,7 @@ typedef struct _cairo_surface_pattern { } cairo_surface_pattern_t; typedef struct _cairo_gradient_stop { - cairo_fixed_t x; + double offset; cairo_color_t color; } cairo_gradient_stop_t; diff --git a/test/clip-operator-ref.png b/test/clip-operator-ref.png index fe113625e..4ea1842e2 100644 Binary files a/test/clip-operator-ref.png and b/test/clip-operator-ref.png differ diff --git a/test/operator-source-ref.png b/test/operator-source-ref.png index ccd9be3da..8e2f5e61f 100644 Binary files a/test/operator-source-ref.png and b/test/operator-source-ref.png differ