0008-fbsplash-support-image-and-bar-alignment-and-positio.patch 4.96 KB
Newer Older
1
From 97fcb49bfbe74fa17a52e63b2196d8a5c3b27d93 Mon Sep 17 00:00:00 2001
2 3
From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi>
Date: Fri, 21 Nov 2014 16:06:34 +0200
4
Subject: [PATCH 08/16] fbsplash: support image and bar alignment and
5
 positioning
6 7 8 9 10 11

---
 miscutils/fbsplash.c | 91 +++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 76 insertions(+), 15 deletions(-)

diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
12
index bc80f728c..9089131b8 100644
13 14
--- a/miscutils/fbsplash.c
+++ b/miscutils/fbsplash.c
15
@@ -53,6 +53,7 @@
16 17 18 19 20 21 22
 //usage:     "\n	-c	Hide cursor"
 //usage:     "\n	-d	Framebuffer device (default /dev/fb0)"
 //usage:     "\n	-i	Config file (var=value):"
+//usage:     "\n			IMAGE_ALIGN"
 //usage:     "\n			BAR_LEFT,BAR_TOP,BAR_WIDTH,BAR_HEIGHT"
 //usage:     "\n			BAR_R,BAR_G,BAR_B"
 //usage:     "\n	-f	Control pipe (else exit after drawing image)"
23 24 25
@@ -73,13 +74,38 @@
 
 #define ESC "\033"
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
 
+enum {
+	image_align,
+
+	image_posx,
+	image_posy,
+	bar_width,
+	bar_height,
+	bar_posx,
+	bar_posy,
+	bar_colr,
+	bar_colg,
+	bar_colb,
+
+	debug
+};
+
+#define nimage_align	ns[image_align]
+#define nbar_width	ns[bar_width]
+#define nbar_height	ns[bar_height]
+#define nbar_posx	ns[bar_posx]
+#define nbar_posy	ns[bar_posy]
+#define nbar_colr	ns[bar_colr]
+#define nbar_colg	ns[bar_colg]
+#define nbar_colb	ns[bar_colb]
+
 struct globals {
 #if DEBUG
 	bool bdebug_messages;	// enable/disable logging
 	FILE *logfile_fd;	// log file
 #endif
 	unsigned char *addr;	// pointer to framebuffer memory
-	unsigned ns[7];		// n-parameters
+	unsigned ns[debug+1];		// n-parameters
 	const char *image_filename;
 	int silent_tty, fd_tty_s;
 	bool do_not_draw;
63
@@ -96,14 +122,6 @@ struct globals {
64 65 66 67 68 69 70 71 72 73 74 75 76 77
 	SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
 } while (0)
 
-#define nbar_width	ns[0]	// progress bar width
-#define nbar_height	ns[1]	// progress bar height
-#define nbar_posx	ns[2]	// progress bar horizontal position
-#define nbar_posy	ns[3]	// progress bar vertical position
-#define nbar_colr	ns[4]	// progress bar color red component
-#define nbar_colg	ns[5]	// progress bar color green component
-#define nbar_colb	ns[6]	// progress bar color blue component
-
 #if DEBUG
 #define DEBUG_MESSAGE(strMessage, args...) \
 	if (G.bdebug_messages) { \
78
@@ -384,7 +402,7 @@ static void fb_drawimage(void)
79 80 81 82 83 84 85 86
 	FILE *theme_file;
 	char *read_ptr;
 	unsigned char *pixline;
-	unsigned i, j, width, height, line_size;
+	int i, j, width, height, line_size, xoffs, yoffs, xstart;
 
 	if (LONE_DASH(G.image_filename)) {
 		theme_file = stdin;
87
@@ -434,18 +452,46 @@ static void fb_drawimage(void)
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
 	line_size = width*3;
 	pixline = xmalloc(line_size);
 
+#if 0
 	if (width > G.scr_var.xres)
 		width = G.scr_var.xres;
 	if (height > G.scr_var.yres)
 		height = G.scr_var.yres;
-	for (j = 0; j < height; j++) {
+#endif
+
+	xoffs = yoffs = 0;
+	switch (G.nimage_align % 3) {
+	case 1: xoffs = (G.scr_var.xres - width) / 2; break;
+	case 2: xoffs = G.scr_var.xres - width; break;
+	}
+	xstart = 0;
+	if (xoffs < 0) {
+		xstart = -xoffs;
+		width -= xstart;
+		xoffs = 0;
+	}
+	xoffs *= G.bytes_per_pixel;
+	if (width > G.scr_var.xres)
+		width = G.scr_var.xres;
+
+	switch (G.nimage_align / 3) {
+	case 1: yoffs = (G.scr_var.yres - height) / 2; break;
+	case 2: yoffs = G.scr_var.yres - height; break;
+	}
+
+	for (j = 0; j < height && yoffs < G.scr_var.yres; j++, yoffs++) {
 		unsigned char *pixel;
 		unsigned char *src;
 
 		if (fread(pixline, 1, line_size, theme_file) != line_size)
 			bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
+
+		if (yoffs < 0)
+			continue;
+
 		pixel = pixline;
-		src = G.addr + j * G.scr_fix.line_length;
+		src = G.addr + yoffs * G.scr_fix.line_length + xoffs;
+
 		for (i = 0; i < width; i++) {
 			unsigned thispix = fb_pixel_value(pixel[0], pixel[1], pixel[2]);
 			fb_write_pixel(src, thispix);
136
@@ -464,9 +510,17 @@ static void fb_drawimage(void)
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
  */
 static void init(const char *cfg_filename)
 {
+	static const char align_names[] ALIGN1 =
+		"LT\0" "CT\0" "RT\0"
+		"LM\0" "CM\0" "RM\0"
+		"LB\0" "CB\0" "RB\0";
 	static const char param_names[] ALIGN1 =
+		"IMAGE_ALIGN\0"
+
+		"IMAGE_X\0" "IMAGE_Y\0"
 		"BAR_WIDTH\0" "BAR_HEIGHT\0"
 		"BAR_LEFT\0" "BAR_TOP\0"
+
 		"BAR_R\0" "BAR_G\0" "BAR_B\0"
 #if DEBUG
 		"DEBUG\0"
154
@@ -476,14 +530,21 @@ static void init(const char *cfg_filename)
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
 	parser_t *parser = config_open2(cfg_filename, xfopen_stdin);
 	while (config_read(parser, token, 2, 2, "#=",
 				(PARSE_NORMAL | PARSE_MIN_DIE) & ~(PARSE_TRIM | PARSE_COLLAPSE))) {
-		unsigned val = xatoi_positive(token[1]);
+		unsigned val;
 		int i = index_in_strings(param_names, token[0]);
+
 		if (i < 0)
 			bb_error_msg_and_die("syntax error: %s", token[0]);
-		if (i >= 0 && i < 7)
+
+		if (i <= image_align)
+			val = index_in_strings(align_names, token[1]);
+		else
+			val = xatoi_positive(token[1]);
+
+		if (i < debug)
 			G.ns[i] = val;
 #if DEBUG
-		if (i == 7) {
+		if (i == debug) {
 			G.bdebug_messages = val;
 			if (G.bdebug_messages)
 				G.logfile_fd = xfopen_for_write("/tmp/fbsplash.log");
-- 
180
2.16.2
181