Signed-off-by: Imre Deak <imre.d...@intel.com>
---
 lib/drmtest.c       | 106 ++++++++++++++++++++++++++++------------------------
 lib/drmtest.h       |  13 +++++++
 tests/testdisplay.c |  96 ++++++++++++++---------------------------------
 3 files changed, 99 insertions(+), 116 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 3c4812f..3ad77a8 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -907,45 +907,55 @@ paint_test_patterns(cairo_t *cr, int width, int height)
        paint_color_gradient(cr, x, y, gr_width, gr_height, 1, 1, 1);
 }
 
-enum corner {
-       topleft,
-       topright,
-       bottomleft,
-       bottomright,
-};
-
-static void
-paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)
+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;
-       int xoff, yoff;
+       char *text;
+       va_list ap;
+       int ret;
 
-       cairo_set_font_size(cr, 18);
-       cairo_text_extents(cr, str, &extents);
+       va_start(ap, fmt);
+       ret = vasprintf(&text, fmt, ap);
+       assert(ret >= 0);
+       va_end(ap);
 
-       switch (text_location) {
-       case topleft:
-               xoff = -20;
-               xoff -= extents.width;
-               yoff = -20;
-               break;
-       case topright:
-               xoff = 20;
-               yoff = -20;
-               break;
-       case bottomleft:
-               xoff = -20;
-               xoff -= extents.width;
-               yoff = 20;
-               break;
-       case bottomright:
-               xoff = 20;
-               yoff = 20;
-               break;
-       default:
-               xoff = 0;
-               yoff = 0;
-       }
+       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;
+}
+
+static void
+paint_marker(cairo_t *cr, int x, int y)
+{
+       enum kmstest_text_align align;
+       int xoff, yoff;
 
        cairo_move_to(cr, x, y - 20);
        cairo_line_to(cr, x, y + 20);
@@ -960,12 +970,15 @@ paint_marker(cairo_t *cr, int x, int y, char *str, enum 
corner text_location)
        cairo_set_line_width(cr, 2);
        cairo_stroke(cr);
 
+       xoff = x ? -20 : 20;
+       align = x ? align_right : align_left;
+
+       yoff = y ? -20 : 20;
+       align |= y ? align_bottom : align_top;
+
        cairo_move_to(cr, x + xoff, y + yoff);
-       cairo_text_path(cr, str);
-       cairo_set_source_rgb(cr, 0, 0, 0);
-       cairo_stroke_preserve(cr);
-       cairo_set_source_rgb(cr, 1, 1, 1);
-       cairo_fill(cr);
+       cairo_set_font_size(cr, 18);
+       kmstest_cairo_printf_line(cr, align, 0, "(%d, %d)", x, y);
 }
 
 unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
@@ -977,7 +990,6 @@ unsigned int kmstest_create_fb(int fd, int width, int 
height, int bpp,
        cairo_surface_t *surface;
        cairo_status_t status;
        cairo_t *cr;
-       char buf[128];
        unsigned int fb_id;
 
        surface = paint_allocate_surface(fd, width, height, depth, bpp,
@@ -991,14 +1003,10 @@ unsigned int kmstest_create_fb(int fd, int width, int 
height, int bpp,
        cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
 
        /* Paint corner markers */
-       snprintf(buf, sizeof buf, "(%d, %d)", 0, 0);
-       paint_marker(cr, 0, 0, buf, bottomright);
-       snprintf(buf, sizeof buf, "(%d, %d)", width, 0);
-       paint_marker(cr, width, 0, buf, bottomleft);
-       snprintf(buf, sizeof buf, "(%d, %d)", 0, height);
-       paint_marker(cr, 0, height, buf, topright);
-       snprintf(buf, sizeof buf, "(%d, %d)", width, height);
-       paint_marker(cr, width, height, buf, topleft);
+       paint_marker(cr, 0, 0);
+       paint_marker(cr, width, 0);
+       paint_marker(cr, 0, height);
+       paint_marker(cr, width, height);
 
        if (paint_func)
                paint_func(cr, width, height, func_arg);
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..b10c3b9 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 % 2].name,
+                        c->connector->modes[i % 2].vrefresh);
+               if (str_width > max_width)
+                       max_width = str_width;
        }
 
        if (qr_code)
-- 
1.8.1.2

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to