PERFORCE change 214310 for review

Brooks Davis brooks at FreeBSD.org
Thu Jul 12 22:50:39 UTC 2012


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

Change 214310 by brooks at brooks_ecr_current on 2012/07/12 22:50:17

	Add the beginnings of a dialog box function.  Currently only pinch to
	close is supported, but basic text rendering works.
	
	Also add a function to fill buffers with a given color.

Affected files ...

.. //depot/projects/ctsrd/beribsd/src/ctsrd-lib/libde4tc/de4tc.c#7 edit
.. //depot/projects/ctsrd/beribsd/src/ctsrd-lib/libde4tc/de4tc.h#7 edit

Differences ...

==== //depot/projects/ctsrd/beribsd/src/ctsrd-lib/libde4tc/de4tc.c#7 (text+ko) ====

@@ -267,6 +267,16 @@
 
 
 void
+fb_fill_buf(u_int32_t *buf, u_int32_t color, int width, int height)
+{
+  int i;
+
+  for (i = 0; i < width * height; i++)
+    buf[i] = color;
+}
+
+
+void
 fb_post(u_int32_t *buf)
 {
   int addr;
@@ -511,3 +521,126 @@
     for(x=0; x<maxwidth; x++)
       imgbuf[x+y*maxwidth] = 0;
 }
+
+#define	FBD_BORDER_LWIDTH	2
+#define FBD_BORDER_SPACE	3
+#define	FBD_BORDER_WIDTH	(FBD_BORDER_LWIDTH + FBD_BORDER_SPACE * 2)
+fb_dialog_action
+fb_dialog(fb_dialog_type type, u_int32_t bcolor, u_int32_t bgcolor,
+    u_int32_t tcolor, const char *title, const char *text)
+{
+	int dheight, dwidth, x0, y0, x, y;
+	int i, textlines, linewidth, maxwidth;
+	int textheight, textwidth, titleheight, titlewidth;
+	char **lines;
+	char *textdup;
+	u_int32_t *textbuf, *titlebuf;
+	struct tsstate *ts;
+
+	titlewidth = strlen(title) * fb_get_font_width() * 2;
+	titleheight = fb_get_font_height() * 2;
+
+	textlines = 0;
+	linewidth = 0;
+	textwidth = 0;
+	for (i = 0; text[i] != '\0'; i++) {
+		if (text[i] == '\n') {
+			textlines++;
+			textwidth = (linewidth > textwidth) ? linewidth :
+			    textwidth;
+			linewidth = 0;
+		} else
+			linewidth++;
+	}
+	textlines++;
+	textwidth = (linewidth > textwidth) ? linewidth : textwidth;
+	textwidth *= fb_get_font_width() * 2;
+	textheight = fb_get_font_height() * 2;
+
+	maxwidth = (textwidth > titlewidth) ? textwidth : titlewidth;
+
+	dwidth = FBD_BORDER_WIDTH + maxwidth + FBD_BORDER_WIDTH;
+	if (dwidth > fb_width)
+		errx(1, "text too wide");
+
+	dheight = FBD_BORDER_WIDTH + titleheight + FBD_BORDER_WIDTH +
+	    textheight * textlines + FBD_BORDER_WIDTH;
+	if (dheight > fb_height)
+		errx(1, "text too tall");
+
+	x0 = (fb_width - dwidth) / 2;
+	y0 = (fb_height - dheight) / 2;
+
+	lines = malloc(textlines * sizeof(char *));
+	if (lines == NULL)
+		err(1, "malloc");
+	textdup = strdup(text);
+	if (textdup == NULL)
+		err(1, "strdup");
+	textlines = 0;
+	lines[textlines] = textdup;
+	for (i = 0; textdup[i] != '\0'; i++) {
+		if (textdup[i] == '\n') {
+			textdup[i] = '\0';
+			lines[++textlines] = &textdup[i+1];
+		}
+	}
+	textlines++;
+
+	fb_fill_region(bgcolor, x0, y0, dwidth, dheight);
+	for (x = x0 + FBD_BORDER_SPACE; x < x0 + dwidth - FBD_BORDER_SPACE;
+	    x++) {
+		for (y = 0; y < FBD_BORDER_LWIDTH; y++) {
+			fb_putpixel(x, y0 + FBD_BORDER_SPACE + y, bcolor);
+			fb_putpixel(x, y0 + FBD_BORDER_SPACE + y + 
+			    FBD_BORDER_WIDTH + titleheight, bcolor);
+			fb_putpixel(x, y0 + FBD_BORDER_SPACE + y + dheight -
+			    FBD_BORDER_WIDTH, bcolor);
+		}
+	}
+	for (y = y0 + FBD_BORDER_SPACE; y < y0 + dheight - FBD_BORDER_SPACE;
+	    y++) {
+		for (x = 0; x < FBD_BORDER_LWIDTH; x++) {
+			fb_putpixel(x0 + FBD_BORDER_SPACE + x, y, bcolor);
+			fb_putpixel(x0 + dwidth + FBD_BORDER_SPACE + x -
+			    FBD_BORDER_WIDTH, y, bcolor);
+		}
+	}
+
+	titlebuf = malloc(sizeof(u_int32_t) * titlewidth * titleheight);
+	if (titlebuf == NULL)
+		err(1, "malloc");
+	fb_render_text(title, 2, tcolor, bgcolor, titlebuf,
+	    titlewidth, titleheight);
+	fb_post_region(titlebuf,
+	    x0 + (dwidth - titlewidth) / 2, y0 + FBD_BORDER_WIDTH,
+	    titlewidth, titleheight);
+	free(titlebuf);
+
+	printf("text width %d height %d\n", textwidth, textheight);
+	textbuf = malloc(sizeof(u_int32_t) * textwidth * textheight);
+	if (textbuf == NULL)
+		err(1, "malloc");
+	for(i = 0; i < textlines; i++) {
+		printf("writing text '%s'\n", lines[i]);
+		fb_fill_buf(textbuf, bgcolor, textwidth, textheight);
+		fb_render_text(lines[i], 2, tcolor, bgcolor, textbuf,
+		    textwidth, textheight);
+		fb_post_region(textbuf, x0 + FBD_BORDER_WIDTH,
+		    y0 + 2 * FBD_BORDER_WIDTH + titleheight + i * textheight,
+		    textwidth, textheight);
+	}
+	free(textbuf);
+	free(lines);
+
+	switch (type) {
+	case FBDT_PINCH2CLOSE:
+		for (;;) {
+			ts = ts_poll();
+			if (ts->ts_gesture == TSG2_ZOOM_OUT)
+				return(FBDA_OK);
+		}
+	default:
+		err(1, "Unhandled dialog type");
+	}
+}

==== //depot/projects/ctsrd/beribsd/src/ctsrd-lib/libde4tc/de4tc.h#7 (text+ko) ====

@@ -57,6 +57,22 @@
 #define	TSG2_ZOOM_IN	0x48
 #define	TSG2_ZOOM_OUT	0x49
 
+typedef enum {
+	FBDA_CANCEL,
+	FBDA_OK,
+	FBDA_YES,
+	FBDA_NO
+} fb_dialog_action;
+        
+typedef enum {
+	FBDT_PINCH2CLOSE,
+#ifdef NOTYET
+	FBDT_OK,
+	FBDT_OKCANCEL,
+	FBDT_YESNO
+#endif
+} fb_dialog_type;
+
 struct tsstate {
 	int ts_x1;
 	int ts_y1;
@@ -89,6 +105,7 @@
 void fb_putpixel(int px, int py, int colour);
 void fb_fill(int col);
 void fb_fill_region(u_int32_t colour, int x, int y, int w, int h);
+void fb_fill_buf(u_int32_t *buf, u_int32_t color, int width, int height);
 void fb_post(u_int32_t *buf);
 void fb_post_region(u_int32_t *buf, int x, int y, int w, int h);
 void fb_blend(int blend_text_bg, int blend_text_fg, int blend_pixel, int wash);
@@ -96,6 +113,7 @@
 void fb_fade2off(void);
 void fb_fade2on(void);
 void fb_fade2text(int textbg_alpha);
+
 void plot_line(int x1, int y1, int x2, int y2, unsigned int colour);
 void read_png_file(const char* file_name, u_int32_t* imgbuf, int maxwidth, int maxheight);
 
@@ -104,5 +122,7 @@
 int fb_get_font_width(void);
 void fb_render_text(const char *string, int expand, u_int32_t con, u_int32_t coff,
     u_int32_t *buffer, int w, int h);
+fb_dialog_action fb_dialog(fb_dialog_type type, u_int32_t bcolor,
+    u_int32_t bgcolor, u_int32_t tcolor, const char *title, const char *text);
 
 #endif /* !_DE4TC_H_ */


More information about the p4-projects mailing list