Signed-off-by: Imre Deak <imre.deak at intel.com> Reviewed-by: Rodrigo Vivi <rodrigo.vivi at gmail.com> [v3: fix mode printing in paint_output_info() botched by debugging leftover :/ ] --- lib/drmtest.c | 44 ++++++++++++++++++++++++ lib/drmtest.h | 13 ++++++++ tests/testdisplay.c | 96 ++++++++++++++++------------------------------------- 3 files changed, 86 insertions(+), 67 deletions(-) diff --git a/lib/drmtest.c b/lib/drmtest.c index 3c4812f..71dd06b 100644 --- a/lib/drmtest.c +++ b/lib/drmtest.c @@ -907,6 +907,50 @@ paint_test_patterns(cairo_t *cr, int width, int height) paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1); } +int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align, + double yspacing, const char *fmt, ...) +{ + double x, y, xofs, yofs; + cairo_text_extents_t extents; + char *text; + va_list ap; + int ret; + + va_start(ap, fmt); + ret = vasprintf(&text, fmt, ap); + assert(ret >= 0); + va_end(ap); + + cairo_text_extents(cr, text, &extents); + + xofs = yofs = 0; + if (align & align_right) + xofs = -extents.width; + else if (align & align_hcenter) + xofs = -extents.width / 2; + + if (align & align_top) + yofs = extents.height; + else if (align & align_vcenter) + yofs = extents.height / 2; + + cairo_get_current_point(cr, &x, &y); + if (xofs || yofs) + cairo_rel_move_to(cr, xofs, yofs); + + cairo_text_path(cr, text); + cairo_set_source_rgb(cr, 0, 0, 0); + cairo_stroke_preserve(cr); + cairo_set_source_rgb(cr, 1, 1, 1); + cairo_fill(cr); + + cairo_move_to(cr, x, y + extents.height + yspacing); + + free(text); + + return extents.width; +} + enum corner { topleft, topright, diff --git a/lib/drmtest.h b/lib/drmtest.h index 38aeb9d..3c1368d 100644 --- a/lib/drmtest.h +++ b/lib/drmtest.h @@ -109,6 +109,19 @@ struct kmstest_fb { unsigned size; }; +enum kmstest_text_align { + align_left, + align_bottom = align_left, + align_right = 0x01, + align_top = 0x02, + align_vcenter = 0x04, + align_hcenter = 0x08, +}; + +int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align, + double yspacing, const char *fmt, ...) + __attribute__((format (printf, 4, 5))); + typedef void (*kmstest_paint_func)(cairo_t *cr, int width, int height, void *priv); unsigned int kmstest_create_fb(int fd, int width, int height, int bpp, diff --git a/tests/testdisplay.c b/tests/testdisplay.c index e7a2555..67b7031 100644 --- a/tests/testdisplay.c +++ b/tests/testdisplay.c @@ -331,86 +331,48 @@ static void paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv) { struct connector *c = priv; - cairo_text_extents_t name_extents, mode_extents; - char name_buf[128], mode_buf[128]; - int i, x, y, modes_x, modes_y; + double str_width; + double x, y, top_y; + double max_width; + int i; - /* Get text extents for each string */ - snprintf(name_buf, sizeof name_buf, "%s", - kmstest_connector_type_str(c->connector->connector_type)); - cairo_set_font_size(cr, 48); cairo_select_font_face(cr, "Helvetica", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_text_extents(cr, name_buf, &name_extents); - - snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz on %s encoder", - c->mode.name, c->mode.vrefresh, - kmstest_encoder_type_str(c->encoder->encoder_type)); - cairo_set_font_size(cr, 36); - cairo_text_extents(cr, mode_buf, &mode_extents); + cairo_move_to(cr, l_width / 2, l_height / 2); - /* Paint output name */ - x = l_width / 2; - x -= name_extents.width / 2; - y = l_height / 2; - y -= (name_extents.height / 2) - (mode_extents.height / 2) - 10; + /* Print connector and mode name */ cairo_set_font_size(cr, 48); - cairo_move_to(cr, x, y); - cairo_text_path(cr, name_buf); - cairo_set_source_rgb(cr, 0, 0, 0); - cairo_stroke_preserve(cr); - cairo_set_source_rgb(cr, 1, 1, 1); - cairo_fill(cr); - - /* Paint mode name */ - x = l_width / 2; - x -= mode_extents.width / 2; - modes_x = x; - y = l_height / 2; - y += (mode_extents.height / 2) + (name_extents.height / 2) + 10; + kmstest_cairo_printf_line(cr, align_hcenter, 10, "%s", + kmstest_connector_type_str(c->connector->connector_type)); + cairo_set_font_size(cr, 36); - cairo_move_to(cr, x, y); - cairo_text_path(cr, mode_buf); - cairo_set_source_rgb(cr, 0, 0, 0); - cairo_stroke_preserve(cr); - cairo_set_source_rgb(cr, 1, 1, 1); - cairo_fill(cr); + str_width = kmstest_cairo_printf_line(cr, align_hcenter, 10, + "%s @ %dHz on %s encoder", c->mode.name, c->mode.vrefresh, + kmstest_encoder_type_str(c->encoder->encoder_type)); + + cairo_rel_move_to(cr, -str_width / 2, 0); /* List available modes */ - snprintf(mode_buf, sizeof mode_buf, "Available modes:"); cairo_set_font_size(cr, 18); - cairo_text_extents(cr, mode_buf, &mode_extents); - x = modes_x; - modes_x = x + mode_extents.width; - y += mode_extents.height + 10; - modes_y = y; - cairo_move_to(cr, x, y); - cairo_text_path(cr, mode_buf); - cairo_set_source_rgb(cr, 0, 0, 0); - cairo_stroke_preserve(cr); - cairo_set_source_rgb(cr, 1, 1, 1); - cairo_fill(cr); + str_width = kmstest_cairo_printf_line(cr, align_left, 10, + "Available modes:"); + cairo_rel_move_to(cr, str_width, 0); + cairo_get_current_point(cr, &x, &top_y); + max_width = 0; for (i = 0; i < c->connector->count_modes; i++) { - snprintf(mode_buf, sizeof mode_buf, "%s @ %dHz", - c->connector->modes[i].name, - c->connector->modes[i].vrefresh); - cairo_set_font_size(cr, 18); - cairo_text_extents(cr, mode_buf, &mode_extents); - x = modes_x - mode_extents.width; /* right justify modes */ - y += mode_extents.height + 10; - if (y + mode_extents.height >= height) { - y = modes_y + mode_extents.height + 10; - modes_x += mode_extents.width + 10; - x = modes_x - mode_extents.width; + cairo_get_current_point(cr, &x, &y); + if (y >= l_height) { + x += max_width + 10; + max_width = 0; + cairo_move_to(cr, x, top_y); } - cairo_move_to(cr, x, y); - cairo_text_path(cr, mode_buf); - cairo_set_source_rgb(cr, 0, 0, 0); - cairo_stroke_preserve(cr); - cairo_set_source_rgb(cr, 1, 1, 1); - cairo_fill(cr); + str_width = kmstest_cairo_printf_line(cr, align_right, 10, + "%s @ %dHz", c->connector->modes[i].name, + c->connector->modes[i].vrefresh); + if (str_width > max_width) + max_width = str_width; } if (qr_code) -- 1.8.1.2