From: Benjamin Herrenschmidt Date: Tue, 3 Apr 2007 05:41:07 +0000 (+1000) Subject: jpeg background support and scaling X-Git-Tag: v0.0.1~27 X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=commitdiff_plain;h=188f491cdfabc8e01bc483e3652f4f8306311920 jpeg background support and scaling Turn the background image into a jpeg and scale it to screen dimensions Signed-off-by: Benjamin Herrenschmidt --- diff --git a/Makefile b/Makefile index e3bba3e..e192b20 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ LDFLAGS = CFLAGS = -O0 -ggdb -Wall '-DPREFIX="$(PREFIX)"' PARSERS = native yaboot -ARTWORK = background.png cdrom.png hdd.png usbpen.png cursor +ARTWORK = background.jpg cdrom.png hdd.png usbpen.png cursor all: petitboot udev-helper diff --git a/artwork/background.jpg b/artwork/background.jpg new file mode 100644 index 0000000..9d54d31 Binary files /dev/null and b/artwork/background.jpg differ diff --git a/artwork/background.png b/artwork/background.png deleted file mode 100644 index f6ea9da..0000000 Binary files a/artwork/background.png and /dev/null differ diff --git a/petitboot.c b/petitboot.c index dfb293c..84a76f6 100644 --- a/petitboot.c +++ b/petitboot.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "petitboot.h" #include "petitboot-paths.h" @@ -853,6 +854,51 @@ int pboot_remove_device(const char *dev_id) return TWIN_TRUE; } +static void pboot_make_background(void) +{ + twin_pixmap_t *filepic, *scaledpic; + const char *background_path; + + /* Set background pixmap */ + LOG("loading background..."); + background_path = artwork_pathname("background.jpg"); + filepic = twin_jpeg_to_pixmap(background_path, TWIN_ARGB32); + LOG("%s\n", filepic ? "ok" : "failed"); + + if (filepic == NULL) + return; + + if (pboot_screen->height == filepic->height && + pboot_screen->width == filepic->width) + scaledpic = filepic; + else { + twin_fixed_t sx, sy; + twin_operand_t srcop; + + scaledpic = twin_pixmap_create(TWIN_ARGB32, + pboot_screen->width, + pboot_screen->height); + if (scaledpic == NULL) { + twin_pixmap_destroy(filepic); + return; + } + sx = twin_fixed_div(twin_int_to_fixed(filepic->width), + twin_int_to_fixed(pboot_screen->width)); + sy = twin_fixed_div(twin_int_to_fixed(filepic->height), + twin_int_to_fixed(pboot_screen->height)); + + twin_matrix_scale(&filepic->transform, sx, sy); + srcop.source_kind = TWIN_PIXMAP; + srcop.u.pixmap = filepic; + twin_composite(scaledpic, 0, 0, &srcop, 0, 0, + NULL, 0, 0, TWIN_SOURCE, + pboot_screen->width, pboot_screen->height); + twin_pixmap_destroy(filepic); + + } + twin_screen_set_background(pboot_screen, scaledpic); +} + static void exitfunc(void) { #ifndef _USE_X11 @@ -870,9 +916,6 @@ static void sigint(int sig) int main(int argc, char **argv) { - twin_pixmap_t *pic; - const char *background_path; - atexit(exitfunc); signal(SIGINT, sigint); @@ -906,12 +949,7 @@ int main(int argc, char **argv) #endif /* Set background pixmap */ - background_path = artwork_pathname("background.png"); - LOG("loading background: %s...", background_path); - pic = twin_png_to_pixmap(background_path, TWIN_ARGB32); - LOG("%s\n", pic ? "ok" : "failed"); - if (pic) - twin_screen_set_background(pboot_screen, pic); + pboot_make_background(); /* Init more stuffs */ pboot_create_panels();