[librsvg] rsvg_handle_create_drawing_ctx_for_node(): Port to Rust
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg] rsvg_handle_create_drawing_ctx_for_node(): Port to Rust
- Date: Wed, 19 Dec 2018 00:08:01 +0000 (UTC)
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]