diff options
-rw-r--r-- | src/cairo-gl-composite.c | 20 | ||||
-rw-r--r-- | src/cairo-pattern.c | 211 | ||||
-rw-r--r-- | src/cairo-qt-surface.cpp | 38 | ||||
-rw-r--r-- | src/cairo-script-surface.c | 18 | ||||
-rw-r--r-- | src/cairo-skia-surface.cpp | 8 | ||||
-rw-r--r-- | src/cairo-svg-surface.c | 40 | ||||
-rw-r--r-- | src/cairo-types-private.h | 10 | ||||
-rw-r--r-- | src/cairo-vg-surface.c | 18 | ||||
-rw-r--r-- | src/cairo-win32-printing-surface.c | 8 | ||||
-rw-r--r-- | src/cairo-xml-surface.c | 14 | ||||
-rw-r--r-- | src/drm/cairo-drm-i915-shader.c | 28 | ||||
-rw-r--r-- | src/drm/cairo-drm-i965-shader.c | 28 |
12 files changed, 205 insertions, 236 deletions
diff --git a/src/cairo-gl-composite.c b/src/cairo-gl-composite.c index 5057fa63..dbd5306c 100644 --- a/src/cairo-gl-composite.c +++ b/src/cairo-gl-composite.c @@ -170,14 +170,14 @@ _cairo_gl_gradient_operand_init (cairo_gl_operand_t *operand, if (unlikely (status)) return status; - dx = _cairo_fixed_to_double (linear->p2.x - linear->p1.x); - dy = _cairo_fixed_to_double (linear->p2.y - linear->p1.y); + dx = linear->pd2.x - linear->pd1.x; + dy = linear->pd2.y - linear->pd1.y; sf = 1.0 / (dx * dx + dy * dy); dx *= sf; dy *= sf; - x0 = _cairo_fixed_to_double (linear->p1.x); - y0 = _cairo_fixed_to_double (linear->p1.y); + x0 = linear->pd1.x; + y0 = linear->pd1.y; offset = dx * x0 + dy * y0; if (_cairo_matrix_is_identity (&linear->base.base.matrix)) { @@ -203,12 +203,12 @@ _cairo_gl_gradient_operand_init (cairo_gl_operand_t *operand, cairo_radial_pattern_t *radial = (cairo_radial_pattern_t *) gradient; double x0, y0, r0, x1, y1, r1; - x0 = _cairo_fixed_to_double (radial->c1.x); - x1 = _cairo_fixed_to_double (radial->c2.x); - y0 = _cairo_fixed_to_double (radial->c1.y); - y1 = _cairo_fixed_to_double (radial->c2.y); - r0 = _cairo_fixed_to_double (radial->r1); - r1 = _cairo_fixed_to_double (radial->r2); + x0 = radial->cd1.center.x; + x1 = radial->cd2.center.x; + y0 = radial->cd1.center.y; + y1 = radial->cd2.center.y; + r0 = radial->cd1.radius; + r1 = radial->cd2.radius; status = _cairo_gl_create_gradient_texture (dst, gradient, diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c index 13bf99da..08e0708f 100644 --- a/src/cairo-pattern.c +++ b/src/cairo-pattern.c @@ -504,10 +504,10 @@ _cairo_pattern_init_linear (cairo_linear_pattern_t *pattern, { _cairo_pattern_init_gradient (&pattern->base, CAIRO_PATTERN_TYPE_LINEAR); - pattern->p1.x = _cairo_fixed_from_double (x0); - pattern->p1.y = _cairo_fixed_from_double (y0); - pattern->p2.x = _cairo_fixed_from_double (x1); - pattern->p2.y = _cairo_fixed_from_double (y1); + pattern->pd1.x = x0; + pattern->pd1.y = y0; + pattern->pd2.x = x1; + pattern->pd2.y = y1; } static void @@ -517,12 +517,12 @@ _cairo_pattern_init_radial (cairo_radial_pattern_t *pattern, { _cairo_pattern_init_gradient (&pattern->base, CAIRO_PATTERN_TYPE_RADIAL); - pattern->c1.x = _cairo_fixed_from_double (cx0); - pattern->c1.y = _cairo_fixed_from_double (cy0); - pattern->r1 = _cairo_fixed_from_double (fabs (radius0)); - pattern->c2.x = _cairo_fixed_from_double (cx1); - pattern->c2.y = _cairo_fixed_from_double (cy1); - pattern->r2 = _cairo_fixed_from_double (fabs (radius1)); + pattern->cd1.center.x = cx0; + pattern->cd1.center.y = cy0; + pattern->cd1.radius = fabs (radius0); + pattern->cd2.center.x = cx1; + pattern->cd2.center.y = cy1; + pattern->cd2.radius = fabs (radius1); } cairo_pattern_t * @@ -2075,10 +2075,8 @@ _cairo_linear_pattern_classify (cairo_linear_pattern_t *pattern, * pattern. We actually only need 3/4 corners, so we skip the * fourth. */ - point0.x = _cairo_fixed_to_double (pattern->p1.x); - point0.y = _cairo_fixed_to_double (pattern->p1.y); - point1.x = _cairo_fixed_to_double (pattern->p2.x); - point1.y = _cairo_fixed_to_double (pattern->p2.y); + point0 = pattern->pd1; + point1 = pattern->pd2; _cairo_matrix_get_affine (&pattern->base.base.matrix, &a, &b, &c, &d, &tx, &ty); @@ -2531,7 +2529,8 @@ _cairo_pattern_reset_solid_surface_cache (void) static cairo_bool_t _linear_pattern_is_degenerate (const cairo_linear_pattern_t *linear) { - return linear->p1.x == linear->p2.x && linear->p1.y == linear->p2.y; + return fabs (linear->pd1.x - linear->pd2.x) < DBL_EPSILON && + fabs (linear->pd1.y - linear->pd2.y) < DBL_EPSILON; } static cairo_bool_t @@ -2541,18 +2540,22 @@ _radial_pattern_is_degenerate (const cairo_radial_pattern_t *radial) * represented as a solid or clear pattern. This corresponds to * one of the two cases: * - * 1) The radii are both zero. + * 1) The radii are both very small: + * |dr| < DBL_EPSILON && min (r0, r1) < DBL_EPSILON * - * 2) The two circles have same radius and are at the same point. - * (Cylinder gradient that doesn't move with the parameter.) + * 2) The two circles have about the same radius and are very + * close to each other (approximately a cylinder gradient that + * doesn't move with the parameter): + * |dr| < DBL_EPSILON && max (|dx|, |dy|) < 2 * DBL_EPSILON * - * These checks are made in fixed point, so they're implicitly - * using an epsilon that is larger than the epsilons we're using - * in the floating point tests. + * These checks are consistent with the assumptions used in + * _cairo_radial_pattern_box_to_parameter (). */ - return radial->r1 == radial->r2 && - (radial->r1 == 0 /* && radial->r2 == 0 */ || - (radial->c1.x == radial->c2.x && radial->c1.y == radial->c2.y)); + + return fabs (radial->cd1.radius - radial->cd2.radius) < DBL_EPSILON && + (MIN (radial->cd1.radius, radial->cd2.radius) < DBL_EPSILON || + MAX (fabs (radial->cd1.center.x - radial->cd2.center.x), + fabs (radial->cd1.center.y - radial->cd2.center.y)) < 2 * DBL_EPSILON); } static void @@ -2581,10 +2584,10 @@ _cairo_linear_pattern_box_to_parameter (const cairo_linear_pattern_t *linear, * tdy is the difference between top and bottom corners */ - p1x = _cairo_fixed_to_double (linear->p1.x); - p1y = _cairo_fixed_to_double (linear->p1.y); - pdx = _cairo_fixed_to_double (linear->p2.x) - p1x; - pdy = _cairo_fixed_to_double (linear->p2.y) - p1y; + p1x = linear->pd1.x; + p1y = linear->pd1.y; + pdx = linear->pd2.x - p1x; + pdy = linear->pd2.y - p1y; invsqnorm = 1.0 / (pdx * pdx + pdy * pdy); pdx *= invsqnorm; pdy *= invsqnorm; @@ -2648,12 +2651,12 @@ _cairo_radial_pattern_box_to_parameter (const cairo_radial_pattern_t *radial, x_focus = y_focus = 0; /* silence gcc */ - cx = _cairo_fixed_to_double (radial->c1.x); - cy = _cairo_fixed_to_double (radial->c1.y); - cr = _cairo_fixed_to_double (radial->r1); - dx = _cairo_fixed_to_double (radial->c2.x) - cx; - dy = _cairo_fixed_to_double (radial->c2.y) - cy; - dr = _cairo_fixed_to_double (radial->r2) - cr; + cx = radial->cd1.center.x; + cy = radial->cd1.center.y; + cr = radial->cd1.radius; + dx = radial->cd2.center.x - cx; + dy = radial->cd2.center.y - cy; + dr = radial->cd2.radius - cr; /* translate by -(cx, cy) to simplify computations */ x0 -= cx; @@ -3018,18 +3021,18 @@ _cairo_gradient_pattern_interpolate (const cairo_gradient_pattern_t *gradient, assert (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR || gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL); -#define lerp(a,b) _cairo_fixed_to_double(a)*(1-t) + _cairo_fixed_to_double(b)*t +#define lerp(a,b) (a)*(1-t) + (b)*t if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; - out_circle->center.x = lerp(linear->p1.x, linear->p2.x); - out_circle->center.y = lerp(linear->p1.y, linear->p2.y); + out_circle->center.x = lerp (linear->pd1.x, linear->pd2.x); + out_circle->center.y = lerp (linear->pd1.y, linear->pd2.y); out_circle->radius = 0; } else { cairo_radial_pattern_t *radial = (cairo_radial_pattern_t *) gradient; - out_circle->center.x = lerp(radial->c1.x, radial->c2.x); - out_circle->center.y = lerp(radial->c1.y, radial->c2.y); - out_circle->radius = lerp(radial->r1, radial->r2); + out_circle->center.x = lerp (radial->cd1.center.x, radial->cd2.center.x); + out_circle->center.y = lerp (radial->cd1.center.y, radial->cd2.center.y); + out_circle->radius = lerp (radial->cd1.radius , radial->cd2.radius); } #undef lerp @@ -3061,44 +3064,32 @@ _cairo_gradient_pattern_fit_to_range (const cairo_gradient_pattern_t *gradient, if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; - out_circle[0].center.x = _cairo_fixed_to_double (linear->p1.x); - out_circle[0].center.y = _cairo_fixed_to_double (linear->p1.y); + out_circle[0].center = linear->pd1; out_circle[0].radius = 0; - out_circle[1].center.x = _cairo_fixed_to_double (linear->p2.x); - out_circle[1].center.y = _cairo_fixed_to_double (linear->p2.y); + out_circle[1].center = linear->pd2; out_circle[1].radius = 0; - dim = fabs (_cairo_fixed_to_double (linear->p1.x)); - dim = MAX (dim, fabs (_cairo_fixed_to_double (linear->p1.y))); - dim = MAX (dim, fabs (_cairo_fixed_to_double (linear->p2.x))); - dim = MAX (dim, fabs (_cairo_fixed_to_double (linear->p2.y))); - dim = MAX (dim, fabs (_cairo_fixed_to_double (linear->p1.x) - - _cairo_fixed_to_double (linear->p2.x))); - dim = MAX (dim, fabs (_cairo_fixed_to_double (linear->p1.y) - - _cairo_fixed_to_double (linear->p2.y))); + dim = fabs (linear->pd1.x); + dim = MAX (dim, fabs (linear->pd1.y)); + dim = MAX (dim, fabs (linear->pd2.x)); + dim = MAX (dim, fabs (linear->pd2.y)); + dim = MAX (dim, fabs (linear->pd1.x - linear->pd2.x)); + dim = MAX (dim, fabs (linear->pd1.y - linear->pd2.y)); } else { cairo_radial_pattern_t *radial = (cairo_radial_pattern_t *) gradient; - out_circle[0].center.x = _cairo_fixed_to_double (radial->c1.x); - out_circle[0].center.y = _cairo_fixed_to_double (radial->c1.y); - out_circle[0].radius = _cairo_fixed_to_double (radial->r1); - - out_circle[1].center.x = _cairo_fixed_to_double (radial->c2.x); - out_circle[1].center.y = _cairo_fixed_to_double (radial->c2.y); - out_circle[1].radius = _cairo_fixed_to_double (radial->r2); - - dim = fabs (_cairo_fixed_to_double (radial->c1.x)); - dim = MAX (dim, fabs (_cairo_fixed_to_double (radial->c1.y))); - dim = MAX (dim, fabs (_cairo_fixed_to_double (radial->r1))); - dim = MAX (dim, fabs (_cairo_fixed_to_double (radial->c2.x))); - dim = MAX (dim, fabs (_cairo_fixed_to_double (radial->c2.y))); - dim = MAX (dim, fabs (_cairo_fixed_to_double (radial->r2))); - dim = MAX (dim, fabs (_cairo_fixed_to_double (radial->c1.x) - - _cairo_fixed_to_double (radial->c2.x))); - dim = MAX (dim, fabs (_cairo_fixed_to_double (radial->c1.y) - - _cairo_fixed_to_double (radial->c2.y))); - dim = MAX (dim, fabs (_cairo_fixed_to_double (radial->r1) - - _cairo_fixed_to_double (radial->r2))); + out_circle[0] = radial->cd1; + out_circle[1] = radial->cd2; + + dim = fabs (radial->cd1.center.x); + dim = MAX (dim, fabs (radial->cd1.center.y)); + dim = MAX (dim, fabs (radial->cd1.radius)); + dim = MAX (dim, fabs (radial->cd2.center.x)); + dim = MAX (dim, fabs (radial->cd2.center.y)); + dim = MAX (dim, fabs (radial->cd2.radius)); + dim = MAX (dim, fabs (radial->cd1.center.x - radial->cd2.center.x)); + dim = MAX (dim, fabs (radial->cd1.center.y - radial->cd2.center.y)); + dim = MAX (dim, fabs (radial->cd1.radius - radial->cd2.radius)); } if (unlikely (dim > max_value)) { @@ -4243,13 +4234,13 @@ _cairo_pattern_get_extents (const cairo_pattern_t *pattern, if (pattern->extend != CAIRO_EXTEND_NONE) goto UNBOUNDED; - cx1 = _cairo_fixed_to_double (radial->c1.x); - cy1 = _cairo_fixed_to_double (radial->c1.y); - r1 = _cairo_fixed_to_double (radial->r1); + cx1 = radial->cd1.center.x; + cy1 = radial->cd1.center.y; + r1 = radial->cd1.radius; - cx2 = _cairo_fixed_to_double (radial->c2.x); - cy2 = _cairo_fixed_to_double (radial->c2.y); - r2 = _cairo_fixed_to_double (radial->r2); + cx2 = radial->cd2.center.x; + cy2 = radial->cd2.center.y; + r2 = radial->cd2.radius; x1 = MIN (cx1 - r1, cx2 - r2); y1 = MIN (cy1 - r1, cy2 - r2); @@ -4278,14 +4269,14 @@ _cairo_pattern_get_extents (const cairo_pattern_t *pattern, if (pattern->matrix.xy != 0. || pattern->matrix.yx != 0.) goto UNBOUNDED; - if (linear->p1.x == linear->p2.x) { + if (linear->pd1.x == linear->pd2.x) { x1 = -HUGE_VAL; x2 = HUGE_VAL; - y1 = _cairo_fixed_to_double (MIN (linear->p1.y, linear->p2.y)); - y2 = _cairo_fixed_to_double (MAX (linear->p1.y, linear->p2.y)); - } else if (linear->p1.y == linear->p2.y) { - x1 = _cairo_fixed_to_double (MIN (linear->p1.x, linear->p2.x)); - x2 = _cairo_fixed_to_double (MAX (linear->p1.x, linear->p2.x)); + y1 = MIN (linear->pd1.y, linear->pd2.y); + y2 = MAX (linear->pd1.y, linear->pd2.y); + } else if (linear->pd1.y == linear->pd2.y) { + x1 = MIN (linear->pd1.x, linear->pd2.x); + x2 = MAX (linear->pd1.x, linear->pd2.x); y1 = -HUGE_VAL; y2 = HUGE_VAL; } else { @@ -4402,8 +4393,8 @@ unsigned long _cairo_linear_pattern_hash (unsigned long hash, const cairo_linear_pattern_t *linear) { - hash = _cairo_hash_bytes (hash, &linear->p1, sizeof (linear->p1)); - hash = _cairo_hash_bytes (hash, &linear->p2, sizeof (linear->p2)); + hash = _cairo_hash_bytes (hash, &linear->pd1, sizeof (linear->pd1)); + hash = _cairo_hash_bytes (hash, &linear->pd2, sizeof (linear->pd2)); return _cairo_gradient_color_stops_hash (hash, &linear->base); } @@ -4412,10 +4403,10 @@ unsigned long _cairo_radial_pattern_hash (unsigned long hash, const cairo_radial_pattern_t *radial) { - hash = _cairo_hash_bytes (hash, &radial->c1, sizeof (radial->c1)); - hash = _cairo_hash_bytes (hash, &radial->r1, sizeof (radial->r1)); - hash = _cairo_hash_bytes (hash, &radial->c2, sizeof (radial->c2)); - hash = _cairo_hash_bytes (hash, &radial->r2, sizeof (radial->r2)); + hash = _cairo_hash_bytes (hash, &radial->cd1.center, sizeof (radial->cd1.center)); + hash = _cairo_hash_bytes (hash, &radial->cd1.radius, sizeof (radial->cd1.radius)); + hash = _cairo_hash_bytes (hash, &radial->cd2.center, sizeof (radial->cd2.center)); + hash = _cairo_hash_bytes (hash, &radial->cd2.radius, sizeof (radial->cd2.radius)); return _cairo_gradient_color_stops_hash (hash, &radial->base); } @@ -4548,16 +4539,16 @@ cairo_bool_t _cairo_linear_pattern_equal (const cairo_linear_pattern_t *a, const cairo_linear_pattern_t *b) { - if (a->p1.x != b->p1.x) + if (a->pd1.x != b->pd1.x) return FALSE; - if (a->p1.y != b->p1.y) + if (a->pd1.y != b->pd1.y) return FALSE; - if (a->p2.x != b->p2.x) + if (a->pd2.x != b->pd2.x) return FALSE; - if (a->p2.y != b->p2.y) + if (a->pd2.y != b->pd2.y) return FALSE; return _cairo_gradient_color_stops_equal (&a->base, &b->base); @@ -4567,22 +4558,22 @@ cairo_bool_t _cairo_radial_pattern_equal (const cairo_radial_pattern_t *a, const cairo_radial_pattern_t *b) { - if (a->c1.x != b->c1.x) + if (a->cd1.center.x != b->cd1.center.x) return FALSE; - if (a->c1.y != b->c1.y) + if (a->cd1.center.y != b->cd1.center.y) return FALSE; - if (a->r1 != b->r1) + if (a->cd1.radius != b->cd1.radius) return FALSE; - if (a->c2.x != b->c2.x) + if (a->cd2.center.x != b->cd2.center.x) return FALSE; - if (a->c2.y != b->c2.y) + if (a->cd2.center.y != b->cd2.center.y) return FALSE; - if (a->r2 != b->r2) + if (a->cd2.radius != b->cd2.radius) return FALSE; return _cairo_gradient_color_stops_equal (&a->base, &b->base); @@ -4859,13 +4850,13 @@ cairo_pattern_get_linear_points (cairo_pattern_t *pattern, return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); if (x0) - *x0 = _cairo_fixed_to_double (linear->p1.x); + *x0 = linear->pd1.x; if (y0) - *y0 = _cairo_fixed_to_double (linear->p1.y); + *y0 = linear->pd1.y; if (x1) - *x1 = _cairo_fixed_to_double (linear->p2.x); + *x1 = linear->pd2.x; if (y1) - *y1 = _cairo_fixed_to_double (linear->p2.y); + *y1 = linear->pd2.y; return CAIRO_STATUS_SUCCESS; } @@ -4903,17 +4894,17 @@ cairo_pattern_get_radial_circles (cairo_pattern_t *pattern, return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); if (x0) - *x0 = _cairo_fixed_to_double (radial->c1.x); + *x0 = radial->cd1.center.x; if (y0) - *y0 = _cairo_fixed_to_double (radial->c1.y); + *y0 = radial->cd1.center.y; if (r0) - *r0 = _cairo_fixed_to_double (radial->r1); + *r0 = radial->cd1.radius; if (x1) - *x1 = _cairo_fixed_to_double (radial->c2.x); + *x1 = radial->cd2.center.x; if (y1) - *y1 = _cairo_fixed_to_double (radial->c2.y); + *y1 = radial->cd2.center.y; if (r1) - *r1 = _cairo_fixed_to_double (radial->r2); + *r1 = radial->cd2.radius; return CAIRO_STATUS_SUCCESS; } diff --git a/src/cairo-qt-surface.cpp b/src/cairo-qt-surface.cpp index 7e528a30..25ee9e9f 100644 --- a/src/cairo-qt-surface.cpp +++ b/src/cairo-qt-surface.cpp @@ -870,40 +870,34 @@ struct PatternToBrushConverter { if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR) { cairo_linear_pattern_t *lpat = (cairo_linear_pattern_t *) pattern; - grad = new QLinearGradient (_cairo_fixed_to_double (lpat->p1.x), - _cairo_fixed_to_double (lpat->p1.y), - _cairo_fixed_to_double (lpat->p2.x), - _cairo_fixed_to_double (lpat->p2.y)); + grad = new QLinearGradient (lpat->pd1.x, lpat->pd1.y, + lpat->pd2.x, lpat->pd2.y); } else if (pattern->type == CAIRO_PATTERN_TYPE_RADIAL) { cairo_radial_pattern_t *rpat = (cairo_radial_pattern_t *) pattern; /* Based on the SVG surface code */ - cairo_point_t *c0, *c1; - cairo_fixed_t radius0, radius1; + cairo_circle_double_t *c0, *c1; + double x0, y0, r0, x1, y1, r1; - if (rpat->r1 < rpat->r2) { - c0 = &rpat->c1; - c1 = &rpat->c2; - radius0 = rpat->r1; - radius1 = rpat->r2; + if (rpat->cd1.radius < rpat->cd2.radius) { + c0 = &rpat->cd1; + c1 = &rpat->cd2; reverse_stops = FALSE; } else { - c0 = &rpat->c2; - c1 = &rpat->c1; - radius0 = rpat->r2; - radius1 = rpat->r1; + c0 = &rpat->cd2; + c1 = &rpat->cd1; reverse_stops = TRUE; } - double x0 = _cairo_fixed_to_double (c0->x); - double y0 = _cairo_fixed_to_double (c0->y); - double r0 = _cairo_fixed_to_double (radius0); - double x1 = _cairo_fixed_to_double (c1->x); - double y1 = _cairo_fixed_to_double (c1->y); - double r1 = _cairo_fixed_to_double (radius1); + x0 = c0->center.x; + y0 = c0->center.y; + r0 = c0->radius; + x1 = c1->center.x; + y1 = c1->center.y; + r1 = c1->radius; - if (rpat->r1 == rpat->r2) { + if (r0 == r1) { grad = new QRadialGradient (x1, y1, r1, x1, y1); } else { double fx = (r1 * x0 - r0 * x1) / (r1 - r0); diff --git a/src/cairo-script-surface.c b/src/cairo-script-surface.c index 9e12e575..5200b3ab 100644 --- a/src/cairo-script-surface.c +++ b/src/cairo-script-surface.c @@ -929,10 +929,8 @@ _emit_linear_pattern (cairo_script_surface_t *surface, _cairo_output_stream_printf (ctx->stream, "%f %f %f %f linear", - _cairo_fixed_to_double (linear->p1.x), - _cairo_fixed_to_double (linear->p1.y), - _cairo_fixed_to_double (linear->p2.x), - _cairo_fixed_to_double (linear->p2.y)); + linear->pd1.x, linear->pd1.y, + linear->pd2.x, linear->pd2.y); return _emit_gradient_color_stops (&linear->base, ctx->stream); } @@ -947,12 +945,12 @@ _emit_radial_pattern (cairo_script_surface_t *surface, _cairo_output_stream_printf (ctx->stream, "%f %f %f %f %f %f radial", - _cairo_fixed_to_double (radial->c1.x), - _cairo_fixed_to_double (radial->c1.y), - _cairo_fixed_to_double (radial->r1), - _cairo_fixed_to_double (radial->c2.x), - _cairo_fixed_to_double (radial->c2.y), - _cairo_fixed_to_double (radial->r2)); + radial->cd1.center.x, + radial->cd1.center.y, + radial->cd1.radius, + radial->cd2.center.x, + radial->cd2.center.y, + radial->cd2.radius); return _emit_gradient_color_stops (&radial->base, ctx->stream); } diff --git a/src/cairo-skia-surface.cpp b/src/cairo-skia-surface.cpp index e29f0220..537c1bc8 100644 --- a/src/cairo-skia-surface.cpp +++ b/src/cairo-skia-surface.cpp @@ -356,10 +356,10 @@ pattern_to_sk_shader (cairo_skia_surface_t *dst, const cairo_pattern_t *pattern, cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; SkPoint points[2]; - points[0].set (CAIRO_FIXED_TO_SK_SCALAR (linear->p1.x), - CAIRO_FIXED_TO_SK_SCALAR (linear->p1.y)); - points[1].set (CAIRO_FIXED_TO_SK_SCALAR (linear->p2.x), - CAIRO_FIXED_TO_SK_SCALAR (linear->p2.y)); + points[0].set (SkFloatToScalar (linear->pd1.x), + SkFloatToScalar (linear->pd1.y)); + points[1].set (SkFloatToScalar (linear->pd2.x), + SkFloatToScalar (linear->pd2.y)); shader = SkGradientShader::CreateLinear (points, colors, pos, gradient->n_stops, extend_to_sk (pattern->extend)); } else { diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index 89e13d0e..bb5bccff 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -1784,7 +1784,6 @@ _cairo_svg_surface_emit_linear_pattern (cairo_svg_surface_t *surface, const cairo_matrix_t *parent_matrix) { cairo_svg_document_t *document = surface->document; - double x0, y0, x1, y1; cairo_matrix_t p2u; cairo_status_t status; @@ -1793,17 +1792,13 @@ _cairo_svg_surface_emit_linear_pattern (cairo_svg_surface_t *surface, /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); - x0 = _cairo_fixed_to_double (pattern->p1.x); - y0 = _cairo_fixed_to_double (pattern->p1.y); - x1 = _cairo_fixed_to_double (pattern->p2.x); - y1 = _cairo_fixed_to_double (pattern->p2.y); - _cairo_output_stream_printf (document->xml_node_defs, "<linearGradient id=\"linear%d\" " "gradientUnits=\"userSpaceOnUse\" " "x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" ", document->linear_pattern_id, - x0, y0, x1, y1); + pattern->pd1.x, pattern->pd1.y, + pattern->pd2.x, pattern->pd2.y); _cairo_svg_surface_emit_pattern_extend (document->xml_node_defs, &pattern->base.base), _cairo_svg_surface_emit_transform (document->xml_node_defs, "gradientTransform", &p2u, parent_matrix); @@ -1842,38 +1837,33 @@ _cairo_svg_surface_emit_radial_pattern (cairo_svg_surface_t *surface, double fx, fy; cairo_bool_t reverse_stops; cairo_status_t status; - cairo_point_t *c0, *c1; - cairo_fixed_t radius0, radius1; + cairo_circle_double_t *c0, *c1; extend = pattern->base.base.extend; - if (pattern->r1 < pattern->r2) { - c0 = &pattern->c1; - c1 = &pattern->c2; - radius0 = pattern->r1; - radius1 = pattern->r2; + if (pattern->cd1.radius < pattern->cd2.radius) { + c0 = &pattern->cd1; + c1 = &pattern->cd2; reverse_stops = FALSE; } else { - c0 = &pattern->c2; - c1 = &pattern->c1; - radius0 = pattern->r2; - radius1 = pattern->r1; + c0 = &pattern->cd2; + c1 = &pattern->cd1; reverse_stops = TRUE; } - x0 = _cairo_fixed_to_double (c0->x); - y0 = _cairo_fixed_to_double (c0->y); - r0 = _cairo_fixed_to_double (radius0); - x1 = _cairo_fixed_to_double (c1->x); - y1 = _cairo_fixed_to_double (c1->y); - r1 = _cairo_fixed_to_double (radius1); + x0 = c0->center.x; + y0 = c0->center.y; + r0 = c0->radius; + x1 = c1->center.x; + y1 = c1->center.y; + r1 = c1->radius; p2u = pattern->base.base.matrix; status = cairo_matrix_invert (&p2u); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); - if (pattern->r1 == pattern->r2) { + if (r0 == r1) { unsigned int n_stops = pattern->base.n_stops; _cairo_output_stream_printf (document->xml_node_defs, diff --git a/src/cairo-types-private.h b/src/cairo-types-private.h index a09b410b..967781c1 100644 --- a/src/cairo-types-private.h +++ b/src/cairo-types-private.h @@ -422,17 +422,15 @@ typedef struct _cairo_gradient_pattern { typedef struct _cairo_linear_pattern { cairo_gradient_pattern_t base; - cairo_point_t p1; - cairo_point_t p2; + cairo_point_double_t pd1; + cairo_point_double_t pd2; } cairo_linear_pattern_t; typedef struct _cairo_radial_pattern { cairo_gradient_pattern_t base; - cairo_point_t c1; - cairo_fixed_t r1; - cairo_point_t c2; - cairo_fixed_t r2; + cairo_circle_double_t cd1; + cairo_circle_double_t cd2; } cairo_radial_pattern_t; typedef union { diff --git a/src/cairo-vg-surface.c b/src/cairo-vg-surface.c index 39059f68..0034d73b 100644 --- a/src/cairo-vg-surface.c +++ b/src/cairo-vg-surface.c @@ -772,10 +772,10 @@ _vg_setup_linear_source (cairo_vg_context_t *context, { VGfloat linear[4]; - linear[0] = _cairo_fixed_to_double (lpat->p1.x); - linear[1] = _cairo_fixed_to_double (lpat->p1.y); - linear[2] = _cairo_fixed_to_double (lpat->p2.x); - linear[3] = _cairo_fixed_to_double (lpat->p2.y); + linear[0] = lpat->pd1.x; + linear[1] = lpat->pd1.y; + linear[2] = lpat->pd2.x; + linear[3] = lpat->pd2.y; vgSetParameteri (context->paint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, @@ -799,11 +799,11 @@ _vg_setup_radial_source (cairo_vg_context_t *context, { VGfloat radial[5]; - radial[0] = _cairo_fixed_to_double (rpat->c1.x); - radial[1] = _cairo_fixed_to_double (rpat->c1.y); - radial[2] = _cairo_fixed_to_double (rpat->c2.x); - radial[3] = _cairo_fixed_to_double (rpat->c2.y); - radial[4] = _cairo_fixed_to_double (rpat->r2); + radial[0] = rpat->cd1.center.x; + radial[1] = rpat->cd1.center.y; + radial[2] = rpat->cd2.center.x; + radial[3] = rpat->cd2.center.y; + radial[4] = rpat->cd2.radius; vgSetParameteri (context->paint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_PAD); diff --git a/src/cairo-win32-printing-surface.c b/src/cairo-win32-printing-surface.c index dabeece7..af6f164e 100644 --- a/src/cairo-win32-printing-surface.c +++ b/src/cairo-win32-printing-surface.c @@ -824,10 +824,10 @@ _cairo_win32_printing_surface_paint_linear_pattern (cairo_win32_surface_t *surfa cairo_matrix_multiply (&mat, &surface->ctm, &mat); - p1x = _cairo_fixed_to_double (pattern->p1.x); - p1y = _cairo_fixed_to_double (pattern->p1.y); - p2x = _cairo_fixed_to_double (pattern->p2.x); - p2y = _cairo_fixed_to_double (pattern->p2.y); + p1x = pattern->pd1.x; + p1y = pattern->pd1.y; + p2x = pattern->pd2.x; + p2y = pattern->pd2.y; cairo_matrix_translate (&mat, p1x, p1y); xd = p2x - p1x; diff --git a/src/cairo-xml-surface.c b/src/cairo-xml-surface.c index 0f258520..83d4f912 100644 --- a/src/cairo-xml-surface.c +++ b/src/cairo-xml-surface.c @@ -554,10 +554,8 @@ _cairo_xml_emit_linear (cairo_xml_t *xml, { _cairo_xml_printf (xml, "<linear x1='%f' y1='%f' x2='%f' y2='%f'>", - _cairo_fixed_to_double (linear->p1.x), - _cairo_fixed_to_double (linear->p1.y), - _cairo_fixed_to_double (linear->p2.x), - _cairo_fixed_to_double (linear->p2.y)); + linear->pd1.x, linear->pd1.y, + linear->pd2.x, linear->pd2.y); _cairo_xml_indent (xml, 2); _cairo_xml_emit_gradient (xml, &linear->base); _cairo_xml_indent (xml, -2); @@ -571,12 +569,8 @@ _cairo_xml_emit_radial (cairo_xml_t *xml, { _cairo_xml_printf (xml, "<radial x1='%f' y1='%f' r1='%f' x2='%f' y2='%f' r2='%f'>", - _cairo_fixed_to_double (radial->c1.x), - _cairo_fixed_to_double (radial->c1.y), - _cairo_fixed_to_double (radial->r1), - _cairo_fixed_to_double (radial->c2.x), - _cairo_fixed_to_double (radial->c2.y), - _cairo_fixed_to_double (radial->r2)); + radial->cd1.center.x, radial->cd1.center.y, radial->cd1.radius, + radial->cd2.center.x, radial->cd2.center.y, radial->cd2.radius); _cairo_xml_indent (xml, 2); _cairo_xml_emit_gradient (xml, &radial->base); _cairo_xml_indent (xml, -2); diff --git a/src/drm/cairo-drm-i915-shader.c b/src/drm/cairo-drm-i915-shader.c index 483f1874..84e501fc 100644 --- a/src/drm/cairo-drm-i915-shader.c +++ b/src/drm/cairo-drm-i915-shader.c @@ -332,16 +332,18 @@ i915_shader_radial_init (struct i915_shader_radial *r, { double dx, dy, dr, r1; - dx = _cairo_fixed_to_double (radial->c2.x - radial->c1.x); - dy = _cairo_fixed_to_double (radial->c2.y - radial->c1.y); - dr = _cairo_fixed_to_double (radial->r2 - radial->r1); + dx = radial->cd2.center.x - radial->cd1.center.x; + dy = radial->cd2.center.y - radial->cd1.center.y; + dr = radial->cd2.radius - radial->cd1.radius; - r1 = _cairo_fixed_to_double (radial->r1); + r1 = radial->cd1.radius; - if (radial->c2.x == radial->c1.x && radial->c2.y == radial->c1.y) { + if (radial->cd2.center.x == radial->cd1.center.x && + radial->cd2.center.y == radial->cd1.center.y) + { /* XXX dr == 0, meaningless with anything other than PAD */ - r->constants[0] = _cairo_fixed_to_double (radial->c1.x) / dr; - r->constants[1] = _cairo_fixed_to_double (radial->c1.y) / dr; + r->constants[0] = radial->cd1.center.x / dr; + r->constants[1] = radial->cd1.center.y / dr; r->constants[2] = 1. / dr; r->constants[3] = -r1 / dr; @@ -352,8 +354,8 @@ i915_shader_radial_init (struct i915_shader_radial *r, r->base.mode = RADIAL_ONE; } else { - r->constants[0] = -_cairo_fixed_to_double (radial->c1.x); - r->constants[1] = -_cairo_fixed_to_double (radial->c1.y); + r->constants[0] = -radial->cd1.center.x; + r->constants[1] = -radial->cd1.center.y; r->constants[2] = r1; r->constants[3] = -4 * (dx*dx + dy*dy - dr*dr); @@ -1028,8 +1030,8 @@ i915_shader_linear_init (struct i915_shader_linear *l, double x0, y0, sf; double dx, dy, offset; - dx = _cairo_fixed_to_double (linear->p2.x - linear->p1.x); - dy = _cairo_fixed_to_double (linear->p2.y - linear->p1.y); + dx = linear->pd2.x - linear->pd1.x; + dy = linear->pd2.y - linear->pd1.y; sf = dx * dx + dy * dy; if (sf <= 1e-5) return FALSE; @@ -1037,8 +1039,8 @@ i915_shader_linear_init (struct i915_shader_linear *l, dx /= sf; dy /= sf; - x0 = _cairo_fixed_to_double (linear->p1.x); - y0 = _cairo_fixed_to_double (linear->p1.y); + x0 = linear->pd1.x; + y0 = linear->pd1.y; offset = dx*x0 + dy*y0; if (_cairo_matrix_is_identity (&linear->base.base.matrix)) { diff --git a/src/drm/cairo-drm-i965-shader.c b/src/drm/cairo-drm-i965-shader.c index 5a5c966e..03d7d443 100644 --- a/src/drm/cairo-drm-i965-shader.c +++ b/src/drm/cairo-drm-i965-shader.c @@ -161,14 +161,14 @@ i965_shader_acquire_linear (i965_shader_t *shader, src->base.filter = i965_filter (CAIRO_FILTER_BILINEAR); src->base.extend = i965_extend (linear->base.base.extend); - dx = _cairo_fixed_to_double (linear->p2.x - linear->p1.x); - dy = _cairo_fixed_to_double (linear->p2.y - linear->p1.y); + dx = linear->pd2.x - linear->pd1.x; + dy = linear->pd2.y - linear->pd1.y; sf = 1. / (dx * dx + dy * dy); dx *= sf; dy *= sf; - x0 = _cairo_fixed_to_double (linear->p1.x); - y0 = _cairo_fixed_to_double (linear->p1.y); + x0 = linear->pd1.x; + y0 = linear->pd1.y; offset = dx*x0 + dy*y0; if (_cairo_matrix_is_identity (&linear->base.base.matrix)) { @@ -215,24 +215,26 @@ i965_shader_acquire_radial (i965_shader_t *shader, src->base.filter = i965_filter (CAIRO_FILTER_BILINEAR); src->base.extend = i965_extend (radial->base.base.extend); - dx = _cairo_fixed_to_double (radial->c2.x - radial->c1.x); - dy = _cairo_fixed_to_double (radial->c2.y - radial->c1.y); - dr = _cairo_fixed_to_double (radial->r2 - radial->r1); + dx = radial->cd2.center.x - radial->cd1.center.x; + dy = radial->cd2.center.y - radial->cd1.center.y; + dr = radial->cd2.radius - radial->cd1.radius; - r1 = _cairo_fixed_to_double (radial->r1); + r1 = radial->cd1.radius; - if (FALSE && radial->c2.x == radial->c1.x && radial->c2.y == radial->c1.y) { + if (FALSE && (radial->cd2.center.x == radial->cd1.center.x && + radial->cd2.center.y == radial->cd1.center.y)) + { /* XXX dr == 0, meaningless with anything other than PAD */ - src->base.constants[0] = _cairo_fixed_to_double (radial->c1.x) / dr; - src->base.constants[1] = _cairo_fixed_to_double (radial->c1.y) / dr; + src->base.constants[0] = radial->cd1.center.x / dr; + src->base.constants[1] = radial->cd1.center.y / dr; src->base.constants[2] = 1. / dr; src->base.constants[3] = -r1 / dr; src->base.constants_size = 4; src->base.mode = RADIAL_ONE; } else { - src->base.constants[0] = -_cairo_fixed_to_double (radial->c1.x); - src->base.constants[1] = -_cairo_fixed_to_double (radial->c1.y); + src->base.constants[0] = -radial->cd1.center.x; + src->base.constants[1] = -radial->cd1.center.y; src->base.constants[2] = r1; src->base.constants[3] = -4 * (dx*dx + dy*dy - dr*dr); |