Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 5 Dec 2012 00:02:37 GMT
From:      Brooks Davis <brooks@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 219881 for review
Message-ID:  <201212050002.qB502bBo034399@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@219881?ac=10

Change 219881 by brooks@brooks_zenith on 2012/12/05 00:02:09

	Add the ability to include a second set of slides with a second -s
	argument.  We can now include both briefing and demo slides
	on the front page.

Affected files ...

.. //depot/projects/ctsrd/cheribsd/src/ctsrd/pictview/Makefile#3 edit
.. //depot/projects/ctsrd/cheribsd/src/ctsrd/pictview/pictview.c#8 edit

Differences ...

==== //depot/projects/ctsrd/cheribsd/src/ctsrd/pictview/Makefile#3 (text+ko) ====

@@ -9,7 +9,7 @@
 
 WARNS=	0
 
-LDADD+= 	 -lde4tc -lvuln_png -lz -lm -lutil
+LDADD+= 	 -lde4tc -limagebox -lvuln_png -lz -lm -lutil -lcheri -lpthread
 # Disable the stack protector, we want to be vulnerable
 SSP_CFLAGS=
 

==== //depot/projects/ctsrd/cheribsd/src/ctsrd/pictview/pictview.c#8 (text+ko) ====

@@ -52,6 +52,7 @@
 #include <unistd.h>
 
 #include <de4tc.h>
+#include <imagebox.h>
 
 static pid_t browser_pid;
 static pid_t kbd_pid;
@@ -370,23 +371,72 @@
  * Picture viewer including PNG image loader
  *****************************************************************************/
 
-static const int selector_nimages=4;
-static u_int32_t *selector_images[4];
+static const int selector_nimages=5;
+static u_int32_t *selector_images[5];
 static char *slide_dir = NULL;
-static int slide_nimages;
-static u_int32_t **slide_images;
+static char *slide_dir2 = NULL;
+static u_int32_t *coverimage, *coverimage2;
 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
+#define SEL_SLIDE_IMG2 4
 
-static int
-strpcmp(const void *v1, const void *v2)
+static uint32_t *
+loadcover(const char *dir)
 {
+  DIR *dirp;
+  struct dirent *entry;
+  char *covername;
+  uint32_t *image;
+  int fd;
+  uint32_t c, fcol, r;
+  struct iboxstate *is;
 
-  return (strcmp(*((const char**)v1), *((const char**)v2)));
+  covername = NULL;
+  if ((dirp = opendir(dir)) == NULL)
+    err(1, "opendir");
+  while((entry = readdir(dirp)) != NULL) {
+    /* XXX: doesn't support symlinks */
+    if (entry->d_type != DT_REG)
+      continue;
+    /* Ignore all files other than covers. */
+    if (fnmatch("*-cover-*.png", entry->d_name, 0) != 0)
+      continue;
+    covername = entry->d_name;
+    break;
+  }
+  if (covername == NULL)
+    errx(1, "No cover found in %s", dir);
+
+  if ((fd = openat(dirfd(dirp), covername, O_RDONLY)) == -1)
+    err(1, "openat(dir, %s)", covername);
+  if ((is = png_read_start(fd, fb_width, fb_height, SB_NONE)) == NULL)
+    errx(1, "Failed to start PNG decode for %s", covername);
+  if (png_read_finish(is) != 0)
+    errx(1, "png_read_finish() failed for icons.png");
+
+  image = malloc(sizeof(u_int32_t) * fb_width * fb_height);
+  if (image == NULL)
+    err(1, "malloc image]");
+  fcol = (fb_width - is->width) / 2;
+  fb_composite(image, fb_width, fb_height, fcol, 0,
+    is->buffer, is->width, is->height);
+  if (is->width != fb_width) {
+    for (r = 0; r < is->height; r++) {
+      for (c = 0; c < fcol; c++)
+	image[c + (r * fb_width)] = image[fcol + (r * fb_width)];
+      for (c = fcol + is->width; c < fb_width; c++)
+	image[c + (r * fb_width)] = image[fcol + is->width - 1 + (r * fb_width)];
+    }
+  }
+  iboxstate_free(is);
+  close(fd);
+  closedir(dirp);
+
+  return (image);
 }
 
 // initialisation - load the images to view
@@ -399,72 +449,18 @@
   busy_indicator();
   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;
+  coverimage = loadcover(slide_dir);
 
-    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;
-      /* Ignore all files other than covers. */
-      if (fnmatch("*-cover-*.png", entry->d_name, 0) != 0)
-	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);
-  }
+  if (slide_dir2 != NULL)
+    coverimage2 = loadcover(slide_dir2);
+  else
+    coverimage2 = NULL;
 
   for(j=0; j<selector_nimages; j++) {
     if (j == SEL_SLIDE_IMG)
-      selector_images[j] = slide_images[0];
+      selector_images[j] = coverimage;
+    else if (j == SEL_SLIDE_IMG2)
+      selector_images[j] = coverimage2;
     else
       if ((selector_images[j] = malloc(sizeof(u_int32_t) * fb_width * fb_height)) == NULL)
         err(1, "malloc selector_images[%d]", j);
@@ -652,6 +648,9 @@
   imgmap[1][2] = -1;
   imgmap[2][2] = SEL_BROWSER_IMG;
 
+  if (slide_dir2 != NULL)
+    imgmap[1][2] = SEL_SLIDE_IMG2;
+
   // display off
   fb_fade2off();
 
@@ -699,81 +698,8 @@
   return display_image;
 }
 
-#ifdef USE_HW_ENG_CODE
-void pictview_pan()
-{
-  int pan_direction = -1;
-  int display_image = 0;
-  int next_display_image = 0;
-  int k,x,y;
-  int prev_ts_x1;
-  struct tsstate *ts;
-
-  // display image
-  for(y=0; y<fb_height; y++) {
-    k=y*fb_width;
-    for(x=0; x<fb_width; x++)
-      fb_buf[x+k] = slide_images[display_image][x+k];
-  }
-  fb_post(fb_buf);
-  fb_fade2on();
-
-  for (;;) {
-    ts = ts_poll();
-    if (ts->ts_gesture == TSG2_ZOOM_OUT)
-      break;
-
-    if((ts->ts_count==0) && (pan_direction!=-1)) {
-      // touch released so decide which image to view
-      if((pan_direction==0) && (ts->ts_x1>(fb_width/2)))
-	display_image = next_display_image;
-      if((pan_direction==1) && (ts->ts_x1<(fb_width/2)))
-	display_image = next_display_image;
-      pan_direction = -1;
-      for(k=0; k<fb_width*fb_height; 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 + 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 = (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);
-      }
-      if(pan_direction!=-1) {
-	int img0, img1;
-	if(pan_direction==0) {
-	  img0=next_display_image;
-	  img1=display_image;
-	} else {
-	  img1=next_display_image;
-	  img0=display_image;
-	}
-	// printf("%1d",pan_direction);
-	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] = slide_images[img0][x+k];
-	  for(x=ts->ts_x1; x<=prev_ts_x1; x++)
-	    fb_buf[x+k] = slide_images[img1][x+k];
-	}
-	fb_post(fb_buf);
-	prev_ts_x1 = ts->ts_x1;
-      }
-    }
-  }
-}
-#else
 static void
-pictview_pan(void)
+run_cheripoint(const char *dir)
 {
   static int pmaster;
   int pslave, n;
@@ -794,7 +720,7 @@
       syslog(LOG_ALERT, "login_tty failed in child: %s", strerror(errno));
       err(1, "tty_login");
     }
-    execl("/usr/bin/cheripoint", "cheripoint", "-f", slide_dir, NULL);
+    execl("/usr/bin/cheripoint", "cheripoint", "-f", dir, NULL);
     syslog(LOG_ALERT, "exec of /usr/bin/cheripoint failed: %s", strerror(errno));
     err(1, "execl()");
   }
@@ -834,7 +760,6 @@
     }
   }
 }
-#endif
 
 
 void
@@ -923,7 +848,9 @@
     else if(display_image == SEL_BROWSER_IMG)
       run_browser();
     else if(display_image == SEL_SLIDE_IMG)
-      pictview_pan();
+      run_cheripoint(slide_dir);
+    else if(display_image == SEL_SLIDE_IMG2)
+      run_cheripoint(slide_dir2);
   }
 }
 
@@ -931,6 +858,8 @@
 static void
 usage(void)
 {
+	fprintf(stderr, "usage: pictview [-s <slide dir>] [-s <slide dir>]\n");
+	exit(1);
 }
 
 
@@ -963,10 +892,15 @@
   while ((ch = getopt(argc, argv, "s:")) != -1) {
     switch (ch) {
     case 's':
-      slide_dir = optarg;
+      if (slide_dir == NULL)
+        slide_dir = optarg;
+      else if (slide_dir2 == NULL)
+	slide_dir2 = optarg;
+      else
+	usage();
+      break;
     default:
       usage();
-      /* ENOKABOOMHERE */
     }
   }
   argc -= optind;
@@ -991,12 +925,10 @@
     }
   }
 
-#ifndef USE_HW_ENG_CODE
   if (slide_dir == NULL) {
+    warnx("usage: must pass in -s <dir>");
     usage();
-    err(1, "usage: must pass in -s <dir>");
   }
-#endif
 
   pictview();
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212050002.qB502bBo034399>