1#![allow(deprecated)]
6
7use crate::{HandleFlags, Rectangle, ffi};
8use glib::{
9 prelude::*,
10 signal::{SignalHandlerId, connect_raw},
11 translate::*,
12};
13use std::boxed::Box as Box_;
14
15glib::wrapper! {
16 #[doc(alias = "RsvgHandle")]
17 pub struct Handle(Object<ffi::RsvgHandle, ffi::RsvgHandleClass>);
18
19 match fn {
20 type_ => || ffi::rsvg_handle_get_type(),
21 }
22}
23
24impl Handle {
25 pub const NONE: Option<&'static Handle> = None;
26
27 #[doc(alias = "rsvg_handle_new")]
28 pub fn new() -> Handle {
29 assert_initialized_main_thread!();
30 unsafe { from_glib_full(ffi::rsvg_handle_new()) }
31 }
32
33 #[doc(alias = "rsvg_handle_new_from_data")]
34 #[doc(alias = "new_from_data")]
35 pub fn from_data(data: &[u8]) -> Result<Handle, glib::Error> {
36 assert_initialized_main_thread!();
37 let data_len = data.len() as _;
38 unsafe {
39 let mut error = std::ptr::null_mut();
40 let ret = ffi::rsvg_handle_new_from_data(data.to_glib_none().0, data_len, &mut error);
41 if error.is_null() {
42 Ok(from_glib_full(ret))
43 } else {
44 Err(from_glib_full(error))
45 }
46 }
47 }
48
49 #[doc(alias = "rsvg_handle_new_from_file")]
50 #[doc(alias = "new_from_file")]
51 pub fn from_file(filename: &str) -> Result<Handle, glib::Error> {
52 assert_initialized_main_thread!();
53 unsafe {
54 let mut error = std::ptr::null_mut();
55 let ret = ffi::rsvg_handle_new_from_file(filename.to_glib_none().0, &mut error);
56 if error.is_null() {
57 Ok(from_glib_full(ret))
58 } else {
59 Err(from_glib_full(error))
60 }
61 }
62 }
63
64 #[doc(alias = "rsvg_handle_new_from_gfile_sync")]
65 #[doc(alias = "new_from_gfile_sync")]
66 pub fn from_gfile_sync(
67 file: &impl IsA<gio::File>,
68 flags: HandleFlags,
69 cancellable: Option<&impl IsA<gio::Cancellable>>,
70 ) -> Result<Handle, glib::Error> {
71 assert_initialized_main_thread!();
72 unsafe {
73 let mut error = std::ptr::null_mut();
74 let ret = ffi::rsvg_handle_new_from_gfile_sync(
75 file.as_ref().to_glib_none().0,
76 flags.into_glib(),
77 cancellable.map(|p| p.as_ref()).to_glib_none().0,
78 &mut error,
79 );
80 if error.is_null() {
81 Ok(from_glib_full(ret))
82 } else {
83 Err(from_glib_full(error))
84 }
85 }
86 }
87
88 #[doc(alias = "rsvg_handle_new_from_stream_sync")]
89 #[doc(alias = "new_from_stream_sync")]
90 pub fn from_stream_sync(
91 input_stream: &impl IsA<gio::InputStream>,
92 base_file: Option<&impl IsA<gio::File>>,
93 flags: HandleFlags,
94 cancellable: Option<&impl IsA<gio::Cancellable>>,
95 ) -> Result<Handle, glib::Error> {
96 assert_initialized_main_thread!();
97 unsafe {
98 let mut error = std::ptr::null_mut();
99 let ret = ffi::rsvg_handle_new_from_stream_sync(
100 input_stream.as_ref().to_glib_none().0,
101 base_file.map(|p| p.as_ref()).to_glib_none().0,
102 flags.into_glib(),
103 cancellable.map(|p| p.as_ref()).to_glib_none().0,
104 &mut error,
105 );
106 if error.is_null() {
107 Ok(from_glib_full(ret))
108 } else {
109 Err(from_glib_full(error))
110 }
111 }
112 }
113
114 #[doc(alias = "rsvg_handle_new_with_flags")]
115 #[doc(alias = "new_with_flags")]
116 pub fn with_flags(flags: HandleFlags) -> Handle {
117 assert_initialized_main_thread!();
118 unsafe { from_glib_full(ffi::rsvg_handle_new_with_flags(flags.into_glib())) }
119 }
120}
121
122impl Default for Handle {
123 fn default() -> Self {
124 Self::new()
125 }
126}
127
128pub trait HandleExt: IsA<Handle> + 'static {
129 #[doc(alias = "rsvg_handle_get_base_uri")]
130 #[doc(alias = "get_base_uri")]
131 #[doc(alias = "base-uri")]
132 fn base_uri(&self) -> Option<glib::GString> {
133 unsafe {
134 from_glib_none(ffi::rsvg_handle_get_base_uri(
135 self.as_ref().to_glib_none().0,
136 ))
137 }
138 }
139
140 #[doc(alias = "rsvg_handle_get_geometry_for_element")]
141 #[doc(alias = "get_geometry_for_element")]
142 fn geometry_for_element(
143 &self,
144 id: Option<&str>,
145 ) -> Result<(Rectangle, Rectangle), glib::Error> {
146 unsafe {
147 let mut out_ink_rect = Rectangle::uninitialized();
148 let mut out_logical_rect = Rectangle::uninitialized();
149 let mut error = std::ptr::null_mut();
150 let is_ok = ffi::rsvg_handle_get_geometry_for_element(
151 self.as_ref().to_glib_none().0,
152 id.to_glib_none().0,
153 out_ink_rect.to_glib_none_mut().0,
154 out_logical_rect.to_glib_none_mut().0,
155 &mut error,
156 );
157 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
158 if error.is_null() {
159 Ok((out_ink_rect, out_logical_rect))
160 } else {
161 Err(from_glib_full(error))
162 }
163 }
164 }
165
166 #[doc(alias = "rsvg_handle_get_geometry_for_layer")]
167 #[doc(alias = "get_geometry_for_layer")]
168 fn geometry_for_layer(
169 &self,
170 id: Option<&str>,
171 viewport: &Rectangle,
172 ) -> Result<(Rectangle, Rectangle), glib::Error> {
173 unsafe {
174 let mut out_ink_rect = Rectangle::uninitialized();
175 let mut out_logical_rect = Rectangle::uninitialized();
176 let mut error = std::ptr::null_mut();
177 let is_ok = ffi::rsvg_handle_get_geometry_for_layer(
178 self.as_ref().to_glib_none().0,
179 id.to_glib_none().0,
180 viewport.to_glib_none().0,
181 out_ink_rect.to_glib_none_mut().0,
182 out_logical_rect.to_glib_none_mut().0,
183 &mut error,
184 );
185 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
186 if error.is_null() {
187 Ok((out_ink_rect, out_logical_rect))
188 } else {
189 Err(from_glib_full(error))
190 }
191 }
192 }
193
194 #[doc(alias = "rsvg_handle_get_intrinsic_size_in_pixels")]
195 #[doc(alias = "get_intrinsic_size_in_pixels")]
196 fn intrinsic_size_in_pixels(&self) -> Option<(f64, f64)> {
197 unsafe {
198 let mut out_width = std::mem::MaybeUninit::uninit();
199 let mut out_height = std::mem::MaybeUninit::uninit();
200 let ret = from_glib(ffi::rsvg_handle_get_intrinsic_size_in_pixels(
201 self.as_ref().to_glib_none().0,
202 out_width.as_mut_ptr(),
203 out_height.as_mut_ptr(),
204 ));
205 if ret {
206 Some((out_width.assume_init(), out_height.assume_init()))
207 } else {
208 None
209 }
210 }
211 }
212
213 #[doc(alias = "rsvg_handle_has_sub")]
236 fn has_sub(&self, id: &str) -> bool {
237 unsafe {
238 from_glib(ffi::rsvg_handle_has_sub(
239 self.as_ref().to_glib_none().0,
240 id.to_glib_none().0,
241 ))
242 }
243 }
244
245 #[doc(alias = "rsvg_handle_internal_set_testing")]
246 fn internal_set_testing(&self, testing: bool) {
247 unsafe {
248 ffi::rsvg_handle_internal_set_testing(
249 self.as_ref().to_glib_none().0,
250 testing.into_glib(),
251 );
252 }
253 }
254
255 #[doc(alias = "rsvg_handle_read_stream_sync")]
256 fn read_stream_sync(
257 &self,
258 stream: &impl IsA<gio::InputStream>,
259 cancellable: Option<&impl IsA<gio::Cancellable>>,
260 ) -> Result<(), glib::Error> {
261 unsafe {
262 let mut error = std::ptr::null_mut();
263 let is_ok = ffi::rsvg_handle_read_stream_sync(
264 self.as_ref().to_glib_none().0,
265 stream.as_ref().to_glib_none().0,
266 cancellable.map(|p| p.as_ref()).to_glib_none().0,
267 &mut error,
268 );
269 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
270 if error.is_null() {
271 Ok(())
272 } else {
273 Err(from_glib_full(error))
274 }
275 }
276 }
277
278 #[doc(alias = "rsvg_handle_render_document")]
279 fn render_document(
280 &self,
281 cr: &cairo::Context,
282 viewport: &Rectangle,
283 ) -> Result<(), glib::Error> {
284 unsafe {
285 let mut error = std::ptr::null_mut();
286 let is_ok = ffi::rsvg_handle_render_document(
287 self.as_ref().to_glib_none().0,
288 mut_override(cr.to_glib_none().0),
289 viewport.to_glib_none().0,
290 &mut error,
291 );
292 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
293 if error.is_null() {
294 Ok(())
295 } else {
296 Err(from_glib_full(error))
297 }
298 }
299 }
300
301 #[doc(alias = "rsvg_handle_render_element")]
302 fn render_element(
303 &self,
304 cr: &cairo::Context,
305 id: Option<&str>,
306 element_viewport: &Rectangle,
307 ) -> Result<(), glib::Error> {
308 unsafe {
309 let mut error = std::ptr::null_mut();
310 let is_ok = ffi::rsvg_handle_render_element(
311 self.as_ref().to_glib_none().0,
312 mut_override(cr.to_glib_none().0),
313 id.to_glib_none().0,
314 element_viewport.to_glib_none().0,
315 &mut error,
316 );
317 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
318 if error.is_null() {
319 Ok(())
320 } else {
321 Err(from_glib_full(error))
322 }
323 }
324 }
325
326 #[doc(alias = "rsvg_handle_render_layer")]
327 fn render_layer(
328 &self,
329 cr: &cairo::Context,
330 id: Option<&str>,
331 viewport: &Rectangle,
332 ) -> Result<(), glib::Error> {
333 unsafe {
334 let mut error = std::ptr::null_mut();
335 let is_ok = ffi::rsvg_handle_render_layer(
336 self.as_ref().to_glib_none().0,
337 mut_override(cr.to_glib_none().0),
338 id.to_glib_none().0,
339 viewport.to_glib_none().0,
340 &mut error,
341 );
342 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
343 if error.is_null() {
344 Ok(())
345 } else {
346 Err(from_glib_full(error))
347 }
348 }
349 }
350
351 #[doc(alias = "rsvg_handle_set_base_gfile")]
352 fn set_base_gfile(&self, base_file: &impl IsA<gio::File>) {
353 unsafe {
354 ffi::rsvg_handle_set_base_gfile(
355 self.as_ref().to_glib_none().0,
356 base_file.as_ref().to_glib_none().0,
357 );
358 }
359 }
360
361 #[doc(alias = "rsvg_handle_set_base_uri")]
362 #[doc(alias = "base-uri")]
363 fn set_base_uri(&self, base_uri: &str) {
364 unsafe {
365 ffi::rsvg_handle_set_base_uri(
366 self.as_ref().to_glib_none().0,
367 base_uri.to_glib_none().0,
368 );
369 }
370 }
371
372 #[cfg(feature = "v2_59")]
373 #[cfg_attr(docsrs, doc(cfg(feature = "v2_59")))]
374 #[doc(alias = "rsvg_handle_set_cancellable_for_rendering")]
375 fn set_cancellable_for_rendering(&self, cancellable: Option<&impl IsA<gio::Cancellable>>) {
376 unsafe {
377 ffi::rsvg_handle_set_cancellable_for_rendering(
378 self.as_ref().to_glib_none().0,
379 cancellable.map(|p| p.as_ref()).to_glib_none().0,
380 );
381 }
382 }
383
384 #[doc(alias = "rsvg_handle_set_dpi")]
385 fn set_dpi(&self, dpi: f64) {
386 unsafe {
387 ffi::rsvg_handle_set_dpi(self.as_ref().to_glib_none().0, dpi);
388 }
389 }
390
391 #[doc(alias = "rsvg_handle_set_dpi_x_y")]
392 fn set_dpi_x_y(&self, dpi_x: f64, dpi_y: f64) {
393 unsafe {
394 ffi::rsvg_handle_set_dpi_x_y(self.as_ref().to_glib_none().0, dpi_x, dpi_y);
395 }
396 }
397
398 #[doc(alias = "rsvg_handle_set_stylesheet")]
399 fn set_stylesheet(&self, css: &[u8]) -> Result<(), glib::Error> {
400 let css_len = css.len() as _;
401 unsafe {
402 let mut error = std::ptr::null_mut();
403 let is_ok = ffi::rsvg_handle_set_stylesheet(
404 self.as_ref().to_glib_none().0,
405 css.to_glib_none().0,
406 css_len,
407 &mut error,
408 );
409 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
410 if error.is_null() {
411 Ok(())
412 } else {
413 Err(from_glib_full(error))
414 }
415 }
416 }
417
418 #[doc(alias = "dpi-x")]
419 fn dpi_x(&self) -> f64 {
420 ObjectExt::property(self.as_ref(), "dpi-x")
421 }
422
423 #[doc(alias = "dpi-x")]
424 fn set_dpi_x(&self, dpi_x: f64) {
425 ObjectExt::set_property(self.as_ref(), "dpi-x", dpi_x)
426 }
427
428 #[doc(alias = "dpi-y")]
429 fn dpi_y(&self) -> f64 {
430 ObjectExt::property(self.as_ref(), "dpi-y")
431 }
432
433 #[doc(alias = "dpi-y")]
434 fn set_dpi_y(&self, dpi_y: f64) {
435 ObjectExt::set_property(self.as_ref(), "dpi-y", dpi_y)
436 }
437
438 fn flags(&self) -> HandleFlags {
439 ObjectExt::property(self.as_ref(), "flags")
440 }
441
442 #[doc(alias = "base-uri")]
443 fn connect_base_uri_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
444 unsafe extern "C" fn notify_base_uri_trampoline<P: IsA<Handle>, F: Fn(&P) + 'static>(
445 this: *mut ffi::RsvgHandle,
446 _param_spec: glib::ffi::gpointer,
447 f: glib::ffi::gpointer,
448 ) {
449 unsafe {
450 let f: &F = &*(f as *const F);
451 f(Handle::from_glib_borrow(this).unsafe_cast_ref())
452 }
453 }
454 unsafe {
455 let f: Box_<F> = Box_::new(f);
456 connect_raw(
457 self.as_ptr() as *mut _,
458 c"notify::base-uri".as_ptr() as *const _,
459 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
460 notify_base_uri_trampoline::<Self, F> as *const (),
461 )),
462 Box_::into_raw(f),
463 )
464 }
465 }
466
467 #[doc(alias = "dpi-x")]
468 fn connect_dpi_x_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
469 unsafe extern "C" fn notify_dpi_x_trampoline<P: IsA<Handle>, F: Fn(&P) + 'static>(
470 this: *mut ffi::RsvgHandle,
471 _param_spec: glib::ffi::gpointer,
472 f: glib::ffi::gpointer,
473 ) {
474 unsafe {
475 let f: &F = &*(f as *const F);
476 f(Handle::from_glib_borrow(this).unsafe_cast_ref())
477 }
478 }
479 unsafe {
480 let f: Box_<F> = Box_::new(f);
481 connect_raw(
482 self.as_ptr() as *mut _,
483 c"notify::dpi-x".as_ptr() as *const _,
484 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
485 notify_dpi_x_trampoline::<Self, F> as *const (),
486 )),
487 Box_::into_raw(f),
488 )
489 }
490 }
491
492 #[doc(alias = "dpi-y")]
493 fn connect_dpi_y_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
494 unsafe extern "C" fn notify_dpi_y_trampoline<P: IsA<Handle>, F: Fn(&P) + 'static>(
495 this: *mut ffi::RsvgHandle,
496 _param_spec: glib::ffi::gpointer,
497 f: glib::ffi::gpointer,
498 ) {
499 unsafe {
500 let f: &F = &*(f as *const F);
501 f(Handle::from_glib_borrow(this).unsafe_cast_ref())
502 }
503 }
504 unsafe {
505 let f: Box_<F> = Box_::new(f);
506 connect_raw(
507 self.as_ptr() as *mut _,
508 c"notify::dpi-y".as_ptr() as *const _,
509 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
510 notify_dpi_y_trampoline::<Self, F> as *const (),
511 )),
512 Box_::into_raw(f),
513 )
514 }
515 }
516}
517
518impl<O: IsA<Handle>> HandleExt for O {}