aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/cairo/files/0001-Rely-less-on-DP-FPU-for-common-matrix-test-funcs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/cairo/files/0001-Rely-less-on-DP-FPU-for-common-matrix-test-funcs.patch')
-rw-r--r--recipes/cairo/files/0001-Rely-less-on-DP-FPU-for-common-matrix-test-funcs.patch86
1 files changed, 86 insertions, 0 deletions
diff --git a/recipes/cairo/files/0001-Rely-less-on-DP-FPU-for-common-matrix-test-funcs.patch b/recipes/cairo/files/0001-Rely-less-on-DP-FPU-for-common-matrix-test-funcs.patch
new file mode 100644
index 0000000000..c82b3d9373
--- /dev/null
+++ b/recipes/cairo/files/0001-Rely-less-on-DP-FPU-for-common-matrix-test-funcs.patch
@@ -0,0 +1,86 @@
+From 940c62bd51d498d5cdc7d8b1b8aecd750d1094ef Mon Sep 17 00:00:00 2001
+From: Jonathan Morton <jonathan.morton@movial.com>
+Date: Wed, 2 Jun 2010 13:58:31 +0300
+Subject: [PATCH] Rely less on DP FPU for common matrix funcs.
+
+---
+ src/cairo-matrix.c | 20 ++++++++++----------
+ 1 files changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/src/cairo-matrix.c b/src/cairo-matrix.c
+index de1c6ed..7519852 100644
+--- a/src/cairo-matrix.c
++++ b/src/cairo-matrix.c
+@@ -43,6 +43,13 @@
+ #define ISFINITE(x) ((x) * (x) >= 0.) /* check for NaNs */
+ #endif
+
++static const cairo_matrix_t
++_cairo_matrix_identity = {
++ .xx = 1, .xy = 0,
++ .yx = 0, .yy = 1,
++ .x0 = 0, .y0 = 0
++};
++
+ static void
+ _cairo_matrix_scalar_multiply (cairo_matrix_t *matrix, double scalar);
+
+@@ -58,10 +65,8 @@ _cairo_matrix_compute_adjoint (cairo_matrix_t *matrix);
+ void
+ cairo_matrix_init_identity (cairo_matrix_t *matrix)
+ {
+- cairo_matrix_init (matrix,
+- 1, 0,
+- 0, 1,
+- 0, 0);
++ matrix->xx = matrix->yy = 1;
++ matrix->xy = matrix->yx = matrix->x0 = matrix->y0 = 0;
+ }
+ slim_hidden_def(cairo_matrix_init_identity);
+
+@@ -86,7 +91,6 @@ slim_hidden_def(cairo_matrix_init_identity);
+ void
+ cairo_matrix_init (cairo_matrix_t *matrix,
+ double xx, double yx,
+-
+ double xy, double yy,
+ double x0, double y0)
+ {
+@@ -650,19 +654,32 @@ _cairo_matrix_compute_basis_scale_factors (const cairo_matrix_t *matrix,
+ return CAIRO_STATUS_SUCCESS;
+ }
+
++static inline cairo_bool_t
++_cairo_compare_matrix (const cairo_matrix_t *a, const cairo_matrix_t *b, const int n)
++{
++ uint64_t *ia = (uint64_t*) a;
++ uint64_t *ib = (uint64_t*) b;
++ uint64_t x = 0;
++ int i;
++
++ assert(sizeof(double) == sizeof(uint64_t));
++
++ for(i=0; i < n; i++)
++ x |= ia[i] ^ ib[i];
++
++ return !x;
++}
++
+ cairo_bool_t
+ _cairo_matrix_is_identity (const cairo_matrix_t *matrix)
+ {
+- return (matrix->xx == 1.0 && matrix->yx == 0.0 &&
+- matrix->xy == 0.0 && matrix->yy == 1.0 &&
+- matrix->x0 == 0.0 && matrix->y0 == 0.0);
++ return _cairo_compare_matrix(matrix, &_cairo_matrix_identity, 6);
+ }
+
+ cairo_bool_t
+ _cairo_matrix_is_translation (const cairo_matrix_t *matrix)
+ {
+- return (matrix->xx == 1.0 && matrix->yx == 0.0 &&
+- matrix->xy == 0.0 && matrix->yy == 1.0);
++ return _cairo_compare_matrix(matrix, &_cairo_matrix_identity, 4);
+ }
+
+ cairo_bool_t