From 75972167a277687b1434c52e791ffe9c18fa2a7a Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Wed, 26 Mar 2008 11:31:04 -0700 Subject: [PATCH] Use floating-point offsets for color stops Previously we were using the cairo_fixed_t type which meant we've historically only been using 16 bits of precision for these offsets, and recently only 8 bits. Meanwhile, all manipulatons of offsets have been in floating-point anyway, so we might as well store them that way. This change also prevents a rendering regression introduced with the 24.8->16.16 change betwen snapshots 1.5.10 and 1.5.12 . This change affected gradient-rendering details for the clip-operator and operator-source tests, so the corresponding reference images are updated here. --- src/cairo-glitz-surface.c | 2 +- src/cairo-pattern.c | 10 ++++------ src/cairo-pdf-surface.c | 6 +++--- src/cairo-ps-surface.c | 6 +++--- src/cairo-quartz-surface.c | 6 +++--- src/cairo-svg-surface.c | 31 +++++++++++++---------------- src/cairo-win32-printing-surface.c | 2 +- src/cairoint.h | 2 +- test/clip-operator-ref.png | Bin 8263 -> 8271 bytes test/operator-source-ref.png | Bin 4422 -> 4420 bytes 10 files changed, 30 insertions(+), 35 deletions(-) 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 fe113625e6cc7226adcb44b12f2937d19ebbded4..4ea1842e2a66214dcaf96aa5e15fbefabc87ea34 100644 GIT binary patch literal 8271 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⁡Tn;7xb9ay(&z6S4(V@b8jD-JYS-eraM> z1Ju6FtZz-FH10Uy*;LU8`{k24~UpbN#DK{y(9rf?c{d)a$G=b!i_n- zzEGuCfEzRNpd`TTop+g3Ofy2UjO+l|;@F+=qdM=s^W1LrwFO3aYEh^wvHY=yPfxtEijxZ) iUH^|Y3ZmJ&!__O@jUkY=9K-$(fTO9Zr&6h89sXaF6d_jt literal 8263 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 diff --git a/test/operator-source-ref.png b/test/operator-source-ref.png index ccd9be3dabcac75407101e99a1003ed7af2c6823..8e2f5e61f90f1751e8b6f455fa6f4bf9531a4cb1 100644 GIT binary patch delta 4400 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