emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 5586eb4 4/4: Prefer rsvg_handle_get_intrinsic_size_in_pixels


From: Paul Eggert
Subject: master 5586eb4 4/4: Prefer rsvg_handle_get_intrinsic_size_in_pixels
Date: Fri, 3 Dec 2021 13:25:39 -0500 (EST)

branch: master
commit 5586eb463fb3c11298f6e1a0b4fd1e86b9a1dd65
Author: Paul Eggert <eggert@cs.ucla.edu>
Commit: Paul Eggert <eggert@cs.ucla.edu>

    Prefer rsvg_handle_get_intrinsic_size_in_pixels
    
    Use rsvg_handle_get_intrinsic_size_in_pixels if available,
    as this is simpler and better than what we were doing.
    From a comment by by Alan Third (Bug#44655#56).
    * src/image.c (init_svg_functions): Arrange for the new function.
    (svg_load_image): Prefer the results of
    rsvg_handle_get_intrinsic_size_in_pixels if available.
---
 src/image.c | 114 +++++++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 74 insertions(+), 40 deletions(-)

diff --git a/src/image.c b/src/image.c
index 14e9944..c08ee92 100644
--- a/src/image.c
+++ b/src/image.c
@@ -10066,6 +10066,10 @@ DEF_DLL_FN (gboolean, rsvg_handle_close, (RsvgHandle 
*, GError **));
 DEF_DLL_FN (void, rsvg_handle_set_dpi_x_y,
            (RsvgHandle * handle, double dpi_x, double dpi_y));
 
+#  if LIBRSVG_CHECK_VERSION (2, 52, 1)
+DEF_DLL_FN (void, rsvg_handle_get_intrinsic_size_in_pixels,
+            (RsvgHandle *, gdouble *, gdouble *));
+#  endif
 #  if LIBRSVG_CHECK_VERSION (2, 46, 0)
 DEF_DLL_FN (void, rsvg_handle_get_intrinsic_dimensions,
             (RsvgHandle *, gboolean *, RsvgLength *, gboolean *,
@@ -10129,6 +10133,9 @@ init_svg_functions (void)
   LOAD_DLL_FN (library, rsvg_handle_close);
 #endif
   LOAD_DLL_FN (library, rsvg_handle_set_dpi_x_y);
+#if LIBRSVG_CHECK_VERSION (2, 52, 1)
+  LOAD_DLL_FN (library, rsvg_handle_get_intrinsic_size_in_pixels);
+#endif
 #if LIBRSVG_CHECK_VERSION (2, 46, 0)
   LOAD_DLL_FN (library, rsvg_handle_get_intrinsic_dimensions);
   LOAD_DLL_FN (library, rsvg_handle_get_geometry_for_layer);
@@ -10172,6 +10179,9 @@ init_svg_functions (void)
 #  undef g_clear_error
 #  undef g_object_unref
 #  undef g_type_init
+#  if LIBRSVG_CHECK_VERSION (2, 52, 1)
+#   undef rsvg_handle_get_intrinsic_size_in_pixels
+#  endif
 #  if LIBRSVG_CHECK_VERSION (2, 46, 0)
 #   undef rsvg_handle_get_intrinsic_dimensions
 #   undef rsvg_handle_get_geometry_for_layer
@@ -10207,6 +10217,10 @@ init_svg_functions (void)
 #  if ! GLIB_CHECK_VERSION (2, 36, 0)
 #   define g_type_init fn_g_type_init
 #  endif
+#  if LIBRSVG_CHECK_VERSION (2, 52, 1)
+#   define rsvg_handle_get_intrinsic_size_in_pixels \
+       fn_rsvg_handle_get_intrinsic_size_in_pixels
+#  endif
 #  if LIBRSVG_CHECK_VERSION (2, 46, 0)
 #   define rsvg_handle_get_intrinsic_dimensions \
        fn_rsvg_handle_get_intrinsic_dimensions
@@ -10444,51 +10458,71 @@ svg_load_image (struct frame *f, struct image *img, 
char *contents,
 
   /* Get the image dimensions.  */
 #if LIBRSVG_CHECK_VERSION (2, 46, 0)
-  RsvgRectangle zero_rect, viewbox, out_logical_rect;
-
-  /* Try the intrinsic dimensions first.  */
-  gboolean has_width, has_height, has_viewbox;
-  RsvgLength iwidth, iheight;
-  double dpi = FRAME_DISPLAY_INFO (f)->resx;
-
-  rsvg_handle_get_intrinsic_dimensions (rsvg_handle,
-                                        &has_width, &iwidth,
-                                        &has_height, &iheight,
-                                        &has_viewbox, &viewbox);
+  gdouble gviewbox_width, gviewbox_height;
+  gboolean has_viewbox = FALSE;
+# if LIBRSVG_CHECK_VERSION (2, 52, 1)
+  has_viewbox = rsvg_handle_get_intrinsic_size_in_pixels (rsvg_handle,
+                                                         &gviewbox_width,
+                                                         &gviewbox_height);
+# endif
 
-  if (has_width && has_height)
+  if (has_viewbox)
     {
-      /* Success!  We can use these values directly.  */
-      viewbox_width = svg_css_length_to_pixels (iwidth, dpi, 
img->face_font_size);
-      viewbox_height = svg_css_length_to_pixels (iheight, dpi, 
img->face_font_size);
-    }
-  else if (has_width && has_viewbox)
-    {
-      viewbox_width = svg_css_length_to_pixels (iwidth, dpi, 
img->face_font_size);
-      viewbox_height = viewbox_width * viewbox.height / viewbox.width;
-    }
-  else if (has_height && has_viewbox)
-    {
-      viewbox_height = svg_css_length_to_pixels (iheight, dpi, 
img->face_font_size);
-      viewbox_width = viewbox_height * viewbox.width / viewbox.height;
-    }
-  else if (has_viewbox)
-    {
-      viewbox_width = viewbox.width;
-      viewbox_height = viewbox.height;
+      viewbox_width = gviewbox_width;
+      viewbox_height = gviewbox_height;
     }
   else
-    viewbox_width = viewbox_height = 0;
-
-  if (! (0 < viewbox_width && 0 < viewbox_height))
     {
-      /* We haven't found a usable set of sizes, so try working out
-         the visible area.  */
-      rsvg_handle_get_geometry_for_layer (rsvg_handle, NULL,
-                                          &zero_rect, &viewbox,
-                                          &out_logical_rect, NULL);
-      viewbox_width = viewbox.x + viewbox.width;
-      viewbox_height = viewbox.y + viewbox.height;
+      RsvgRectangle zero_rect, viewbox, out_logical_rect;
+
+      /* Try the intrinsic dimensions first.  */
+      gboolean has_width, has_height;
+      RsvgLength iwidth, iheight;
+      double dpi = FRAME_DISPLAY_INFO (f)->resx;
+
+      rsvg_handle_get_intrinsic_dimensions (rsvg_handle,
+                                           &has_width, &iwidth,
+                                           &has_height, &iheight,
+                                           &has_viewbox, &viewbox);
+
+      if (has_width && has_height)
+       {
+         /* Success!  We can use these values directly.  */
+         viewbox_width = svg_css_length_to_pixels (iwidth, dpi,
+                                                   img->face_font_size);
+         viewbox_height = svg_css_length_to_pixels (iheight, dpi,
+                                                    img->face_font_size);
+       }
+      else if (has_width && has_viewbox)
+       {
+         viewbox_width = svg_css_length_to_pixels (iwidth, dpi,
+                                                   img->face_font_size);
+         viewbox_height = viewbox_width * viewbox.height / viewbox.width;
+       }
+      else if (has_height && has_viewbox)
+       {
+         viewbox_height = svg_css_length_to_pixels (iheight, dpi,
+                                                    img->face_font_size);
+         viewbox_width = viewbox_height * viewbox.width / viewbox.height;
+       }
+      else if (has_viewbox)
+       {
+         viewbox_width = viewbox.width;
+         viewbox_height = viewbox.height;
+       }
+      else
+       viewbox_width = viewbox_height = 0;
+
+      if (! (0 < viewbox_width && 0 < viewbox_height))
+       {
+         /* We haven't found a usable set of sizes, so try working out
+            the visible area.  */
+         rsvg_handle_get_geometry_for_layer (rsvg_handle, NULL,
+                                             &zero_rect, &viewbox,
+                                             &out_logical_rect, NULL);
+         viewbox_width = viewbox.x + viewbox.width;
+         viewbox_height = viewbox.y + viewbox.height;
+       }
     }
 #else
   /* In librsvg before 2.46.0, guess the viewbox from the image dimensions.  */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]