Add qemu 2.4.0
[kvmfornfv.git] / qemu / pixman / test / scaling-helpers-test.c
diff --git a/qemu/pixman/test/scaling-helpers-test.c b/qemu/pixman/test/scaling-helpers-test.c
new file mode 100644 (file)
index 0000000..cd5ace0
--- /dev/null
@@ -0,0 +1,92 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include "utils.h"
+#include "pixman-inlines.h"
+
+/* A trivial reference implementation for
+ * 'bilinear_pad_repeat_get_scanline_bounds'
+ */
+static void
+bilinear_pad_repeat_get_scanline_bounds_ref (int32_t        source_image_width,
+                                            pixman_fixed_t vx_,
+                                            pixman_fixed_t unit_x,
+                                            int32_t *      left_pad,
+                                            int32_t *      left_tz,
+                                            int32_t *      width,
+                                            int32_t *      right_tz,
+                                            int32_t *      right_pad)
+{
+    int w = *width;
+    int64_t vx = vx_;
+    *left_pad = 0;
+    *left_tz = 0;
+    *width = 0;
+    *right_tz = 0;
+    *right_pad = 0;
+    while (--w >= 0)
+    {
+       if (vx < 0)
+       {
+           if (vx + pixman_fixed_1 < 0)
+               *left_pad += 1;
+           else
+               *left_tz += 1;
+       }
+       else if (vx + pixman_fixed_1 >= pixman_int_to_fixed (source_image_width))
+       {
+           if (vx >= pixman_int_to_fixed (source_image_width))
+               *right_pad += 1;
+           else
+               *right_tz += 1;
+       }
+       else
+       {
+           *width += 1;
+       }
+       vx += unit_x;
+    }
+}
+
+int
+main (void)
+{
+    int i;
+    prng_srand (0);
+    for (i = 0; i < 10000; i++)
+    {
+       int32_t left_pad1, left_tz1, width1, right_tz1, right_pad1;
+       int32_t left_pad2, left_tz2, width2, right_tz2, right_pad2;
+       pixman_fixed_t vx = prng_rand_n(10000 << 16) - (3000 << 16);
+       int32_t width = prng_rand_n(10000);
+       int32_t source_image_width = prng_rand_n(10000) + 1;
+       pixman_fixed_t unit_x = prng_rand_n(10 << 16) + 1;
+       width1 = width2 = width;
+
+       bilinear_pad_repeat_get_scanline_bounds_ref (source_image_width,
+                                                    vx,
+                                                    unit_x,
+                                                    &left_pad1,
+                                                    &left_tz1,
+                                                    &width1,
+                                                    &right_tz1,
+                                                    &right_pad1);
+
+       bilinear_pad_repeat_get_scanline_bounds (source_image_width,
+                                                vx,
+                                                unit_x,
+                                                &left_pad2,
+                                                &left_tz2,
+                                                &width2,
+                                                &right_tz2,
+                                                &right_pad2);
+
+       assert (left_pad1 == left_pad2);
+       assert (left_tz1 == left_tz2);
+       assert (width1 == width2);
+       assert (right_tz1 == right_tz2);
+       assert (right_pad1 == right_pad2);
+    }
+
+    return 0;
+}