Skip to main content

librsvg_rebind/
handle.rs

1use glib::{prelude::*, translate::*};
2
3use crate::{Handle, Length, Rectangle};
4pub trait HandleExtManual: IsA<Handle> + 'static {
5    #[doc(alias = "rsvg_handle_get_intrinsic_dimensions")]
6    #[doc(alias = "get_intrinsic_dimensions")]
7    fn intrinsic_dimensions(&self) -> (Length, Length, Option<Rectangle>) {
8        unsafe {
9            let mut out_has_width = std::mem::MaybeUninit::uninit();
10            let mut out_width = Length::uninitialized();
11            let mut out_has_height = std::mem::MaybeUninit::uninit();
12            let mut out_height = Length::uninitialized();
13            let mut out_has_viewbox = std::mem::MaybeUninit::uninit();
14            let mut out_viewbox = Rectangle::uninitialized();
15            ffi::rsvg_handle_get_intrinsic_dimensions(
16                self.as_ref().to_glib_none().0,
17                out_has_width.as_mut_ptr(),
18                out_width.to_glib_none_mut().0,
19                out_has_height.as_mut_ptr(),
20                out_height.to_glib_none_mut().0,
21                out_has_viewbox.as_mut_ptr(),
22                out_viewbox.to_glib_none_mut().0,
23            );
24            (
25                out_width,
26                out_height,
27                (out_has_viewbox.assume_init() != 0).then_some(out_viewbox),
28            )
29        }
30    }
31}
32
33impl<O: IsA<Handle>> HandleExtManual for O {}