[Intel-gfx] [igt PATCH 2/5] lib: add kmstest_cairo_printf_line
Rodrigo Vivi
rodrigo.vivi at gmail.com
Wed Jun 5 19:44:22 CEST 2013
This patch is big and doing considerable changes in paint_marker
besides add cairo_printf line... doesn' t it deserves a split?
On Fri, May 31, 2013 at 6:23 AM, Imre Deak <imre.deak at intel.com> wrote:
> Signed-off-by: Imre Deak <imre.deak at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Rodrigo Vivi
Blog: http://blog.vivi.eng.br
More information about the Intel-gfx
mailing list