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