summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cairo-gl-composite.c20
-rw-r--r--src/cairo-pattern.c211
-rw-r--r--src/cairo-qt-surface.cpp38
-rw-r--r--src/cairo-script-surface.c18
-rw-r--r--src/cairo-skia-surface.cpp8
-rw-r--r--src/cairo-svg-surface.c40
-rw-r--r--src/cairo-types-private.h10
-rw-r--r--src/cairo-vg-surface.c18
-rw-r--r--src/cairo-win32-printing-surface.c8
-rw-r--r--src/cairo-xml-surface.c14
-rw-r--r--src/drm/cairo-drm-i915-shader.c28
-rw-r--r--src/drm/cairo-drm-i965-shader.c28
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);