[librsvg] rsvg_handle_create_drawing_ctx_for_node(): Port to Rust



commit b7e71be316ecce14e5bb70b83b38505e314cc085
Author: Federico Mena Quintero <federico gnome org>
Date:   Tue Dec 18 18:06:39 2018 -0600

    rsvg_handle_create_drawing_ctx_for_node(): Port to Rust

 librsvg/rsvg-handle.c             | 43 ++++------------------
 rsvg_internals/src/drawing_ctx.rs | 39 +-------------------
 rsvg_internals/src/handle.rs      | 77 +++++++++++++++++++++++++++++++++------
 rsvg_internals/src/lib.rs         |  4 +-
 4 files changed, 75 insertions(+), 88 deletions(-)
---
diff --git a/librsvg/rsvg-handle.c b/librsvg/rsvg-handle.c
index 2a214ced..d9fd3f16 100644
--- a/librsvg/rsvg-handle.c
+++ b/librsvg/rsvg-handle.c
@@ -153,7 +153,6 @@ RsvgHandleRust *rsvg_handle_get_rust (RsvgHandle *handle);
 /* Implemented in rsvg_internals/src/handle.rs */
 extern RsvgHandleRust *rsvg_handle_rust_new (void);
 extern void rsvg_handle_rust_free (RsvgHandleRust *raw_handle);
-extern void rsvg_handle_rust_cascade (RsvgHandleRust *raw_handle);
 extern double rsvg_handle_rust_get_dpi_x (RsvgHandleRust *raw_handle);
 extern double rsvg_handle_rust_get_dpi_y (RsvgHandleRust *raw_handle);
 extern void rsvg_handle_rust_set_dpi_x (RsvgHandleRust *raw_handle, double dpi_x);
@@ -172,7 +171,11 @@ extern gboolean rsvg_handle_rust_read_stream_sync (RsvgHandle *handle,
                                                    GError **error);
 extern void rsvg_handle_rust_write (RsvgHandle *handle, const guchar *buf, gsize count);
 extern gboolean rsvg_handle_rust_close (RsvgHandle *handle, GError **error);
-
+extern RsvgDrawingCtx *rsvg_handle_create_drawing_ctx_for_node(RsvgHandle *handle,
+                                                               cairo_t *cr,
+                                                               RsvgDimensionData *dimensions,
+                                                               RsvgNode *node,
+                                                               gboolean is_testing);
 
 /* Implemented in rust/src/node.rs */
 /* Call this as node = rsvg_node_unref (node);  Then node will be NULL and you don't own it anymore! */
@@ -183,16 +186,7 @@ G_GNUC_INTERNAL
 gboolean rsvg_node_svg_get_size (RsvgNode *node, double dpi_x, double dpi_y, int *out_width, int 
*out_height);
 
 /* Defined in rsvg_internals/src/drawing_ctx.rs */
-extern RsvgDrawingCtx *rsvg_drawing_ctx_new (RsvgHandle *handle,
-                                             cairo_t *cr,
-                                             guint width,
-                                             guint height,
-                                             double vb_width,
-                                             double vb_height,
-                                             gboolean testing);
 extern void rsvg_drawing_ctx_free (RsvgDrawingCtx *draw_ctx);
-extern void rsvg_drawing_ctx_add_node_and_ancestors_to_stack (RsvgDrawingCtx *draw_ctx,
-                                                              RsvgNode       *node);
 extern gboolean rsvg_drawing_ctx_draw_node_from_stack (RsvgDrawingCtx *ctx) G_GNUC_WARN_UNUSED_RESULT;
 extern void rsvg_drawing_ctx_get_geometry (RsvgDrawingCtx *ctx,
                                            RsvgRectangle *ink_rect,
@@ -989,29 +983,6 @@ rsvg_handle_get_rust (RsvgHandle *handle)
     return handle->priv->rust_handle;
 }
 
-static RsvgDrawingCtx *
-rsvg_handle_create_drawing_ctx_for_node(RsvgHandle *handle,
-                                        cairo_t *cr,
-                                        RsvgDimensionData *dimensions,
-                                        RsvgNode *node)
-{
-    RsvgDrawingCtx *draw_ctx;
-
-    draw_ctx = rsvg_drawing_ctx_new (handle,
-                                     cr,
-                                     dimensions->width, dimensions->height,
-                                     dimensions->em, dimensions->ex,
-                                     handle->priv->is_testing);
-
-    if (node != NULL) {
-        rsvg_drawing_ctx_add_node_and_ancestors_to_stack (draw_ctx, node);
-    }
-
-    rsvg_handle_rust_cascade (handle->priv->rust_handle);
-
-    return draw_ctx;
-}
-
 static gboolean
 is_loaded (RsvgHandle *handle)
 {
@@ -1093,7 +1064,7 @@ rsvg_handle_render_cairo_sub (RsvgHandle * handle, cairo_t * cr, const char *id)
 
     cairo_save (cr);
 
-    draw = rsvg_handle_create_drawing_ctx_for_node (handle, cr, &dimensions, drawsub);
+    draw = rsvg_handle_create_drawing_ctx_for_node (handle, cr, &dimensions, drawsub, 
handle->priv->is_testing);
     res = rsvg_drawing_ctx_draw_node_from_stack (draw);
 
     rsvg_drawing_ctx_free (draw);
@@ -1173,7 +1144,7 @@ get_node_geometry(RsvgHandle *handle, RsvgNode *node, RsvgRectangle *ink_rect, R
     target = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 1, 1);
     cr = cairo_create (target);
 
-    draw = rsvg_handle_create_drawing_ctx_for_node (handle, cr, &dimensions, node);
+    draw = rsvg_handle_create_drawing_ctx_for_node (handle, cr, &dimensions, node, handle->priv->is_testing);
 
     /* FIXME: expose this as a RenderingError in the public API */
     res = rsvg_drawing_ctx_draw_node_from_stack (draw);
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index c1885a37..2229c58a 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -3,7 +3,6 @@ use cairo::MatrixTrait;
 use cairo_sys;
 use glib::translate::*;
 use glib_sys;
-use libc;
 use pango::{self, ContextExt, FontMapExt, LayoutExt};
 use pango_sys;
 use pangocairo;
@@ -135,7 +134,7 @@ pub struct DrawingCtx {
 impl DrawingCtx {
     pub fn new(
         handle: *const RsvgHandle,
-        cr: cairo::Context,
+        cr: &cairo::Context,
         width: f64,
         height: f64,
         vb_width: f64,
@@ -1074,20 +1073,6 @@ pub extern "C" fn rsvg_drawing_ctx_draw_node_from_stack(
     }
 }
 
-#[no_mangle]
-pub extern "C" fn rsvg_drawing_ctx_add_node_and_ancestors_to_stack(
-    raw_draw_ctx: *mut DrawingCtx,
-    raw_node: *const RsvgNode,
-) {
-    assert!(!raw_draw_ctx.is_null());
-    let draw_ctx = unsafe { &mut *raw_draw_ctx };
-
-    assert!(!raw_node.is_null());
-    let node = unsafe { &*raw_node };
-
-    draw_ctx.add_node_and_ancestors_to_stack(node);
-}
-
 #[derive(Clone, Copy, Debug, PartialEq)]
 #[repr(C)]
 pub struct RsvgRectangle {
@@ -1180,28 +1165,6 @@ impl NodeStack {
     }
 }
 
-#[no_mangle]
-pub extern "C" fn rsvg_drawing_ctx_new(
-    handle: *const RsvgHandle,
-    cr: *mut cairo_sys::cairo_t,
-    width: u32,
-    height: u32,
-    vb_width: libc::c_double,
-    vb_height: libc::c_double,
-    is_testing: glib_sys::gboolean,
-) -> *mut DrawingCtx {
-    Box::into_raw(Box::new(DrawingCtx::new(
-        handle,
-        unsafe { from_glib_none(cr) },
-        f64::from(width),
-        f64::from(height),
-        vb_width,
-        vb_height,
-        handle::get_dpi(handle).clone(),
-        from_glib(is_testing),
-    )))
-}
-
 #[no_mangle]
 pub unsafe extern "C" fn rsvg_drawing_ctx_free(raw_draw_ctx: *mut DrawingCtx) {
     assert!(!raw_draw_ctx.is_null());
diff --git a/rsvg_internals/src/handle.rs b/rsvg_internals/src/handle.rs
index 8601bd2f..f5200190 100644
--- a/rsvg_internals/src/handle.rs
+++ b/rsvg_internals/src/handle.rs
@@ -3,7 +3,7 @@ use std::ptr;
 use std::rc::Rc;
 use std::slice;
 
-use cairo::{ImageSurface, Status};
+use cairo::{self, ImageSurface, Status};
 use cairo_sys;
 use gdk_pixbuf::{PixbufLoader, PixbufLoaderExt};
 use gio::{File as GFile, InputStream};
@@ -17,6 +17,7 @@ use allowed_url::AllowedUrl;
 use css::{self, CssStyles};
 use defs::{Fragment, Href};
 use dpi::Dpi;
+use drawing_ctx::DrawingCtx;
 use error::{set_gerror, LoadingError};
 use io;
 use load::LoadContext;
@@ -33,6 +34,15 @@ pub struct RsvgHandle {
     _private: [u8; 0],
 }
 
+// Keep in sync with rsvg.h:RsvgDimensionData
+#[repr(C)]
+pub struct RsvgDimensionData {
+    width: libc::c_int,
+    height: libc::c_int,
+    em: f64,
+    ex: f64,
+}
+
 /// Flags used during loading
 ///
 /// We communicate these to/from the C code with a guint <-> u32,
@@ -180,6 +190,41 @@ impl Handle {
         *self.svg.borrow_mut() = Some(xml.steal_result());
         Ok(())
     }
+
+    fn cascade(&mut self) {
+        let svg_ref = self.svg.borrow();
+        let svg = svg_ref.as_ref().unwrap();
+
+        svg.tree.cascade();
+    }
+
+    fn create_drawing_ctx_for_node(
+        &mut self,
+        handle: *mut RsvgHandle,
+        cr: &cairo::Context,
+        dimensions: &RsvgDimensionData,
+        node: Option<&RsvgNode>,
+        is_testing: bool,
+    ) -> DrawingCtx {
+        let mut draw_ctx = DrawingCtx::new(
+            handle,
+            cr,
+            f64::from(dimensions.width),
+            f64::from(dimensions.height),
+            dimensions.em,
+            dimensions.ex,
+            get_dpi(handle).clone(),
+            is_testing,
+        );
+
+        if let Some(node) = node {
+            draw_ctx.add_node_and_ancestors_to_stack(node);
+        }
+
+        self.cascade();
+
+        draw_ctx
+    }
 }
 
 // Keep these in sync with rsvg.h:RsvgHandleFlags
@@ -554,16 +599,6 @@ pub unsafe extern "C" fn rsvg_handle_defs_lookup(
     }
 }
 
-#[no_mangle]
-pub unsafe extern "C" fn rsvg_handle_rust_cascade(raw_handle: *const Handle) {
-    let rhandle = &*raw_handle;
-
-    let svg_ref = rhandle.svg.borrow();
-    let svg = svg_ref.as_ref().unwrap();
-
-    svg.tree.cascade();
-}
-
 #[no_mangle]
 pub unsafe extern "C" fn rsvg_handle_rust_get_root(raw_handle: *const Handle) -> *const RsvgNode {
     let rhandle = &*raw_handle;
@@ -676,3 +711,23 @@ pub unsafe extern "C" fn rsvg_handle_rust_close(
         }
     }
 }
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_create_drawing_ctx_for_node(
+    handle: *mut RsvgHandle,
+    cr: *mut cairo_sys::cairo_t,
+    dimensions: *const RsvgDimensionData,
+    node: *const RsvgNode,
+    is_testing: glib_sys::gboolean,
+) -> *mut DrawingCtx {
+    let cr = from_glib_none(cr);
+    let dimensions = &*dimensions;
+    let is_testing = from_glib(is_testing);
+
+    let node = if node.is_null() { None } else { Some(&*node) };
+
+    let rhandle = get_rust_handle(handle);
+    let draw_ctx = rhandle.create_drawing_ctx_for_node(handle, &cr, dimensions, node, is_testing);
+
+    Box::into_raw(Box::new(draw_ctx))
+}
diff --git a/rsvg_internals/src/lib.rs b/rsvg_internals/src/lib.rs
index 1936e5cc..ad809e8a 100644
--- a/rsvg_internals/src/lib.rs
+++ b/rsvg_internals/src/lib.rs
@@ -36,16 +36,14 @@ extern crate lazy_static;
 pub use color::{rsvg_css_parse_color, ColorKind, ColorSpec};
 
 pub use drawing_ctx::{
-    rsvg_drawing_ctx_add_node_and_ancestors_to_stack,
     rsvg_drawing_ctx_draw_node_from_stack,
     rsvg_drawing_ctx_free,
     rsvg_drawing_ctx_get_geometry,
-    rsvg_drawing_ctx_new,
 };
 
 pub use handle::{
+    rsvg_handle_create_drawing_ctx_for_node,
     rsvg_handle_defs_lookup,
-    rsvg_handle_rust_cascade,
     rsvg_handle_rust_close,
     rsvg_handle_rust_free,
     rsvg_handle_rust_get_base_gfile,


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