From 41fe811feb5c79c760f5d2e9fe5d1671f6d71ff8 Mon Sep 17 00:00:00 2001 From: Yi Sun Date: Thu, 26 Jul 2012 14:23:36 +0800 Subject: [PATCH] tests/testdisplay.c: Add a option '-r'. With the option '-r', the testdisplay could paint a 2-D bar code(QR bar code) on the screen. The word "pass" is hiden in the bar code image. Further more, with this option, testdisplay will wait until a system signal 'SIGUSR1' coming after each mode setting. This function is for another program to control testdisplay. danvet: Fix up the missing static. Signed-off-by: Yi Sun Signed-off-by: Daniel Vetter --- lib/drmtest.c | 1 + tests/pass.png | Bin 0 -> 376 bytes tests/testdisplay.c | 93 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 tests/pass.png diff --git a/lib/drmtest.c b/lib/drmtest.c index 34db1261..2101f6a9 100644 --- a/lib/drmtest.c +++ b/lib/drmtest.c @@ -774,5 +774,6 @@ void kmstest_dump_mode(drmModeModeInfo *mode) mode->flags, mode->type, mode->clock); + fflush(stdout); } diff --git a/tests/pass.png b/tests/pass.png new file mode 100644 index 0000000000000000000000000000000000000000..5928d5ca109b7db33640851ceb352f9da742ff7b GIT binary patch literal 376 zcmV-;0f+vHP)K&qlmd8Y?m?=S>V};d!&JC-@c%hEGI?~i|G%bw#%`yn#2zFYS z+0-7gg|{O}1!wgI00c~fPDf?c;Hvckz~B`9IOHyYm1SA#|bqn!+nJepLch5kgVzT3%I zOA6OV+pcX-Uvy+}b(EP0H?%ow8?F&4v@mQk8p>PG2rCR<_!R9VEK^wF&vD>^r0@l& W)>)U}2&Hxa0000 +#include + drmModeRes *resources; int drm_fd, modes; int dump_info = 0, test_all_modes =0, test_preferred_mode = 0, force_mode = 0, test_plane, enable_tiling; int sleep_between_modes = 5; uint32_t depth = 24, stride, bpp; +int qr_code = 0; drmModeModeInfo force_timing; @@ -334,6 +338,40 @@ paint_color_key(void) } } +static void paint_image(cairo_t *cr, const char *file) +{ + int img_x, img_y, img_w, img_h, img_w_o, img_h_o; + double img_w_scale, img_h_scale; + + cairo_surface_t *image; + + img_y = height * (0.10 ); + img_h = height * 0.08 * 4; + img_w = img_h; + + img_x = (width / 2) - (img_w / 2); + + image = cairo_image_surface_create_from_png(file); + + img_w_o = cairo_image_surface_get_width(image); + img_h_o = cairo_image_surface_get_height(image); + + cairo_translate(cr, img_x, img_y); + + fprintf(stderr, "drew %dx%d image at %d,%d\n", img_w, img_h, + img_x, img_y); + + img_w_scale = (double)img_w / (double)img_w_o; + img_h_scale = (double)img_h / (double)img_h_o; + cairo_scale(cr, img_w_scale, img_h_scale); + + cairo_set_source_surface(cr, image, 0, 0); + cairo_scale(cr, 1, 1); + + cairo_paint(cr); + cairo_surface_destroy(image); +} + static void paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv) { @@ -419,6 +457,26 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv) cairo_set_source_rgb(cr, 1, 1, 1); cairo_fill(cr); } + + if (qr_code) + paint_image(cr, "./pass.png"); +} + +static void sighandler(int signo) +{ + return; +} + +static void set_single(void) +{ + int sigs[] = { SIGUSR1 }; + struct sigaction sa; + sa.sa_handler = sighandler; + + sigemptyset(&sa.sa_mask); + + if (sigaction(sigs[0], &sa, NULL) == -1) + perror("Could not set signal handler"); } static void @@ -480,9 +538,14 @@ set_mode(struct connector *c) continue; } - if (sleep_between_modes && test_all_modes) + if (sleep_between_modes && test_all_modes && !qr_code) sleep(sleep_between_modes); + if (qr_code){ + set_single(); + pause(); + } + } if(test_all_modes){ @@ -536,7 +599,7 @@ int update_display(void) return 1; } -static char optstr[] = "hiaf:s:d:p:mt"; +static char optstr[] = "hiaf:s:d:p:mrt"; static void usage(char *name) { @@ -548,6 +611,7 @@ static void usage(char *name) fprintf(stderr, "\t-p\t,, test overlay plane\n"); fprintf(stderr, "\t-m\ttest the preferred mode\n"); fprintf(stderr, "\t-t\tuse a tiled framebuffer\n"); + fprintf(stderr, "\t-r\tprint a QR code on the screen whose content is \"pass\" for the automatic test\n"); fprintf(stderr, "\t-f\t,,,,,\n"); fprintf(stderr, "\t\t,,,\n"); fprintf(stderr, "\t\ttest force mode\n"); @@ -558,7 +622,7 @@ static void usage(char *name) #define dump_resource(res) if (res) dump_##res() static gboolean input_event(GIOChannel *source, GIOCondition condition, - gpointer data) + gpointer data) { gchar buf[2]; gsize count; @@ -571,6 +635,24 @@ static gboolean input_event(GIOChannel *source, GIOCondition condition, return TRUE; } +static void enter_exec_path( char **argv ) +{ + char *exec_path = NULL; + char *pos = NULL; + short len_path = 0; + + len_path = strlen( argv[0] ); + exec_path = (char*) malloc(len_path); + + memcpy(exec_path, argv[0], len_path); + pos = strrchr(exec_path, '/'); + if (pos != NULL) + *(pos+1) = '\0'; + + chdir(exec_path); + free(exec_path); +} + int main(int argc, char **argv) { int c; @@ -579,6 +661,8 @@ int main(int argc, char **argv) GMainLoop *mainloop; float force_clock; + enter_exec_path( argv ); + opterr = 0; while ((c = getopt(argc, argv, optstr)) != -1) { switch (c) { @@ -617,6 +701,9 @@ int main(int argc, char **argv) case 't': enable_tiling = 1; break; + case 'r': + qr_code = 1; + break; default: fprintf(stderr, "unknown option %c\n", c); /* fall through */