On 2012-07-31 18:51, Yi Sun wrote: > That option will save all the images which are created and intended > to paint on screen. > The images will be saved in folder "saveimages" with PNG format. > > Signed-off-by: Yi Sun <yi.sun at intel.com> > > diff --git a/tests/testdisplay.c b/tests/testdisplay.c > index 4430d07..2d1fdb0 100644 > --- a/tests/testdisplay.c > +++ b/tests/testdisplay.c > @@ -64,6 +64,7 @@ > > #include <stdlib.h> > #include <signal.h> > +#include <sys/stat.h> > > drmModeRes *resources; > int drm_fd, modes; > @@ -72,6 +73,7 @@ int dump_info = 0, test_all_modes =0, > test_preferred_mode = 0, force_mode = 0, > int sleep_between_modes = 5; > uint32_t depth = 24, stride, bpp; > int qr_code = 0; > +int save_image = 0; > > drmModeModeInfo force_timing; > > @@ -379,6 +381,8 @@ paint_output_info(cairo_t *cr, int l_width, int > l_height, void *priv) > cairo_text_extents_t name_extents, mode_extents; > char name_buf[128], mode_buf[128]; > int i, x, y, modes_x, modes_y; > + static int count = 0; > + count++; > > /* Get text extents for each string */ > snprintf(name_buf, sizeof name_buf, "%s", > @@ -460,6 +464,25 @@ paint_output_info(cairo_t *cr, int l_width, int > l_height, void *priv) > > if (qr_code) > paint_image(cr, "./pass.png"); > + > + if (save_image){ > + char pngname[256]; > + char *pos; > + > + readlink("/proc/self/exe", pngname, sizeof(pngname)); > + pos = strrchr(pngname, '/'); > + *(pos + 1) = '\0'; > + > + strcat(pngname, "saveimages"); > + > + //judge whether folder mkdir existed, if not create it. > + if(access(pngname,0) == -1) > + if (mkdir( pngname,0777)) > + fprintf (stderr, "error %d, %s\n", errno, strerror (errno)); > + > + sprintf(pngname, "%s/%d_%s@%d.png", pngname, count, c->mode.name, > c->mode.vrefresh); I think we've already decided we're willing to piss off the BSD folks, but just in case we haven't I googled around for a more portable way to do this. It seems argv[0] *may* be better, may not. In any case, this reminds me that maybe we should start noting things which won't work in non-linux operating systems. I also find it comical that adding the argument, and writing the surface is like 5 lines, and the rest is all finding the damn executable path :-) > + cairo_surface_write_to_png( cairo_get_target(cr), pngname ); > + } > } > > static void sighandler(int signo) > @@ -599,7 +622,7 @@ int update_display(void) > return 1; > } > > -static char optstr[] = "hiaf:s:d:p:mrt"; > +static char optstr[] = "hiaf:s:d:p:mrtg"; > > static void usage(char *name) > { > @@ -612,6 +635,7 @@ static void usage(char *name) > fprintf(stderr, "\t-m\ttest the preferred mode\n"); > fprintf(stderr, "\t-t\tuse a tiled framebuffer\n"); > fprintf(stderr, "\t-r\tprint a QR code on the screen whose content > is \"pass\" for the automatic test\n"); > + fprintf(stderr, "\t-g\tsave images which is intended to paint on > the screen as png files in folder \"saveimages\"\n"); > fprintf(stderr, "\t-f\t<clock > MHz>,<hdisp>,<hsync-start>,<hsync-end>,<htotal>,\n"); > fprintf(stderr, > "\t\t<vdisp>,<vsync-start>,<vsync-end>,<vtotal>\n"); > fprintf(stderr, "\t\ttest force mode\n"); > @@ -704,6 +728,9 @@ int main(int argc, char **argv) > case 'r': > qr_code = 1; > break; > + case 'g': > + save_image = 1; > + break; > default: > fprintf(stderr, "unknown option %c\n", c); > /* fall through */