Subject: bug#64908: 29.1; svg parse failure

From: David Ponce <[email-masked]>
Date: Sat, 5 Aug 2023 14:32:07 +0200

On 05/08/2023 11:58, Alan Third wrote:
> Hi David, I did a bit of thinking about what a percentage in the width
> or height attributes actually means and how librsvg handles it.
> 
> I think we should always ignore it.
> 
> A percentage is intended as a percentage of the enclosing box. this
> means if we set an image width of 100 pixels in Emacs, and the width
> in the SVG is 50%, the image should be 50 pixels wide.
> 
> However we requested a width of 100 pixels, and Emacs will give us
> that no matter what, even scaling it back up.
> 
> Additionally, librsvg will scale the drawn image to a width of 50%
> anyway.
> 
> What this means is if we set the image width to 100 pixels, librsvg
> will scale its drawing down by 50% and it should come out the correct
> size within the 100 pixel wide image.
> 
> I hope that made sense, it took me a bit of thinking about it before I
> came to this conclusion. It was really the fact that librsvg scales
> its drawing anyway that made me decide there's no point in us also
> scaling it.
> 
> I've attached a patch, can you give it a go and let me know how it
> works.
> 
> Or if you disagree with my analysis above, let me know, because I'm
> not 100% sure of it.

Hi Alan,

I did test your V2 patch, and it seems to work well.
I tend to agree with your reasoning, even if I am not enough a
librsvg expert to fully understand all the details.

One case however is not working, when the svg image just specify
percentage for width and height without a viewbox, like this:

'(image :type svg :data
      "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\">
   <defs id=\"defs3051\">
     <style type=\"text/css\" id=\"current-color-scheme\">
       .ColorScheme-Text {
         color:#232629;
       }
       </style>
   </defs>
  <path
     style=\"fill:currentColor;fill-opacity:1;stroke:none\"
     d=\"m7.707031 3l-.707031.707031 6.125 6.125 1.167969 1.167969-1.167969 1.167969-6.125 6.125.707031.707031 6.125-6.125 1.875-1.875-1.875-1.875-6.125-6.125\"
     class=\"ColorScheme-Text\"
     />
</svg>"
      :scale 1)

I can display a such image in firefox, gwenview, or inkscape, but not in Emacs.
I guess it works in applications that provide a default viewbox when not defined.
And it is failing in Emacs because no default viewbox is provided.

What could be questionable is if it makes sense to fail when image also specifies
:width and :height, like this:

'(image :type svg :data
      "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\">
   <defs id=\"defs3051\">
     <style type=\"text/css\" id=\"current-color-scheme\">
       .ColorScheme-Text {
         color:#232629;
       }
       </style>
   </defs>
  <path
     style=\"fill:currentColor;fill-opacity:1;stroke:none\"
     d=\"m7.707031 3l-.707031.707031 6.125 6.125 1.167969 1.167969-1.167969 1.167969-6.125 6.125.707031.707031 6.125-6.125 1.875-1.875-1.875-1.875-6.125-6.125\"
     class=\"ColorScheme-Text\"
     />
</svg>"
      :scale 1 :width 22 :height 22)

I wonder if it could make sense to provide a default viewbox having image :width and :height?
Not sure it will be useful, though.

Thanks