lualoader: allow graphical bits to be disabled with loader_gfx

Some people prefer the old ASCII art look and it's good to have a way
to confirm that the fallbacks still work right on systems that have a
functional framebuffer available. Add a loader_gfx loader.conf(5)
variable to disable the eager use of graphics for these use-cases.

While we're here, clean up the style in the area a little bit; the early
porting that I did to lualoader did a lot of redundant ~= nil that has
carried over into some of the later work.  We can drop some of that, and
also re-organize some of these variables to improve readability.

ziaee notes that the positioning of the orb is a bit off; this is due to
a change in positioning that happened in
1b4e117131 ("loader: Fix orb position") to account for the image
dimensions.  This should be partially reverted to get it right; we
shouldn't assume that we can use the same shift in gfx-* definitions for
both the ASCII art and the associated image -- the {image, image_rl}
pair should be converted to something more like an fbimg or gfx table
that has the image, image width and a shift override to avoid messing
up the ASCII positioning when disabled (or with no graphics available).

Reviewed by:	imp, manu, ziaee (manpages)
Differential Revision:	https://reviews.freebsd.org/D50706
This commit is contained in:
Kyle Evans 2025-06-06 09:44:14 -05:00
parent 2542189532
commit bef6d85b6d
3 changed files with 23 additions and 16 deletions

View file

@ -105,6 +105,7 @@ efi_max_resolution="1x1" # Set the max resolution for EFI loader to use:
# WidthxHeight (e.g. 1920x1080)
#kernels="kernel kernel.old" # Kernels to display in the boot menu
kernels_autodetect="YES" # Auto-detect kernel directories in /boot
#loader_gfx="YES" # Use graphical images when available
#loader_logo="orbbw" # Desired logo: orbbw, orb, fbsdbw, beastiebw, beastie, none
#comconsole_speed="115200" # Set the current serial console speed
#console="vidconsole" # A comma separated list of console(s)

View file

@ -21,7 +21,7 @@
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.Dd February 9, 2025
.Dd June 5, 2025
.Dt LOADER.CONF 5
.Os
.Sh NAME
@ -414,6 +414,12 @@ the beastie boot menu will be skipped.
If set to
.Dq NO ,
the autoboot menu will not be displayed
.It Va loader_gfx
If set to
.Dq NO ,
the ASCII art version of the brand and logo will be used even if graphical
versions are available.
Additionally, the menu frame will be drawn with ASCII art as well.
.It Va loader_logo Pq Dq Li orbbw
Selects a desired logo in the beastie boot menu.
Possible values are:

View file

@ -217,6 +217,13 @@ local function defaultframe()
return "double"
end
local function gfxenabled()
return (loader.getenv("loader_gfx") or "yes"):lower() ~= "no"
end
local function gfxcapable()
return core.isFramebufferConsole() and gfx.term_putimage
end
local function drawframe()
local x = menu_position.x - 3
local y = menu_position.y - 1
@ -242,7 +249,7 @@ local function drawframe()
x = x + shift.x
y = y + shift.y
if core.isFramebufferConsole() and gfx.term_drawrect ~= nil then
if gfxenabled() and gfxcapable() then
gfx.term_drawrect(x, y, x + w, y + h)
return true
end
@ -332,11 +339,9 @@ local function drawbrand()
y = y + branddef.shift.y
end
if core.isFramebufferConsole() and
gfx.term_putimage ~= nil and
branddef.image ~= nil then
if gfx.term_putimage(branddef.image, x, y, 0, 7, 0)
then
local gfx_requested = branddef.image and gfxenabled()
if gfx_requested and gfxcapable() then
if gfx.term_putimage(branddef.image, x, y, 0, 7, 0) then
return true
end
end
@ -383,16 +388,11 @@ local function drawlogo()
y = y + logodef.shift.y
end
if core.isFramebufferConsole() and
gfx.term_putimage ~= nil and
logodef.image ~= nil then
local y1 = 15
local gfx_requested = logodef.image and gfxenabled()
if gfx_requested and gfxcapable() then
local y1 = logodef.image_rl or 15
if logodef.image_rl ~= nil then
y1 = logodef.image_rl
end
if gfx.term_putimage(logodef.image, x, y, 0, y + y1, 0)
then
if gfx.term_putimage(logodef.image, x, y, 0, y + y1, 0) then
return true
end
end