All of lore.kernel.org
 help / color / mirror / Atom feed
From: Imre Deak <imre.deak@intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: [PATCH v2 2/6] lib: add kmstest_cairo_printf_line
Date: Wed,  5 Jun 2013 22:25:24 +0300	[thread overview]
Message-ID: <1370460328-635-3-git-send-email-imre.deak@intel.com> (raw)
In-Reply-To: <1370460328-635-1-git-send-email-imre.deak@intel.com>

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

  parent reply	other threads:[~2013-06-05 19:25 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-31  9:23 [igt PATCH 1/5] lib: move connector_type_str and co to drmtest Imre Deak
2013-05-31  9:23 ` [igt PATCH 2/5] lib: add kmstest_cairo_printf_line Imre Deak
2013-06-05 17:44   ` Rodrigo Vivi
2013-06-05 19:01     ` Imre Deak
2013-05-31  9:23 ` [igt PATCH 3/5] lib: add kmstest_get_connector_config Imre Deak
2013-06-05 18:00   ` Rodrigo Vivi
2013-05-31  9:23 ` [igt PATCH 4/5] lib: refactor kmstest_create_fb Imre Deak
2013-06-05 18:21   ` Rodrigo Vivi
2013-05-31  9:23 ` [igt PATCH 5/5] tests: add kms_render Imre Deak
2013-06-05 18:28   ` Rodrigo Vivi
2013-06-06 10:19     ` Imre Deak
2013-06-05 19:25   ` [PATCH v2 0/6] tests: add tests for front buffer rendering Imre Deak
2013-06-05 19:25     ` [PATCH v2 1/6] lib: move connector_type_str and co to drmtest Imre Deak
2013-06-05 19:25     ` Imre Deak [this message]
2013-06-05 19:27       ` [PATCH v2 2/6] lib: add kmstest_cairo_printf_line Rodrigo Vivi
2013-06-05 20:04       ` [PATCH v3 " Imre Deak
2013-06-05 19:25     ` [PATCH v2 3/6] lib: use kmstest_cairo_printf_line in paint_marker Imre Deak
2013-06-05 19:29       ` Rodrigo Vivi
2013-06-05 19:25     ` [PATCH v2 4/6] lib: add kmstest_get_connector_config Imre Deak
2013-06-05 19:25     ` [PATCH v2 5/6] lib: refactor kmstest_create_fb Imre Deak
2013-06-05 19:25     ` [PATCH v2 6/6] tests: add kms_render Imre Deak
2013-06-05 17:40 ` [igt PATCH 1/5] lib: move connector_type_str and co to drmtest Rodrigo Vivi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1370460328-635-3-git-send-email-imre.deak@intel.com \
    --to=imre.deak@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.