diff mbox

[v2,2/6] lib: add kmstest_cairo_printf_line

Message ID 1370460328-635-3-git-send-email-imre.deak@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Imre Deak June 5, 2013, 7:25 p.m. UTC
Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 lib/drmtest.c       | 44 ++++++++++++++++++++++++
 lib/drmtest.h       | 13 ++++++++
 tests/testdisplay.c | 96 ++++++++++++++++-------------------------------------
 3 files changed, 86 insertions(+), 67 deletions(-)

Comments

Rodrigo Vivi June 5, 2013, 7:27 p.m. UTC | #1
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>

On Wed, Jun 5, 2013 at 4:25 PM, Imre Deak <imre.deak@intel.com> wrote:
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  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..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
diff mbox

Patch

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..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)