10 static void startup(void);
11 static void cleanup(void);
13 void (*tet_startup)(void) = startup;
14 void (*tet_cleanup)(void) = cleanup;
16 static void utc_pixman_scaling_crash(void);
18 struct tet_testlist tet_testlist[] = {
19 { utc_pixman_scaling_crash, 1 },
23 static void startup(void)
28 static void cleanup(void)
34 * We have a source image filled with solid color, set NORMAL or PAD repeat,
35 * and some transform which results in nearest neighbour scaling.
37 * The expected result is either that the destination image filled with this solid
38 * color or, if the transformation is such that we can't composite anything at
39 * all, that nothing has changed in the destination.
41 * The surrounding memory of the source image is a different solid color so that
42 * we are sure to get failures if we access it.
45 run_test (int32_t dst_width,
53 pixman_filter_t filter,
54 pixman_repeat_t repeat)
56 pixman_image_t * src_img;
57 pixman_image_t * dst_img;
58 pixman_transform_t transform;
61 pixman_color_t color_cc = { 0xcccc, 0xcccc, 0xcccc, 0xcccc };
62 pixman_image_t * solid;
66 static const pixman_fixed_t kernel[] =
68 #define D(f) (pixman_double_to_fixed (f) + 0x0001)
70 pixman_int_to_fixed (5),
71 pixman_int_to_fixed (5),
72 D(1/25.0), D(1/25.0), D(1/25.0), D(1/25.0), D(1/25.0),
73 D(1/25.0), D(1/25.0), D(1/25.0), D(1/25.0), D(1/25.0),
74 D(1/25.0), D(1/25.0), D(1/25.0), D(1/25.0), D(1/25.0),
75 D(1/25.0), D(1/25.0), D(1/25.0), D(1/25.0), D(1/25.0),
76 D(1/25.0), D(1/25.0), D(1/25.0), D(1/25.0), D(1/25.0)
81 srcbuf = (uint32_t *)malloc ((src_width + 10) * (src_height + 10) * 4);
82 dstbuf = (uint32_t *)malloc (dst_width * dst_height * 4);
84 memset (srcbuf, 0x88, src_width * src_height * 4);
85 memset (dstbuf, 0x33, dst_width * dst_height * 4);
87 src_img = pixman_image_create_bits (
88 PIXMAN_a8r8g8b8, src_width, src_height,
89 srcbuf + (src_width + 10) * 5 + 5, (src_width + 10) * 4);
91 solid = pixman_image_create_solid_fill (&color_cc);
92 pixman_image_composite32 (PIXMAN_OP_SRC, solid, NULL, src_img,
93 0, 0, 0, 0, 0, 0, src_width, src_height);
94 pixman_image_unref (solid);
96 dst_img = pixman_image_create_bits (
97 PIXMAN_a8r8g8b8, dst_width, dst_height, dstbuf, dst_width * 4);
99 pixman_transform_init_scale (&transform, scale_x, scale_y);
100 pixman_image_set_transform (src_img, &transform);
101 pixman_image_set_repeat (src_img, repeat);
102 if (filter == PIXMAN_FILTER_CONVOLUTION)
103 pixman_image_set_filter (src_img, filter, kernel, 27);
105 pixman_image_set_filter (src_img, filter, NULL, 0);
107 pixman_image_composite (PIXMAN_OP_SRC, src_img, NULL, dst_img,
108 src_x, src_y, 0, 0, 0, 0, dst_width, dst_height);
110 pixman_image_unref (src_img);
111 pixman_image_unref (dst_img);
113 for (i = 0; i < dst_width * dst_height; i++)
115 if (dstbuf[i] != 0xCCCCCCCC && dstbuf[i] != 0x33333333)
127 typedef struct filter_info_t filter_info_t;
130 pixman_filter_t value;
134 static const filter_info_t filters[] =
136 { PIXMAN_FILTER_NEAREST, "NEAREST" },
137 { PIXMAN_FILTER_BILINEAR, "BILINEAR" },
138 { PIXMAN_FILTER_CONVOLUTION, "CONVOLUTION" },
141 typedef struct repeat_info_t repeat_info_t;
144 pixman_repeat_t value;
149 static const repeat_info_t repeats[] =
151 { PIXMAN_REPEAT_PAD, "PAD" },
152 { PIXMAN_REPEAT_REFLECT, "REFLECT" },
153 { PIXMAN_REPEAT_NORMAL, "NORMAL" }
157 do_test (int32_t dst_size,
160 int32_t scale_factor)
164 for (i = 0; i < ARRAY_LENGTH (filters); ++i)
166 for (j = 0; j < ARRAY_LENGTH (repeats); ++j)
168 /* horizontal test */
169 if (run_test (dst_size, 1,
174 repeats[j].value) != 0)
176 printf ("Vertical test failed with %s filter and repeat mode %s\n",
177 filters[i].name, repeats[j].name);
183 if (run_test (1, dst_size,
188 repeats[j].value) != 0)
190 printf ("Vertical test failed with %s filter and repeat mode %s\n",
191 filters[i].name, repeats[j].name);
201 static void utc_pixman_scaling_crash(void)
206 pixman_disable_out_of_bounds_workaround ();
208 /* can potentially crash */
210 48000, 32767, 1, 65536 * 128) == 0);
212 /* can potentially get into a deadloop */
214 16384, 65536, 32, 32768) == 0);
216 /* can potentially access memory outside source image buffer */
222 for (i = 0; i < 100; ++i)
224 pixman_fixed_t one_seventh =
225 (((pixman_fixed_48_16_t)pixman_fixed_1) << 16) / (7 << 16);
228 1, 7, 3, one_seventh + i - 50) == 0);
231 for (i = 0; i < 100; ++i)
233 pixman_fixed_t scale =
234 (((pixman_fixed_48_16_t)pixman_fixed_1) << 16) / (32767 << 16);
237 1, 32767, 16383, scale + i - 50) == 0);
240 /* can potentially provide invalid results (out of range matrix stuff) */
242 48000, 32767, 16384, 65536 * 128) == 0);
244 /*FIXME : when fail???*/
245 // dts_fail("utc_pixman_scaling_crash");
247 dts_pass("utc_pixman_scaling_crash");