[librsvg: 7/13] From the Rust code, return the lack of bounding boxes as 0-sized Cairo rectangles



commit 8e44a64a08fdb0984c6fb41374bff20abb24e576
Author: Federico Mena Quintero <federico gnome org>
Date:   Sun Nov 18 07:12:49 2018 -0600

    From the Rust code, return the lack of bounding boxes as 0-sized Cairo rectangles

 librsvg/rsvg-handle.c             |  3 +-
 librsvg/rsvg-private.h            |  2 +-
 rsvg_internals/src/drawing_ctx.rs | 58 ++++++++++++++++++++++-----------------
 3 files changed, 36 insertions(+), 27 deletions(-)
---
diff --git a/librsvg/rsvg-handle.c b/librsvg/rsvg-handle.c
index 5e78bcd3..856a5cf9 100644
--- a/librsvg/rsvg-handle.c
+++ b/librsvg/rsvg-handle.c
@@ -1220,9 +1220,10 @@ get_node_geometry(RsvgHandle *handle, RsvgNode *node, cairo_rectangle_t *ink_rec
     rsvg_drawing_ctx_add_node_and_ancestors_to_stack (draw, node);
 
     rsvg_tree_cascade (handle->priv->tree);
+    /* FIXME: expose this as a RenderingError in the public API */
     res = rsvg_drawing_ctx_draw_node_from_stack (draw, handle->priv->tree);
     if (res) {
-        res = rsvg_drawing_ctx_get_geometry (draw, ink_rect, logical_rect);
+        rsvg_drawing_ctx_get_geometry (draw, ink_rect, logical_rect);
     }
 
     rsvg_drawing_ctx_free (draw);
diff --git a/librsvg/rsvg-private.h b/librsvg/rsvg-private.h
index e201ab67..296b8c1a 100644
--- a/librsvg/rsvg-private.h
+++ b/librsvg/rsvg-private.h
@@ -223,7 +223,7 @@ gboolean rsvg_drawing_ctx_draw_node_from_stack (RsvgDrawingCtx *ctx, RsvgTree *t
 
 /* Defined in rsvg_internals/src/drawing_ctx.rs */
 G_GNUC_INTERNAL
-gboolean rsvg_drawing_ctx_get_geometry (RsvgDrawingCtx *ctx, cairo_rectangle_t *ink_rect, cairo_rectangle_t 
*logical_rect);
+void rsvg_drawing_ctx_get_geometry (RsvgDrawingCtx *ctx, cairo_rectangle_t *ink_rect, cairo_rectangle_t 
*logical_rect);
 
 /* Implemented in rust/src/node.rs */
 G_GNUC_INTERNAL
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index e183abd7..a39696cb 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -1094,41 +1094,49 @@ pub extern "C" fn rsvg_drawing_ctx_add_node_and_ancestors_to_stack(
 }
 
 #[no_mangle]
-pub extern "C" fn rsvg_drawing_ctx_get_geometry(
+pub unsafe extern "C" fn rsvg_drawing_ctx_get_geometry(
     raw_draw_ctx: *const RsvgDrawingCtx,
     ink_rect: *mut cairo_sys::cairo_rectangle_t,
     logical_rect: *mut cairo_sys::cairo_rectangle_t,
-) -> glib_sys::gboolean {
+) {
     assert!(!raw_draw_ctx.is_null());
-    let draw_ctx = unsafe { &mut *(raw_draw_ctx as *mut DrawingCtx<'_>) };
+    let draw_ctx = &mut *(raw_draw_ctx as *mut DrawingCtx<'_>);
 
     assert!(!ink_rect.is_null());
     assert!(!logical_rect.is_null());
 
-    let mut res = match draw_ctx.get_bbox().ink_rect {
-        Some(r) => unsafe {
-            (*ink_rect).x = r.x;
-            (*ink_rect).y = r.y;
-            (*ink_rect).width = r.width;
-            (*ink_rect).height = r.height;
-            true
-        },
-        _ => false,
-    };
+    let ink_rect: &mut cairo::Rectangle = &mut *ink_rect;
+    let logical_rect: &mut cairo::Rectangle = &mut *logical_rect;
 
-    res = res
-        && match draw_ctx.get_bbox().rect {
-            Some(r) => unsafe {
-                (*logical_rect).x = r.x;
-                (*logical_rect).y = r.y;
-                (*logical_rect).width = r.width;
-                (*logical_rect).height = r.height;
-                true
-            },
-            _ => false,
-        };
+    match draw_ctx.get_bbox().ink_rect {
+        Some(r) => {
+            ink_rect.x = r.x;
+            ink_rect.y = r.y;
+            ink_rect.width = r.width;
+            ink_rect.height = r.height;
+        }
+        None => {
+            ink_rect.x = 0.0;
+            ink_rect.y = 0.0;
+            ink_rect.width = 0.0;
+            ink_rect.height = 0.0;
+        }
+    }
 
-    res.to_glib()
+    match draw_ctx.get_bbox().rect {
+        Some(r) => {
+            logical_rect.x = r.x;
+            logical_rect.y = r.y;
+            logical_rect.width = r.width;
+            logical_rect.height = r.height;
+        }
+        None => {
+            logical_rect.x = 0.0;
+            logical_rect.y = 0.0;
+            logical_rect.width = 0.0;
+            logical_rect.height = 0.0;
+        }
+    }
 }
 
 pub struct AcquiredNode(Rc<RefCell<Vec<RsvgNode>>>, RsvgNode);


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