pmaports/busybox/0006-fbsplash-support-image-and-bar-alignment-and-positio.patch
Oliver Smith 1c0ff6aa23 Put postmarketOS aports inside pmbootstrap repo
Later, the aports folder will probably get split up in its own repository.
But right now this is simply convenient.
2017-05-26 22:26:25 +02:00

185 lines
5.1 KiB
Diff

From 1dab8b58ff051d529fd3fd74caf6016e51b10ae3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi>
Date: Fri, 21 Nov 2014 16:06:34 +0200
Subject: [PATCH 06/12] fbsplash: support image and bar alignment and
positioning
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
---
miscutils/fbsplash.c | 91 +++++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 76 insertions(+), 15 deletions(-)
diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
index ec5947314..34bbf81f5 100644
--- a/miscutils/fbsplash.c
+++ b/miscutils/fbsplash.c
@@ -53,6 +53,7 @@
//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)"
@@ -71,13 +72,38 @@
/* If you want logging messages on /tmp/fbsplash.log... */
#define DEBUG 0
+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;
@@ -94,14 +120,6 @@ struct globals {
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) { \
@@ -382,7 +400,7 @@ static void fb_drawimage(void)
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;
@@ -432,18 +450,46 @@ static void fb_drawimage(void)
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);
@@ -462,9 +508,17 @@ static void fb_drawimage(void)
*/
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"
@@ -474,14 +528,21 @@ static void init(const char *cfg_filename)
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");
--
2.11.0