diff mbox series

[bug#41163] gnu: grub: Allow a PNG image and replace (aspect-ratio) with (resolution).

Message ID FA552D7A-638E-4317-B00F-7F5D380A4AD3@vodafonemail.de
State Accepted
Headers show
Series [bug#41163] gnu: grub: Allow a PNG image and replace (aspect-ratio) with (resolution). | expand

Checks

Context Check Description
cbaines/applying patch fail View Laminar job

Commit Message

Stefan May 9, 2020, 10:44 p.m. UTC
* gnu/bootloaders/grub.scm (<grub-image>)[resolution]: Replacement of the
'aspect-ratio' field.
(<grub-theme>)[image]: Replacement of the 'images' field.
(svg->png): Remove default-values for 'width' and 'height' and only do the
conversion with them, if the suffix of the file is actually ".svg".

Using image formats different to SVG was not possible.

For a <grub-image> to be chosen, the 'aspect-ratio' of it had to be 4/3, as the
resolution of any image was defaulting to 1024 x 768.

There was no code yet to determine the proper boot-resolution, to make any use
of a list of images with different aspect-ratios.

It seems to be a better solution to only define a single image with any format,
and use a given resolution only for the conversion from a SVG file.

Moving the default values from '%background-image' and '%default-theme' into
<grub-image> and <grub-theme> makes a customisation easier without (inherit)
and allows to deprecate %background-image' and '%default-theme'.
---
 gnu/bootloader/grub.scm | 74 +++++++++++++++++++----------------------
 gnu/system.scm          |  1 +
 2 files changed, 36 insertions(+), 39 deletions(-)

Comments

Mathieu Othacehe May 10, 2020, 7:07 a.m. UTC | #1
Hello Stefan,

For some reason I cannot apply this patch. Could you send an updated
revision based on master?

A few comments below:

> * gnu/bootloaders/grub.scm (<grub-image>)[resolution]: Replacement of the
> 'aspect-ratio' field.

You can write something like:

* gnu/bootloaders/grub.scm (<grub-image>)[aspect-ratio]: Remove this
field and replace it by ...
[resolution]: ... this field.

> +  (resolution grub-image-resolution
> +              (default '(1024 . 768)))
> +  (file       grub-image-file
> +              (default (file-append %artwork-repository
> +                                    "/grub/GuixSD-fully-black-4-3.svg"))))

I'm not sure about defaulting to this file. This record is meant to
describe a generic image. Could you keep this empty?

>  (define* (svg->png svg #:key width height)
> -  "Build a PNG of HEIGHT x WIDTH from SVG."
> +  "Build a PNG of HEIGHT x WIDTH from SVG if its file suffix is \".svg\".

I'm not sure having "svg->png" handle other file types than ".svg" is
very clear. 

> +                     #~(if (string-suffix? ".svg" #+svg)
> +                           (begin
> +                             (use-modules (gnu build svg))
> +                             (svg->png #+svg #$output
> +                                       #:width #$width
> +                                       #:height #$height))
> +                           (copy-file #+svg #$output))))))

You could move this check to "grub-background-image" procedure. So that
"svg->png" only deals with ".svg" files.

> +         (let ((resolution (grub-image-resolution image)))
> +           (svg->png (grub-image-file image)
> +                     #:width (car resolution)
> +                     #:height (cdr resolution))))))

"car" and "cdr" should be avoided. You can write something like that
instead:

--8<---------------cut here---------------start------------->8---
(match resolution
       ((width . height)
        (svg->png (grub-image-file image)
                  #:width width
                  #:height height)))
--8<---------------cut here---------------end--------------->8---

Thanks for this patch,

Mathieu
Stefan May 10, 2020, 3:43 p.m. UTC | #2
Hi Mathieu!

Many thanks for your reply! :-)

> Am 10.05.2020 um 09:07 schrieb Mathieu Othacehe <othacehe@gnu.org>:
> 
> For some reason I cannot apply this patch. Could you send an updated
> revision based on master?

I’ll try.

> A few comments below:
> 
>> * gnu/bootloaders/grub.scm (<grub-image>)[resolution]: Replacement of the
>> 'aspect-ratio' field.
> 
> You can write something like:
> 
> * gnu/bootloaders/grub.scm (<grub-image>)[aspect-ratio]: Remove this
> field and replace it by ...
> [resolution]: ... this field.

OK.

>> +  (resolution grub-image-resolution
>> +              (default '(1024 . 768)))
>> +  (file       grub-image-file
>> +              (default (file-append %artwork-repository
>> +                                    "/grub/GuixSD-fully-black-4-3.svg"))))
> 
> I'm not sure about defaulting to this file. This record is meant to
> describe a generic image. Could you keep this empty?

The point is that currently the grub-theme used by default is %default-theme, even if you set the theme field inside your bootloader-configuration to #f (this is documented). And %default-theme is using the very same file. 

If you now just want to modify the size of this image file to your screen resolution (I'd guess 1920 x 1080 is common), then you need to inherit form %default-theme and somehow change the resolution, probably making use of %background-image as well. This gets complicated and is not obvious – moreover as both variables are not documented.

With my proposed change, you can create a new grub-theme which has all the current guix defaults and only modify the parts you want to change:

(grub-theme (image (grub-image (resolution '(1920 . 1080)))))

Compare this with an alternative code to achieve the same, if the file field would default to #f:

(grub-theme (inherit %default-theme) 
           (image (grub-image (inherit %background-image) 
                              (resolution '(1920 . 1080))))))

Actually I question that it makes much sense to have a separate grub-image record at all, now that I'm about to remove the list of it from grub-theme. But I'm hesitating to change too much – that’s also the reason that I didn't delete %default-theme and %background-image.

So despite your comment, I’d go even further: For me something like this would look much easier without having any loss:

(grub-theme (resolution '(1920 . 1080)
           (file %my-neat-backround-svg)
           (color-highlight '((fg . green) (bg . black))))

Or to stay with the simpler examples above:

(grub-theme (resolution '(1920 . 1080)))

And any missing field would stay the same as the current default.

>> (define* (svg->png svg #:key width height)
>> -  "Build a PNG of HEIGHT x WIDTH from SVG."
>> +  "Build a PNG of HEIGHT x WIDTH from SVG if its file suffix is \".svg\".
> 
> I'm not sure having "svg->png" handle other file types than ".svg" is
> very clear. 
> 
>> +                     #~(if (string-suffix? ".svg" #+svg)
>> +                           (begin
>> +                             (use-modules (gnu build svg))
>> +                             (svg->png #+svg #$output
>> +                                       #:width #$width
>> +                                       #:height #$height))
>> +                           (copy-file #+svg #$output))))))
> 
> You could move this check to "grub-background-image" procedure. So that
> "svg->png" only deals with ".svg" files.

Yes, that makes sense.

>> +         (let ((resolution (grub-image-resolution image)))
>> +           (svg->png (grub-image-file image)
>> +                     #:width (car resolution)
>> +                     #:height (cdr resolution))))))
> 
> "car" and "cdr" should be avoided. You can write something like that
> instead:
> 
> --8<---------------cut here---------------start------------->8---
> (match resolution
>      ((width . height)
>       (svg->png (grub-image-file image)
>                 #:width width
>                 #:height height)))
> --8<---------------cut here---------------end--------------->8—

Looks nice.


Bye

Stefan
diff mbox series

Patch

diff --git a/gnu/bootloader/grub.scm b/gnu/bootloader/grub.scm
index 67736724a7..c70c3e260d 100644
--- a/gnu/bootloader/grub.scm
+++ b/gnu/bootloader/grub.scm
@@ -40,12 +40,12 @@ 
   #:use-module (srfi srfi-2)
   #:export (grub-image
             grub-image?
-            grub-image-aspect-ratio
+            grub-image-resolution
             grub-image-file
 
             grub-theme
             grub-theme?
-            grub-theme-images
+            grub-theme-image
             grub-theme-color-normal
             grub-theme-color-highlight
 
@@ -82,34 +82,28 @@  denoting a file name."
 (define-record-type* <grub-image>
   grub-image make-grub-image
   grub-image?
-  (aspect-ratio    grub-image-aspect-ratio        ;rational number
-                   (default 4/3))
-  (file            grub-image-file))              ;file-valued gexp (SVG)
+  (resolution grub-image-resolution
+              (default '(1024 . 768)))
+  (file       grub-image-file
+              (default (file-append %artwork-repository
+                                    "/grub/GuixSD-fully-black-4-3.svg"))))
 
 (define-record-type* <grub-theme>
+  ;; Default theme contributed by Felipe López.
   grub-theme make-grub-theme
   grub-theme?
-  (images          grub-theme-images
-                   (default '()))                 ;list of <grub-image>
+  (image           grub-theme-image
+                   (default (grub-image)))
   (color-normal    grub-theme-color-normal
-                   (default '((fg . cyan) (bg . blue))))
+                   (default '((fg . light-gray) (bg . black))))
   (color-highlight grub-theme-color-highlight
-                   (default '((fg . white) (bg . blue))))
+                   (default '((fg . yellow) (bg . black))))
   (gfxmode         grub-gfxmode
                    (default '("auto"))))          ;list of string
 
-(define %background-image
-  (grub-image
-   (aspect-ratio 4/3)
-   (file (file-append %artwork-repository
-                      "/grub/GuixSD-fully-black-4-3.svg"))))
+(define %background-image (grub-image))
 
-(define %default-theme
-  ;; Default theme contributed by Felipe López.
-  (grub-theme
-   (images (list %background-image))
-   (color-highlight '((fg . yellow) (bg . black)))
-   (color-normal    '((fg . light-gray) (bg . black))))) ;XXX: #x303030
+(define %default-theme (grub-theme))
 
 ^L
 ;;;
@@ -117,32 +111,34 @@  denoting a file name."
 ;;;
 
 (define (bootloader-theme config)
-  "Return user defined theme in CONFIG if defined or %default-theme
+  "Return user defined theme in CONFIG if defined or a default theme
 otherwise."
-  (or (bootloader-configuration-theme config) %default-theme))
+  (or (bootloader-configuration-theme config) (grub-theme)))
 
 (define* (svg->png svg #:key width height)
-  "Build a PNG of HEIGHT x WIDTH from SVG."
+  "Build a PNG of HEIGHT x WIDTH from SVG if its file suffix is \".svg\".
+Otherwise the picture in SVG is just copied."
   (computed-file "grub-image.png"
                  (with-imported-modules '((gnu build svg))
                    (with-extensions (list guile-rsvg guile-cairo)
-                     #~(begin
-                         (use-modules (gnu build svg))
-                         (svg->png #+svg #$output
-                                   #:width #$width
-                                   #:height #$height))))))
-
-(define* (grub-background-image config #:key (width 1024) (height 768))
-  "Return the GRUB background image defined in CONFIG with a ratio of
-WIDTH/HEIGHT, or #f if none was found."
-  (let* ((ratio (/ width height))
-         (image (find (lambda (image)
-                        (= (grub-image-aspect-ratio image) ratio))
-                      (grub-theme-images
-                       (bootloader-theme config)))))
+                     #~(if (string-suffix? ".svg" #+svg)
+                           (begin
+                             (use-modules (gnu build svg))
+                             (svg->png #+svg #$output
+                                       #:width #$width
+                                       #:height #$height))
+                           (copy-file #+svg #$output))))))
+
+(define* (grub-background-image config)
+  "Return the GRUB background image defined in CONFIG or #f if none was found.
+If the suffix of the image file is \".svg\", then it is converted into a PNG
+file with the resolution provided in CONFIG."
+  (let* ((image (grub-theme-image (bootloader-theme config))))
     (and image
-         (svg->png (grub-image-file image)
-                   #:width width #:height height))))
+         (let ((resolution (grub-image-resolution image)))
+           (svg->png (grub-image-file image)
+                     #:width (car resolution)
+                     #:height (cdr resolution))))))
 
 (define* (eye-candy config store-device store-mount-point
                     #:key port)