summaryrefslogtreecommitdiff
path: root/src/drm
diff options
context:
space:
mode:
authorAndrea Canciani <ranma42@gmail.com>2010-12-17 11:04:53 +0100
committerAndrea Canciani <ranma42@gmail.com>2011-01-02 18:33:14 +0100
commit200e147322a7a17dec91ad5f678a07fdfaf38de2 (patch)
tree1e55e96980b3f21ac8113177a255ae4df2482938 /src/drm
parent6472864b2c424c0dfe4ff4e76eff8dfb896e60e8 (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.c28
-rw-r--r--src/drm/cairo-drm-i965-shader.c28
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 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);