Message ID | 1370460328-635-3-git-send-email-imre.deak@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 --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)
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(-)