2 * Image Library -- Simple automatic tests
4 * (c) 2006 Pavel Charvat <pchar@ucw.cz>
6 * This software may be freely distributed and used according to the terms
7 * of the GNU Lesser General Public License.
13 #include <ucw/mempool.h>
14 #include <ucw/fastbuf.h>
15 #include <ucw/threads.h>
16 #include <images/images.h>
17 #include <images/color.h>
25 static uint want_image_iface;
26 static uint want_threads;
28 #define TRY(x) do { if (!(x)) ASSERT(0); } while (0)
31 test_image_iface(void)
34 struct image_context ctx;
35 struct image *i1, *i2;
39 image_context_init(&ctx);
41 /* Image allocation */
42 i1 = image_new(&ctx, 731, 327, COLOR_SPACE_RGB, NULL);
44 ASSERT(i1->pixel_size == 3);
47 /* Test invalid image size */
48 ctx.msg_callback = image_context_msg_silent;
49 i1 = image_new(&ctx, 2214, 0, COLOR_SPACE_RGB, NULL);
51 i1 = image_new(&ctx, 0xffffff, 0xffffff, COLOR_SPACE_RGB, NULL);
53 ctx.msg_callback = image_context_msg_default;
55 /* Various image allocatio parameters */
56 i1 = image_new(&ctx, 370, 100, COLOR_SPACE_GRAYSCALE, pool);
58 ASSERT(i1->pixel_size == 1);
62 i1 = image_new(&ctx, 373, 101, COLOR_SPACE_RGB | IMAGE_ALIGNED, NULL);
64 ASSERT(i1->pixel_size == 4);
65 ASSERT(IMAGE_SSE_ALIGN_SIZE >= 16);
66 ASSERT(!(i1->row_size & (IMAGE_SSE_ALIGN_SIZE - 1)));
67 ASSERT(!((uintptr_t)i1->pixels & (IMAGE_SSE_ALIGN_SIZE - 1)));
70 i1 = image_new(&ctx, 283, 329, COLOR_SPACE_RGB, NULL);
72 ASSERT(i1->pixel_size == 3);
74 /* Image structures cloning */
75 i2 = image_clone(&ctx, i1, COLOR_SPACE_RGB, NULL);
77 ASSERT(i2->pixel_size == 3);
80 i2 = image_clone(&ctx, i1, COLOR_SPACE_RGB | IMAGE_PIXELS_ALIGNED, NULL);
82 ASSERT(i2->pixel_size == 4);
86 i2 = image_init_subimage(&ctx, &s1, i1, 29, 39, 283 - 29, 100);
92 image_context_cleanup(&ctx);
96 #ifdef CONFIG_UCW_THREADS
98 #define TEST_THREADS_COUNT 4
101 test_threads_thread(void *param UNUSED)
103 DBG("Starting thread");
104 struct image_context ctx;
106 image_context_init(&ctx);
107 TRY(image_io_init(&ctx, &io));
109 for (uint num = 0; num < 200; num++)
111 int r0 = random_max(100);
113 /* realloc context */
116 image_io_cleanup(&io);
117 image_context_cleanup(&ctx);
118 image_context_init(&ctx);
119 TRY(image_io_init(&ctx, &io));
123 else if ((r0 -= 2) < 0)
125 image_io_cleanup(&io);
126 TRY(image_io_init(&ctx, &io));
129 /* encode and decode random image */
134 TRY(img = image_new(&ctx, 10 + random_max(140), 10 + random_max(140), COLOR_SPACE_RGB, NULL));
135 image_clear(&ctx, img);
137 #if defined(CONFIG_IMAGES_LIBJPEG) || defined(CONFIG_IMAGES_LIBPNG) || defined(CONFIG_IMAGES_LIBMAGICK)
139 struct fastbuf *wfb = fbmem_create(10000);
144 switch (random_max(3))
147 #if defined(CONFIG_IMAGES_LIBJPEG) || defined(CONFIG_IMAGES_LIBMAGICK)
148 format = IMAGE_FORMAT_JPEG;
152 #if defined(CONFIG_IMAGES_LIBPNG) || defined(CONFIG_IMAGES_LIBMAGICK)
153 format = IMAGE_FORMAT_PNG;
157 #if defined(CONFIG_IMAGES_LIBMAGICK)
158 format = IMAGE_FORMAT_GIF;
169 TRY(image_io_write(&io));
172 rfb = fbmem_clone_read(wfb);
175 TRY(image_io_read(&io, 0));
186 image_io_cleanup(&io);
187 image_context_cleanup(&ctx);
188 DBG("Stopping thread");
197 #ifdef CONFIG_UCW_THREADS
198 pthread_t threads[TEST_THREADS_COUNT - 1];
200 if (pthread_attr_init(&attr) < 0 ||
201 pthread_attr_setstacksize(&attr, ucwlib_thread_stack_size) < 0)
203 for (uint i = 0; i < TEST_THREADS_COUNT - 1; i++)
205 if (pthread_create(threads + i, &attr, test_threads_thread, NULL) < 0)
206 die("Unable to create thread: %m");
208 test_threads_thread(NULL);
209 for (uint i = 0; i < TEST_THREADS_COUNT - 1; i++)
210 if (pthread_join(threads[i], NULL) < 0)
211 die("Cannot join thread: %m");
213 msg(L_WARN, "Disabled CONFIG_UCW_THREADS, threaded tests skipped");
218 main(int argc, char **argv)
220 for (int i = 1; i < argc; i++)
221 if (!strcmp(argv[i], "image-iface"))
223 else if (!strcmp(argv[i], "threads"))
226 die("Invalid parameter");
228 srandom(time(NULL) ^ getpid());
230 if (want_image_iface)