Skip site navigation (1)Skip section navigation (2)
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>