diff options
author | Andrea Canciani <ranma42@gmail.com> | 2010-12-17 11:04:53 +0100 |
---|---|---|
committer | Andrea Canciani <ranma42@gmail.com> | 2011-01-02 18:33:14 +0100 |
commit | 200e147322a7a17dec91ad5f678a07fdfaf38de2 (patch) | |
tree | 1e55e96980b3f21ac8113177a255ae4df2482938 /src/drm | |
parent | 6472864b2c424c0dfe4ff4e76eff8dfb896e60e8 (diff) |
pattern: Use double precision for gradient extreme objects
Using double precision for gradient extreme objects ensures that they
are preserved as specified when constructing the gradient pattern.
Fixes huge-linear, huge-radial.
Fixes part of https://bugs.freedesktop.org/show_bug.cgi?id=32215
Diffstat (limited to 'src/drm')
-rw-r--r-- | src/drm/cairo-drm-i915-shader.c | 28 | ||||
-rw-r--r-- | src/drm/cairo-drm-i965-shader.c | 28 |
2 files changed, 30 insertions, 26 deletions
diff --git a/src/drm/cairo-drm-i915-shader.c b/src/drm/cairo-drm-i915-shader.c index 483f1874f..84e501fc9 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 5a5c966e9..03d7d443f 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); |