PERFORCE change 219854 for review

Brooks Davis brooks at FreeBSD.org
Tue Nov 27 21:02:12 UTC 2012


http://p4web.freebsd.org/@@219854?ac=10

Change 219854 by brooks at brooks_zenith on 2012/11/27 21:01:59

	Use an hour glass icon as an the busy indicator rather than a
	red square.
	
	Ignore files without .png extensions.

Affected files ...

.. //depot/projects/ctsrd/cheribsd/src/ctsrd/cheripoint/cheripoint.c#11 edit

Differences ...

==== //depot/projects/ctsrd/cheribsd/src/ctsrd/cheripoint/cheripoint.c#11 (text+ko) ====

@@ -57,7 +57,7 @@
 #define vred(v)		fb_colour((v), 0, 0)
 #define red		vred(0xFF)
 
-#define FB_BUSY fb_fill_region(red, 0, 0, header_height - 1, header_height - 1)
+#define ICON_WH         32
 
 enum mtl_display_mode {
 	MTL_DM_800x480,		/* Full touch screen */
@@ -68,6 +68,7 @@
 
 int sb_vis = 0;
 uint32_t header_height;
+uint32_t *busyarea, *hourglass;
 enum sbtype sb = SB_CHERI;
 enum mtl_display_mode res = MTL_DM_720x480;
 static int zombies_waiting = 0;
@@ -87,6 +88,68 @@
 }
 
 static void
+init_busy(void)
+{
+	int pfd;
+	struct iboxstate *is;
+
+	if ((busyarea = malloc(sizeof(uint32_t) * 32 * 32)) == NULL)
+		err(1, "malloc of busyarea failed");
+
+	if ((pfd = open("/usr/share/images/icons.png", O_RDONLY)) == -1)
+		err(1, "Failed to open icons.png");
+	if ((is = png_read_start(pfd, 32, 2048, -1, SB_NONE)) == NULL)
+		errx(1, "Failed to start PNG decode for icons.png");
+	if (png_read_finish(is) != 0)
+		errx(1, "png_read_finish() failed for icons.png");
+	
+	if ((hourglass = malloc(sizeof(uint32_t) * 32 * 32)) == NULL)
+		err(1, "malloc of hourglass failed");
+	memcpy(hourglass, __DEVOLATILE(uint32_t *,
+	    is->buffer + (32 * 32 * 20)), sizeof(uint32_t) * 32 * 32);
+	iboxstate_free(is);
+}
+
+static void
+busy(int init)
+{
+	int c, r;
+
+	if (init)
+		memcpy(busyarea, hourglass,
+		    sizeof(uint32_t) * ICON_WH * ICON_WH);
+	else
+		/*
+		 * Save all parts of the busy area that don't match the
+		 * hourglass.
+		 */
+		for (r = 0; r < ICON_WH; r++)
+			for(c = 0; c < ICON_WH; c++)
+				if (pfbp[r * fb_width + c] !=
+				    hourglass[r * ICON_WH + c])
+					busyarea[r * ICON_WH + c] =
+					    pfbp[r * fb_width + c];
+	/* Draw the hourglass */
+	fb_post_region(hourglass, 0, 0, ICON_WH, ICON_WH);
+}
+
+static void
+unbusy(void)
+{
+	int c, r;
+	
+	busy(0);
+
+	/* Restore the parts that don't match the hourglass */
+	for (r = 0; r < ICON_WH; r++)
+		for(c = 0; c < ICON_WH; c++)
+			if (busyarea[r * ICON_WH + c] !=
+			    hourglass[r * ICON_WH + c])
+				pfbp[r * fb_width + c] =
+				    busyarea[r * ICON_WH + c];
+}
+
+static void
 set_display_mode(enum mtl_display_mode dm)
 {
 
@@ -386,7 +449,7 @@
 
 	printf("rendering cover\n");
 
-	FB_BUSY;
+	busy(1);
 
 	if ((pfd = openat(dfd, cover, O_RDONLY)) == -1) {
 		warn("Failed to open %s", cover);
@@ -414,6 +477,8 @@
 		fb_rectangle(red, 2, 0, 0, is->width, is->height);
 	iboxstate_free(is);
 
+	unbusy();
+
 	return (0);
 }
 
@@ -433,7 +498,7 @@
 
 	printf("rendering slide %s\n", slide);
 
-	FB_BUSY;
+	busy(1);
 
 	if ((pfd = openat(dfd, slide, O_RDONLY)) == -1) {
 		warn("Failed to open %s", slide);
@@ -454,7 +519,7 @@
 		return (-1);
 	}
 	fb_fill_region(white, 0, 0, fb_width, fb_height);
-	FB_BUSY;
+	busy(0);
 	fb_post_region(__DEVOLATILE(uint32_t *, is->buffer),
 	    slide_fcol + ((slide_width - is->width) / 2), header_height,
 	    is->width, is->height < slide_height ? is->height : slide_height);
@@ -480,7 +545,7 @@
 	}
 	iboxstate_free(is);
 
-	FB_BUSY;
+	busy(0);
 
 	/* put an SRI logo in the lower left corner */
 	if ((pfd = open("/usr/share/images/sri.png", O_RDONLY)) == -1) {
@@ -570,6 +635,8 @@
 		    0, hdris->width, hdris->height);
 	iboxstate_free(hdris);
 
+	unbusy();
+
 	return (error);
 }
 
@@ -763,6 +830,7 @@
 	fb_fill_region(white, 0, 0, fb_width, fb_height);
         fb_fade2on(); 
         fb_load_syscons_font(NULL, "/usr/share/syscons/fonts/iso-8x16.fnt");
+	init_busy();
 
 	if (forkflag) {
 		if ((slidep = mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE,
@@ -790,6 +858,9 @@
 		/* XXX: doesn't support symlinks */
 		if (entry->d_type != DT_REG)
 			continue;
+		/* Skip obvious non-PNGs */
+		if (fnmatch("*.[pP][nN][gG]", entry->d_name, 0) != 0)
+			continue;
 
 		if (fnmatch("*-cover-*.png", entry->d_name, 0) == 0)
 			addslide(&ncovers, &maxcovers, &covers, entry->d_name);


More information about the p4-projects mailing list