PERFORCE change 214875 for review
Brooks Davis
brooks at FreeBSD.org
Tue Jul 24 21:47:19 UTC 2012
http://p4web.freebsd.org/@@214875?ac=10
Change 214875 by brooks at 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]);
More information about the p4-projects
mailing list