[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: Re: [fbsplash patch] - text rendering.
From: Michele Sanges <michele.sanges () gmail ! com>
Date: 2008-09-25 16:45:23
Message-ID: 48DBC023.8030405 () gmail ! com
[Download RAW message or body]
Bernhard Reutner-Fischer ha scritto:
> On Wed, Sep 24, 2008 at 11:21:49PM +0200, Michele Sanges wrote:
>
> please fix that typo:
>
> s/dinamically/dynamically/g
>
> > +#if ENABLE_FONTMAP_DINAMICALLY_LOADED
Done.
> > diff -urP /tmp/acroread_0_0/busybox-1.12.0/miscutils/fbsplash.cfg \
> > busybox-1.12.0/miscutils/fbsplash.cfg
> > --- /tmp/acroread_0_0/busybox-1.12.0/miscutils/fbsplash.cfg 2008-08-06 \
> > 00:56:08.000000000 +0200
> > +++ busybox-1.12.0/miscutils/fbsplash.cfg 2008-09-21 15:35:41.000000000 +0200
>
> wouldn't it be better to move this .cfg into examples/ ?
Moved.
Do you think you can create a directory 'examples/fbsplash' and put in
it the .cfg file and the 'fbsplash_fontmap' binary file, sent in my
previous email?
Thanks. Regards.
--
Michele Sanges
["fbsplash_patch25_09_08.diff" (text/plain)]
diff -urP /tmp/acroread_0_0/busybox-1.12.0/examples/fbsplash.cfg \
busybox-1.12.0/examples/fbsplash.cfg
--- /tmp/acroread_0_0/busybox-1.12.0/examples/fbsplash.cfg 1970-01-01 \
01:00:00.000000000 +0100
+++ busybox-1.12.0/examples/fbsplash.cfg 2008-09-21 15:35:41.000000000 +0200
@@ -0,0 +1,19 @@
+# progress bar position
+BAR_LEFT0
+BAR_TOP00
+BAR_WIDTH00
+BAR_HEIGHT
+# progress bar color
+BAR_R€
+BAR_G€
+BAR_B0
+# the below settings are active only if you enable the option \
FBSPLASH_TEXT_RENDERING +# text position
+TEXT_LEFT0
+TEXT_TOP50
+# text color
+TEXT_R€
+TEXT_G€
+TEXT_B0
+# text size (1 to 4)
+TEXT_SIZE=2
diff -urP /tmp/acroread_0_0/busybox-1.12.0/include/usage.h \
busybox-1.12.0/include/usage.h
--- /tmp/acroread_0_0/busybox-1.12.0/include/usage.h 2008-08-20 00:05:31.000000000 \
+0200
+++ busybox-1.12.0/include/usage.h 2008-09-21 23:58:08.000000000 +0200
@@ -128,7 +128,7 @@
"bar"
#define fbsplash_trivial_usage \
- "-s IMGFILE [-c] [-d DEV] [-i INIFILE] [-f CMD]"
+ "-s IMGFILE [-c] [-d DEV] [-i INIFILE] [-f CMD] [-m FONTMAPFILE]"
#define fbsplash_full_usage "\n\n" \
"Options:\n" \
"\n -s Image" \
@@ -137,8 +137,10 @@
"\n -i Config file (var=value):" \
"\n BAR_LEFT,BAR_TOP,BAR_WIDTH,BAR_HEIGHT" \
"\n BAR_R,BAR_G,BAR_B" \
+ "\n TEXT_LEFT,TEXT_TOP,TEXT_R,TEXT_G,TEXT_B,TEXT_SIZE" \
"\n -f Control pipe (else exit after drawing image)" \
- "\n commands: 'NN' (% for progress bar) or 'exit'" \
+ "\n -m Font map file" \
+ "\n commands: 'NN' (% for progress bar), 'write:string to print' or 'exit'"
#define brctl_trivial_usage \
"COMMAND [BRIDGE [INTERFACE]]"
diff -urP /tmp/acroread_0_0/busybox-1.12.0/miscutils/Config.in \
busybox-1.12.0/miscutils/Config.in
--- /tmp/acroread_0_0/busybox-1.12.0/miscutils/Config.in 2008-08-06 \
00:56:08.000000000 +0200
+++ busybox-1.12.0/miscutils/Config.in 2008-09-25 16:59:55.000000000 +0200
@@ -223,6 +223,34 @@
"NN" (ASCII decimal number) - percentage to show on progress bar
"exit" - well you guessed it
+config FBSPLASH_TEXT_RENDERING
+ bool "text rendering"
+ default n
+ depends on FBSPLASH
+ help
+ This option adds the ability to print text messages on the
+ image displayed by the fbsplash applet.
+ - command for fifo:
+ "write:string to print" - print the string after the word "write:"
+
+choice
+ prompt "Choose the font map"
+ depends on FBSPLASH_TEXT_RENDERING
+ default FONTMAP_HARDCODED
+
+config FONTMAP_HARDCODED
+ bool "hardcoded"
+ help
+ The font map is hard-coded to use the default font map.
+ Adds about 1.6Kb.
+
+config FONTMAP_DYNAMICALLY_LOADED
+ bool "dynamically loaded"
+ help
+ The font map is dynamically loaded from a file.
+ Adds about 700 byte.
+endchoice
+
config INOTIFYD
bool "inotifyd"
default n
diff -urP /tmp/acroread_0_0/busybox-1.12.0/miscutils/fbsplash.c \
busybox-1.12.0/miscutils/fbsplash.c
--- /tmp/acroread_0_0/busybox-1.12.0/miscutils/fbsplash.c 2008-08-06 \
00:56:08.000000000 +0200
+++ busybox-1.12.0/miscutils/fbsplash.c 2008-09-25 17:23:15.000000000 +0200
@@ -1,7 +1,6 @@
/* vi: set sw=4 ts=4: */
/*
- * Copyright (C) 2008 Michele Sanges <michele.sanges@otomelara.it>,
- * <michele.sanges@gmail.it>
+ * Copyright (C) 2008 Michele Sanges <michele.sanges@gmail.com>
*
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*
@@ -14,11 +13,13 @@
* -s path_to_image_file (can be "-" for stdin)
* -i path_to_cfg_file
* -f path_to_fifo (can be "-" for stdin)
+ * -m font map file
* - if you want to run it only in presence of a kernel parameter
* (for example fbsplash=on), use:
* grep -q "fbsplash=on" </proc/cmdline && setsid fbsplash [params]
* - commands for fifo:
* "NN" (ASCII decimal number) - percentage to show on progress bar.
+ * "write:string to print" - print the string after the word "write:"
* "exit" (or just close fifo) - well you guessed it.
*/
@@ -38,7 +39,7 @@
FILE *logfile_fd; // log file
#endif
unsigned char *addr; // pointer to framebuffer memory
- unsigned ns[7]; // n-parameters
+ unsigned ns[13]; // n-parameters
const char *image_filename;
struct fb_var_screeninfo scr_var;
struct fb_fix_screeninfo scr_fix;
@@ -55,6 +56,12 @@
#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
+#define text_posx ns[7] // text horizontal position
+#define text_posy ns[8] // text vertical position
+#define text_colr ns[9] // text color red component
+#define text_colg ns[10] // text color green component
+#define text_colb ns[11] // text color blue component
+#define text_size ns[12] // text size (1 to 4)
#if DEBUG
#define DEBUG_MESSAGE(strMessage, args...) \
@@ -66,6 +73,206 @@
#define DEBUG_MESSAGE(...) ((void)0)
#endif
+#if ENABLE_FBSPLASH_TEXT_RENDERING
+
+#if ENABLE_FONTMAP_HARDCODED
+static char fontmap[95][12] = {
+ //space (32)
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ // ! (33)
+{0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x80,0x00,0x00,0x00,0x00},
+ //" (34)
+{0x00,0xA0,0xA0,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ //# (35)
+{0x00,0x24,0x24,0x7E,0x28,0xFC,0x48,0x48,0x00,0x00,0x00,0x00},
+ //$ (36)
+{0x00,0x20,0x78,0xA0,0x60,0x30,0x28,0xF0,0x20,0x20,0x00,0x00},
+ //% (37)
+{0x00,0x64,0x98,0x98,0x7E,0x19,0x19,0x26,0x00,0x00,0x00,0x00},
+ //& (38)
+{0x00,0x60,0x90,0x90,0x68,0x90,0x98,0x64,0x00,0x00,0x00,0x00},
+ //' (39)
+{0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ //( (40)
+{0x00,0x20,0x40,0x80,0x80,0x80,0x80,0x80,0x80,0x40,0x20,0x00},
+ //) (41)
+{0x00,0x80,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x40,0x80,0x00},
+ //* (42)
+{0x00,0x20,0xA8,0x70,0xA8,0x20,0x00,0x00,0x00,0x00,0x00,0x00},
+ //+ (43)
+{0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00,0x00,0x00},
+ //, (44)
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80,0x00},
+ //- (45)
+{0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},
+ //. (112)
+{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00},
+ // / (47)
+{0x00,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x80,0x80,0x00,0x00},
+ //0 (48)
+{0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x60,0x00,0x00,0x00,0x00},
+ //1 (49)
+{0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0xE0,0x00,0x00,0x00,0x00},
+ //2 (50)
+{0x00,0xE0,0x10,0x10,0x20,0x40,0x80,0xF0,0x00,0x00,0x00,0x00},
+ //3 (51)
+{0x00,0xE0,0x10,0x10,0x60,0x10,0x10,0xE0,0x00,0x00,0x00,0x00},
+ //4 (52)
+{0x00,0x10,0x30,0x50,0x90,0xF8,0x10,0x10,0x00,0x00,0x00,0x00},
+ //5 (53)
+{0x00,0xF0,0x80,0x80,0xE0,0x10,0x10,0xE0,0x00,0x00,0x00,0x00},
+ //6 (54)
+{0x00,0x60,0x80,0x80,0xE0,0x90,0x90,0x60,0x00,0x00,0x00,0x00},
+ //7 (55)
+{0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0x00,0x00,0x00,0x00},
+ //8 (56)
+{0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x60,0x00,0x00,0x00,0x00},
+ //9 (57)
+{0x00,0x60,0x90,0x90,0x70,0x10,0x10,0x60,0x00,0x00,0x00,0x00},
+ //: (58)
+{0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x00},
+ //; (59)
+{0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x40,0x40,0x80},
+ //< (60)
+{0x00,0x00,0x00,0x08,0x70,0x80,0x70,0x08,0x00,0x00,0x00,0x00},
+ //= (61)
+{0x00,0x00,0x00,0x00,0xFC,0x00,0xFC,0x00,0x00,0x00,0x00,0x00},
+ //> (62)
+{0x00,0x00,0x00,0x80,0x70,0x08,0x70,0x80,0x00,0x00,0x00,0x00},
+ //? (63)
+{0x00,0xE0,0x10,0x10,0x20,0x40,0x00,0x40,0x00,0x00,0x00,0x00},
+ //@ (64)
+{0x00,0x38,0x44,0x9A,0xAA,0xAA,0x9C,0x40,0x38,0x00,0x00,0x00},
+ //A (65)
+{0x00,0x30,0x30,0x48,0x48,0xFC,0x84,0x84,0x00,0x00,0x00,0x00},
+ //B (66)
+{0x00,0xE0,0x90,0x90,0xF0,0x88,0x88,0xF0,0x00,0x00,0x00,0x00},
+ //C (67)
+{0x00,0x38,0x44,0x80,0x80,0x80,0x44,0x38,0x00,0x00,0x00,0x00},
+ //D (68)
+{0x00,0xF0,0x88,0x84,0x84,0x84,0x88,0xF0,0x00,0x00,0x00,0x00},
+ //E (69)
+{0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00,0x00,0x00},
+ //F (70)
+{0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0x80,0x00,0x00,0x00,0x00},
+ //G (71)
+{0x00,0x38,0x44,0x80,0x9C,0x84,0x44,0x3C,0x00,0x00,0x00,0x00},
+ //H (72)
+{0x00,0x84,0x84,0x84,0xFC,0x84,0x84,0x84,0x00,0x00,0x00,0x00},
+ //I (73)
+{0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0,0x00,0x00,0x00,0x00},
+ //J (74)
+{0x00,0x60,0x20,0x20,0x20,0x20,0x20,0xC0,0x00,0x00,0x00,0x00},
+ //K (75)
+{0x00,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00,0x00,0x00,0x00},
+ //L (76)
+{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00,0x00,0x00,0x00},
+ //M (77)
+{0x00,0xC6,0xC6,0xAA,0xAA,0x92,0x92,0x82,0x00,0x00,0x00,0x00},
+ //N (78)
+{0x00,0x84,0xC4,0xA4,0x94,0x8C,0x84,0x84,0x00,0x00,0x00,0x00},
+ //O (79)
+{0x00,0x38,0x44,0x82,0x82,0x82,0x44,0x38,0x00,0x00,0x00,0x00},
+ //P (80)
+{0x00,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x00,0x00,0x00,0x00},
+ //Q (81)
+{0x00,0x38,0x44,0x82,0x82,0x82,0x44,0x38,0x08,0x06,0x00,0x00},
+ //R (82)
+{0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88,0x00,0x00,0x00,0x00},
+ //S (83)
+{0x00,0x78,0x80,0x80,0x70,0x08,0x08,0xF0,0x00,0x00,0x00,0x00},
+ //T (84)
+{0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00},
+ //U (85)
+{0x00,0x84,0x84,0x84,0x84,0x84,0x84,0x78,0x00,0x00,0x00,0x00},
+ //V (86)
+{0x00,0x84,0x84,0x84,0x48,0x48,0x30,0x30,0x00,0x00,0x00,0x00},
+ //W (87)
+{0x00,0x92,0x92,0xAA,0xAA,0xAA,0x44,0x44,0x00,0x00,0x00,0x00},
+ //X (88)
+{0x00,0x90,0x90,0x60,0x60,0x60,0x90,0x90,0x00,0x00,0x00,0x00},
+ //Y (89)
+{0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00},
+ //Z (90)
+{0x00,0xF0,0x10,0x20,0x40,0x40,0x80,0xF0,0x00,0x00,0x00,0x00},
+ //[ (91)
+{0x00,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x00},
+ //\ (92)
+{0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x00,0x00},
+ //] (93)
+{0x00,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0x00},
+ //^ (94)
+{0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ //_ (95)
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00},
+ // (32)
+{0x00,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ //a (97)
+{0x00,0x00,0x00,0x60,0x10,0x70,0x90,0x70,0x00,0x00,0x00,0x00},
+ //b (98)
+{0x80,0x80,0x80,0xE0,0x90,0x90,0x90,0xE0,0x00,0x00,0x00,0x00},
+ //c (99)
+{0x00,0x00,0x00,0x60,0x80,0x80,0x80,0x60,0x00,0x00,0x00,0x00},
+ //d (100)
+{0x10,0x10,0x10,0x70,0x90,0x90,0x90,0x70,0x00,0x00,0x00,0x00},
+ //e (101)
+{0x00,0x00,0x00,0x60,0x90,0xF0,0x80,0x70,0x00,0x00,0x00,0x00},
+ //f (102)
+{0x60,0x80,0x80,0xE0,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00},
+ //g (103)
+{0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x60,0x00,0x00},
+ //h (104)
+{0x80,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x00,0x00,0x00,0x00},
+ //i (105)
+{0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00},
+ //j (106)
+{0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,0x80,0x00,0x00},
+ //k (107)
+{0x80,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x00,0x00,0x00,0x00},
+ //l (108)
+{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00},
+ //m (109)
+{0x00,0x00,0x00,0xEC,0x92,0x92,0x92,0x92,0x00,0x00,0x00,0x00},
+ //n (110)
+{0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0x00,0x00,0x00,0x00},
+ //o (111)
+{0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x60,0x00,0x00,0x00,0x00},
+ //p (112)
+{0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80,0x00,0x00},
+ //q (113)
+{0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x10,0x00,0x00},
+ //r (114)
+{0x00,0x00,0x00,0xA0,0xC0,0x80,0x80,0x80,0x00,0x00,0x00,0x00},
+ //s (115)
+{0x00,0x00,0x00,0xE0,0x80,0x40,0x20,0xE0,0x00,0x00,0x00,0x00},
+ //t (116)
+{0x00,0x00,0x80,0xC0,0x80,0x80,0x80,0x40,0x00,0x00,0x00,0x00},
+ //u (117)
+{0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x00,0x00,0x00,0x00},
+ //v (118)
+{0x00,0x00,0x00,0x88,0x50,0x50,0x50,0x20,0x00,0x00,0x00,0x00},
+ //w (119)
+{0x00,0x00,0x00,0x92,0x92,0xAA,0x6C,0x44,0x00,0x00,0x00,0x00},
+ //x (120)
+{0x00,0x00,0x00,0xA0,0x40,0x40,0x40,0xA0,0x00,0x00,0x00,0x00},
+ //y (121)
+{0x00,0x00,0x00,0x88,0x50,0x50,0x50,0x20,0x20,0x40,0x00,0x00},
+ //z (122)
+{0x00,0x00,0x00,0xE0,0x20,0x40,0x80,0xE0,0x00,0x00,0x00,0x00},
+ //{ (123)
+{0x00,0x20,0x40,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x20,0x00},
+ //| (124)
+{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00},
+ //} (125)
+{0x00,0x80,0x40,0x40,0x40,0x40,0x20,0x40,0x40,0x40,0x80,0x00},
+ //~ (126)
+{0x00,0x60,0x90,0x90,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};
+
+#else
+ static char (*fontmap)[12];
+#endif
+#endif
+
/**
* Open and initialize the framebuffer device
@@ -213,9 +420,13 @@
/**
- * Draw image from PPM file
+ * Draws a PPM image.
+ * \param nXPos horizontal position from which draw the image.
+ * \param nYPos vertical position from which draw the image. With nXPos=-1 and \
nYPos=-1, draws the full image. + * \param nXDim horizontal dimension of the image \
section to draw. + * \param nYDim vertical dimension of the image section to draw.
*/
-static void fb_drawimage(void)
+static void fb_drawimage(int nXPos, int nYPos, int nXDim, int nYDim)
{
char head[256];
char s[80];
@@ -254,13 +465,29 @@
height = G.scr_var.yres;
pixline = xmalloc(line_size);
- for (j = 0; j < height; j++) {
- unsigned char *pixel = pixline;
- DATA *src = (DATA *)(G.addr + j * G.scr_fix.line_length);
+
+ if (nYPos == -1) {
+ nYPos = 0;
+ }
+ else {
+ fseek(theme_file, line_size * nYPos, SEEK_CUR);
+ height = nYPos + nYDim;
+ }
+
+ if (nXPos == -1) {
+ nXPos = 0;
+ }
+ else {
+ width = nXPos + nXDim;
+ }
+
+ for (j = nYPos; j < height; j++) {
+ unsigned char *pixel = pixline + 3 * nXPos;
+ DATA *src = (DATA *)(G.addr + (j * G.scr_var.xres + nXPos) * BYTES_PER_PIXEL);
if (fread(pixline, 1, line_size, theme_file) != line_size)
bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
- for (i = 0; i < width; i++) {
+ for (i = nXPos; i < width; i++) {
unsigned thispix;
thispix = (((unsigned)pixel[0] << 8) & 0xf800)
| (((unsigned)pixel[1] << 3) & 0x07e0)
@@ -274,6 +501,73 @@
}
+#if ENABLE_FBSPLASH_TEXT_RENDERING
+/**
+ * Draws a single character on framebuffer.
+ * \param nXPos horizontal position from which draw the character.
+ * \param nYPos vertical position from which draw the character.
+ * \param nCharSize character scale factor [1..4].
+ * \param nChar character to draw.
+ */
+static void fb_drawchar(int nXPos, int nYPos, int nCharSize, int nChar)
+{
+ unsigned char nred, ngreen, nblue;
+ DATA *ptr, thispix;
+
+ nred = G.text_colr;
+ ngreen = G.text_colg;
+ nblue = G.text_colb;
+
+ nred >>= 3; // 5-bit red
+ ngreen >>= 2; // 6-bit green
+ nblue >>= 3; // 5-bit blue
+ thispix = nblue + (ngreen << 5) + (nred << (5+6));
+
+ for (int nHeight = 0; nHeight < 12 * nCharSize; nHeight++) {
+ for (int nWidth = 0; nWidth < 8 * nCharSize; nWidth++) {
+ if ((fontmap[nChar - 32][nHeight / nCharSize] & (0x80 >> (nWidth / nCharSize))) \
!= 0) { + ptr = (DATA*)(G.addr + ((nYPos + nHeight) * G.scr_var.xres + (nXPos + \
nWidth)) * BYTES_PER_PIXEL); + *ptr = thispix;
+ }
+ }
+ }
+}
+
+
+/**
+ * Draws a string on framebuffer.
+ * \param *strString pointer to the string.
+ */
+static void fb_drawstring(char *strString)
+{
+ int nCharSize;
+ static int nOldCharSize = -1;
+ static int nOldStringSize = -1; // in pixel
+
+ // size check
+ nCharSize = G.text_size;
+ if (nCharSize < 1)
+ nCharSize = 1;
+ else if (nCharSize > 4)
+ nCharSize = 4;
+
+ // redraws the portion of image interested to the old write operation
+ if (nOldStringSize != -1) {
+ fb_drawimage(G.text_posx, G.text_posy, nOldStringSize, 12 * nCharSize);
+ }
+
+ // new write operation
+ for (int nCharNum = 0; nCharNum < strlen(strString); nCharNum++) {
+ char c = *(strString + nCharNum);
+ fb_drawchar(G.text_posx + 8 * nCharSize * nCharNum, G.text_posy, nCharSize, c);
+ }
+
+ nOldCharSize = nCharSize;
+ nOldStringSize = 8 * nCharSize * strlen(strString);
+}
+
+#endif
+
/**
* Parse configuration file
* \param *cfg_filename name of the configuration file
@@ -284,6 +578,7 @@
"BAR_WIDTH\0" "BAR_HEIGHT\0"
"BAR_LEFT\0" "BAR_TOP\0"
"BAR_R\0" "BAR_G\0" "BAR_B\0"
+ "TEXT_LEFT\0" "TEXT_TOP\0" "TEXT_R\0" "TEXT_G\0" "TEXT_B\0" "TEXT_SIZE\0"
#if DEBUG
"DEBUG\0"
#endif
@@ -296,10 +591,10 @@
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 >= 0 && i < 13)
G.ns[i] = val;
#if DEBUG
- if (i == 7) {
+ if (i == 13) {
G.bdebug_messages = val;
if (G.bdebug_messages)
G.logfile_fd = xfopen_for_write("/tmp/fbsplash.log");
@@ -313,7 +608,11 @@
int fbsplash_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int fbsplash_main(int argc UNUSED_PARAM, char **argv)
{
+#if ENABLE_FONTMAP_DYNAMICALLY_LOADED
+ const char *fontmap_filename = NULL;
+#endif
const char *fb_device, *cfg_filename, *fifo_filename;
+
FILE *fp = fp; // for compiler
char *num_buf;
unsigned num;
@@ -325,9 +624,21 @@
fb_device = "/dev/fb0";
cfg_filename = NULL;
fifo_filename = NULL;
+
+#if ENABLE_FONTMAP_DYNAMICALLY_LOADED
+ bCursorOff = 1 & getopt32(argv, "cs:d:i:f:m:",
+ &G.image_filename, &fb_device, &cfg_filename, &fifo_filename, &fontmap_filename);
+
+ if (fontmap_filename) {
+ FILE *fontmap_fd = xfopen_stdin(fontmap_filename);
+ fontmap = xzalloc(sizeof(fontmap[0]) * 95);
+ fread(fontmap[0], 1, sizeof(fontmap[0]) * 95, fontmap_fd);
+ fclose_if_not_stdin(fontmap_fd);
+ }
+#else
bCursorOff = 1 & getopt32(argv, "cs:d:i:f:",
&G.image_filename, &fb_device, &cfg_filename, &fifo_filename);
-
+#endif
// parse configuration file
if (cfg_filename)
init(cfg_filename);
@@ -343,7 +654,7 @@
full_write(STDOUT_FILENO, "\x1b" "[?25l", 6);
}
- fb_drawimage();
+ fb_drawimage(-1, -1, -1, -1);
if (!fifo_filename)
return EXIT_SUCCESS;
@@ -374,6 +685,18 @@
DEBUG_MESSAGE("exit");
break;
}
+#if ENABLE_FBSPLASH_TEXT_RENDERING
+ else if (strncmp(num_buf, "write:", 6) == 0) {
+#if ENABLE_FONTMAP_DYNAMICALLY_LOADED
+ if (fontmap_filename) {
+#endif
+ fb_drawstring(num_buf + 6);
+ continue;
+#if ENABLE_FONTMAP_DYNAMICALLY_LOADED
+ }
+#endif
+ }
+#endif
num = atoi(num_buf);
if (isdigit(num_buf[0]) && (num <= 100)) {
#if DEBUG
@@ -386,6 +709,10 @@
free(num_buf);
}
+#if ENABLE_FONTMAP_DYNAMICALLY_LOADED
+ free(fontmap);
+#endif
+
if (bCursorOff) // restore cursor
full_write(STDOUT_FILENO, "\x1b" "[?25h", 6);
Only in /tmp/acroread_0_0/busybox-1.12.0/miscutils: fbsplash.cfg
_______________________________________________
busybox mailing list
busybox@busybox.net
http://busybox.net/cgi-bin/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic