[librsvg: 3/5] handle: move dpi to rust



commit 4db16b1acd11571db5053a5b4a8f50a0f3573f55
Author: Paolo Borelli <pborelli gnome org>
Date:   Thu Dec 6 22:53:34 2018 +0100

    handle: move dpi to rust
    
    Note that the default dpi is still handled in the C part, since
    it uses global variables

 Makefile.am                  |  1 +
 librsvg/rsvg-handle.c        | 56 +++++++++++---------------------------------
 librsvg/rsvg-private.h       |  3 ---
 rsvg_internals/src/dpi.rs    | 38 ++++++++++++++++++++++++++++++
 rsvg_internals/src/handle.rs | 31 ++++++++++++++++++++++++
 rsvg_internals/src/lib.rs    |  5 ++++
 6 files changed, 89 insertions(+), 45 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 7978dddd..f1ddc052 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -53,6 +53,7 @@ RUST_SRC =                                                    \
        rsvg_internals/src/croco.rs                             \
        rsvg_internals/src/css.rs                               \
        rsvg_internals/src/defs.rs                              \
+       rsvg_internals/src/dpi.rs                               \
        rsvg_internals/src/drawing_ctx.rs                       \
        rsvg_internals/src/filters/bounds.rs                    \
        rsvg_internals/src/filters/blend.rs                     \
diff --git a/librsvg/rsvg-handle.c b/librsvg/rsvg-handle.c
index 3383a8d2..4b582a60 100644
--- a/librsvg/rsvg-handle.c
+++ b/librsvg/rsvg-handle.c
@@ -131,6 +131,10 @@
 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);
+extern void rsvg_handle_rust_set_dpi_y (RsvgHandleRust *raw_handle, double dpi_y);
 extern void rsvg_handle_rust_set_base_url (RsvgHandleRust *raw_handle, const char *uri);
 extern RsvgNode *rsvg_handle_rust_get_root (RsvgHandleRust *raw_handle);
 extern GFile *rsvg_handle_rust_get_base_gfile (RsvgHandleRust *raw_handle);
@@ -189,8 +193,6 @@ rsvg_handle_init (RsvgHandle * self)
 
     self->priv->flags = RSVG_HANDLE_FLAGS_NONE;
     self->priv->hstate = RSVG_HANDLE_STATE_START;
-    self->priv->dpi_x = 0.;
-    self->priv->dpi_y = 0.;
 
     self->priv->in_loop = FALSE;
 
@@ -228,38 +230,6 @@ rsvg_handle_dispose (GObject *instance)
     G_OBJECT_CLASS (rsvg_handle_parent_class)->dispose (instance);
 }
 
-static double
-rsvg_handle_get_dpi_x (RsvgHandle *handle)
-{
-    if (handle->priv->dpi_x <= 0.) {
-        return rsvg_get_default_dpi_x ();
-    }
-
-    return handle->priv->dpi_x;
-}
-
-static double
-rsvg_handle_get_dpi_y (RsvgHandle *handle)
-{
-    if (handle->priv->dpi_y <= 0.) {
-        return rsvg_get_default_dpi_y ();
-    }
-
-    return handle->priv->dpi_y;
-}
-
-static void
-rsvg_handle_set_dpi_x (RsvgHandle *handle, double dpi_x)
-{
-    handle->priv->dpi_x = dpi_x;
-}
-
-static void
-rsvg_handle_set_dpi_y (RsvgHandle *handle, double dpi_y)
-{
-    handle->priv->dpi_y = dpi_y;
-}
-
 static void
 rsvg_handle_set_property (GObject * instance, guint prop_id, GValue const *value, GParamSpec * pspec)
 {
@@ -270,10 +240,10 @@ rsvg_handle_set_property (GObject * instance, guint prop_id, GValue const *value
         self->priv->flags = g_value_get_flags (value);
         break;
     case PROP_DPI_X:
-        rsvg_handle_set_dpi_x (self, g_value_get_double (value));
+        rsvg_handle_rust_set_dpi_x (self->priv->rust_handle, g_value_get_double (value));
         break;
     case PROP_DPI_Y:
-        rsvg_handle_set_dpi_y (self, g_value_get_double (value));
+        rsvg_handle_rust_set_dpi_y (self->priv->rust_handle, g_value_get_double (value));
         break;
     case PROP_BASE_URI:
         rsvg_handle_set_base_uri (self, g_value_get_string (value));
@@ -294,10 +264,10 @@ rsvg_handle_get_property (GObject * instance, guint prop_id, GValue * value, GPa
         g_value_set_flags (value, self->priv->flags);
         break;
     case PROP_DPI_X:
-        g_value_set_double (value, rsvg_handle_get_dpi_x (self));
+        g_value_set_double (value, rsvg_handle_rust_get_dpi_x (self->priv->rust_handle));
         break;
     case PROP_DPI_Y:
-        g_value_set_double (value, rsvg_handle_get_dpi_y (self));
+        g_value_set_double (value, rsvg_handle_rust_get_dpi_y (self->priv->rust_handle));
         break;
     case PROP_BASE_URI:
         g_value_set_string (value, rsvg_handle_get_base_uri (self));
@@ -1061,7 +1031,8 @@ rsvg_handle_create_drawing_ctx(RsvgHandle *handle,
                                  cr,
                                  dimensions->width, dimensions->height,
                                  dimensions->em, dimensions->ex,
-                                 rsvg_handle_get_dpi_x (handle), rsvg_handle_get_dpi_y (handle),
+                                 rsvg_handle_rust_get_dpi_x (handle->priv->rust_handle),
+                                 rsvg_handle_rust_get_dpi_y (handle->priv->rust_handle),
                                  handle->priv->is_testing);
 }
 
@@ -1304,7 +1275,8 @@ rsvg_handle_get_geometry_sub (RsvgHandle * handle, RsvgRectangle * ink_rect, Rsv
     }
 
     has_size = rsvg_node_svg_get_size (root,
-                                       rsvg_handle_get_dpi_x (handle), rsvg_handle_get_dpi_y (handle),
+                                       rsvg_handle_rust_get_dpi_x (handle->priv->rust_handle),
+                                       rsvg_handle_rust_get_dpi_y (handle->priv->rust_handle),
                                        &root_width, &root_height);
 
     if (id || !has_size) {
@@ -1523,8 +1495,8 @@ rsvg_handle_set_dpi_x_y (RsvgHandle * handle, double dpi_x, double dpi_y)
 {
     g_return_if_fail (RSVG_IS_HANDLE (handle));
 
-    rsvg_handle_set_dpi_x (handle, dpi_x);
-    rsvg_handle_set_dpi_y (handle, dpi_y);
+    rsvg_handle_rust_set_dpi_x (handle->priv->rust_handle, dpi_x);
+    rsvg_handle_rust_set_dpi_y (handle->priv->rust_handle, dpi_y);
 }
 
 /**
diff --git a/librsvg/rsvg-private.h b/librsvg/rsvg-private.h
index 5aaa4910..c205f551 100644
--- a/librsvg/rsvg-private.h
+++ b/librsvg/rsvg-private.h
@@ -99,9 +99,6 @@ struct RsvgHandlePrivate {
     gpointer user_data;
     GDestroyNotify user_data_destroy;
 
-    double dpi_x;
-    double dpi_y;
-
     gchar *base_uri; // Keep this here; since rsvg_handle_get_base_uri() returns a const char *
 
     gboolean in_loop;          /* see get_dimension() */
diff --git a/rsvg_internals/src/dpi.rs b/rsvg_internals/src/dpi.rs
new file mode 100644
index 00000000..6d4693ba
--- /dev/null
+++ b/rsvg_internals/src/dpi.rs
@@ -0,0 +1,38 @@
+use std::cell::Cell;
+
+extern "C" {
+    fn rsvg_get_default_dpi_y() -> f64;
+    fn rsvg_get_default_dpi_x() -> f64;
+}
+
+#[derive(Debug, Clone, Default)]
+pub struct Dpi {
+    x: Cell<f64>,
+    y: Cell<f64>,
+}
+
+impl Dpi {
+    pub fn x(&self) -> f64 {
+        if self.x.get() <= 0.0 {
+            unsafe { rsvg_get_default_dpi_x() }
+        } else {
+            self.x.get()
+        }
+    }
+
+    pub fn set_x(&self, dpi_x: f64) {
+        self.x.set(dpi_x)
+    }
+
+    pub fn y(&self) -> f64 {
+        if self.y.get() <= 0.0 {
+            unsafe { rsvg_get_default_dpi_y() }
+        } else {
+            self.y.get()
+        }
+    }
+
+    pub fn set_y(&self, dpi_y: f64) {
+        self.y.set(dpi_y)
+    }
+}
diff --git a/rsvg_internals/src/handle.rs b/rsvg_internals/src/handle.rs
index 5de142bf..9afcc0fd 100644
--- a/rsvg_internals/src/handle.rs
+++ b/rsvg_internals/src/handle.rs
@@ -16,6 +16,7 @@ use url::Url;
 use allowed_url::AllowedUrl;
 use css::{self, CssStyles};
 use defs::{Fragment, Href};
+use dpi::Dpi;
 use error::{set_gerror, LoadingError};
 use io;
 use node::{box_node, Node, RsvgNode};
@@ -31,6 +32,7 @@ pub struct RsvgHandle {
 }
 
 pub struct Handle {
+    dpi: Dpi,
     base_url: RefCell<Option<Url>>,
     svg: RefCell<Option<Svg>>,
 }
@@ -38,6 +40,7 @@ pub struct Handle {
 impl Handle {
     fn new() -> Handle {
         Handle {
+            dpi: Dpi::default(),
             base_url: RefCell::new(None),
             svg: RefCell::new(None),
         }
@@ -305,6 +308,34 @@ pub unsafe extern "C" fn rsvg_handle_rust_get_base_gfile(
     }
 }
 
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_rust_set_dpi_x(raw_handle: *const Handle, dpi_x: f64) {
+    let handle = &*(raw_handle as *const Handle);
+
+    handle.dpi.set_x(dpi_x);
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_rust_get_dpi_x(raw_handle: *const Handle) -> f64 {
+    let handle = &*(raw_handle as *const Handle);
+
+    handle.dpi.x()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_rust_set_dpi_y(raw_handle: *const Handle, dpi_y: f64) {
+    let handle = &*(raw_handle as *const Handle);
+
+    handle.dpi.set_y(dpi_y);
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_rust_get_dpi_y(raw_handle: *const Handle) -> f64 {
+    let handle = &*(raw_handle as *const Handle);
+
+    handle.dpi.y()
+}
+
 #[no_mangle]
 pub unsafe extern "C" fn rsvg_handle_defs_lookup(
     handle: *const RsvgHandle,
diff --git a/rsvg_internals/src/lib.rs b/rsvg_internals/src/lib.rs
index bc0164bc..0ba60145 100644
--- a/rsvg_internals/src/lib.rs
+++ b/rsvg_internals/src/lib.rs
@@ -50,10 +50,14 @@ pub use handle::{
     rsvg_handle_rust_cascade,
     rsvg_handle_rust_free,
     rsvg_handle_rust_get_base_gfile,
+    rsvg_handle_rust_get_dpi_x,
+    rsvg_handle_rust_get_dpi_y,
     rsvg_handle_rust_get_root,
     rsvg_handle_rust_new,
     rsvg_handle_rust_node_is_root,
     rsvg_handle_rust_set_base_url,
+    rsvg_handle_rust_set_dpi_x,
+    rsvg_handle_rust_set_dpi_y,
     rsvg_handle_rust_steal_result,
 };
 
@@ -97,6 +101,7 @@ mod create_node;
 mod croco;
 mod css;
 mod defs;
+mod dpi;
 mod drawing_ctx;
 mod error;
 pub mod filters;


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