Date: Thu, 15 Nov 2012 23:55:53 GMT From: Brooks Davis <brooks@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 219802 for review Message-ID: <201211152355.qAFNtrJ7081922@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@219802?ac=10 Change 219802 by brooks@brooks_zenith on 2012/11/15 23:55:22 Add a busy indicator when rendering slides. Change the rendering order to draw the main image first and to not start drawing other than the busy indicator before the main image is loaded. Preserve the decode, draw, decode, ... sequence in an effort to show the relative speed of sandboxing technologies. Affected files ... .. //depot/projects/ctsrd/cheribsd/src/ctsrd/cheripoint/cheripoint.c#9 edit Differences ... ==== //depot/projects/ctsrd/cheribsd/src/ctsrd/cheripoint/cheripoint.c#9 (text+ko) ==== @@ -51,13 +51,14 @@ #include <syslog.h> #include <unistd.h> - #define vwhite(v) fb_colour((v), (v), (v)) #define black vwhite(0) #define white vwhite(0xFF) #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) + enum mtl_display_mode { MTL_DM_800x480, /* Full touch screen */ MTL_DM_720x480, /* Full 480p HDMI out */ @@ -66,6 +67,7 @@ }; int sb_vis = 0; +uint32_t header_height; enum sbtype sb = SB_CHERI; enum mtl_display_mode res = MTL_DM_720x480; static int zombies_waiting = 0; @@ -384,7 +386,7 @@ printf("rendering cover\n"); - fb_fill_region(white, 0, 0, fb_width, fb_height); + FB_BUSY; if ((pfd = openat(dfd, cover, O_RDONLY)) == -1) { warn("Failed to open %s", cover); @@ -399,6 +401,7 @@ warnx("png_read_finish() failed for %s", cover); return (-1); } + fb_fill_region(white, 0, 0, fb_width, fb_height); fb_post_region(__DEVOLATILE(uint32_t *, is->buffer), 0, 0, is->width, is->height); if (is->width < (uint)fb_width) { @@ -423,14 +426,59 @@ size_t olen; char sntext[8]; uint32_t *snimage; - uint32_t r, header_height; - struct iboxstate *is; + uint32_t r; + struct iboxstate *is, *hdris; error = 0; printf("rendering slide %s\n", slide); + FB_BUSY; + + if ((pfd = openat(dfd, slide, O_RDONLY)) == -1) { + warn("Failed to open %s", slide); + return (-1); + } + if (sb == SB_CHERI) { + olen = sizeof(sv1); + sysctlbyname("security.cheri.syscall_violations", + &sv1, &olen, NULL, 0); + } + if ((is = png_read_start(pfd, slide_width, fb_height, slidenum, + sb)) == NULL) { + warn("Failed to start PNG decode for %s", slide); + return (-1); + } + if (png_read_finish(is) != 0) { + warnx("png_read_finish() failed for %s", slide); + return (-1); + } fb_fill_region(white, 0, 0, fb_width, fb_height); + FB_BUSY; + 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); + if (sb_vis && sb != SB_NONE) + fb_rectangle(red, 2, + slide_fcol + ((slide_width - is->width) / 2), + header_height, is->width, + is->height < slide_height ? is->height : slide_height); + switch (sb) { + case SB_CAPSICUM: + if (is->error == 99) + error = 99; + break; + case SB_CHERI: + olen = sizeof(sv2); + sysctlbyname("security.cheri.syscall_violations", + &sv2, &olen, NULL, 0); + if (sv1 != sv2) + error = 99; + break; + default: + break; + } + iboxstate_free(is); /* * Draw the header with image at the upper right. Assume @@ -441,25 +489,26 @@ warn("Failed to open header.png"); return (-1); } - if ((is = png_read_start(pfd, slide_width, fb_height, -1, sb)) == + if ((hdris = png_read_start(pfd, slide_width, fb_height, -1, sb)) == NULL) { warn("Failed to start PNG decode for header.png"); return (-1); } - if (png_read_finish(is) != 0) { + if (png_read_finish(hdris) != 0) { warnx("png_read_finish() failed for header.png"); return (-1); } /* Fill in the header's background. */ - for (r = 0; r < is->height; r++) - fb_fill_region(is->buffer[r * is->width], 0, r, fb_width, 1); - fb_post_region(__DEVOLATILE(uint32_t *, is->buffer), - slide_fcol + slide_width - is->width, 0, is->width, is->height); + for (r = 0; r < hdris->height; r++) + fb_fill_region(hdris->buffer[r * hdris->width], 0, r, + fb_width, 1); + fb_post_region(__DEVOLATILE(uint32_t *, hdris->buffer), + slide_fcol + slide_width - hdris->width, 0, hdris->width, + hdris->height); + FB_BUSY; if (sb_vis && sb != SB_NONE) - fb_rectangle(red, 2, slide_fcol + slide_width - is->width, - 0, is->width, is->height); - header_height = is->height; - iboxstate_free(is); + fb_rectangle(red, 2, slide_fcol + slide_width - hdris->width, + 0, hdris->width, hdris->height); /* put an SRI logo in the lower left corner */ if ((pfd = open("/usr/share/images/sri.png", O_RDONLY)) == -1) { @@ -502,49 +551,6 @@ fb_height - is->height, is->width, is->height); iboxstate_free(is); - if ((pfd = openat(dfd, slide, O_RDONLY)) == -1) { - warn("Failed to open %s", slide); - return (-1); - } - if (sb == SB_CHERI) { - olen = sizeof(sv1); - sysctlbyname("security.cheri.syscall_violations", - &sv1, &olen, NULL, 0); - } - if ((is = png_read_start(pfd, slide_width, fb_height, slidenum, - sb)) == NULL) { - warn("Failed to start PNG decode for %s", slide); - return (-1); - } - if (png_read_finish(is) != 0) { - warnx("png_read_finish() failed for %s", slide); - return (-1); - } - 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); - if (sb_vis && sb != SB_NONE) - fb_rectangle(red, 2, - slide_fcol + ((slide_width - is->width) / 2), - header_height, is->width, - is->height < slide_height ? is->height : slide_height); - switch (sb) { - case SB_CAPSICUM: - if (is->error == 99) - error = 99; - break; - case SB_CHERI: - olen = sizeof(sv2); - sysctlbyname("security.cheri.syscall_violations", - &sv2, &olen, NULL, 0); - if (sv1 != sv2) - error = 99; - break; - default: - break; - } - iboxstate_free(is); - f_width = fb_get_font_width(); f_height = fb_get_font_height(); if ((uint)slidenum < (sizeof(sntext) - 1) * 10) { @@ -562,6 +568,16 @@ free(snimage); } + /* Drawing done, redraw header to clear FB_BUSY */ + fb_post_region(__DEVOLATILE(uint32_t *, hdris->buffer), + slide_fcol + slide_width - hdris->width, 0, hdris->width, + hdris->height); + /* Fill in the header's background. */ + for (r = 0; r < hdris->height; r++) + fb_fill_region(hdris->buffer[r * hdris->width], 0, r, + fb_width, 1); + iboxstate_free(hdris); + return (error); } @@ -704,6 +720,22 @@ } } +static void +init_header_height(void) +{ + int pfd; + struct iboxstate *is; + + if ((pfd = open("/usr/share/images/header.png", O_RDONLY)) == -1) + err(1, "Failed to open header.png"); + if ((is = png_read_start(pfd, slide_width, fb_height, -1, sb)) == NULL) + errx(1, "Failed to start PNG decode for header.png"); + if (png_read_finish(is) != 0) + errx(1, "png_read_finish() failed for header.png"); + header_height = is->height; + iboxstate_free(is); +} + int main(int argc, char **argv) { @@ -754,6 +786,7 @@ busy_indicator(); set_display_mode(res); + init_header_height(); printf("reading slides\n");
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211152355.qAFNtrJ7081922>