Date: Tue, 24 Jul 2012 21:47:16 GMT From: Brooks Davis <brooks@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 214875 for review Message-ID: <201207242147.q6OLlGV0010393@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@214875?ac=10 Change 214875 by brooks@brooks_ecr_current on 2012/07/24 21:47:02 Add a new -s option to pictview that replaces the hardcoded set of photos with the files in a directory. All regular files in the directory are loaded in alphabetical order and must be PNG files. The existance of other types of files is currently an error. Affected files ... .. //depot/projects/ctsrd/beribsd/src/ctsrd/pictview/pictview.c#12 edit Differences ... ==== //depot/projects/ctsrd/beribsd/src/ctsrd/pictview/pictview.c#12 (text+ko) ==== @@ -35,6 +35,7 @@ #include <stdio.h> #include <stdlib.h> #include <syslog.h> +#include <dirent.h> #include <err.h> #include <errno.h> #include <fcntl.h> @@ -365,61 +366,113 @@ * Picture viewer including PNG image loader *****************************************************************************/ -static const int pictview_numimg=7; -//static u_int32_t* pictview_imgs[pictview_numimg]; -static u_int32_t* pictview_imgs[7]; -static int pictview_browser_img; -static int pictview_quill_img; -static int pictview_term_img; -static int pictview_num_photo; +static const int selector_nimages=4; +static u_int32_t *selector_images[4]; +static char *slide_dir = NULL; +static int slide_nimages; +static u_int32_t **slide_images; +static u_int32_t *bgimage; + +#define SEL_SLIDE_IMG 0 +#define SEL_QUILL_IMG 1 +#define SEL_TERM_IMG 2 +#define SEL_BROWSER_IMG 3 +static int +strpcmp(const void *v1, const void *v2) +{ -/* -void -show_text_buffer(void) -{ - int j; - fb_fade2off(); - // display background - for(j=0; j<fb_width*fb_height; j++) - pfbp[j] = pictview_imgs[0][j]; - fb_fade2text(127); - multitouch_release_event(); - do { - multitouch_pole(); - } while(!((touch_count==2) && (touch_gesture==0x49))); + return (strcmp(*((const char**)v1), *((const char**)v2))); } -*/ // initialisation - load the images to view void pictview_init(void) { int j; - // allocate memory for images - for(j=0; j<pictview_numimg; j++) - pictview_imgs[j] = (u_int32_t*) malloc(sizeof(u_int32_t) * fb_width * fb_height); - // read images + bgimage = malloc(sizeof(u_int32_t) * fb_width * fb_height); busy_indicator(); - read_png_file("/usr/share/images/CatSword.png", pictview_imgs[0], fb_width, fb_height); + read_png_file("/usr/share/images/CatSword.png", bgimage, fb_width, fb_height); + + if (slide_dir == NULL) { + slide_nimages = 3; + if ((slide_images = malloc(sizeof(*slide_images) * slide_nimages)) == NULL) + err(1, "malloc slide_images"); + for(j = 0; j < slide_nimages; j++) + if ((slide_images[j] = malloc(sizeof(u_int32_t) * fb_width * fb_height)) == NULL) + err(1, "malloc slide_images[%d]", j); + busy_indicator(); + read_png_file("/usr/share/images/Canon-5DII-5487.png", slide_images[0], fb_width, fb_height); + busy_indicator(); + read_png_file("/usr/share/images/Canon-5DII-4717.png", slide_images[1], fb_width, fb_height); + busy_indicator(); + read_png_file("/usr/share/images/Canon-5DII-3816.png", slide_images[2], fb_width, fb_height); + } else { + DIR *dirp; + struct dirent *entry; + char **slidenames; + int fd, maxslides; + + if ((dirp = opendir(slide_dir)) == NULL) + err(1, "opendir"); + slide_nimages = 0; + maxslides = 1024; + slidenames = malloc(sizeof(*slidenames) * maxslides); + if (slidenames == NULL) + err(1, "malloc slidenames"); + while((entry = readdir(dirp)) != NULL) { + /* XXX: doesn't support symlinks */ + if (entry->d_type != DT_REG) + continue; + if (slide_nimages == maxslides) { + maxslides *= 2; + slidenames = realloc(slidenames, sizeof(*slidenames) * maxslides); + if (slidenames == NULL) + err(1, "realloc slidenames"); + } + slidenames[slide_nimages] = strdup(entry->d_name); + if (slidenames[slide_nimages] == NULL) + err(1, "strdup"); + slide_nimages++; + } + qsort(slidenames, slide_nimages, sizeof(*slidenames), &strpcmp); + slide_images = malloc(sizeof(*slide_images) * slide_nimages); + if (slide_images == NULL) + err(1, "malloc slide_images"); + for (j = 0; j < slide_nimages; j++) { + slide_images[j] = malloc(sizeof(u_int32_t) * fb_width * fb_height); + if (slide_images[j] == NULL) + err(1, "malloc slide_images[%d]", j); + if ((fd = openat(dirfd(dirp), slidenames[j], O_RDONLY)) == -1) + err(1, "openat(slide_dir, %s)", slidenames[j]); + if (read_png_fd(fd, slide_images[j], fb_width, fb_height) != 0) + errx(1, "failed to read png %s", slidenames[j]); + close(fd); + free(slidenames[j]); + } + closedir(dirp); + free(slidenames); + } + + for(j=0; j<selector_nimages; j++) { + if (j == SEL_SLIDE_IMG) + selector_images[j] = slide_images[0]; + else + if ((selector_images[j] = malloc(sizeof(u_int32_t) * fb_width * fb_height)) == NULL) + err(1, "malloc selector_images[%d]", j); + } + busy_indicator(); - read_png_file("/usr/share/images/Canon-5DII-5487.png", pictview_imgs[1], fb_width, fb_height); + read_png_file("/usr/share/images/Quill.png", + selector_images[SEL_QUILL_IMG], fb_width, fb_height); busy_indicator(); - read_png_file("/usr/share/images/Canon-5DII-4717.png", pictview_imgs[2], fb_width, fb_height); + read_png_file("/usr/share/images/Terminal.png", + selector_images[SEL_TERM_IMG], fb_width, fb_height); busy_indicator(); - read_png_file("/usr/share/images/Canon-5DII-3816.png", pictview_imgs[3], fb_width, fb_height); - busy_indicator(); - read_png_file("/usr/share/images/Quill.png", pictview_imgs[4], fb_width, fb_height); - busy_indicator(); - read_png_file("/usr/share/images/Terminal.png", pictview_imgs[5], fb_width, fb_height); - busy_indicator(); - read_png_file("/usr/share/images/browser-thumb.png", pictview_imgs[6], fb_width, fb_height); + read_png_file("/usr/share/images/browser-thumb.png", + selector_images[SEL_BROWSER_IMG], fb_width, fb_height); busy_indicator(); - pictview_quill_img = 4; - pictview_term_img = 5; - pictview_browser_img = 6; - pictview_num_photo = 3; } @@ -433,37 +486,37 @@ int j,xi,yi; int imgmap[tile][tile]; // map images to tile locations - imgmap[0][0] = pictview_quill_img; + imgmap[0][0] = SEL_QUILL_IMG; imgmap[1][0] = -1; - imgmap[2][0] = pictview_term_img; + imgmap[2][0] = SEL_TERM_IMG; imgmap[0][1] = -1; imgmap[1][1] = -1; imgmap[2][1] = -1; - imgmap[0][2] = 1; + imgmap[0][2] = SEL_SLIDE_IMG; imgmap[1][2] = -1; - imgmap[2][2] = pictview_browser_img; + imgmap[2][2] = SEL_BROWSER_IMG; // display off fb_fade2off(); // display background for(j=0; j<fb_width*fb_height; j++) - fb_buf[j] = pictview_imgs[0][j]; + fb_buf[j] = bgimage[j]; fb_post(fb_buf); // display photos as tiles for(yi=0; yi<tile; yi++) for(xi=0; xi<tile; xi++) - if(imgmap[xi][yi]>0) { + if(imgmap[xi][yi]>=0) { int x,y; int x0 = (fb_width/tile)*xi + ((fb_width/tile)-(fb_width/scale))/2; int y0 = (fb_height/tile)*yi + ((fb_height/tile)-(fb_height/scale))/2; int img = imgmap[xi][yi]; for(y=0; y<fb_height/scale; y++) for(x=0; x<fb_width/scale; x++) - fb_buf[x+x0+(y+y0)*fb_width] = pictview_imgs[img][(x+y*fb_width)*scale]; + fb_buf[x+x0+(y+y0)*fb_width] = selector_images[img][(x+y*fb_width)*scale]; } fb_post(fb_buf); @@ -489,25 +542,20 @@ } -void pictview_pan(int display_image) +void pictview_pan() { int pan_direction = -1; - int next_display_image = display_image; + int display_image = 0; + int next_display_image = 0; int k,x,y; int prev_ts_x1; struct tsstate *ts; - if((display_image<1) || (display_image>pictview_num_photo)) { - printf("pictview_pan assertion error: display_image=%1d out of range\n", - display_image); - display_image = next_display_image = 1; - } - // display image for(y=0; y<fb_height; y++) { k=y*fb_width; for(x=0; x<fb_width; x++) - fb_buf[x+k] = pictview_imgs[display_image][x+k]; + fb_buf[x+k] = slide_images[display_image][x+k]; } fb_post(fb_buf); fb_fade2on(); @@ -525,22 +573,22 @@ display_image = next_display_image; pan_direction = -1; for(k=0; k<fb_width*fb_height; k++) - fb_buf[k] = pictview_imgs[display_image][k]; + fb_buf[k] = slide_images[display_image][k]; fb_post(fb_buf); } if(ts->ts_count==1) { if((pan_direction==-1) && (ts->ts_x1>(5*fb_width/6))) { // pan image to right pan_direction=1; - next_display_image = (display_image % pictview_num_photo)+1; + next_display_image = (display_image + 1) % slide_nimages; prev_ts_x1 = fb_width-1; //printf("display_image=%1d next_display_image=%1d\n",display_image,next_display_image); } if((pan_direction==-1) && (ts->ts_x1<(fb_width/6))) { // pan image to left pan_direction=0; - next_display_image = ((pictview_num_photo+display_image-2) % pictview_num_photo)+1; + next_display_image = (display_image == 0) ? slide_nimages - 1 : display_image - 1; prev_ts_x1 = 0; - // printf("display_image=%1d next_display_image=%1d\n",display_image,next_display_image); + //printf("display_image=%1d next_display_image=%1d\n",display_image,next_display_image); } if(pan_direction!=-1) { int img0, img1; @@ -555,9 +603,9 @@ for(y=0; y<fb_height; y++) { k = y*fb_width; for(x=prev_ts_x1; x<ts->ts_x1; x++) - fb_buf[x+k] = pictview_imgs[img0][x+k]; + fb_buf[x+k] = slide_images[img0][x+k]; for(x=ts->ts_x1; x<=prev_ts_x1; x++) - fb_buf[x+k] = pictview_imgs[img1][x+k]; + fb_buf[x+k] = slide_images[img1][x+k]; } fb_post(fb_buf); prev_ts_x1 = ts->ts_x1; @@ -632,24 +680,6 @@ void -pictview_slideshow() -{ - int j, k; - // while no pinch gesture, display slide show - while(!((touch_count==2) && (touch_gesture==0x49))) { - multitouch_pole(); - for(j=1; j<=pictview_num_photo; j++) { - // printf("display image %1d\n",j); - fb_fade2off(); - fb_post(pictview_imgs[j]); - fb_fade2on(); - sleep(3); - } - } -} - - -void pictview(void) { int display_image; @@ -663,24 +693,29 @@ while(1) { display_image = pictview_selector(); - if(display_image == pictview_term_img) + if(display_image == SEL_TERM_IMG) keyboard_on(); // show_text_buffer(); - else if(display_image == pictview_quill_img) + else if(display_image == SEL_QUILL_IMG) pen_drawing(); - else if(display_image == pictview_browser_img) + else if(display_image == SEL_BROWSER_IMG) run_browser(); - else if((display_image>=1) && (display_image<=pictview_num_photo)) - pictview_pan(display_image); + else if(display_image == SEL_SLIDE_IMG) + pictview_pan(); } } +static void +usage(void) +{ +} + int main(int argc, char *argv[]) { - int tty; + int ch, tty; char *devpath; struct sigaction act; @@ -702,9 +737,20 @@ if (sigaction(SIGCHLD, &act, 0)) err(1, "sigacation"); - if (argc > 2) - errx(1, "usage: pictview [tty]"); - if (argc == 2) { + while ((ch = getopt(argc, argv, "s:")) != -1) { + switch (ch) { + case 's': + slide_dir = optarg; + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (argc > 1) + errx(1, "usage: pictview [-s <slide dir>] [tty]"); + if (argc == 1) { kbdfd = -1; if (argv[1][0] != '/') asprintf(&devpath, "/dev/%s", argv[1]);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207242147.q6OLlGV0010393>